Package: visual-automata
Visual AutomataCopyright 2021Lewi Lie UbergReleased under the MIT licenseVisual Automata is a Python 3 library built as a wrapper for theAutomatalibrary to add more visualization features.ContentsVisual AutomataContentsPrerequisitesInstallingFinite Automaton (FA)VisualDFAImportingInstantiating DFAsConvertingTransition TableMinimal-DFACheck input stringsShow DiagramVisualNFAImportingInstantiating NFAsConvertingTransition TableEliminate lambda/epsilonCheck input stringsShow DiagramAuthorsLicenseAcknowledgmentsPrerequisitespip install automata-libpip install pandaspip install graphvizpip install colormathpip install jupyterlabInstallingpip install visual-automataFinite Automaton (FA)VisualDFAImportingImport needed classes.fromautomata.fa.dfaimportDFAfromvisual_automata.fa.dfaimportVisualDFAInstantiating DFAsDefine an visual_automata DFA that can accept any string ending with 00 or 11.dfa=VisualDFA(states={"q0","q1","q2","q3","q4"},input_symbols={"0","1"},transitions={"q0":{"0":"q3","1":"q1"},"q1":{"0":"q3","1":"q2"},"q2":{"0":"q3","1":"q2"},"q3":{"0":"q4","1":"q1"},"q4":{"0":"q4","1":"q1"},},initial_state="q0",final_states={"q2","q4"},)ConvertingAn automata-lib DFA can be converted to a VisualDFA.Define an automata-lib DFA that can accept any string ending with 00 or 11.dfa=DFA(states={"q0","q1","q2","q3","q4"},input_symbols={"0","1"},transitions={"q0":{"0":"q3","1":"q1"},"q1":{"0":"q3","1":"q2"},"q2":{"0":"q3","1":"q2"},"q3":{"0":"q4","1":"q1"},"q4":{"0":"q4","1":"q1"},},initial_state="q0",final_states={"q2","q4"},)Convert automata-lib DFA to VisualDFA.dfa=VisualDFA(dfa)Transition TableOutputs the transition table for the given DFA.dfa.table0    1
→q0   q3   q1
q1    q3  *q2
*q2   q3  *q2
q3   *q4   q1
*q4  *q4   q1Minimal-DFACreates a minimal DFA which accepts the same inputs as the old one. Unreachable states are removed and equivalent states are merged. States are renamed by default.new_dfa=VisualDFA(states={'q0','q1','q2'},input_symbols={'0','1'},transitions={'q0':{'0':'q0','1':'q1'},'q1':{'0':'q0','1':'q2'},'q2':{'0':'q2','1':'q1'}},initial_state='q0',final_states={'q1'})new_dfa.table0    1
→q0  q0  *q1
*q1  q0   q2
q2   q2  *q1new_dfa.show_diagram()minimal_dfa=VisualDFA.minify(new_dfa)minimal_dfa.show_diagram()minimal_dfa.table0        1
→{q0,q2}  {q0,q2}      *q1
*q1       {q0,q2}  {q0,q2}Check input strings1001does not end with00or11, and is thereforeRejecteddfa.input_check("1001")[Rejected]                         
Step: Current state: Input symbol: New state:
1                →q0             1         q1
2                 q1             0         q3
3                 q3             0        *q4
4                *q4             1         q110011does end with11, and is thereforeAccepteddfa.input_check("10011")[Accepted]                         
Step: Current state: Input symbol: New state:
1                →q0             1         q1
2                 q1             0         q3
3                 q3             0        *q4
4                *q4             1         q1
5                 q1             1        *q2Show DiagramFor IPythondfa.show_diagram()may be used.For a python scriptdfa.show_diagram(view=True)may be used to automatically view the graph as a PDF file.dfa.show_diagram()Theshow_diagrammethod also accepts input strings, and will return a graph with gradientredarrows forRejectedresults, and gradientgreenarrows forAcceptedresults. It will also display a table with transitions states stepwise. The steps in this table will correspond with the[number]over each traversed arrow.Please note that for visual purposes additional arrows are added if a transition is traversed more than once.dfa.show_diagram("1001")[Rejected]                         
Step: Current state: Input symbol: New state:
1                →q0             1         q1
2                 q1             0         q3
3                 q3             0        *q4
4                *q4             1         q1dfa.show_diagram("10011")[Accepted]                         
Step: Current state: Input symbol: New state:
1                →q0             1         q1
2                 q1             0         q3
3                 q3             0        *q4
4                *q4             1         q1
5                 q1             1        *q2VisualNFAImportingImport needed classes.fromautomata.fa.nfaimportNFAfromvisual_automata.fa.nfaimportVisualNFAInstantiating NFAsDefine an visual_automata NFA that can accept any string with the pattern 10, 1010, 101010.nfa=VisualNFA(states={"q0","q1","q2"},input_symbols={"0","1"},transitions={"q0":{"":{"q2"},"1":{"q1"}},"q1":{"1":{"q2"},"0":{"q0","q2"}},"q2":{},},initial_state="q0",final_states={"q0"},)ConvertingAn automata-lib NFA can be converted to a VisualNFA.Define an automata-lib NFA that can accept any string with the pattern 10, 1010, 101010.nfa=NFA(states={"q0","q1","q2"},input_symbols={"0","1"},transitions={"q0":{"":{"q2"},"1":{"q1"}},"q1":{"1":{"q2"},"0":{"q0","q2"}},"q2":{},},initial_state="q0",final_states={"q0"},)Convert automata-lib NFA to VisualNFA.nfa=VisualNFA(nfa)Transition TableOutputs the transition table for the given DFA.nfa.table0   1   λ
→*q0         ∅  q1  q2
q1    {*q0,q2}  q2   ∅
q2           ∅   ∅   ∅Eliminate lambda/epsilonCreates a NFA with lambda transitions removed.nfa_eliminated=VisualNFA.eliminate_lambda(nfa)nfa_eliminated.table0   1
→*q0         ∅  q1
q1    {*q0,q2}  q2
q2           ∅   ∅nfa_eliminated.show_diagram()Check input strings101does not correspond with the pattern10,1010,101010, and is thereforeRejectednfa.input_check("101")[Rejected]                         
Step: Current state: Input symbol: New state:
1               →*q0             1         q1
2                 q1             0         q2
3                 q2             1          ∅1010does correspond with the pattern10,1010,101010, and is thereforeAcceptednfa.input_check("1010")[Accepted]                         
Step: Current state: Input symbol: New state:
1               →*q0             1         q1
2                 q1             0       →*q0
3               →*q0             1         q1
4                 q1             0       →*q0Show DiagramFor IPythonnfa.show_diagram()may be used.For a python scriptnfa.show_diagram(view=True)may be used to automatically view the graph as a PDF file.nfa.show_diagram()Theshow_diagrammethod also accepts input strings, and will return a graph with gradientredarrows forRejectedresults, and gradientgreenarrows forAcceptedresults. It will also display a table with transitions states stepwise. The steps in this table will correspond with the[number]over each traversed arrow.Please note that for visual purposes additional arrows are added if a transition is traversed more than once.nfa.show_diagram("101")[Rejected]                         
Step: Current state: Input symbol: New state:
1               →*q0             1         q1
2                 q1             0         q2
3                 q2             1          ∅nfa.show_diagram("1010")[Accepted]                         
Step: Current state: Input symbol: New state:
1               →*q0             1         q1
2                 q1             0       →*q0
3               →*q0             1         q1
4                 q1             0       →*q0Please note that for long input strings, the path calculations may take some time.big_nfa=VisualNFA(states={"q1","q2","q3","q4","q5","q6","q7","q8"},input_symbols={"A","C","G","T"},transitions={"q1":{"A":{"q7"},"C":{"q4"},"G":{"q4","q2"},"T":{"q4"}},"q2":{"A":{"q3","q6"},"C":{"q2","q4"},"G":{"q3","q6"},"T":{"q6"}},"q3":{"A":{"q8"},"C":{"q8"},"T":{"q8"}},"q4":{"A":{"q5"},"C":{"q4"},"G":{"q5"},"T":{"q2","q4","q5"}},"q5":{"A":{"q3","q8"},"C":{"q3","q8"},"G":{"q8"},"T":{"q3","q8"}},"q6":{"A":{"q8"},"C":{"q8"},"G":{"q8"},"T":{"q8"}},"q7":{"A":{"q7","q8"},"C":{"q7","q8"},"G":{"q8"},"T":{"q3","q8"}},"q8":{},},initial_state="q1",final_states={"q8"},)big_nfa.tablebig_nfa.show_diagram("CGC")[Accepted]                         
Step: Current state: Input symbol: New state:
1                →q1             C         q4
2                 q4             G         q5
3                 q5             C        *q8AuthorsLewi Lie Uberg-uberg.meLicenseThis project is licensed under the MIT License - see theLICENSE.mdfile for detailsAcknowledgmentsCaleb Evansfor his work on automata-lib.Geir Arne Hjelle,Michal Porteš, andBart Willemsfor their general counsel.Dr. Seifedine Kadry. MyFurther Discrete Mathematicsprofessor atNoroff University College, for teaching me Automata.JFLAPfor their work on a GUI based Automata application.