{ "cells": [ { "cell_type": "markdown", "id": "c200034d-b5f7-4af8-89fe-589d508d65d5", "metadata": { "tags": [] }, "source": [ "# PRINTER_SELL" ] }, { "cell_type": "code", "execution_count": 1, "id": "60301507-1d96-4e3c-97cd-390dc512bcb5", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "<!-- Generated by graphviz version 2.43.0 (0)\n", " -->\n", "<!-- Title: finite_state_machine Pages: 1 -->\n", "<svg width=\"475pt\" height=\"123pt\"\n", " viewBox=\"0.00 0.00 474.60 123.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 119)\">\n", "<title>finite_state_machine</title>\n", "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-119 470.6,-119 470.6,4 -4,4\"/>\n", "<!-- _a -->\n", "<g id=\"node1\" class=\"node\">\n", "<title>_a</title>\n", "<ellipse fill=\"white\" stroke=\"white\" cx=\"1.8\" cy=\"-58\" rx=\"1.8\" ry=\"1.8\"/>\n", "</g>\n", "<!-- 0 -->\n", "<g id=\"node2\" class=\"node\">\n", "<title>0</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"62.6\" cy=\"-58\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"62.6\" cy=\"-58\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"62.6\" y=\"-54.3\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n", "</g>\n", "<!-- _a->0 -->\n", "<g id=\"edge1\" class=\"edge\">\n", "<title>_a->0</title>\n", "<path fill=\"none\" stroke=\"black\" d=\"M3.82,-58C7.19,-58 18.44,-58 30.12,-58\"/>\n", "<polygon fill=\"black\" stroke=\"black\" points=\"30.31,-61.5 40.31,-58 30.31,-54.5 30.31,-61.5\"/>\n", "</g>\n", "<!-- 1 -->\n", "<g id=\"node3\" class=\"node\">\n", "<title>1</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"212.6\" cy=\"-69\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"212.6\" cy=\"-69\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"212.6\" y=\"-65.3\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n", "</g>\n", "<!-- 0->1 -->\n", "<g id=\"edge2\" class=\"edge\">\n", "<title>0->1</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M77.35,-74.94C84.12,-81.94 92.91,-89.29 102.6,-93 131.65,-104.13 142.66,-101.47 172.6,-93 177.11,-91.72 181.61,-89.76 185.87,-87.5\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"187.93,-90.35 194.71,-82.21 184.33,-84.34 187.93,-90.35\"/>\n", "<text text-anchor=\"middle\" x=\"137.6\" y=\"-103.8\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 1->0 -->\n", "<g id=\"edge3\" class=\"edge\">\n", "<title>1->0</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M190.43,-67.43C165.5,-65.57 123.85,-62.48 95.12,-60.34\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"95.04,-56.83 84.8,-59.58 94.52,-63.81 95.04,-56.83\"/>\n", "<text text-anchor=\"middle\" x=\"137.6\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 1->0 -->\n", "<g id=\"edge5\" class=\"edge\">\n", "<title>1->0</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M195.78,-54.21C189.14,-48.97 181.01,-43.71 172.6,-41 142.98,-31.47 133.06,-34.65 102.6,-41 99.1,-41.73 95.52,-42.79 92.03,-44.04\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"90.47,-40.89 82.52,-47.9 93.1,-47.38 90.47,-40.89\"/>\n", "<text text-anchor=\"middle\" x=\"137.6\" y=\"-44.8\" font-family=\"Times,serif\" font-size=\"14.00\">manual_stop</text>\n", "</g>\n", "<!-- 2 -->\n", "<g id=\"node4\" class=\"node\">\n", "<title>2</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"349.6\" cy=\"-22\" rx=\"18\" ry=\"18\"/>\n", "<text text-anchor=\"middle\" x=\"349.6\" y=\"-18.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", "</g>\n", "<!-- 1->2 -->\n", "<g id=\"edge4\" class=\"edge\">\n", "<title>1->2</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M233.52,-62.06C257.22,-53.81 296.84,-40.02 322.84,-30.97\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"324.12,-34.23 332.41,-27.64 321.82,-27.62 324.12,-34.23\"/>\n", "<text text-anchor=\"middle\" x=\"283.1\" y=\"-58.8\" font-family=\"Times,serif\" font-size=\"14.00\">breakdown</text>\n", "</g>\n", "<!-- 2->0 -->\n", "<g id=\"edge6\" class=\"edge\">\n", "<title>2->0</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M331.81,-19.05C291.01,-12.62 184.05,-0.17 102.6,-30 97.54,-31.85 92.56,-34.55 87.93,-37.55\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"85.63,-34.89 79.53,-43.56 89.7,-40.59 85.63,-34.89\"/>\n", "<text text-anchor=\"middle\" x=\"212.6\" y=\"-15.8\" font-family=\"Times,serif\" font-size=\"14.00\">fix</text>\n", "</g>\n", "<!-- 3 -->\n", "<g id=\"node5\" class=\"node\">\n", "<title>3</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"444.6\" cy=\"-22\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"444.6\" cy=\"-22\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"444.6\" y=\"-18.3\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n", "</g>\n", "<!-- 2->3 -->\n", "<g id=\"edge7\" class=\"edge\">\n", "<title>2->3</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M367.66,-22C380.06,-22 397.22,-22 412.09,-22\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"412.41,-25.5 422.41,-22 412.41,-18.5 412.41,-25.5\"/>\n", "<text text-anchor=\"middle\" x=\"395.1\" y=\"-25.8\" font-family=\"Times,serif\" font-size=\"14.00\">sell</text>\n", "</g>\n", "</g>\n", "</svg>\n" ], "text/html": [ "<img width=\"100%\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDMuMCAoMCkKIC0tPgo8IS0tIFRpdGxlOiBmaW5pdGVfc3RhdGVfbWFjaGluZSBQYWdlczogMSAtLT4KPHN2ZyB3aWR0aD0iNDc1cHQiIGhlaWdodD0iMTIzcHQiCiB2aWV3Qm94PSIwLjAwIDAuMDAgNDc0LjYwIDEyMy4wMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CjxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCAxMTkpIj4KPHRpdGxlPmZpbml0ZV9zdGF0ZV9tYWNoaW5lPC90aXRsZT4KPHBvbHlnb24gZmlsbD0id2hpdGUiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtMTE5IDQ3MC42LC0xMTkgNDcwLjYsNCAtNCw0Ii8+CjwhLS0gX2EgLS0+CjxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+X2E8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSJ3aGl0ZSIgY3g9IjEuOCIgY3k9Ii01OCIgcng9IjEuOCIgcnk9IjEuOCIvPgo8L2c+CjwhLS0gMCAtLT4KPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4wPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjYyLjYiIGN5PSItNTgiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI2Mi42IiBjeT0iLTU4IiByeD0iMjIiIHJ5PSIyMiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2Mi42IiB5PSItNTQuMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj4wPC90ZXh0Pgo8L2c+CjwhLS0gX2EmIzQ1OyZndDswIC0tPgo8ZyBpZD0iZWRnZTEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPl9hJiM0NTsmZ3Q7MDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zLjgyLC01OEM3LjE5LC01OCAxOC40NCwtNTggMzAuMTIsLTU4Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMwLjMxLC02MS41IDQwLjMxLC01OCAzMC4zMSwtNTQuNSAzMC4zMSwtNjEuNSIvPgo8L2c+CjwhLS0gMSAtLT4KPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjIxMi42IiBjeT0iLTY5IiByeD0iMTgiIHJ5PSIxOCIvPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMjEyLjYiIGN5PSItNjkiIHJ4PSIyMiIgcnk9IjIyIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxMi42IiB5PSItNjUuMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj4xPC90ZXh0Pgo8L2c+CjwhLS0gMCYjNDU7Jmd0OzEgLS0+CjxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MCYjNDU7Jmd0OzE8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9InJlZCIgZD0iTTc3LjM1LC03NC45NEM4NC4xMiwtODEuOTQgOTIuOTEsLTg5LjI5IDEwMi42LC05MyAxMzEuNjUsLTEwNC4xMyAxNDIuNjYsLTEwMS40NyAxNzIuNiwtOTMgMTc3LjExLC05MS43MiAxODEuNjEsLTg5Ljc2IDE4NS44NywtODcuNSIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjE4Ny45MywtOTAuMzUgMTk0LjcxLC04Mi4yMSAxODQuMzMsLTg0LjM0IDE4Ny45MywtOTAuMzUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTM3LjYiIHk9Ii0xMDMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5zdGFydDwvdGV4dD4KPC9nPgo8IS0tIDEmIzQ1OyZndDswIC0tPgo8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjEmIzQ1OyZndDswPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmVlbiIgZD0iTTE5MC40MywtNjcuNDNDMTY1LjUsLTY1LjU3IDEyMy44NSwtNjIuNDggOTUuMTIsLTYwLjM0Ii8+Cjxwb2x5Z29uIGZpbGw9ImdyZWVuIiBzdHJva2U9ImdyZWVuIiBwb2ludHM9Ijk1LjA0LC01Ni44MyA4NC44LC01OS41OCA5NC41MiwtNjMuODEgOTUuMDQsLTU2LjgzIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEzNy42IiB5PSItNjkuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5hdXRvX2ZpbmlzaDwvdGV4dD4KPC9nPgo8IS0tIDEmIzQ1OyZndDswIC0tPgo8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjEmIzQ1OyZndDswPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik0xOTUuNzgsLTU0LjIxQzE4OS4xNCwtNDguOTcgMTgxLjAxLC00My43MSAxNzIuNiwtNDEgMTQyLjk4LC0zMS40NyAxMzMuMDYsLTM0LjY1IDEwMi42LC00MSA5OS4xLC00MS43MyA5NS41MiwtNDIuNzkgOTIuMDMsLTQ0LjA0Ii8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iOTAuNDcsLTQwLjg5IDgyLjUyLC00Ny45IDkzLjEsLTQ3LjM4IDkwLjQ3LC00MC44OSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMzcuNiIgeT0iLTQ0LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+bWFudWFsX3N0b3A8L3RleHQ+CjwvZz4KPCEtLSAyIC0tPgo8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMzQ5LjYiIGN5PSItMjIiIHJ4PSIxOCIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM0OS42IiB5PSItMTguMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj4yPC90ZXh0Pgo8L2c+CjwhLS0gMSYjNDU7Jmd0OzIgLS0+CjxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MSYjNDU7Jmd0OzI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImdyZWVuIiBkPSJNMjMzLjUyLC02Mi4wNkMyNTcuMjIsLTUzLjgxIDI5Ni44NCwtNDAuMDIgMzIyLjg0LC0zMC45NyIvPgo8cG9seWdvbiBmaWxsPSJncmVlbiIgc3Ryb2tlPSJncmVlbiIgcG9pbnRzPSIzMjQuMTIsLTM0LjIzIDMzMi40MSwtMjcuNjQgMzIxLjgyLC0yNy42MiAzMjQuMTIsLTM0LjIzIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI4My4xIiB5PSItNTguOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5icmVha2Rvd248L3RleHQ+CjwvZz4KPCEtLSAyJiM0NTsmZ3Q7MCAtLT4KPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4yJiM0NTsmZ3Q7MDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNMzMxLjgxLC0xOS4wNUMyOTEuMDEsLTEyLjYyIDE4NC4wNSwtMC4xNyAxMDIuNiwtMzAgOTcuNTQsLTMxLjg1IDkyLjU2LC0zNC41NSA4Ny45MywtMzcuNTUiLz4KPHBvbHlnb24gZmlsbD0icmVkIiBzdHJva2U9InJlZCIgcG9pbnRzPSI4NS42MywtMzQuODkgNzkuNTMsLTQzLjU2IDg5LjcsLTQwLjU5IDg1LjYzLC0zNC44OSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTIuNiIgeT0iLTE1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+Zml4PC90ZXh0Pgo8L2c+CjwhLS0gMyAtLT4KPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4zPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjQ0NC42IiBjeT0iLTIyIiByeD0iMTgiIHJ5PSIxOCIvPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iNDQ0LjYiIGN5PSItMjIiIHJ4PSIyMiIgcnk9IjIyIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ0NC42IiB5PSItMTguMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj4zPC90ZXh0Pgo8L2c+CjwhLS0gMiYjNDU7Jmd0OzMgLS0+CjxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MiYjNDU7Jmd0OzM8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9InJlZCIgZD0iTTM2Ny42NiwtMjJDMzgwLjA2LC0yMiAzOTcuMjIsLTIyIDQxMi4wOSwtMjIiLz4KPHBvbHlnb24gZmlsbD0icmVkIiBzdHJva2U9InJlZCIgcG9pbnRzPSI0MTIuNDEsLTI1LjUgNDIyLjQxLC0yMiA0MTIuNDEsLTE4LjUgNDEyLjQxLC0yNS41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM5NS4xIiB5PSItMjUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5zZWxsPC90ZXh0Pgo8L2c+CjwvZz4KPC9zdmc+Cg==\" >" ], "text/plain": [ "<pytct.automaton_display.AutomatonDisplay at 0x78e58b6591d0>" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pytct\n", "pytct.init(\"Chp4\", overwrite=True)\n", "\n", "statenum=4 #number of states\n", "#states are sequentially labeled 0,1,...,statenum\n", "#initial state is labeled 0\n", "\n", "trans=[(0,'start',1,'c'),\n", " (1,'auto_finish',0,'u'),\n", " (1,'manual_stop',0,'c'),\n", " (1,'breakdown',2,'u'),\n", " (2,'fix',0,'c'),\n", " (2,'sell',3,'c')] #set of transitions\n", "#each triple is (exit state, event label, entering state)\n", "#each event is either 'c' (controllable) or 'u' (uncontrollable)\n", "\n", "marker = [0,1,3] #set of marker states\n", "\n", "pytct.create('PRINTER_SELL', statenum, trans, marker)\n", "#create automaton PRINTER_SELL\n", "\n", "pytct.display_automaton('PRINTER_SELL',color=True)\n", "#plot PRINTER_SELL.DES with color coding" ] }, { "cell_type": "code", "execution_count": 2, "id": "0bcac9b6-4758-460a-bdbb-3cc4ab739c8a", "metadata": {}, "outputs": [], "source": [ "#statenum=4 #number of states\n", "#states are sequentially labeled 0,1,...,statenum\n", "#initial state is labeled 0\n", "\n", "#trans=[(0,11,1),\n", "# (1,10,0),\n", "# (1,13,0),\n", "# (1,12,2),\n", "# (2,15,0),\n", "# (2,17,3)] #set of transitions\n", "#each triple is (exit state, event label, entering state)\n", "#odd numbers for controllable events; even numbers for uncontrollable events\n", "\n", "#marker = [0,1,3] #set of marker states\n", "\n", "#pytct.create('PRINTER_SELL', statenum, trans, marker)\n", "#create automaton PRINTER_SELL\n", "\n", "#pytct.display_automaton('PRINTER_SELL',color=True)\n", "#plot PRINTER_SELL.DES with color coding" ] }, { "cell_type": "code", "execution_count": 3, "id": "8f7c9a7e-a099-4250-83ef-5decc782f2f3", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "<!-- Generated by graphviz version 2.43.0 (0)\n", " -->\n", "<!-- Title: finite_state_machine Pages: 1 -->\n", "<svg width=\"466pt\" height=\"91pt\"\n", " viewBox=\"0.00 0.00 465.60 91.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 87)\">\n", "<title>finite_state_machine</title>\n", "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-87 461.6,-87 461.6,4 -4,4\"/>\n", "<!-- _a -->\n", "<g id=\"node1\" class=\"node\">\n", "<title>_a</title>\n", "<ellipse fill=\"white\" stroke=\"white\" cx=\"1.8\" cy=\"-39\" rx=\"1.8\" ry=\"1.8\"/>\n", "</g>\n", "<!-- 0 -->\n", "<g id=\"node2\" class=\"node\">\n", "<title>0</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"62.6\" cy=\"-39\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"62.6\" cy=\"-39\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"62.6\" y=\"-35.3\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n", "</g>\n", "<!-- _a->0 -->\n", "<g id=\"edge1\" class=\"edge\">\n", "<title>_a->0</title>\n", "<path fill=\"none\" stroke=\"black\" d=\"M3.82,-39C7.19,-39 18.44,-39 30.12,-39\"/>\n", "<polygon fill=\"black\" stroke=\"black\" points=\"30.31,-42.5 40.31,-39 30.31,-35.5 30.31,-42.5\"/>\n", "</g>\n", "<!-- 1 -->\n", "<g id=\"node3\" class=\"node\">\n", "<title>1</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"203.6\" cy=\"-61\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"203.6\" cy=\"-61\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"203.6\" y=\"-57.3\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n", "</g>\n", "<!-- 0->1 -->\n", "<g id=\"edge2\" class=\"edge\">\n", "<title>0->1</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M82.63,-48.27C88.85,-50.9 95.89,-53.47 102.6,-55 125.16,-60.16 151.29,-61.57 171.18,-61.74\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"171.25,-65.24 181.24,-61.73 171.24,-58.24 171.25,-65.24\"/>\n", "<text text-anchor=\"middle\" x=\"133.1\" y=\"-64.8\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 1->0 -->\n", "<g id=\"edge3\" class=\"edge\">\n", "<title>1->0</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M186.17,-47.51C179.57,-42.92 171.63,-38.35 163.6,-36 141.14,-29.42 114.61,-30.6 94.52,-33.19\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"93.76,-29.77 84.38,-34.69 94.78,-36.69 93.76,-29.77\"/>\n", "<text text-anchor=\"middle\" x=\"133.1\" y=\"-39.8\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 2 -->\n", "<g id=\"node4\" class=\"node\">\n", "<title>2</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"340.6\" cy=\"-22\" rx=\"18\" ry=\"18\"/>\n", "<text text-anchor=\"middle\" x=\"340.6\" y=\"-18.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", "</g>\n", "<!-- 1->2 -->\n", "<g id=\"edge4\" class=\"edge\">\n", "<title>1->2</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M225.1,-55.08C248.7,-48.26 287.51,-37.05 313.31,-29.59\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"314.52,-32.89 323.16,-26.75 312.58,-26.16 314.52,-32.89\"/>\n", "<text text-anchor=\"middle\" x=\"274.1\" y=\"-52.8\" font-family=\"Times,serif\" font-size=\"14.00\">breakdown</text>\n", "</g>\n", "<!-- 2->0 -->\n", "<g id=\"edge5\" class=\"edge\">\n", "<title>2->0</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M322.62,-20.63C300.36,-18.91 260.09,-16.06 225.6,-15 170.7,-13.32 156.15,-14.77 102.6,-27 99.59,-27.69 96.47,-28.49 93.37,-29.35\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"92.29,-26.02 83.69,-32.2 94.27,-32.73 92.29,-26.02\"/>\n", "<text text-anchor=\"middle\" x=\"203.6\" y=\"-18.8\" font-family=\"Times,serif\" font-size=\"14.00\">fix</text>\n", "</g>\n", "<!-- 3 -->\n", "<g id=\"node5\" class=\"node\">\n", "<title>3</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"435.6\" cy=\"-22\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"435.6\" cy=\"-22\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"435.6\" y=\"-18.3\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n", "</g>\n", "<!-- 2->3 -->\n", "<g id=\"edge6\" class=\"edge\">\n", "<title>2->3</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M358.66,-22C371.06,-22 388.22,-22 403.09,-22\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"403.41,-25.5 413.41,-22 403.41,-18.5 403.41,-25.5\"/>\n", "<text text-anchor=\"middle\" x=\"386.1\" y=\"-25.8\" font-family=\"Times,serif\" font-size=\"14.00\">sell</text>\n", "</g>\n", "</g>\n", "</svg>\n" ], "text/html": [ "<img width=\"100%\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDMuMCAoMCkKIC0tPgo8IS0tIFRpdGxlOiBmaW5pdGVfc3RhdGVfbWFjaGluZSBQYWdlczogMSAtLT4KPHN2ZyB3aWR0aD0iNDY2cHQiIGhlaWdodD0iOTFwdCIKIHZpZXdCb3g9IjAuMDAgMC4wMCA0NjUuNjAgOTEuMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgo8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgODcpIj4KPHRpdGxlPmZpbml0ZV9zdGF0ZV9tYWNoaW5lPC90aXRsZT4KPHBvbHlnb24gZmlsbD0id2hpdGUiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtODcgNDYxLjYsLTg3IDQ2MS42LDQgLTQsNCIvPgo8IS0tIF9hIC0tPgo8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KPHRpdGxlPl9hPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0id2hpdGUiIHN0cm9rZT0id2hpdGUiIGN4PSIxLjgiIGN5PSItMzkiIHJ4PSIxLjgiIHJ5PSIxLjgiLz4KPC9nPgo8IS0tIDAgLS0+CjxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI2Mi42IiBjeT0iLTM5IiByeD0iMTgiIHJ5PSIxOCIvPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iNjIuNiIgY3k9Ii0zOSIgcng9IjIyIiByeT0iMjIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjIuNiIgeT0iLTM1LjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+MDwvdGV4dD4KPC9nPgo8IS0tIF9hJiM0NTsmZ3Q7MCAtLT4KPGcgaWQ9ImVkZ2UxIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5fYSYjNDU7Jmd0OzA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMy44MiwtMzlDNy4xOSwtMzkgMTguNDQsLTM5IDMwLjEyLC0zOSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzMC4zMSwtNDIuNSA0MC4zMSwtMzkgMzAuMzEsLTM1LjUgMzAuMzEsLTQyLjUiLz4KPC9nPgo8IS0tIDEgLS0+CjxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyMDMuNiIgY3k9Ii02MSIgcng9IjE4IiByeT0iMTgiLz4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjIwMy42IiBjeT0iLTYxIiByeD0iMjIiIHJ5PSIyMiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDMuNiIgeT0iLTU3LjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+MTwvdGV4dD4KPC9nPgo8IS0tIDAmIzQ1OyZndDsxIC0tPgo8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjAmIzQ1OyZndDsxPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik04Mi42MywtNDguMjdDODguODUsLTUwLjkgOTUuODksLTUzLjQ3IDEwMi42LC01NSAxMjUuMTYsLTYwLjE2IDE1MS4yOSwtNjEuNTcgMTcxLjE4LC02MS43NCIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjE3MS4yNSwtNjUuMjQgMTgxLjI0LC02MS43MyAxNzEuMjQsLTU4LjI0IDE3MS4yNSwtNjUuMjQiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTMzLjEiIHk9Ii02NC44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPnN0YXJ0PC90ZXh0Pgo8L2c+CjwhLS0gMSYjNDU7Jmd0OzAgLS0+CjxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MSYjNDU7Jmd0OzA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImdyZWVuIiBkPSJNMTg2LjE3LC00Ny41MUMxNzkuNTcsLTQyLjkyIDE3MS42MywtMzguMzUgMTYzLjYsLTM2IDE0MS4xNCwtMjkuNDIgMTE0LjYxLC0zMC42IDk0LjUyLC0zMy4xOSIvPgo8cG9seWdvbiBmaWxsPSJncmVlbiIgc3Ryb2tlPSJncmVlbiIgcG9pbnRzPSI5My43NiwtMjkuNzcgODQuMzgsLTM0LjY5IDk0Ljc4LC0zNi42OSA5My43NiwtMjkuNzciLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTMzLjEiIHk9Ii0zOS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmF1dG9fZmluaXNoPC90ZXh0Pgo8L2c+CjwhLS0gMiAtLT4KPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4yPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjM0MC42IiBjeT0iLTIyIiByeD0iMTgiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNDAuNiIgeT0iLTE4LjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+MjwvdGV4dD4KPC9nPgo8IS0tIDEmIzQ1OyZndDsyIC0tPgo8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjEmIzQ1OyZndDsyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmVlbiIgZD0iTTIyNS4xLC01NS4wOEMyNDguNywtNDguMjYgMjg3LjUxLC0zNy4wNSAzMTMuMzEsLTI5LjU5Ii8+Cjxwb2x5Z29uIGZpbGw9ImdyZWVuIiBzdHJva2U9ImdyZWVuIiBwb2ludHM9IjMxNC41MiwtMzIuODkgMzIzLjE2LC0yNi43NSAzMTIuNTgsLTI2LjE2IDMxNC41MiwtMzIuODkiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjc0LjEiIHk9Ii01Mi44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmJyZWFrZG93bjwvdGV4dD4KPC9nPgo8IS0tIDImIzQ1OyZndDswIC0tPgo8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjImIzQ1OyZndDswPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik0zMjIuNjIsLTIwLjYzQzMwMC4zNiwtMTguOTEgMjYwLjA5LC0xNi4wNiAyMjUuNiwtMTUgMTcwLjcsLTEzLjMyIDE1Ni4xNSwtMTQuNzcgMTAyLjYsLTI3IDk5LjU5LC0yNy42OSA5Ni40NywtMjguNDkgOTMuMzcsLTI5LjM1Ii8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iOTIuMjksLTI2LjAyIDgzLjY5LC0zMi4yIDk0LjI3LC0zMi43MyA5Mi4yOSwtMjYuMDIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAzLjYiIHk9Ii0xOC44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZpeDwvdGV4dD4KPC9nPgo8IS0tIDMgLS0+CjxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MzwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0MzUuNiIgY3k9Ii0yMiIgcng9IjE4IiByeT0iMTgiLz4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjQzNS42IiBjeT0iLTIyIiByeD0iMjIiIHJ5PSIyMiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MzUuNiIgeT0iLTE4LjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+MzwvdGV4dD4KPC9nPgo8IS0tIDImIzQ1OyZndDszIC0tPgo8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjImIzQ1OyZndDszPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik0zNTguNjYsLTIyQzM3MS4wNiwtMjIgMzg4LjIyLC0yMiA0MDMuMDksLTIyIi8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iNDAzLjQxLC0yNS41IDQxMy40MSwtMjIgNDAzLjQxLC0xOC41IDQwMy40MSwtMjUuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzODYuMSIgeT0iLTI1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+c2VsbDwvdGV4dD4KPC9nPgo8L2c+Cjwvc3ZnPgo=\" >" ], "text/plain": [ "<pytct.automaton_display.AutomatonDisplay at 0x78e58b663850>" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.subautomaton('S1','PRINTER_SELL',[],[(1,'manual_stop',0)])\n", "#create subautomaton S1 by removing from PRINTER_SELL \n", "#[state list] and [transition list]\n", "\n", "pytct.display_automaton('S1',color=True)\n", "#plot S1.DES with color coding" ] }, { "cell_type": "code", "execution_count": 4, "id": "dffd7084-e234-4170-bfb8-ce68fbc5f8ff", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.is_controllable('PRINTER_SELL','S1')\n", "#check if S1 is controllable wrt. PRINTER_SELL" ] }, { "cell_type": "code", "execution_count": 5, "id": "b91e36f5-b192-486b-9b16-65f6479245a2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.uncontrollable_states('PRINTER_SELL','S1')\n", "#compute the set of uncontrollable states" ] }, { "cell_type": "code", "execution_count": 6, "id": "0c7d1961-2f38-4414-a740-0a4db2c662a6", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/lib/python3.11/site-packages/pytct/des_check.py:65: UserWarning: Too many number of state. It is recommend to set 2\n", " warnings.warn(f\"Too many number of state. It is recommend to set {max_state}\")\n" ] }, { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "<!-- Generated by graphviz version 2.43.0 (0)\n", " -->\n", "<!-- Title: finite_state_machine Pages: 1 -->\n", "<svg width=\"283pt\" height=\"155pt\"\n", " viewBox=\"0.00 0.00 283.00 155.14\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 151.14)\">\n", "<title>finite_state_machine</title>\n", "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-151.14 279,-151.14 279,4 -4,4\"/>\n", "<!-- _a -->\n", "<g id=\"node1\" class=\"node\">\n", "<title>_a</title>\n", "<ellipse fill=\"white\" stroke=\"white\" cx=\"22\" cy=\"-29.14\" rx=\"1.8\" ry=\"1.8\"/>\n", "</g>\n", "<!-- 0 -->\n", "<g id=\"node2\" class=\"node\">\n", "<title>0</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"103\" cy=\"-29.14\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"103\" cy=\"-29.14\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"103\" y=\"-25.44\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n", "</g>\n", "<!-- _a->0 -->\n", "<g id=\"edge1\" class=\"edge\">\n", "<title>_a->0</title>\n", "<path fill=\"none\" stroke=\"black\" d=\"M23.89,-29.14C28.57,-29.14 50.95,-29.14 70.56,-29.14\"/>\n", "<polygon fill=\"black\" stroke=\"black\" points=\"70.75,-32.64 80.75,-29.14 70.75,-25.64 70.75,-32.64\"/>\n", "</g>\n", "<!-- 1 -->\n", "<g id=\"node3\" class=\"node\">\n", "<title>1</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"253\" cy=\"-29.14\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"253\" cy=\"-29.14\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"253\" y=\"-25.44\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n", "</g>\n", "<!-- 0->1 -->\n", "<g id=\"edge2\" class=\"edge\">\n", "<title>0->1</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M122.98,-38.66C129.2,-41.3 136.25,-43.81 143,-45.14 173.52,-51.16 182.48,-51.16 213,-45.14 216.48,-44.46 220.04,-43.46 223.53,-42.29\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"224.93,-45.5 233.02,-38.66 222.43,-38.96 224.93,-45.5\"/>\n", "<text text-anchor=\"middle\" x=\"178\" y=\"-52.94\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 1->0 -->\n", "<g id=\"edge3\" class=\"edge\">\n", "<title>1->0</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M230.97,-27.23C225.15,-26.78 218.84,-26.37 213,-26.14 181.91,-24.95 174.09,-24.95 143,-26.14 140.45,-26.24 137.8,-26.38 135.15,-26.53\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"134.77,-23.05 125.03,-27.23 135.25,-30.03 134.77,-23.05\"/>\n", "<text text-anchor=\"middle\" x=\"178\" y=\"-29.94\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 1->0 -->\n", "<g id=\"edge4\" class=\"edge\">\n", "<title>1->0</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M234.65,-16.24C228.19,-12.18 220.58,-8.21 213,-6.14 182.99,2.05 173.01,2.05 143,-6.14 138.62,-7.34 134.22,-9.17 130.05,-11.28\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"128.31,-8.25 121.35,-16.24 131.77,-14.33 128.31,-8.25\"/>\n", "<text text-anchor=\"middle\" x=\"178\" y=\"-9.94\" font-family=\"Times,serif\" font-size=\"14.00\">manual_stop</text>\n", "</g>\n", "<!-- 2 -->\n", "<g id=\"node4\" class=\"node\">\n", "<title>2</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"22\" cy=\"-67.14\" rx=\"18\" ry=\"18\"/>\n", "<text text-anchor=\"middle\" x=\"22\" y=\"-63.44\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", "</g>\n", "<!-- 3 -->\n", "<g id=\"node5\" class=\"node\">\n", "<title>3</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"22\" cy=\"-125.14\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"22\" cy=\"-125.14\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"22\" y=\"-121.44\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n", "</g>\n", "</g>\n", "</svg>\n" ], "text/html": [ "<img width=\"100%\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDMuMCAoMCkKIC0tPgo8IS0tIFRpdGxlOiBmaW5pdGVfc3RhdGVfbWFjaGluZSBQYWdlczogMSAtLT4KPHN2ZyB3aWR0aD0iMjgzcHQiIGhlaWdodD0iMTU1cHQiCiB2aWV3Qm94PSIwLjAwIDAuMDAgMjgzLjAwIDE1NS4xNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CjxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCAxNTEuMTQpIj4KPHRpdGxlPmZpbml0ZV9zdGF0ZV9tYWNoaW5lPC90aXRsZT4KPHBvbHlnb24gZmlsbD0id2hpdGUiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtMTUxLjE0IDI3OSwtMTUxLjE0IDI3OSw0IC00LDQiLz4KPCEtLSBfYSAtLT4KPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5fYTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9IndoaXRlIiBzdHJva2U9IndoaXRlIiBjeD0iMjIiIGN5PSItMjkuMTQiIHJ4PSIxLjgiIHJ5PSIxLjgiLz4KPC9nPgo8IS0tIDAgLS0+CjxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxMDMiIGN5PSItMjkuMTQiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxMDMiIGN5PSItMjkuMTQiIHJ4PSIyMiIgcnk9IjIyIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEwMyIgeT0iLTI1LjQ0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjA8L3RleHQ+CjwvZz4KPCEtLSBfYSYjNDU7Jmd0OzAgLS0+CjxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+X2EmIzQ1OyZndDswPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIzLjg5LC0yOS4xNEMyOC41NywtMjkuMTQgNTAuOTUsLTI5LjE0IDcwLjU2LC0yOS4xNCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI3MC43NSwtMzIuNjQgODAuNzUsLTI5LjE0IDcwLjc1LC0yNS42NCA3MC43NSwtMzIuNjQiLz4KPC9nPgo8IS0tIDEgLS0+CjxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyNTMiIGN5PSItMjkuMTQiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyNTMiIGN5PSItMjkuMTQiIHJ4PSIyMiIgcnk9IjIyIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI1MyIgeT0iLTI1LjQ0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjE8L3RleHQ+CjwvZz4KPCEtLSAwJiM0NTsmZ3Q7MSAtLT4KPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4wJiM0NTsmZ3Q7MTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNMTIyLjk4LC0zOC42NkMxMjkuMiwtNDEuMyAxMzYuMjUsLTQzLjgxIDE0MywtNDUuMTQgMTczLjUyLC01MS4xNiAxODIuNDgsLTUxLjE2IDIxMywtNDUuMTQgMjE2LjQ4LC00NC40NiAyMjAuMDQsLTQzLjQ2IDIyMy41MywtNDIuMjkiLz4KPHBvbHlnb24gZmlsbD0icmVkIiBzdHJva2U9InJlZCIgcG9pbnRzPSIyMjQuOTMsLTQ1LjUgMjMzLjAyLC0zOC42NiAyMjIuNDMsLTM4Ljk2IDIyNC45MywtNDUuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNzgiIHk9Ii01Mi45NCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5zdGFydDwvdGV4dD4KPC9nPgo8IS0tIDEmIzQ1OyZndDswIC0tPgo8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjEmIzQ1OyZndDswPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmVlbiIgZD0iTTIzMC45NywtMjcuMjNDMjI1LjE1LC0yNi43OCAyMTguODQsLTI2LjM3IDIxMywtMjYuMTQgMTgxLjkxLC0yNC45NSAxNzQuMDksLTI0Ljk1IDE0MywtMjYuMTQgMTQwLjQ1LC0yNi4yNCAxMzcuOCwtMjYuMzggMTM1LjE1LC0yNi41MyIvPgo8cG9seWdvbiBmaWxsPSJncmVlbiIgc3Ryb2tlPSJncmVlbiIgcG9pbnRzPSIxMzQuNzcsLTIzLjA1IDEyNS4wMywtMjcuMjMgMTM1LjI1LC0zMC4wMyAxMzQuNzcsLTIzLjA1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE3OCIgeT0iLTI5Ljk0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmF1dG9fZmluaXNoPC90ZXh0Pgo8L2c+CjwhLS0gMSYjNDU7Jmd0OzAgLS0+CjxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MSYjNDU7Jmd0OzA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9InJlZCIgZD0iTTIzNC42NSwtMTYuMjRDMjI4LjE5LC0xMi4xOCAyMjAuNTgsLTguMjEgMjEzLC02LjE0IDE4Mi45OSwyLjA1IDE3My4wMSwyLjA1IDE0MywtNi4xNCAxMzguNjIsLTcuMzQgMTM0LjIyLC05LjE3IDEzMC4wNSwtMTEuMjgiLz4KPHBvbHlnb24gZmlsbD0icmVkIiBzdHJva2U9InJlZCIgcG9pbnRzPSIxMjguMzEsLTguMjUgMTIxLjM1LC0xNi4yNCAxMzEuNzcsLTE0LjMzIDEyOC4zMSwtOC4yNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNzgiIHk9Ii05Ljk0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPm1hbnVhbF9zdG9wPC90ZXh0Pgo8L2c+CjwhLS0gMiAtLT4KPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4yPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjIyIiBjeT0iLTY3LjE0IiByeD0iMTgiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMiIgeT0iLTYzLjQ0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjI8L3RleHQ+CjwvZz4KPCEtLSAzIC0tPgo8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjM8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMjIiIGN5PSItMTI1LjE0IiByeD0iMTgiIHJ5PSIxOCIvPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMjIiIGN5PSItMTI1LjE0IiByeD0iMjIiIHJ5PSIyMiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMiIgeT0iLTEyMS40NCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj4zPC90ZXh0Pgo8L2c+CjwvZz4KPC9zdmc+Cg==\" >" ], "text/plain": [ "<pytct.automaton_display.AutomatonDisplay at 0x78e58b66b6d0>" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.subautomaton('S2','PRINTER_SELL',[2],[])\n", "#create subautomaton S2 by removing from PRINTER_SELL \n", "# [state list] and [transition list]\n", "\n", "pytct.display_automaton('S2',color=True)\n", "#plot S2.DES with color coding" ] }, { "cell_type": "code", "execution_count": 7, "id": "e5114885-d6ba-4d9b-93cd-5ab00387c37f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.is_controllable('PRINTER_SELL','S2')\n", "#check if S1 is controllable wrt. PRINTER_SELL" ] }, { "cell_type": "code", "execution_count": 8, "id": "f5946698-0b04-4a10-aaae-9907a8e46acd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.uncontrollable_states('PRINTER_SELL','S2')\n", "#compute the set of uncontrollable states" ] }, { "cell_type": "code", "execution_count": 9, "id": "a0060523-4eb5-40df-b6d0-b09f75940e37", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "<!-- Generated by graphviz version 2.43.0 (0)\n", " -->\n", "<!-- Title: finite_state_machine Pages: 1 -->\n", "<svg width=\"388pt\" height=\"184pt\"\n", " viewBox=\"0.00 0.00 387.60 184.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 180)\">\n", "<title>finite_state_machine</title>\n", "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-180 383.6,-180 383.6,4 -4,4\"/>\n", "<!-- _a -->\n", "<g id=\"node1\" class=\"node\">\n", "<title>_a</title>\n", "<ellipse fill=\"white\" stroke=\"white\" cx=\"1.8\" cy=\"-22\" rx=\"1.8\" ry=\"1.8\"/>\n", "</g>\n", "<!-- 0 -->\n", "<g id=\"node2\" class=\"node\">\n", "<title>0</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"62.6\" cy=\"-22\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"62.6\" cy=\"-22\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"62.6\" y=\"-18.3\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n", "</g>\n", "<!-- _a->0 -->\n", "<g id=\"edge1\" class=\"edge\">\n", "<title>_a->0</title>\n", "<path fill=\"none\" stroke=\"black\" d=\"M3.82,-22C7.19,-22 18.44,-22 30.12,-22\"/>\n", "<polygon fill=\"black\" stroke=\"black\" points=\"30.31,-25.5 40.31,-22 30.31,-18.5 30.31,-25.5\"/>\n", "</g>\n", "<!-- 0->0 -->\n", "<g id=\"edge2\" class=\"edge\">\n", "<title>0->0</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M60.13,-44.21C59.93,-53.8 60.75,-62 62.6,-62 63.73,-62 64.47,-58.95 64.84,-54.4\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"68.34,-54.29 65.07,-44.21 61.34,-54.13 68.34,-54.29\"/>\n", "<text text-anchor=\"middle\" x=\"62.6\" y=\"-65.8\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 0->0 -->\n", "<g id=\"edge3\" class=\"edge\">\n", "<title>0->0</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M58.33,-43.72C56.57,-61.52 57.99,-80 62.6,-80 66.31,-80 67.95,-68.03 67.54,-54.08\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"71,-53.47 66.87,-43.72 64.02,-53.92 71,-53.47\"/>\n", "<text text-anchor=\"middle\" x=\"62.6\" y=\"-83.8\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 0->0 -->\n", "<g id=\"edge5\" class=\"edge\">\n", "<title>0->0</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M57.15,-43.4C53.17,-68.6 54.98,-98 62.6,-98 69.21,-98 71.45,-75.89 69.33,-53.58\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"72.77,-52.88 68.05,-43.4 65.82,-53.76 72.77,-52.88\"/>\n", "<text text-anchor=\"middle\" x=\"62.6\" y=\"-101.8\" font-family=\"Times,serif\" font-size=\"14.00\">manual_stop</text>\n", "</g>\n", "<!-- 1 -->\n", "<g id=\"node3\" class=\"node\">\n", "<title>1</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"203.6\" cy=\"-22\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"203.6\" cy=\"-22\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"203.6\" y=\"-18.3\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n", "</g>\n", "<!-- 0->1 -->\n", "<g id=\"edge4\" class=\"edge\">\n", "<title>0->1</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M84.71,-22C107.67,-22 144.63,-22 171.04,-22\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"171.29,-25.5 181.29,-22 171.29,-18.5 171.29,-25.5\"/>\n", "<text text-anchor=\"middle\" x=\"133.1\" y=\"-25.8\" font-family=\"Times,serif\" font-size=\"14.00\">breakdown</text>\n", "</g>\n", "<!-- 1->1 -->\n", "<g id=\"edge6\" class=\"edge\">\n", "<title>1->1</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M200.37,-43.81C200.06,-53.56 201.14,-62 203.6,-62 205.14,-62 206.14,-58.7 206.59,-53.85\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"210.09,-53.89 206.83,-43.81 203.09,-53.72 210.09,-53.89\"/>\n", "<text text-anchor=\"middle\" x=\"203.6\" y=\"-65.8\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 1->1 -->\n", "<g id=\"edge7\" class=\"edge\">\n", "<title>1->1</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M198.04,-43.42C195.66,-61.31 197.52,-80 203.6,-80 208.54,-80 210.69,-67.66 210.05,-53.44\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"213.53,-53.07 209.16,-43.42 206.56,-53.69 213.53,-53.07\"/>\n", "<text text-anchor=\"middle\" x=\"203.6\" y=\"-83.8\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 1->1 -->\n", "<g id=\"edge9\" class=\"edge\">\n", "<title>1->1</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M196.53,-43.01C191.2,-68.3 193.55,-98 203.6,-98 212.35,-98 215.27,-75.46 212.35,-52.94\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"215.79,-52.28 210.67,-43.01 208.88,-53.45 215.79,-52.28\"/>\n", "<text text-anchor=\"middle\" x=\"203.6\" y=\"-101.8\" font-family=\"Times,serif\" font-size=\"14.00\">manual_stop</text>\n", "</g>\n", "<!-- 1->1 -->\n", "<g id=\"edge10\" class=\"edge\">\n", "<title>1->1</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M195.47,-42.78C186.74,-75.03 189.45,-116 203.6,-116 216.31,-116 219.79,-82.93 214.03,-52.82\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"217.38,-51.74 211.73,-42.78 210.55,-53.31 217.38,-51.74\"/>\n", "<text text-anchor=\"middle\" x=\"203.6\" y=\"-119.8\" font-family=\"Times,serif\" font-size=\"14.00\">fix</text>\n", "</g>\n", "<!-- 2 -->\n", "<g id=\"node4\" class=\"node\">\n", "<title>2</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"344.6\" cy=\"-22\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"344.6\" cy=\"-22\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"344.6\" y=\"-18.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", "</g>\n", "<!-- 1->2 -->\n", "<g id=\"edge8\" class=\"edge\">\n", "<title>1->2</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M225.71,-22C248.67,-22 285.63,-22 312.04,-22\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"312.29,-25.5 322.29,-22 312.29,-18.5 312.29,-25.5\"/>\n", "<text text-anchor=\"middle\" x=\"274.1\" y=\"-25.8\" font-family=\"Times,serif\" font-size=\"14.00\">breakdown</text>\n", "</g>\n", "<!-- 2->2 -->\n", "<g id=\"edge11\" class=\"edge\">\n", "<title>2->2</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M341.37,-43.81C341.06,-53.56 342.14,-62 344.6,-62 346.14,-62 347.14,-58.7 347.59,-53.85\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"351.09,-53.89 347.83,-43.81 344.09,-53.72 351.09,-53.89\"/>\n", "<text text-anchor=\"middle\" x=\"344.6\" y=\"-65.8\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 2->2 -->\n", "<g id=\"edge12\" class=\"edge\">\n", "<title>2->2</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M339.04,-43.42C336.66,-61.31 338.52,-80 344.6,-80 349.54,-80 351.69,-67.66 351.05,-53.44\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"354.53,-53.07 350.16,-43.42 347.56,-53.69 354.53,-53.07\"/>\n", "<text text-anchor=\"middle\" x=\"344.6\" y=\"-83.8\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 2->2 -->\n", "<g id=\"edge13\" class=\"edge\">\n", "<title>2->2</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M337.53,-43.01C332.2,-68.3 334.55,-98 344.6,-98 353.35,-98 356.27,-75.46 353.35,-52.94\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"356.79,-52.28 351.67,-43.01 349.88,-53.45 356.79,-52.28\"/>\n", "<text text-anchor=\"middle\" x=\"344.6\" y=\"-101.8\" font-family=\"Times,serif\" font-size=\"14.00\">manual_stop</text>\n", "</g>\n", "<!-- 2->2 -->\n", "<g id=\"edge14\" class=\"edge\">\n", "<title>2->2</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M336.47,-42.78C327.74,-75.03 330.45,-116 344.6,-116 357.31,-116 360.79,-82.93 355.03,-52.82\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"358.38,-51.74 352.73,-42.78 351.55,-53.31 358.38,-51.74\"/>\n", "<text text-anchor=\"middle\" x=\"344.6\" y=\"-119.8\" font-family=\"Times,serif\" font-size=\"14.00\">sell</text>\n", "</g>\n", "</g>\n", "</svg>\n" ], "text/html": [ "<img width=\"100%\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDMuMCAoMCkKIC0tPgo8IS0tIFRpdGxlOiBmaW5pdGVfc3RhdGVfbWFjaGluZSBQYWdlczogMSAtLT4KPHN2ZyB3aWR0aD0iMzg4cHQiIGhlaWdodD0iMTg0cHQiCiB2aWV3Qm94PSIwLjAwIDAuMDAgMzg3LjYwIDE4NC4wMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CjxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCAxODApIj4KPHRpdGxlPmZpbml0ZV9zdGF0ZV9tYWNoaW5lPC90aXRsZT4KPHBvbHlnb24gZmlsbD0id2hpdGUiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtMTgwIDM4My42LC0xODAgMzgzLjYsNCAtNCw0Ii8+CjwhLS0gX2EgLS0+CjxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+X2E8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSJ3aGl0ZSIgY3g9IjEuOCIgY3k9Ii0yMiIgcng9IjEuOCIgcnk9IjEuOCIvPgo8L2c+CjwhLS0gMCAtLT4KPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4wPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjYyLjYiIGN5PSItMjIiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI2Mi42IiBjeT0iLTIyIiByeD0iMjIiIHJ5PSIyMiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2Mi42IiB5PSItMTguMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj4wPC90ZXh0Pgo8L2c+CjwhLS0gX2EmIzQ1OyZndDswIC0tPgo8ZyBpZD0iZWRnZTEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPl9hJiM0NTsmZ3Q7MDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zLjgyLC0yMkM3LjE5LC0yMiAxOC40NCwtMjIgMzAuMTIsLTIyIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMwLjMxLC0yNS41IDQwLjMxLC0yMiAzMC4zMSwtMTguNSAzMC4zMSwtMjUuNSIvPgo8L2c+CjwhLS0gMCYjNDU7Jmd0OzAgLS0+CjxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MCYjNDU7Jmd0OzA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImdyZWVuIiBkPSJNNjAuMTMsLTQ0LjIxQzU5LjkzLC01My44IDYwLjc1LC02MiA2Mi42LC02MiA2My43MywtNjIgNjQuNDcsLTU4Ljk1IDY0Ljg0LC01NC40Ii8+Cjxwb2x5Z29uIGZpbGw9ImdyZWVuIiBzdHJva2U9ImdyZWVuIiBwb2ludHM9IjY4LjM0LC01NC4yOSA2NS4wNywtNDQuMjEgNjEuMzQsLTU0LjEzIDY4LjM0LC01NC4yOSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2Mi42IiB5PSItNjUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5hdXRvX2ZpbmlzaDwvdGV4dD4KPC9nPgo8IS0tIDAmIzQ1OyZndDswIC0tPgo8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjAmIzQ1OyZndDswPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik01OC4zMywtNDMuNzJDNTYuNTcsLTYxLjUyIDU3Ljk5LC04MCA2Mi42LC04MCA2Ni4zMSwtODAgNjcuOTUsLTY4LjAzIDY3LjU0LC01NC4wOCIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjcxLC01My40NyA2Ni44NywtNDMuNzIgNjQuMDIsLTUzLjkyIDcxLC01My40NyIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2Mi42IiB5PSItODMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5zdGFydDwvdGV4dD4KPC9nPgo8IS0tIDAmIzQ1OyZndDswIC0tPgo8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjAmIzQ1OyZndDswPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik01Ny4xNSwtNDMuNEM1My4xNywtNjguNiA1NC45OCwtOTggNjIuNiwtOTggNjkuMjEsLTk4IDcxLjQ1LC03NS44OSA2OS4zMywtNTMuNTgiLz4KPHBvbHlnb24gZmlsbD0icmVkIiBzdHJva2U9InJlZCIgcG9pbnRzPSI3Mi43NywtNTIuODggNjguMDUsLTQzLjQgNjUuODIsLTUzLjc2IDcyLjc3LC01Mi44OCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2Mi42IiB5PSItMTAxLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+bWFudWFsX3N0b3A8L3RleHQ+CjwvZz4KPCEtLSAxIC0tPgo8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMjAzLjYiIGN5PSItMjIiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyMDMuNiIgY3k9Ii0yMiIgcng9IjIyIiByeT0iMjIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAzLjYiIHk9Ii0xOC4zIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjE8L3RleHQ+CjwvZz4KPCEtLSAwJiM0NTsmZ3Q7MSAtLT4KPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4wJiM0NTsmZ3Q7MTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iZ3JlZW4iIGQ9Ik04NC43MSwtMjJDMTA3LjY3LC0yMiAxNDQuNjMsLTIyIDE3MS4wNCwtMjIiLz4KPHBvbHlnb24gZmlsbD0iZ3JlZW4iIHN0cm9rZT0iZ3JlZW4iIHBvaW50cz0iMTcxLjI5LC0yNS41IDE4MS4yOSwtMjIgMTcxLjI5LC0xOC41IDE3MS4yOSwtMjUuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMzMuMSIgeT0iLTI1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+YnJlYWtkb3duPC90ZXh0Pgo8L2c+CjwhLS0gMSYjNDU7Jmd0OzEgLS0+CjxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MSYjNDU7Jmd0OzE8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImdyZWVuIiBkPSJNMjAwLjM3LC00My44MUMyMDAuMDYsLTUzLjU2IDIwMS4xNCwtNjIgMjAzLjYsLTYyIDIwNS4xNCwtNjIgMjA2LjE0LC01OC43IDIwNi41OSwtNTMuODUiLz4KPHBvbHlnb24gZmlsbD0iZ3JlZW4iIHN0cm9rZT0iZ3JlZW4iIHBvaW50cz0iMjEwLjA5LC01My44OSAyMDYuODMsLTQzLjgxIDIwMy4wOSwtNTMuNzIgMjEwLjA5LC01My44OSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDMuNiIgeT0iLTY1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+YXV0b19maW5pc2g8L3RleHQ+CjwvZz4KPCEtLSAxJiM0NTsmZ3Q7MSAtLT4KPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xJiM0NTsmZ3Q7MTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNMTk4LjA0LC00My40MkMxOTUuNjYsLTYxLjMxIDE5Ny41MiwtODAgMjAzLjYsLTgwIDIwOC41NCwtODAgMjEwLjY5LC02Ny42NiAyMTAuMDUsLTUzLjQ0Ii8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iMjEzLjUzLC01My4wNyAyMDkuMTYsLTQzLjQyIDIwNi41NiwtNTMuNjkgMjEzLjUzLC01My4wNyIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDMuNiIgeT0iLTgzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+c3RhcnQ8L3RleHQ+CjwvZz4KPCEtLSAxJiM0NTsmZ3Q7MSAtLT4KPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xJiM0NTsmZ3Q7MTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNMTk2LjUzLC00My4wMUMxOTEuMiwtNjguMyAxOTMuNTUsLTk4IDIwMy42LC05OCAyMTIuMzUsLTk4IDIxNS4yNywtNzUuNDYgMjEyLjM1LC01Mi45NCIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjIxNS43OSwtNTIuMjggMjEwLjY3LC00My4wMSAyMDguODgsLTUzLjQ1IDIxNS43OSwtNTIuMjgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAzLjYiIHk9Ii0xMDEuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5tYW51YWxfc3RvcDwvdGV4dD4KPC9nPgo8IS0tIDEmIzQ1OyZndDsxIC0tPgo8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xJiM0NTsmZ3Q7MTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNMTk1LjQ3LC00Mi43OEMxODYuNzQsLTc1LjAzIDE4OS40NSwtMTE2IDIwMy42LC0xMTYgMjE2LjMxLC0xMTYgMjE5Ljc5LC04Mi45MyAyMTQuMDMsLTUyLjgyIi8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iMjE3LjM4LC01MS43NCAyMTEuNzMsLTQyLjc4IDIxMC41NSwtNTMuMzEgMjE3LjM4LC01MS43NCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDMuNiIgeT0iLTExOS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZpeDwvdGV4dD4KPC9nPgo8IS0tIDIgLS0+CjxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MjwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIzNDQuNiIgY3k9Ii0yMiIgcng9IjE4IiByeT0iMTgiLz4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjM0NC42IiBjeT0iLTIyIiByeD0iMjIiIHJ5PSIyMiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNDQuNiIgeT0iLTE4LjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+MjwvdGV4dD4KPC9nPgo8IS0tIDEmIzQ1OyZndDsyIC0tPgo8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjEmIzQ1OyZndDsyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmVlbiIgZD0iTTIyNS43MSwtMjJDMjQ4LjY3LC0yMiAyODUuNjMsLTIyIDMxMi4wNCwtMjIiLz4KPHBvbHlnb24gZmlsbD0iZ3JlZW4iIHN0cm9rZT0iZ3JlZW4iIHBvaW50cz0iMzEyLjI5LC0yNS41IDMyMi4yOSwtMjIgMzEyLjI5LC0xOC41IDMxMi4yOSwtMjUuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzQuMSIgeT0iLTI1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+YnJlYWtkb3duPC90ZXh0Pgo8L2c+CjwhLS0gMiYjNDU7Jmd0OzIgLS0+CjxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjImIzQ1OyZndDsyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmVlbiIgZD0iTTM0MS4zNywtNDMuODFDMzQxLjA2LC01My41NiAzNDIuMTQsLTYyIDM0NC42LC02MiAzNDYuMTQsLTYyIDM0Ny4xNCwtNTguNyAzNDcuNTksLTUzLjg1Ii8+Cjxwb2x5Z29uIGZpbGw9ImdyZWVuIiBzdHJva2U9ImdyZWVuIiBwb2ludHM9IjM1MS4wOSwtNTMuODkgMzQ3LjgzLC00My44MSAzNDQuMDksLTUzLjcyIDM1MS4wOSwtNTMuODkiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzQ0LjYiIHk9Ii02NS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmF1dG9fZmluaXNoPC90ZXh0Pgo8L2c+CjwhLS0gMiYjNDU7Jmd0OzIgLS0+CjxnIGlkPSJlZGdlMTIiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjImIzQ1OyZndDsyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik0zMzkuMDQsLTQzLjQyQzMzNi42NiwtNjEuMzEgMzM4LjUyLC04MCAzNDQuNiwtODAgMzQ5LjU0LC04MCAzNTEuNjksLTY3LjY2IDM1MS4wNSwtNTMuNDQiLz4KPHBvbHlnb24gZmlsbD0icmVkIiBzdHJva2U9InJlZCIgcG9pbnRzPSIzNTQuNTMsLTUzLjA3IDM1MC4xNiwtNDMuNDIgMzQ3LjU2LC01My42OSAzNTQuNTMsLTUzLjA3Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM0NC42IiB5PSItODMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5zdGFydDwvdGV4dD4KPC9nPgo8IS0tIDImIzQ1OyZndDsyIC0tPgo8ZyBpZD0iZWRnZTEzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4yJiM0NTsmZ3Q7MjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNMzM3LjUzLC00My4wMUMzMzIuMiwtNjguMyAzMzQuNTUsLTk4IDM0NC42LC05OCAzNTMuMzUsLTk4IDM1Ni4yNywtNzUuNDYgMzUzLjM1LC01Mi45NCIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjM1Ni43OSwtNTIuMjggMzUxLjY3LC00My4wMSAzNDkuODgsLTUzLjQ1IDM1Ni43OSwtNTIuMjgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzQ0LjYiIHk9Ii0xMDEuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5tYW51YWxfc3RvcDwvdGV4dD4KPC9nPgo8IS0tIDImIzQ1OyZndDsyIC0tPgo8ZyBpZD0iZWRnZTE0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4yJiM0NTsmZ3Q7MjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNMzM2LjQ3LC00Mi43OEMzMjcuNzQsLTc1LjAzIDMzMC40NSwtMTE2IDM0NC42LC0xMTYgMzU3LjMxLC0xMTYgMzYwLjc5LC04Mi45MyAzNTUuMDMsLTUyLjgyIi8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iMzU4LjM4LC01MS43NCAzNTIuNzMsLTQyLjc4IDM1MS41NSwtNTMuMzEgMzU4LjM4LC01MS43NCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNDQuNiIgeT0iLTExOS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPnNlbGw8L3RleHQ+CjwvZz4KPC9nPgo8L3N2Zz4K\" >" ], "text/plain": [ "<pytct.automaton_display.AutomatonDisplay at 0x78e58b60b450>" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# creat automaton E1\n", "\n", "statenum=3 #number of states\n", "#states are sequentially labeled 0,1,...,statenum\n", "#initial state is labeled 0\n", "\n", "trans=[(0,'start',0,'c'),\n", " (0,'auto_finish',0,'u'),\n", " (0,'manual_stop',0,'c'),\n", " (0,'breakdown',1,'u'),\n", " (1,'start',1,'c'),\n", " (1,'auto_finish',1,'u'),\n", " (1,'manual_stop',1,'c'),\n", " (1,'fix',1,'c'),\n", " (1,'breakdown',2,'u'),\n", " (2,'start',2,'c'),\n", " (2,'auto_finish',2,'u'),\n", " (2,'manual_stop',2,'c'),\n", " (2,'sell',2,'c')] #set of transitions\n", "#each triple is (exit state, event label, entering state)\n", "#each event is either 'c' (controllable) or 'u' (uncontrollable)\n", "\n", "marker = [0,1,2] #set of marker states\n", "\n", "pytct.create('E1', statenum, trans, marker)\n", "#create automaton E1\n", "\n", "pytct.display_automaton('E1',color=True)\n", "#plot E1.DES with color coding" ] }, { "cell_type": "code", "execution_count": 10, "id": "32a50cc2-4042-4f2b-90e1-66626d3d6f10", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.is_controllable('PRINTER_SELL','E1')\n", "#check if E1 is controllable wrt. PRINTER_SELL" ] }, { "cell_type": "code", "execution_count": 11, "id": "fb1d4451-3dbf-4183-8c7a-c73a8c7550a1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.uncontrollable_states('PRINTER_SELL','E1')\n", "#compute the set of uncontrollable states" ] }, { "cell_type": "code", "execution_count": 12, "id": "e2b54ebf-3551-4ae4-a7dc-ef6b1a8255aa", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "<!-- Generated by graphviz version 2.43.0 (0)\n", " -->\n", "<!-- Title: finite_state_machine Pages: 1 -->\n", "<svg width=\"854pt\" height=\"72pt\"\n", " viewBox=\"0.00 0.00 853.60 72.14\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 68.14)\">\n", "<title>finite_state_machine</title>\n", "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-68.14 849.6,-68.14 849.6,4 -4,4\"/>\n", "<!-- _a -->\n", "<g id=\"node1\" class=\"node\">\n", "<title>_a</title>\n", "<ellipse fill=\"white\" stroke=\"white\" cx=\"1.8\" cy=\"-29.14\" rx=\"1.8\" ry=\"1.8\"/>\n", "</g>\n", "<!-- 0 -->\n", "<g id=\"node2\" class=\"node\">\n", "<title>0</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"62.6\" cy=\"-29.14\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"62.6\" cy=\"-29.14\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"62.6\" y=\"-25.44\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n", "</g>\n", "<!-- _a->0 -->\n", "<g id=\"edge1\" class=\"edge\">\n", "<title>_a->0</title>\n", "<path fill=\"none\" stroke=\"black\" d=\"M3.82,-29.14C7.19,-29.14 18.44,-29.14 30.12,-29.14\"/>\n", "<polygon fill=\"black\" stroke=\"black\" points=\"30.31,-32.64 40.31,-29.14 30.31,-25.64 30.31,-32.64\"/>\n", "</g>\n", "<!-- 1 -->\n", "<g id=\"node3\" class=\"node\">\n", "<title>1</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"212.6\" cy=\"-29.14\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"212.6\" cy=\"-29.14\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"212.6\" y=\"-25.44\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n", "</g>\n", "<!-- 0->1 -->\n", "<g id=\"edge2\" class=\"edge\">\n", "<title>0->1</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M82.58,-38.66C88.8,-41.3 95.85,-43.81 102.6,-45.14 133.12,-51.16 142.08,-51.16 172.6,-45.14 176.08,-44.46 179.64,-43.46 183.13,-42.29\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"184.53,-45.5 192.62,-38.66 182.03,-38.96 184.53,-45.5\"/>\n", "<text text-anchor=\"middle\" x=\"137.6\" y=\"-52.94\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 1->0 -->\n", "<g id=\"edge3\" class=\"edge\">\n", "<title>1->0</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M190.57,-27.23C184.75,-26.78 178.44,-26.37 172.6,-26.14 141.51,-24.95 133.69,-24.95 102.6,-26.14 100.05,-26.24 97.4,-26.38 94.75,-26.53\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"94.37,-23.05 84.63,-27.23 94.85,-30.03 94.37,-23.05\"/>\n", "<text text-anchor=\"middle\" x=\"137.6\" y=\"-29.94\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 1->0 -->\n", "<g id=\"edge5\" class=\"edge\">\n", "<title>1->0</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M194.25,-16.24C187.79,-12.18 180.18,-8.21 172.6,-6.14 142.59,2.05 132.61,2.05 102.6,-6.14 98.22,-7.34 93.82,-9.17 89.65,-11.28\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"87.91,-8.25 80.95,-16.24 91.37,-14.33 87.91,-8.25\"/>\n", "<text text-anchor=\"middle\" x=\"137.6\" y=\"-9.94\" font-family=\"Times,serif\" font-size=\"14.00\">manual_stop</text>\n", "</g>\n", "<!-- 2 -->\n", "<g id=\"node4\" class=\"node\">\n", "<title>2</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"349.6\" cy=\"-29.14\" rx=\"18\" ry=\"18\"/>\n", "<text text-anchor=\"middle\" x=\"349.6\" y=\"-25.44\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", "</g>\n", "<!-- 1->2 -->\n", "<g id=\"edge4\" class=\"edge\">\n", "<title>1->2</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M234.69,-29.14C258.05,-29.14 295.78,-29.14 321.36,-29.14\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"321.5,-32.64 331.5,-29.14 321.5,-25.64 321.5,-32.64\"/>\n", "<text text-anchor=\"middle\" x=\"283.1\" y=\"-32.94\" font-family=\"Times,serif\" font-size=\"14.00\">breakdown</text>\n", "</g>\n", "<!-- 3 -->\n", "<g id=\"node5\" class=\"node\">\n", "<title>3</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"441.6\" cy=\"-29.14\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"441.6\" cy=\"-29.14\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"441.6\" y=\"-25.44\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n", "</g>\n", "<!-- 2->3 -->\n", "<g id=\"edge6\" class=\"edge\">\n", "<title>2->3</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M367.95,-29.14C379.68,-29.14 395.49,-29.14 409.36,-29.14\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"409.5,-32.64 419.5,-29.14 409.5,-25.64 409.5,-32.64\"/>\n", "<text text-anchor=\"middle\" x=\"393.6\" y=\"-32.94\" font-family=\"Times,serif\" font-size=\"14.00\">fix</text>\n", "</g>\n", "<!-- 4 -->\n", "<g id=\"node6\" class=\"node\">\n", "<title>4</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"591.6\" cy=\"-29.14\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"591.6\" cy=\"-29.14\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"591.6\" y=\"-25.44\" font-family=\"Times,serif\" font-size=\"14.00\">4</text>\n", "</g>\n", "<!-- 3->4 -->\n", "<g id=\"edge7\" class=\"edge\">\n", "<title>3->4</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M461.58,-38.66C467.8,-41.3 474.85,-43.81 481.6,-45.14 512.12,-51.16 521.08,-51.16 551.6,-45.14 555.08,-44.46 558.64,-43.46 562.13,-42.29\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"563.53,-45.5 571.62,-38.66 561.03,-38.96 563.53,-45.5\"/>\n", "<text text-anchor=\"middle\" x=\"516.6\" y=\"-52.94\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 4->3 -->\n", "<g id=\"edge8\" class=\"edge\">\n", "<title>4->3</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M569.57,-27.23C563.75,-26.78 557.44,-26.37 551.6,-26.14 520.51,-24.95 512.69,-24.95 481.6,-26.14 479.05,-26.24 476.4,-26.38 473.75,-26.53\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"473.37,-23.05 463.63,-27.23 473.85,-30.03 473.37,-23.05\"/>\n", "<text text-anchor=\"middle\" x=\"516.6\" y=\"-29.94\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 4->3 -->\n", "<g id=\"edge10\" class=\"edge\">\n", "<title>4->3</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M573.25,-16.24C566.79,-12.18 559.18,-8.21 551.6,-6.14 521.59,2.05 511.61,2.05 481.6,-6.14 477.22,-7.34 472.82,-9.17 468.65,-11.28\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"466.91,-8.25 459.95,-16.24 470.37,-14.33 466.91,-8.25\"/>\n", "<text text-anchor=\"middle\" x=\"516.6\" y=\"-9.94\" font-family=\"Times,serif\" font-size=\"14.00\">manual_stop</text>\n", "</g>\n", "<!-- 5 -->\n", "<g id=\"node7\" class=\"node\">\n", "<title>5</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"728.6\" cy=\"-29.14\" rx=\"18\" ry=\"18\"/>\n", "<text text-anchor=\"middle\" x=\"728.6\" y=\"-25.44\" font-family=\"Times,serif\" font-size=\"14.00\">5</text>\n", "</g>\n", "<!-- 4->5 -->\n", "<g id=\"edge9\" class=\"edge\">\n", "<title>4->5</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M613.69,-29.14C637.05,-29.14 674.78,-29.14 700.36,-29.14\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"700.5,-32.64 710.5,-29.14 700.5,-25.64 700.5,-32.64\"/>\n", "<text text-anchor=\"middle\" x=\"662.1\" y=\"-32.94\" font-family=\"Times,serif\" font-size=\"14.00\">breakdown</text>\n", "</g>\n", "<!-- 6 -->\n", "<g id=\"node8\" class=\"node\">\n", "<title>6</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"823.6\" cy=\"-29.14\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"823.6\" cy=\"-29.14\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"823.6\" y=\"-25.44\" font-family=\"Times,serif\" font-size=\"14.00\">6</text>\n", "</g>\n", "<!-- 5->6 -->\n", "<g id=\"edge11\" class=\"edge\">\n", "<title>5->6</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M746.66,-29.14C759.06,-29.14 776.22,-29.14 791.09,-29.14\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"791.41,-32.64 801.41,-29.14 791.41,-25.64 791.41,-32.64\"/>\n", "<text text-anchor=\"middle\" x=\"774.1\" y=\"-32.94\" font-family=\"Times,serif\" font-size=\"14.00\">sell</text>\n", "</g>\n", "</g>\n", "</svg>\n" ], "text/html": [ "<img width=\"100%\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDMuMCAoMCkKIC0tPgo8IS0tIFRpdGxlOiBmaW5pdGVfc3RhdGVfbWFjaGluZSBQYWdlczogMSAtLT4KPHN2ZyB3aWR0aD0iODU0cHQiIGhlaWdodD0iNzJwdCIKIHZpZXdCb3g9IjAuMDAgMC4wMCA4NTMuNjAgNzIuMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgo8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgNjguMTQpIj4KPHRpdGxlPmZpbml0ZV9zdGF0ZV9tYWNoaW5lPC90aXRsZT4KPHBvbHlnb24gZmlsbD0id2hpdGUiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtNjguMTQgODQ5LjYsLTY4LjE0IDg0OS42LDQgLTQsNCIvPgo8IS0tIF9hIC0tPgo8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KPHRpdGxlPl9hPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0id2hpdGUiIHN0cm9rZT0id2hpdGUiIGN4PSIxLjgiIGN5PSItMjkuMTQiIHJ4PSIxLjgiIHJ5PSIxLjgiLz4KPC9nPgo8IS0tIDAgLS0+CjxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI2Mi42IiBjeT0iLTI5LjE0IiByeD0iMTgiIHJ5PSIxOCIvPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iNjIuNiIgY3k9Ii0yOS4xNCIgcng9IjIyIiByeT0iMjIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjIuNiIgeT0iLTI1LjQ0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjA8L3RleHQ+CjwvZz4KPCEtLSBfYSYjNDU7Jmd0OzAgLS0+CjxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+X2EmIzQ1OyZndDswPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTMuODIsLTI5LjE0QzcuMTksLTI5LjE0IDE4LjQ0LC0yOS4xNCAzMC4xMiwtMjkuMTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzAuMzEsLTMyLjY0IDQwLjMxLC0yOS4xNCAzMC4zMSwtMjUuNjQgMzAuMzEsLTMyLjY0Ii8+CjwvZz4KPCEtLSAxIC0tPgo8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjE8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMjEyLjYiIGN5PSItMjkuMTQiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyMTIuNiIgY3k9Ii0yOS4xNCIgcng9IjIyIiByeT0iMjIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjEyLjYiIHk9Ii0yNS40NCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj4xPC90ZXh0Pgo8L2c+CjwhLS0gMCYjNDU7Jmd0OzEgLS0+CjxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MCYjNDU7Jmd0OzE8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9InJlZCIgZD0iTTgyLjU4LC0zOC42NkM4OC44LC00MS4zIDk1Ljg1LC00My44MSAxMDIuNiwtNDUuMTQgMTMzLjEyLC01MS4xNiAxNDIuMDgsLTUxLjE2IDE3Mi42LC00NS4xNCAxNzYuMDgsLTQ0LjQ2IDE3OS42NCwtNDMuNDYgMTgzLjEzLC00Mi4yOSIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjE4NC41MywtNDUuNSAxOTIuNjIsLTM4LjY2IDE4Mi4wMywtMzguOTYgMTg0LjUzLC00NS41Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEzNy42IiB5PSItNTIuOTQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+c3RhcnQ8L3RleHQ+CjwvZz4KPCEtLSAxJiM0NTsmZ3Q7MCAtLT4KPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xJiM0NTsmZ3Q7MDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iZ3JlZW4iIGQ9Ik0xOTAuNTcsLTI3LjIzQzE4NC43NSwtMjYuNzggMTc4LjQ0LC0yNi4zNyAxNzIuNiwtMjYuMTQgMTQxLjUxLC0yNC45NSAxMzMuNjksLTI0Ljk1IDEwMi42LC0yNi4xNCAxMDAuMDUsLTI2LjI0IDk3LjQsLTI2LjM4IDk0Ljc1LC0yNi41MyIvPgo8cG9seWdvbiBmaWxsPSJncmVlbiIgc3Ryb2tlPSJncmVlbiIgcG9pbnRzPSI5NC4zNywtMjMuMDUgODQuNjMsLTI3LjIzIDk0Ljg1LC0zMC4wMyA5NC4zNywtMjMuMDUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTM3LjYiIHk9Ii0yOS45NCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5hdXRvX2ZpbmlzaDwvdGV4dD4KPC9nPgo8IS0tIDEmIzQ1OyZndDswIC0tPgo8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjEmIzQ1OyZndDswPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik0xOTQuMjUsLTE2LjI0QzE4Ny43OSwtMTIuMTggMTgwLjE4LC04LjIxIDE3Mi42LC02LjE0IDE0Mi41OSwyLjA1IDEzMi42MSwyLjA1IDEwMi42LC02LjE0IDk4LjIyLC03LjM0IDkzLjgyLC05LjE3IDg5LjY1LC0xMS4yOCIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9Ijg3LjkxLC04LjI1IDgwLjk1LC0xNi4yNCA5MS4zNywtMTQuMzMgODcuOTEsLTguMjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTM3LjYiIHk9Ii05Ljk0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPm1hbnVhbF9zdG9wPC90ZXh0Pgo8L2c+CjwhLS0gMiAtLT4KPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4yPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjM0OS42IiBjeT0iLTI5LjE0IiByeD0iMTgiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNDkuNiIgeT0iLTI1LjQ0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjI8L3RleHQ+CjwvZz4KPCEtLSAxJiM0NTsmZ3Q7MiAtLT4KPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xJiM0NTsmZ3Q7MjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iZ3JlZW4iIGQ9Ik0yMzQuNjksLTI5LjE0QzI1OC4wNSwtMjkuMTQgMjk1Ljc4LC0yOS4xNCAzMjEuMzYsLTI5LjE0Ii8+Cjxwb2x5Z29uIGZpbGw9ImdyZWVuIiBzdHJva2U9ImdyZWVuIiBwb2ludHM9IjMyMS41LC0zMi42NCAzMzEuNSwtMjkuMTQgMzIxLjUsLTI1LjY0IDMyMS41LC0zMi42NCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODMuMSIgeT0iLTMyLjk0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmJyZWFrZG93bjwvdGV4dD4KPC9nPgo8IS0tIDMgLS0+CjxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MzwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0NDEuNiIgY3k9Ii0yOS4xNCIgcng9IjE4IiByeT0iMTgiLz4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjQ0MS42IiBjeT0iLTI5LjE0IiByeD0iMjIiIHJ5PSIyMiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NDEuNiIgeT0iLTI1LjQ0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjM8L3RleHQ+CjwvZz4KPCEtLSAyJiM0NTsmZ3Q7MyAtLT4KPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4yJiM0NTsmZ3Q7MzwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNMzY3Ljk1LC0yOS4xNEMzNzkuNjgsLTI5LjE0IDM5NS40OSwtMjkuMTQgNDA5LjM2LC0yOS4xNCIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjQwOS41LC0zMi42NCA0MTkuNSwtMjkuMTQgNDA5LjUsLTI1LjY0IDQwOS41LC0zMi42NCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzOTMuNiIgeT0iLTMyLjk0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZpeDwvdGV4dD4KPC9nPgo8IS0tIDQgLS0+CjxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+NDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI1OTEuNiIgY3k9Ii0yOS4xNCIgcng9IjE4IiByeT0iMTgiLz4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjU5MS42IiBjeT0iLTI5LjE0IiByeD0iMjIiIHJ5PSIyMiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1OTEuNiIgeT0iLTI1LjQ0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjQ8L3RleHQ+CjwvZz4KPCEtLSAzJiM0NTsmZ3Q7NCAtLT4KPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4zJiM0NTsmZ3Q7NDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNNDYxLjU4LC0zOC42NkM0NjcuOCwtNDEuMyA0NzQuODUsLTQzLjgxIDQ4MS42LC00NS4xNCA1MTIuMTIsLTUxLjE2IDUyMS4wOCwtNTEuMTYgNTUxLjYsLTQ1LjE0IDU1NS4wOCwtNDQuNDYgNTU4LjY0LC00My40NiA1NjIuMTMsLTQyLjI5Ii8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iNTYzLjUzLC00NS41IDU3MS42MiwtMzguNjYgNTYxLjAzLC0zOC45NiA1NjMuNTMsLTQ1LjUiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTE2LjYiIHk9Ii01Mi45NCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5zdGFydDwvdGV4dD4KPC9nPgo8IS0tIDQmIzQ1OyZndDszIC0tPgo8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjQmIzQ1OyZndDszPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmVlbiIgZD0iTTU2OS41NywtMjcuMjNDNTYzLjc1LC0yNi43OCA1NTcuNDQsLTI2LjM3IDU1MS42LC0yNi4xNCA1MjAuNTEsLTI0Ljk1IDUxMi42OSwtMjQuOTUgNDgxLjYsLTI2LjE0IDQ3OS4wNSwtMjYuMjQgNDc2LjQsLTI2LjM4IDQ3My43NSwtMjYuNTMiLz4KPHBvbHlnb24gZmlsbD0iZ3JlZW4iIHN0cm9rZT0iZ3JlZW4iIHBvaW50cz0iNDczLjM3LC0yMy4wNSA0NjMuNjMsLTI3LjIzIDQ3My44NSwtMzAuMDMgNDczLjM3LC0yMy4wNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1MTYuNiIgeT0iLTI5Ljk0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmF1dG9fZmluaXNoPC90ZXh0Pgo8L2c+CjwhLS0gNCYjNDU7Jmd0OzMgLS0+CjxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjQmIzQ1OyZndDszPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik01NzMuMjUsLTE2LjI0QzU2Ni43OSwtMTIuMTggNTU5LjE4LC04LjIxIDU1MS42LC02LjE0IDUyMS41OSwyLjA1IDUxMS42MSwyLjA1IDQ4MS42LC02LjE0IDQ3Ny4yMiwtNy4zNCA0NzIuODIsLTkuMTcgNDY4LjY1LC0xMS4yOCIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjQ2Ni45MSwtOC4yNSA0NTkuOTUsLTE2LjI0IDQ3MC4zNywtMTQuMzMgNDY2LjkxLC04LjI1Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjUxNi42IiB5PSItOS45NCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5tYW51YWxfc3RvcDwvdGV4dD4KPC9nPgo8IS0tIDUgLS0+CjxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+NTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI3MjguNiIgY3k9Ii0yOS4xNCIgcng9IjE4IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzI4LjYiIHk9Ii0yNS40NCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj41PC90ZXh0Pgo8L2c+CjwhLS0gNCYjNDU7Jmd0OzUgLS0+CjxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+NCYjNDU7Jmd0OzU8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImdyZWVuIiBkPSJNNjEzLjY5LC0yOS4xNEM2MzcuMDUsLTI5LjE0IDY3NC43OCwtMjkuMTQgNzAwLjM2LC0yOS4xNCIvPgo8cG9seWdvbiBmaWxsPSJncmVlbiIgc3Ryb2tlPSJncmVlbiIgcG9pbnRzPSI3MDAuNSwtMzIuNjQgNzEwLjUsLTI5LjE0IDcwMC41LC0yNS42NCA3MDAuNSwtMzIuNjQiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjYyLjEiIHk9Ii0zMi45NCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5icmVha2Rvd248L3RleHQ+CjwvZz4KPCEtLSA2IC0tPgo8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjY8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iODIzLjYiIGN5PSItMjkuMTQiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI4MjMuNiIgY3k9Ii0yOS4xNCIgcng9IjIyIiByeT0iMjIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iODIzLjYiIHk9Ii0yNS40NCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj42PC90ZXh0Pgo8L2c+CjwhLS0gNSYjNDU7Jmd0OzYgLS0+CjxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjUmIzQ1OyZndDs2PC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik03NDYuNjYsLTI5LjE0Qzc1OS4wNiwtMjkuMTQgNzc2LjIyLC0yOS4xNCA3OTEuMDksLTI5LjE0Ii8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iNzkxLjQxLC0zMi42NCA4MDEuNDEsLTI5LjE0IDc5MS40MSwtMjUuNjQgNzkxLjQxLC0zMi42NCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3NzQuMSIgeT0iLTMyLjk0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPnNlbGw8L3RleHQ+CjwvZz4KPC9nPgo8L3N2Zz4K\" >" ], "text/plain": [ "<pytct.automaton_display.AutomatonDisplay at 0x78e58b4e6250>" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.sync('SE1','PRINTER_SELL','E1')\n", "#synchronous product\n", "\n", "pytct.display_automaton('SE1',color=True)\n", "#plot DES with color coding" ] }, { "cell_type": "code", "execution_count": 13, "id": "828e479c-4020-4e76-be55-80e103bb9a49", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.is_controllable('PRINTER_SELL','SE1')\n", "#check if SE1 is controllable wrt. PRINTER_SELL" ] }, { "cell_type": "code", "execution_count": 14, "id": "bd0e2ad3-31b6-47db-90c5-cd31a8e56bd0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.uncontrollable_states('PRINTER_SELL','SE1')\n", "#compute the set of uncontrollable states" ] }, { "cell_type": "code", "execution_count": 15, "id": "762b3f6f-491a-43f4-a20c-56e1ae73ec39", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "<!-- Generated by graphviz version 2.43.0 (0)\n", " -->\n", "<!-- Title: finite_state_machine Pages: 1 -->\n", "<svg width=\"672pt\" height=\"120pt\"\n", " viewBox=\"0.00 0.00 672.00 119.93\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 115.93)\">\n", "<title>finite_state_machine</title>\n", "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-115.93 668,-115.93 668,4 -4,4\"/>\n", "<!-- _a -->\n", "<g id=\"node1\" class=\"node\">\n", "<title>_a</title>\n", "<ellipse fill=\"white\" stroke=\"white\" cx=\"18\" cy=\"-27.93\" rx=\"1.8\" ry=\"1.8\"/>\n", "</g>\n", "<!-- 0 -->\n", "<g id=\"node2\" class=\"node\">\n", "<title>0</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"113\" cy=\"-27.93\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"113\" cy=\"-27.93\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"113\" y=\"-24.23\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n", "</g>\n", "<!-- _a->0 -->\n", "<g id=\"edge1\" class=\"edge\">\n", "<title>_a->0</title>\n", "<path fill=\"none\" stroke=\"black\" d=\"M20.04,-27.93C25.99,-27.93 56.15,-27.93 80.33,-27.93\"/>\n", "<polygon fill=\"black\" stroke=\"black\" points=\"80.58,-31.43 90.58,-27.93 80.58,-24.43 80.58,-31.43\"/>\n", "</g>\n", "<!-- 1 -->\n", "<g id=\"node3\" class=\"node\">\n", "<title>1</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"263\" cy=\"-27.93\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"263\" cy=\"-27.93\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"263\" y=\"-24.23\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n", "</g>\n", "<!-- 0->1 -->\n", "<g id=\"edge2\" class=\"edge\">\n", "<title>0->1</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M132.98,-37.44C139.2,-40.09 146.25,-42.6 153,-43.93 183.52,-49.94 192.48,-49.94 223,-43.93 226.48,-43.24 230.04,-42.24 233.53,-41.07\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"234.93,-44.28 243.02,-37.44 232.43,-37.74 234.93,-44.28\"/>\n", "<text text-anchor=\"middle\" x=\"188\" y=\"-52.73\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 1->0 -->\n", "<g id=\"edge3\" class=\"edge\">\n", "<title>1->0</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M240.97,-26.01C235.15,-25.56 228.84,-25.15 223,-24.93 191.91,-23.73 184.09,-23.73 153,-24.93 150.45,-25.02 147.8,-25.16 145.15,-25.32\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"144.77,-21.83 135.03,-26.01 145.25,-28.82 144.77,-21.83\"/>\n", "<text text-anchor=\"middle\" x=\"188\" y=\"-28.73\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 1->0 -->\n", "<g id=\"edge5\" class=\"edge\">\n", "<title>1->0</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M244.58,-15.57C238.11,-11.69 230.52,-7.9 223,-5.93 192.91,1.98 183.09,1.98 153,-5.93 148.77,-7.04 144.52,-8.72 140.45,-10.67\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"138.54,-7.73 131.42,-15.57 141.88,-13.88 138.54,-7.73\"/>\n", "<text text-anchor=\"middle\" x=\"188\" y=\"-9.73\" font-family=\"Times,serif\" font-size=\"14.00\">manual_stop</text>\n", "</g>\n", "<!-- 2 -->\n", "<g id=\"node4\" class=\"node\">\n", "<title>2</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"400\" cy=\"-27.93\" rx=\"18\" ry=\"18\"/>\n", "<text text-anchor=\"middle\" x=\"400\" y=\"-24.23\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", "</g>\n", "<!-- 1->2 -->\n", "<g id=\"edge4\" class=\"edge\">\n", "<title>1->2</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M285.09,-27.93C308.45,-27.93 346.18,-27.93 371.76,-27.93\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"371.9,-31.43 381.9,-27.93 371.9,-24.43 371.9,-31.43\"/>\n", "<text text-anchor=\"middle\" x=\"333.5\" y=\"-31.73\" font-family=\"Times,serif\" font-size=\"14.00\">breakdown</text>\n", "</g>\n", "<!-- 3 -->\n", "<g id=\"node5\" class=\"node\">\n", "<title>3</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"492\" cy=\"-27.93\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"492\" cy=\"-27.93\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"492\" y=\"-24.23\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n", "</g>\n", "<!-- 2->3 -->\n", "<g id=\"edge6\" class=\"edge\">\n", "<title>2->3</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M418.35,-27.93C430.08,-27.93 445.89,-27.93 459.76,-27.93\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"459.9,-31.43 469.9,-27.93 459.9,-24.43 459.9,-31.43\"/>\n", "<text text-anchor=\"middle\" x=\"444\" y=\"-31.73\" font-family=\"Times,serif\" font-size=\"14.00\">fix</text>\n", "</g>\n", "<!-- 4 -->\n", "<g id=\"node6\" class=\"node\">\n", "<title>4</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"642\" cy=\"-27.93\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"642\" cy=\"-27.93\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"642\" y=\"-24.23\" font-family=\"Times,serif\" font-size=\"14.00\">4</text>\n", "</g>\n", "<!-- 3->4 -->\n", "<g id=\"edge7\" class=\"edge\">\n", "<title>3->4</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M511.98,-37.44C518.2,-40.09 525.25,-42.6 532,-43.93 562.52,-49.94 571.48,-49.94 602,-43.93 605.48,-43.24 609.04,-42.24 612.53,-41.07\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"613.93,-44.28 622.02,-37.44 611.43,-37.74 613.93,-44.28\"/>\n", "<text text-anchor=\"middle\" x=\"567\" y=\"-52.73\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 4->3 -->\n", "<g id=\"edge8\" class=\"edge\">\n", "<title>4->3</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M619.97,-26.01C614.15,-25.56 607.84,-25.15 602,-24.93 570.91,-23.73 563.09,-23.73 532,-24.93 529.45,-25.02 526.8,-25.16 524.15,-25.32\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"523.77,-21.83 514.03,-26.01 524.25,-28.82 523.77,-21.83\"/>\n", "<text text-anchor=\"middle\" x=\"567\" y=\"-28.73\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 4->3 -->\n", "<g id=\"edge9\" class=\"edge\">\n", "<title>4->3</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M623.58,-15.57C617.11,-11.69 609.52,-7.9 602,-5.93 571.91,1.98 562.09,1.98 532,-5.93 527.77,-7.04 523.52,-8.72 519.45,-10.67\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"517.54,-7.73 510.42,-15.57 520.88,-13.88 517.54,-7.73\"/>\n", "<text text-anchor=\"middle\" x=\"567\" y=\"-9.73\" font-family=\"Times,serif\" font-size=\"14.00\">manual_stop</text>\n", "</g>\n", "<!-- 5 -->\n", "<g id=\"node7\" class=\"node\">\n", "<title>5</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"18\" cy=\"-89.93\" rx=\"18\" ry=\"18\"/>\n", "<text text-anchor=\"middle\" x=\"18\" y=\"-86.23\" font-family=\"Times,serif\" font-size=\"14.00\">5</text>\n", "</g>\n", "<!-- 6 -->\n", "<g id=\"node8\" class=\"node\">\n", "<title>6</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"113\" cy=\"-89.93\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"113\" cy=\"-89.93\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"113\" y=\"-86.23\" font-family=\"Times,serif\" font-size=\"14.00\">6</text>\n", "</g>\n", "<!-- 5->6 -->\n", "<g id=\"edge10\" class=\"edge\">\n", "<title>5->6</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M36.06,-89.93C48.46,-89.93 65.62,-89.93 80.49,-89.93\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"80.81,-93.43 90.81,-89.93 80.81,-86.43 80.81,-93.43\"/>\n", "<text text-anchor=\"middle\" x=\"63.5\" y=\"-93.73\" font-family=\"Times,serif\" font-size=\"14.00\">sell</text>\n", "</g>\n", "</g>\n", "</svg>\n" ], "text/html": [ "<img width=\"100%\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDMuMCAoMCkKIC0tPgo8IS0tIFRpdGxlOiBmaW5pdGVfc3RhdGVfbWFjaGluZSBQYWdlczogMSAtLT4KPHN2ZyB3aWR0aD0iNjcycHQiIGhlaWdodD0iMTIwcHQiCiB2aWV3Qm94PSIwLjAwIDAuMDAgNjcyLjAwIDExOS45MyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CjxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCAxMTUuOTMpIj4KPHRpdGxlPmZpbml0ZV9zdGF0ZV9tYWNoaW5lPC90aXRsZT4KPHBvbHlnb24gZmlsbD0id2hpdGUiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtMTE1LjkzIDY2OCwtMTE1LjkzIDY2OCw0IC00LDQiLz4KPCEtLSBfYSAtLT4KPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5fYTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9IndoaXRlIiBzdHJva2U9IndoaXRlIiBjeD0iMTgiIGN5PSItMjcuOTMiIHJ4PSIxLjgiIHJ5PSIxLjgiLz4KPC9nPgo8IS0tIDAgLS0+CjxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxMTMiIGN5PSItMjcuOTMiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxMTMiIGN5PSItMjcuOTMiIHJ4PSIyMiIgcnk9IjIyIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjExMyIgeT0iLTI0LjIzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjA8L3RleHQ+CjwvZz4KPCEtLSBfYSYjNDU7Jmd0OzAgLS0+CjxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+X2EmIzQ1OyZndDswPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTIwLjA0LC0yNy45M0MyNS45OSwtMjcuOTMgNTYuMTUsLTI3LjkzIDgwLjMzLC0yNy45MyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSI4MC41OCwtMzEuNDMgOTAuNTgsLTI3LjkzIDgwLjU4LC0yNC40MyA4MC41OCwtMzEuNDMiLz4KPC9nPgo8IS0tIDEgLS0+CjxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyNjMiIGN5PSItMjcuOTMiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyNjMiIGN5PSItMjcuOTMiIHJ4PSIyMiIgcnk9IjIyIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI2MyIgeT0iLTI0LjIzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjE8L3RleHQ+CjwvZz4KPCEtLSAwJiM0NTsmZ3Q7MSAtLT4KPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4wJiM0NTsmZ3Q7MTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNMTMyLjk4LC0zNy40NEMxMzkuMiwtNDAuMDkgMTQ2LjI1LC00Mi42IDE1MywtNDMuOTMgMTgzLjUyLC00OS45NCAxOTIuNDgsLTQ5Ljk0IDIyMywtNDMuOTMgMjI2LjQ4LC00My4yNCAyMzAuMDQsLTQyLjI0IDIzMy41MywtNDEuMDciLz4KPHBvbHlnb24gZmlsbD0icmVkIiBzdHJva2U9InJlZCIgcG9pbnRzPSIyMzQuOTMsLTQ0LjI4IDI0My4wMiwtMzcuNDQgMjMyLjQzLC0zNy43NCAyMzQuOTMsLTQ0LjI4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4OCIgeT0iLTUyLjczIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPnN0YXJ0PC90ZXh0Pgo8L2c+CjwhLS0gMSYjNDU7Jmd0OzAgLS0+CjxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MSYjNDU7Jmd0OzA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImdyZWVuIiBkPSJNMjQwLjk3LC0yNi4wMUMyMzUuMTUsLTI1LjU2IDIyOC44NCwtMjUuMTUgMjIzLC0yNC45MyAxOTEuOTEsLTIzLjczIDE4NC4wOSwtMjMuNzMgMTUzLC0yNC45MyAxNTAuNDUsLTI1LjAyIDE0Ny44LC0yNS4xNiAxNDUuMTUsLTI1LjMyIi8+Cjxwb2x5Z29uIGZpbGw9ImdyZWVuIiBzdHJva2U9ImdyZWVuIiBwb2ludHM9IjE0NC43NywtMjEuODMgMTM1LjAzLC0yNi4wMSAxNDUuMjUsLTI4LjgyIDE0NC43NywtMjEuODMiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTg4IiB5PSItMjguNzMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+YXV0b19maW5pc2g8L3RleHQ+CjwvZz4KPCEtLSAxJiM0NTsmZ3Q7MCAtLT4KPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xJiM0NTsmZ3Q7MDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNMjQ0LjU4LC0xNS41N0MyMzguMTEsLTExLjY5IDIzMC41MiwtNy45IDIyMywtNS45MyAxOTIuOTEsMS45OCAxODMuMDksMS45OCAxNTMsLTUuOTMgMTQ4Ljc3LC03LjA0IDE0NC41MiwtOC43MiAxNDAuNDUsLTEwLjY3Ii8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iMTM4LjU0LC03LjczIDEzMS40MiwtMTUuNTcgMTQxLjg4LC0xMy44OCAxMzguNTQsLTcuNzMiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTg4IiB5PSItOS43MyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5tYW51YWxfc3RvcDwvdGV4dD4KPC9nPgo8IS0tIDIgLS0+CjxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MjwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0MDAiIGN5PSItMjcuOTMiIHJ4PSIxOCIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQwMCIgeT0iLTI0LjIzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjI8L3RleHQ+CjwvZz4KPCEtLSAxJiM0NTsmZ3Q7MiAtLT4KPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xJiM0NTsmZ3Q7MjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iZ3JlZW4iIGQ9Ik0yODUuMDksLTI3LjkzQzMwOC40NSwtMjcuOTMgMzQ2LjE4LC0yNy45MyAzNzEuNzYsLTI3LjkzIi8+Cjxwb2x5Z29uIGZpbGw9ImdyZWVuIiBzdHJva2U9ImdyZWVuIiBwb2ludHM9IjM3MS45LC0zMS40MyAzODEuOSwtMjcuOTMgMzcxLjksLTI0LjQzIDM3MS45LC0zMS40MyIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMzMuNSIgeT0iLTMxLjczIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmJyZWFrZG93bjwvdGV4dD4KPC9nPgo8IS0tIDMgLS0+CjxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MzwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0OTIiIGN5PSItMjcuOTMiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0OTIiIGN5PSItMjcuOTMiIHJ4PSIyMiIgcnk9IjIyIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ5MiIgeT0iLTI0LjIzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjM8L3RleHQ+CjwvZz4KPCEtLSAyJiM0NTsmZ3Q7MyAtLT4KPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4yJiM0NTsmZ3Q7MzwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmVkIiBkPSJNNDE4LjM1LC0yNy45M0M0MzAuMDgsLTI3LjkzIDQ0NS44OSwtMjcuOTMgNDU5Ljc2LC0yNy45MyIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjQ1OS45LC0zMS40MyA0NjkuOSwtMjcuOTMgNDU5LjksLTI0LjQzIDQ1OS45LC0zMS40MyIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NDQiIHk9Ii0zMS43MyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5maXg8L3RleHQ+CjwvZz4KPCEtLSA0IC0tPgo8ZyBpZD0ibm9kZTYiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjQ8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iNjQyIiBjeT0iLTI3LjkzIiByeD0iMTgiIHJ5PSIxOCIvPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iNjQyIiBjeT0iLTI3LjkzIiByeD0iMjIiIHJ5PSIyMiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2NDIiIHk9Ii0yNC4yMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj40PC90ZXh0Pgo8L2c+CjwhLS0gMyYjNDU7Jmd0OzQgLS0+CjxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MyYjNDU7Jmd0OzQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9InJlZCIgZD0iTTUxMS45OCwtMzcuNDRDNTE4LjIsLTQwLjA5IDUyNS4yNSwtNDIuNiA1MzIsLTQzLjkzIDU2Mi41MiwtNDkuOTQgNTcxLjQ4LC00OS45NCA2MDIsLTQzLjkzIDYwNS40OCwtNDMuMjQgNjA5LjA0LC00Mi4yNCA2MTIuNTMsLTQxLjA3Ii8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iNjEzLjkzLC00NC4yOCA2MjIuMDIsLTM3LjQ0IDYxMS40MywtMzcuNzQgNjEzLjkzLC00NC4yOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1NjciIHk9Ii01Mi43MyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5zdGFydDwvdGV4dD4KPC9nPgo8IS0tIDQmIzQ1OyZndDszIC0tPgo8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjQmIzQ1OyZndDszPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJncmVlbiIgZD0iTTYxOS45NywtMjYuMDFDNjE0LjE1LC0yNS41NiA2MDcuODQsLTI1LjE1IDYwMiwtMjQuOTMgNTcwLjkxLC0yMy43MyA1NjMuMDksLTIzLjczIDUzMiwtMjQuOTMgNTI5LjQ1LC0yNS4wMiA1MjYuOCwtMjUuMTYgNTI0LjE1LC0yNS4zMiIvPgo8cG9seWdvbiBmaWxsPSJncmVlbiIgc3Ryb2tlPSJncmVlbiIgcG9pbnRzPSI1MjMuNzcsLTIxLjgzIDUxNC4wMywtMjYuMDEgNTI0LjI1LC0yOC44MiA1MjMuNzcsLTIxLjgzIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU2NyIgeT0iLTI4LjczIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmF1dG9fZmluaXNoPC90ZXh0Pgo8L2c+CjwhLS0gNCYjNDU7Jmd0OzMgLS0+CjxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+NCYjNDU7Jmd0OzM8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9InJlZCIgZD0iTTYyMy41OCwtMTUuNTdDNjE3LjExLC0xMS42OSA2MDkuNTIsLTcuOSA2MDIsLTUuOTMgNTcxLjkxLDEuOTggNTYyLjA5LDEuOTggNTMyLC01LjkzIDUyNy43NywtNy4wNCA1MjMuNTIsLTguNzIgNTE5LjQ1LC0xMC42NyIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjUxNy41NCwtNy43MyA1MTAuNDIsLTE1LjU3IDUyMC44OCwtMTMuODggNTE3LjU0LC03LjczIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU2NyIgeT0iLTkuNzMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+bWFudWFsX3N0b3A8L3RleHQ+CjwvZz4KPCEtLSA1IC0tPgo8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KPHRpdGxlPjU8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMTgiIGN5PSItODkuOTMiIHJ4PSIxOCIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4IiB5PSItODYuMjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+NTwvdGV4dD4KPC9nPgo8IS0tIDYgLS0+CjxnIGlkPSJub2RlOCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+NjwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxMTMiIGN5PSItODkuOTMiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxMTMiIGN5PSItODkuOTMiIHJ4PSIyMiIgcnk9IjIyIi8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjExMyIgeT0iLTg2LjIzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjY8L3RleHQ+CjwvZz4KPCEtLSA1JiM0NTsmZ3Q7NiAtLT4KPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+NSYjNDU7Jmd0OzY8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9InJlZCIgZD0iTTM2LjA2LC04OS45M0M0OC40NiwtODkuOTMgNjUuNjIsLTg5LjkzIDgwLjQ5LC04OS45MyIvPgo8cG9seWdvbiBmaWxsPSJyZWQiIHN0cm9rZT0icmVkIiBwb2ludHM9IjgwLjgxLC05My40MyA5MC44MSwtODkuOTMgODAuODEsLTg2LjQzIDgwLjgxLC05My40MyIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2My41IiB5PSItOTMuNzMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+c2VsbDwvdGV4dD4KPC9nPgo8L2c+Cjwvc3ZnPgo=\" >" ], "text/plain": [ "<pytct.automaton_display.AutomatonDisplay at 0x78e58b4efc10>" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.subautomaton('SE2','SE1',[],[(4,'breakdown',5)])\n", "#create subautomaton SE2 by removing from SE1 \n", "# [state list] and [transition list]\n", "\n", "pytct.display_automaton('SE2',color=True)\n", "#plot SE2.DES with color coding" ] }, { "cell_type": "code", "execution_count": 16, "id": "fee92691-0964-45c8-8706-b4d41574d44a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.is_controllable('PRINTER_SELL','SE2')\n", "#check if SE2 is controllable wrt. PRINTER_SELL" ] }, { "cell_type": "code", "execution_count": 17, "id": "9fab1a1e-2925-4286-9905-d939915373b4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[4]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pytct.uncontrollable_states('PRINTER_SELL','SE2')\n", "#compute the set of uncontrollable states" ] }, { "cell_type": "code", "execution_count": 18, "id": "771361ea-bcd7-4c9d-bd24-a45c4a6ba7a7", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "<!-- Generated by graphviz version 2.43.0 (0)\n", " -->\n", "<!-- Title: finite_state_machine Pages: 1 -->\n", "<svg width=\"435pt\" height=\"79pt\"\n", " viewBox=\"0.00 0.00 434.60 79.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 75)\">\n", "<title>finite_state_machine</title>\n", "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-75 430.6,-75 430.6,4 -4,4\"/>\n", "<!-- _a -->\n", "<g id=\"node1\" class=\"node\">\n", "<title>_a</title>\n", "<ellipse fill=\"white\" stroke=\"white\" cx=\"1.8\" cy=\"-45\" rx=\"1.8\" ry=\"1.8\"/>\n", "</g>\n", "<!-- 0 -->\n", "<g id=\"node2\" class=\"node\">\n", "<title>0</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"58.6\" cy=\"-45\" rx=\"18\" ry=\"18\"/>\n", "<text text-anchor=\"middle\" x=\"58.6\" y=\"-41.3\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n", "</g>\n", "<!-- _a->0 -->\n", "<g id=\"edge1\" class=\"edge\">\n", "<title>_a->0</title>\n", "<path fill=\"none\" stroke=\"black\" d=\"M3.75,-45C7.11,-45 18.87,-45 30.55,-45\"/>\n", "<polygon fill=\"black\" stroke=\"black\" points=\"30.58,-48.5 40.58,-45 30.58,-41.5 30.58,-48.5\"/>\n", "</g>\n", "<!-- 1 -->\n", "<g id=\"node3\" class=\"node\">\n", "<title>1</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"154.6\" cy=\"-45\" rx=\"18\" ry=\"18\"/>\n", "<text text-anchor=\"middle\" x=\"154.6\" y=\"-41.3\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n", "</g>\n", "<!-- 0->1 -->\n", "<g id=\"edge2\" class=\"edge\">\n", "<title>0->1</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M76.84,-45C90.62,-45 110.2,-45 126.13,-45\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"126.47,-48.5 136.47,-45 126.47,-41.5 126.47,-48.5\"/>\n", "<text text-anchor=\"middle\" x=\"106.6\" y=\"-48.8\" font-family=\"Times,serif\" font-size=\"14.00\">start</text>\n", "</g>\n", "<!-- 2 -->\n", "<g id=\"node4\" class=\"node\">\n", "<title>2</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"404.6\" cy=\"-45\" rx=\"18\" ry=\"18\"/>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"404.6\" cy=\"-45\" rx=\"22\" ry=\"22\"/>\n", "<text text-anchor=\"middle\" x=\"404.6\" y=\"-41.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", "</g>\n", "<!-- 1->2 -->\n", "<g id=\"edge3\" class=\"edge\">\n", "<title>1->2</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M171.74,-51.2C177.59,-53.14 184.3,-55.03 190.6,-56 215.35,-59.8 344.42,-55.32 364.6,-53 367.34,-52.69 370.17,-52.27 373,-51.81\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"373.88,-55.2 383.06,-49.92 372.59,-48.32 373.88,-55.2\"/>\n", "<text text-anchor=\"middle\" x=\"300.1\" y=\"-59.8\" font-family=\"Times,serif\" font-size=\"14.00\">auto_finish</text>\n", "</g>\n", "<!-- 3 -->\n", "<g id=\"node5\" class=\"node\">\n", "<title>3</title>\n", "<ellipse fill=\"none\" stroke=\"black\" cx=\"300.1\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n", "<text text-anchor=\"middle\" x=\"300.1\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n", "</g>\n", "<!-- 1->3 -->\n", "<g id=\"edge4\" class=\"edge\">\n", "<title>1->3</title>\n", "<path fill=\"none\" stroke=\"green\" d=\"M172.34,-41.85C196.84,-37.24 242.71,-28.61 272.03,-23.09\"/>\n", "<polygon fill=\"green\" stroke=\"green\" points=\"272.84,-26.5 282.02,-21.21 271.54,-19.62 272.84,-26.5\"/>\n", "<text text-anchor=\"middle\" x=\"221.1\" y=\"-40.8\" font-family=\"Times,serif\" font-size=\"14.00\">breakdown</text>\n", "</g>\n", "<!-- 3->2 -->\n", "<g id=\"edge5\" class=\"edge\">\n", "<title>3->2</title>\n", "<path fill=\"none\" stroke=\"red\" d=\"M318.03,-22.46C333.02,-26.41 355.27,-32.27 373.32,-37.02\"/>\n", "<polygon fill=\"red\" stroke=\"red\" points=\"372.55,-40.44 383.12,-39.6 374.34,-33.67 372.55,-40.44\"/>\n", "<text text-anchor=\"middle\" x=\"356.6\" y=\"-37.8\" font-family=\"Times,serif\" font-size=\"14.00\">fix</text>\n", "</g>\n", "</g>\n", "</svg>\n" ], "text/html": [ "<img width=\"100%\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDMuMCAoMCkKIC0tPgo8IS0tIFRpdGxlOiBmaW5pdGVfc3RhdGVfbWFjaGluZSBQYWdlczogMSAtLT4KPHN2ZyB3aWR0aD0iNDM1cHQiIGhlaWdodD0iNzlwdCIKIHZpZXdCb3g9IjAuMDAgMC4wMCA0MzQuNjAgNzkuMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgo8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgNzUpIj4KPHRpdGxlPmZpbml0ZV9zdGF0ZV9tYWNoaW5lPC90aXRsZT4KPHBvbHlnb24gZmlsbD0id2hpdGUiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtNzUgNDMwLjYsLTc1IDQzMC42LDQgLTQsNCIvPgo8IS0tIF9hIC0tPgo8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KPHRpdGxlPl9hPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0id2hpdGUiIHN0cm9rZT0id2hpdGUiIGN4PSIxLjgiIGN5PSItNDUiIHJ4PSIxLjgiIHJ5PSIxLjgiLz4KPC9nPgo8IS0tIDAgLS0+CjxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+MDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI1OC42IiBjeT0iLTQ1IiByeD0iMTgiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1OC42IiB5PSItNDEuMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj4wPC90ZXh0Pgo8L2c+CjwhLS0gX2EmIzQ1OyZndDswIC0tPgo8ZyBpZD0iZWRnZTEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPl9hJiM0NTsmZ3Q7MDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zLjc1LC00NUM3LjExLC00NSAxOC44NywtNDUgMzAuNTUsLTQ1Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMwLjU4LC00OC41IDQwLjU4LC00NSAzMC41OCwtNDEuNSAzMC41OCwtNDguNSIvPgo8L2c+CjwhLS0gMSAtLT4KPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT4xPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjE1NC42IiBjeT0iLTQ1IiByeD0iMTgiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNTQuNiIgeT0iLTQxLjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+MTwvdGV4dD4KPC9nPgo8IS0tIDAmIzQ1OyZndDsxIC0tPgo8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPjAmIzQ1OyZndDsxPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZWQiIGQ9Ik03Ni44NCwtNDVDOTAuNjIsLTQ1IDExMC4yLC00NSAxMjYuMTMsLTQ1Ii8+Cjxwb2x5Z29uIGZpbGw9InJlZCIgc3Ryb2tlPSJyZWQiIHBvaW50cz0iMTI2LjQ3LC00OC41IDEzNi40NywtNDUgMTI2LjQ3LC00MS41IDEyNi40NywtNDguNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMDYuNiIgeT0iLTQ4LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+c3RhcnQ8L3RleHQ+CjwvZz4KPCEtLSAyIC0tPgo8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iNDA0LjYiIGN5PSItNDUiIHJ4PSIxOCIgcnk9IjE4Ii8+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0MDQuNiIgY3k9Ii00NSIgcng9IjIyIiByeT0iMjIiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDA0LjYiIHk9Ii00MS4zIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPjI8L3RleHQ+CjwvZz4KPCEtLSAxJiM0NTsmZ3Q7MiAtLT4KPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT4xJiM0NTsmZ3Q7MjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iZ3JlZW4iIGQ9Ik0xNzEuNzQsLTUxLjJDMTc3LjU5LC01My4xNCAxODQuMywtNTUuMDMgMTkwLjYsLTU2IDIxNS4zNSwtNTkuOCAzNDQuNDIsLTU1LjMyIDM2NC42LC01MyAzNjcuMzQsLTUyLjY5IDM3MC4xNywtNTIuMjcgMzczLC01MS44MSIvPgo8cG9seWdvbiBmaWxsPSJncmVlbiIgc3Ryb2tlPSJncmVlbiIgcG9pbnRzPSIzNzMuODgsLTU1LjIgMzgzLjA2LC00OS45MiAzNzIuNTksLTQ4LjMyIDM3My44OCwtNTUuMiIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMDAuMSIgeT0iLTU5LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+YXV0b19maW5pc2g8L3RleHQ+CjwvZz4KPCEtLSAzIC0tPgo8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KPHRpdGxlPjM8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMzAwLjEiIGN5PSItMTgiIHJ4PSIxOCIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMwMC4xIiB5PSItMTQuMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj4zPC90ZXh0Pgo8L2c+CjwhLS0gMSYjNDU7Jmd0OzMgLS0+CjxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MSYjNDU7Jmd0OzM8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImdyZWVuIiBkPSJNMTcyLjM0LC00MS44NUMxOTYuODQsLTM3LjI0IDI0Mi43MSwtMjguNjEgMjcyLjAzLC0yMy4wOSIvPgo8cG9seWdvbiBmaWxsPSJncmVlbiIgc3Ryb2tlPSJncmVlbiIgcG9pbnRzPSIyNzIuODQsLTI2LjUgMjgyLjAyLC0yMS4yMSAyNzEuNTQsLTE5LjYyIDI3Mi44NCwtMjYuNSIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjEuMSIgeT0iLTQwLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+YnJlYWtkb3duPC90ZXh0Pgo8L2c+CjwhLS0gMyYjNDU7Jmd0OzIgLS0+CjxnIGlkPSJlZGdlNSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+MyYjNDU7Jmd0OzI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9InJlZCIgZD0iTTMxOC4wMywtMjIuNDZDMzMzLjAyLC0yNi40MSAzNTUuMjcsLTMyLjI3IDM3My4zMiwtMzcuMDIiLz4KPHBvbHlnb24gZmlsbD0icmVkIiBzdHJva2U9InJlZCIgcG9pbnRzPSIzNzIuNTUsLTQwLjQ0IDM4My4xMiwtMzkuNiAzNzQuMzQsLTMzLjY3IDM3Mi41NSwtNDAuNDQiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU2LjYiIHk9Ii0zNy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZpeDwvdGV4dD4KPC9nPgo8L2c+Cjwvc3ZnPgo=\" >" ], "text/plain": [ "<pytct.automaton_display.AutomatonDisplay at 0x78e58b4bea10>" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# creat automaton K2\n", "\n", "statenum = 4 # number of states\n", "\n", "trans = [(0,'start',1,'c'), \n", " (1,'auto_finish',2,'u'),\n", " (1,'breakdown',3,'u'),\n", " (3,'fix',2,'c')] # set of transitions\n", "\n", "marker = [2] # set of marker states\n", "\n", "pytct.create('K2', statenum, trans, marker) # create automaton\n", "\n", "pytct.display_automaton('K2', color=True) # display automaton\n", "# red transition: controllable; green transition: uncontrollable" ] }, { "cell_type": "code", "execution_count": 19, "id": "c2919984-2ec7-4fb1-8b8c-f660c27394f5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatInfo(\n", " text=\"Chp4/K2DAT\n", "\n", "\n", "Control data are displayed as a list of supervisor states\n", "where disabling occurs, together with the events that must\n", "be disabled there.\n", "\n", "Chp4/K2DAT is CONTROLLABLE\n", "\n", "control data:\n", "\n", "1: manual_stop\n", "2: start\n", "3: sell\n", "\n", "\",\n", " is_controllable=True,\n", " control_data={1: ['manual_stop'], 2: ['start'], 3: ['sell']}\n", ")" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check controllability\n", "pytct.condat('K2DAT','PRINTER_SELL','K2')\n", "\n", "# print out control data\n", "pytct.printdat('K2DAT_txt','K2DAT')" ] }, { "cell_type": "code", "execution_count": null, "id": "bc4351ae-7926-4aa0-ba85-3f180a2ff8dd", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.6" } }, "nbformat": 4, "nbformat_minor": 5 }