Skip to content

Instantly share code, notes, and snippets.

@kenwebb
Last active May 9, 2019 10:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kenwebb/75fc87ec3cc222582478636f44c71c90 to your computer and use it in GitHub Desktop.
Save kenwebb/75fc87ec3cc222582478636f44c71c90 to your computer and use it in GitHub Desktop.
Picturing Quantum Processes (PQP) - exercise 3.30
<?xml version="1.0" encoding="UTF-8"?>
<!--Xholon Workbook http://www.primordion.com/Xholon/gwt/ MIT License, Copyright (C) Ken Webb, Thu May 09 2019 06:31:12 GMT-0400 (Eastern Daylight Time)-->
<XholonWorkbook>
<Notes><![CDATA[
Xholon
------
Title: Picturing Quantum Processes (PQP) - exercise 3.30
Description:
Url: http://www.primordion.com/Xholon/gwt/
InternalName: 75fc87ec3cc222582478636f44c71c90
Keywords:
My Notes
--------
May 6, 2019
Exercise 3.30 on page 55-56
Concurrency is important in this exercise.
TODO
----
- do a Petri Net implementation
Imlementation Approaches
------------------------
1. ROOM - communicating state machines
maybe eTrice
2. Petri Net
3. single Process class with roleName=NOT or CNOT
the behavior could base its actions on type (roleName) and time (timestep)
this approach is very specific to one particular app/Function
Type x Time -> Action
4. a DSL
using 2 symbols and parentheses:
⊗ parallel composition
∘ sequential composition
()
I think I did this with Graphical Linear Algebra
this might end up being a Xholon mechanism
5. perfectly synchronized, where layer 1 executes, followed by layer 2, etc.
each layer is at a different timestep
see PQP p. 48
6. use arrays to pass values between processes
7. other approaches mentioned in ref[3]
References
----------
(1) Picturing Quantum Processes
A First Course in Quantum Theory and Diagrammatic Reasoning
Bob Coecke, University of Oxford and Aleks Kissinger, Radboud Universiteit Nijmegen
2017
(2) http://127.0.0.1:8888/XholonOpDSL.html?app=57e815d9de593c1a3d0fe155c3790067&src=gist&gui=none
Operadics DSL IDE
ex: bindings d1 |-> X3
(3) https://en.wikipedia.org/wiki/Concurrency_(computer_science)
(4) https://inst.eecs.berkeley.edu/~ee249/fa07/discussions/TSM.pdf
A Framework for Comparing Models of Computation
Edward A. Lee,Fellow, IEEE, and Alberto Sangiovanni-Vincentelli,Fellow, IEEE
1998
(5) https://en.wikipedia.org/wiki/Reo_Coordination_Language
(6) https://en.wikipedia.org/wiki/Actor_model_and_process_calculi
(7) https://gist.github.com/kenwebb/834e367697da821ca2b207552f761018
Sync vs Async
various implementations of (((3 + 2) * 6) - (7 + 1))
<TestPetriNetApproach> produces the correct answer after 4 timesteps; uses a custom behavior
<TestPetriNetFuncApproach> also produces the correct answer; uses a built-in Petri Net behavior
(8) https://gist.github.com/kenwebb/063bc93c7c5deb1a16c75d84b2170a58
includes a Petri Net version
]]></Notes>
<_-.XholonClass>
<PhysicalSystem/>
<!-- processes -->
<Not/>
<Cnot/>
<!--<Not superClass="script"/>-->
<!--<Cnot superClass="script"/>-->
<Function>
<Function01/>
<Function02/>
</Function>
<TestHarness/>
<TestHarnessIn/>
<TestHarnessOut/>
<!-- NEW approach -->
<Process/>
<Diagram>
<Circuit/>
</Diagram>
<PetriNetApproach/>
<PNFunc>
<!-- a function that ... -->
<PNFuncNOT superClass="Script"/>
<!-- a function that ... -->
<PNFuncCNOT superClass="Script"/>
<!-- a function that ... -->
<PNFuncSWAP superClass="Script"/>
</PNFunc>
<PetriNetFunctions/>
</_-.XholonClass>
<xholonClassDetails>
<Not>
<port name="one" connector="./following-sibling::*"/>
</Not>
<Cnot>
<port name="one" connector="./following-sibling::*"/>
<port name="two" connector="./following-sibling::*[2]"/>
</Cnot>
<PNFuncNOT><DefaultContent>
var me, beh = {
postConfigure: function() {
me = this.cnode;
},
processReceivedSyncMessage: function(msg) {
var data = msg.data;
if (data == 0) {return 1;}
else {return 0;}
}
}
//# sourceURL=PNFuncNOT.js
</DefaultContent></PNFuncNOT>
<PNFuncCNOT><DefaultContent>
var me, beh = {
postConfigure: function() {
me = this.cnode;
},
processReceivedSyncMessage: function(msg) {
var datastr = msg.data.toString(); // an array of 2 integers
switch (datastr) {
case "0,0": return [0,0];
case "0,1": return [0,1];
case "1,0": return [1,1];
case "1,1": return [1,0];
default: return [101,102];
}
}
}
//# sourceURL=PNFuncCNOT.js
</DefaultContent></PNFuncCNOT>
<PNFuncSWAP><DefaultContent>
var me, beh = {
postConfigure: function() {
me = this.cnode;
},
processReceivedSyncMessage: function(msg) {
var data = msg.data;
return [data[1], data[0]];
}
}
//# sourceURL=PNFuncSWAP.js
</DefaultContent></PNFuncSWAP>
</xholonClassDetails>
<PhysicalSystem>
<!-- OLD approach -->
<TestHarness in01="0" in02="1">
<Function01>
<!-- layers; processing moves downwards from topmost layer/node to bottommost; in the book, it moves from bottom to top -->
<Not/> <!-- plain wire -->
<Cnot/>
<Not/> <Not/>
</Function01>
</TestHarness>
<TestHarness in01="0" in02="1">
<Function02></Function02>
</TestHarness>
<!-- NEW approach; specifications -->
<Process roleName="NOT"><Attribute_String>
0 |-> 1
1 |-> 0
</Attribute_String></Process>
<Process roleName="CNOT"><Attribute_String>
(0,0) |-> (0,0)
(0,1) |-> (0,1)
(1,0) |-> (1,1)
(1,1) |-> (1,0)
</Attribute_String></Process>
<Process roleName="identity"><Attribute_String>
(a) |-> (a)
</Attribute_String></Process>
<Process roleName="swap"><Attribute_String>
(a,b) |-> (b,a)
</Attribute_String></Process>
<Circuit roleName="3.30 1"><Attribute_String>
(NOT ⊗ NOT) ∘ CNOT ∘ (NOT ⊗ *)
</Attribute_String></Circuit>
<Circuit roleName="3.30 2"><Attribute_String>
CNOT ∘ swap ∘ CNOT ∘ swap ∘ CNOT
</Attribute_String></Circuit>
<!-- Petri Net approach -->
<PetriNetApproach>
<!-- KINETICS_FUNCTION = 11; auto invoke functions -->
<PetriNet roleName="PN 3.30 1" kineticsType="11">
<QueueTransitions shouldShuffle="false"/>
<AnalysisCRN/>
<AnalysisCat/>
<Places>
<!-- initial values -->
<PlacePN roleName="p1" token="0"/>
<PlacePN roleName="p2" token="0"/>
<PlacePN roleName="p3" token="0"/>
<PlacePN roleName="p4" token="0"/>
<PlacePN roleName="p5" token="0"/>
<PlacePN roleName="p6"/>
<PlacePN roleName="p7"/>
</Places>
<Transitions>
<TransitionPN roleName="t1NOT" functionXPath="ancestor::PhysicalSystem/PetriNetFunctions/PNFuncNOT">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p1']"/>
</InputArcs>
<OutputArcs>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p3']"/>
</OutputArcs>
</TransitionPN>
<TransitionPN roleName="t2CNOT" functionXPath="ancestor::PhysicalSystem/PetriNetFunctions/PNFuncCNOT">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p3']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p2']"/>
</InputArcs>
<OutputArcs>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p4']"/>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p5']"/>
</OutputArcs>
</TransitionPN>
<TransitionPN roleName="t3NOT" functionXPath="ancestor::PhysicalSystem/PetriNetFunctions/PNFuncNOT">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p4']"/>
</InputArcs>
<OutputArcs>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p6']"/>
</OutputArcs>
</TransitionPN>
<TransitionPN roleName="t4NOT" functionXPath="ancestor::PhysicalSystem/PetriNetFunctions/PNFuncNOT">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p5']"/>
</InputArcs>
<OutputArcs>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p7']"/>
</OutputArcs>
</TransitionPN>
</Transitions>
</PetriNet>
</PetriNetApproach>
<PetriNetApproach>
<!-- KINETICS_FUNCTION = 11; auto invoke functions -->
<PetriNet roleName="PN 3.30 2" kineticsType="11">
<QueueTransitions shouldShuffle="false"/>
<AnalysisCRN/>
<AnalysisCat/>
<Places>
<!-- initial values -->
<PlacePN roleName="p1" token="0"/>
<PlacePN roleName="p2" token="1"/>
<PlacePN roleName="p3" token="0"/>
<PlacePN roleName="p4" token="0"/>
<PlacePN roleName="p5" token="0"/>
<PlacePN roleName="p6" token="0"/>
<PlacePN roleName="p7" token="0"/>
<PlacePN roleName="p8" token="0"/>
<PlacePN roleName="p9" token="0"/>
<PlacePN roleName="p10" token="0"/>
<PlacePN roleName="p11" token="0"/>
<PlacePN roleName="p12" token="0"/>
</Places>
<Transitions>
<TransitionPN roleName="t1CNOT" functionXPath="ancestor::PhysicalSystem/PetriNetFunctions/PNFuncCNOT">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p1']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p2']"/>
</InputArcs>
<OutputArcs>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p3']"/>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p4']"/>
</OutputArcs>
</TransitionPN>
<TransitionPN roleName="t2SWAP" functionXPath="ancestor::PhysicalSystem/PetriNetFunctions/PNFuncSWAP">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p3']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p4']"/>
</InputArcs>
<OutputArcs>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p5']"/>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p6']"/>
</OutputArcs>
</TransitionPN>
<TransitionPN roleName="t3CNOT" functionXPath="ancestor::PhysicalSystem/PetriNetFunctions/PNFuncCNOT">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p5']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p6']"/>
</InputArcs>
<OutputArcs>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p7']"/>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p8']"/>
</OutputArcs>
</TransitionPN>
<TransitionPN roleName="t4SWAP" functionXPath="ancestor::PhysicalSystem/PetriNetFunctions/PNFuncSWAP">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p7']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p8']"/>
</InputArcs>
<OutputArcs>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p9']"/>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p10']"/>
</OutputArcs>
</TransitionPN>
<TransitionPN roleName="t5CNOT" functionXPath="ancestor::PhysicalSystem/PetriNetFunctions/PNFuncCNOT">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p9']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p10']"/>
</InputArcs>
<OutputArcs>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p11']"/>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/PlacePN[@roleName='p12']"/>
</OutputArcs>
</TransitionPN>
</Transitions>
</PetriNet>
</PetriNetApproach>
<!-- a set of Petri Net functions
will be invoked by TransitionPN nodes
-->
<PetriNetFunctions>
<PNFuncNOT/>
<PNFuncCNOT/>
<PNFuncSWAP/>
</PetriNetFunctions>
</PhysicalSystem>
<Notbehavior implName="org.primordion.xholon.base.Behavior_gwtjs"><![CDATA[
var me, beh = {
postConfigure: function() {
me = this.cnode.parent();
//me.println("I am Not.");
},
act: function() {
//me.println(this.toString());
}
}
//# sourceURL=Notbehavior.js
]]></Notbehavior>
<Cnotbehavior implName="org.primordion.xholon.base.Behavior_gwtjs"><![CDATA[
var me, beh = {
postConfigure: function() {
me = this.cnode.parent();
//me.println("I am Cnot.");
},
act: function() {
//me.println(this.toString());
}
}
//# sourceURL=Cnotbehavior.js
]]></Cnotbehavior>
<SvgClient><Attribute_String roleName="svgUri"><![CDATA[data:image/svg+xml,
<svg width="143pt" height="549pt"
viewBox="0.00 0.00 143.00 548.80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="PetriNet" class="graph" transform="scale(1 1) rotate(0) translate(4 544.8)">
<title>61</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-544.8 139,-544.8 139,4 -4,4"/>
<text text-anchor="middle" x="67.5" y="-8.2" font-family="Courier New" font-size="14.00">PN 3.30 1</text>
<!-- 64 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p1&#39;]" class="node"><title>64</title>
<ellipse fill="#ffff00" stroke="black" cx="30" cy="-42.8" rx="27" ry="18"/>
<text text-anchor="middle" x="30" y="-38.6" font-family="Courier New" font-size="14.00">p1</text>
</g>
<!-- 72 -->
<g id="PetriNet/Transitions/TransitionPN[@roleName=&#39;t1NOT&#39;]" class="node"><title>72</title>
<polygon fill="#00ffff" stroke="black" points="58.993,-132.8 1.007,-132.8 1.007,-96.8 58.993,-96.8 58.993,-132.8"/>
<text text-anchor="middle" x="30" y="-110.6" font-family="Courier New" font-size="14.00">t1NOT</text>
</g>
<!-- 64&#45;&gt;72 -->
<g id="PetriNet_edge1" class="edge"><title>64&#45;&gt;72</title>
<path fill="none" stroke="black" d="M30,-61.1034C30,-68.8173 30,-78.0875 30,-86.6876"/>
<polygon fill="black" stroke="black" points="30,-96.6957 25.5001,-86.6956 30,-91.6957 30.0001,-86.6957 30.0001,-86.6957 30.0001,-86.6957 30,-91.6957 34.5001,-86.6957 30,-96.6957 30,-96.6957"/>
</g>
<!-- 65 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p2&#39;]" class="node"><title>65</title>
<ellipse fill="#ffff00" stroke="black" cx="104" cy="-198.8" rx="27" ry="18"/>
<text text-anchor="middle" x="104" y="-194.6" font-family="Courier New" font-size="14.00">p2</text>
</g>
<!-- 77 -->
<g id="PetriNet/Transitions/TransitionPN[@roleName=&#39;t2CNOT&#39;]" class="node"><title>77</title>
<polygon fill="#00ffff" stroke="black" points="100.393,-300.8 33.6072,-300.8 33.6072,-264.8 100.393,-264.8 100.393,-300.8"/>
<text text-anchor="middle" x="67" y="-278.6" font-family="Courier New" font-size="14.00">t2CNOT</text>
</g>
<!-- 65&#45;&gt;77 -->
<g id="PetriNet_edge4" class="edge"><title>65&#45;&gt;77</title>
<path fill="none" stroke="black" d="M96.5125,-216.394C91.4644,-227.582 84.6963,-242.581 78.9149,-255.394"/>
<polygon fill="black" stroke="black" points="74.7311,-264.666 74.7422,-253.7 76.7875,-260.109 78.844,-255.551 78.844,-255.551 78.844,-255.551 76.7875,-260.109 82.9458,-257.402 74.7311,-264.666 74.7311,-264.666"/>
</g>
<!-- 66 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p3&#39;]" class="node"><title>66</title>
<ellipse fill="#ffff00" stroke="black" cx="30" cy="-198.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="30" y="-203" font-family="Courier New" font-size="14.00">p3</text>
<text text-anchor="middle" x="30" y="-186.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 66&#45;&gt;77 -->
<g id="PetriNet_edge3" class="edge"><title>66&#45;&gt;77</title>
<path fill="none" stroke="black" d="M41.707,-225.745C45.9496,-235.148 50.7457,-245.777 55.0121,-255.232"/>
<polygon fill="black" stroke="black" points="59.221,-264.56 51.0063,-257.296 57.1646,-260.003 55.1081,-255.445 55.1081,-255.445 55.1081,-255.445 57.1646,-260.003 59.2099,-253.594 59.221,-264.56 59.221,-264.56"/>
</g>
<!-- 67 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p4&#39;]" class="node"><title>67</title>
<ellipse fill="#ffff00" stroke="black" cx="29" cy="-366.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="29" y="-371" font-family="Courier New" font-size="14.00">p4</text>
<text text-anchor="middle" x="29" y="-354.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 84 -->
<g id="PetriNet/Transitions/TransitionPN[@roleName=&#39;t3NOT&#39;]" class="node"><title>84</title>
<polygon fill="#00ffff" stroke="black" points="57.993,-468.8 0.00699958,-468.8 0.00699958,-432.8 57.993,-432.8 57.993,-468.8"/>
<text text-anchor="middle" x="29" y="-446.6" font-family="Courier New" font-size="14.00">t3NOT</text>
</g>
<!-- 67&#45;&gt;84 -->
<g id="PetriNet_edge7" class="edge"><title>67&#45;&gt;84</title>
<path fill="none" stroke="black" d="M29,-396.48C29,-404.923 29,-414.134 29,-422.489"/>
<polygon fill="black" stroke="black" points="29,-432.491 24.5001,-422.491 29,-427.491 29.0001,-422.491 29.0001,-422.491 29.0001,-422.491 29,-427.491 33.5001,-422.491 29,-432.491 29,-432.491"/>
</g>
<!-- 68 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p5&#39;]" class="node"><title>68</title>
<ellipse fill="#ffff00" stroke="black" cx="105" cy="-366.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="105" y="-371" font-family="Courier New" font-size="14.00">p5</text>
<text text-anchor="middle" x="105" y="-354.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 89 -->
<g id="PetriNet/Transitions/TransitionPN[@roleName=&#39;t4NOT&#39;]" class="node"><title>89</title>
<polygon fill="#00ffff" stroke="black" points="133.993,-468.8 76.007,-468.8 76.007,-432.8 133.993,-432.8 133.993,-468.8"/>
<text text-anchor="middle" x="105" y="-446.6" font-family="Courier New" font-size="14.00">t4NOT</text>
</g>
<!-- 68&#45;&gt;89 -->
<g id="PetriNet_edge9" class="edge"><title>68&#45;&gt;89</title>
<path fill="none" stroke="black" d="M105,-396.48C105,-404.923 105,-414.134 105,-422.489"/>
<polygon fill="black" stroke="black" points="105,-432.491 100.5,-422.491 105,-427.491 105,-422.491 105,-422.491 105,-422.491 105,-427.491 109.5,-422.491 105,-432.491 105,-432.491"/>
</g>
<!-- 69 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p6&#39;]" class="node"><title>69</title>
<ellipse fill="#ffff00" stroke="black" cx="29" cy="-522.8" rx="27" ry="18"/>
<text text-anchor="middle" x="29" y="-518.6" font-family="Courier New" font-size="14.00">p6</text>
</g>
<!-- 70 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p7&#39;]" class="node"><title>70</title>
<ellipse fill="#ffff00" stroke="black" cx="105" cy="-522.8" rx="27" ry="18"/>
<text text-anchor="middle" x="105" y="-518.6" font-family="Courier New" font-size="14.00">p7</text>
</g>
<!-- 72&#45;&gt;66 -->
<g id="PetriNet_edge2" class="edge"><title>72&#45;&gt;66</title>
<path fill="none" stroke="black" d="M30,-133.19C30,-140.773 30,-149.991 30,-159.06"/>
<polygon fill="black" stroke="black" points="30,-169.142 25.5001,-159.142 30,-164.142 30.0001,-159.142 30.0001,-159.142 30.0001,-159.142 30,-164.142 34.5001,-159.142 30,-169.142 30,-169.142"/>
</g>
<!-- 77&#45;&gt;67 -->
<g id="PetriNet_edge5" class="edge"><title>77&#45;&gt;67</title>
<path fill="none" stroke="black" d="M58.9412,-301.19C54.9713,-309.757 50.0348,-320.409 45.3224,-330.578"/>
<polygon fill="black" stroke="black" points="41.092,-339.707 41.2137,-328.742 43.1943,-335.17 45.2966,-330.634 45.2966,-330.634 45.2966,-330.634 43.1943,-335.17 49.3795,-332.526 41.092,-339.707 41.092,-339.707"/>
</g>
<!-- 77&#45;&gt;68 -->
<g id="PetriNet_edge6" class="edge"><title>77&#45;&gt;68</title>
<path fill="none" stroke="black" d="M75.0588,-301.19C79.0287,-309.757 83.9652,-320.409 88.6776,-330.578"/>
<polygon fill="black" stroke="black" points="92.908,-339.707 84.6205,-332.526 90.8057,-335.17 88.7034,-330.634 88.7034,-330.634 88.7034,-330.634 90.8057,-335.17 92.7863,-328.742 92.908,-339.707 92.908,-339.707"/>
</g>
<!-- 84&#45;&gt;69 -->
<g id="PetriNet_edge8" class="edge"><title>84&#45;&gt;69</title>
<path fill="none" stroke="black" d="M29,-469.103C29,-476.817 29,-486.088 29,-494.688"/>
<polygon fill="black" stroke="black" points="29,-504.696 24.5001,-494.696 29,-499.696 29.0001,-494.696 29.0001,-494.696 29.0001,-494.696 29,-499.696 33.5001,-494.696 29,-504.696 29,-504.696"/>
</g>
<!-- 89&#45;&gt;70 -->
<g id="PetriNet_edge10" class="edge"><title>89&#45;&gt;70</title>
<path fill="none" stroke="black" d="M105,-469.103C105,-476.817 105,-486.088 105,-494.688"/>
<polygon fill="black" stroke="black" points="105,-504.696 100.5,-494.696 105,-499.696 105,-494.696 105,-494.696 105,-494.696 105,-499.696 109.5,-494.696 105,-504.696 105,-504.696"/>
</g>
</g>
</svg>
<svg width="142pt" height="933pt"
viewBox="0.00 0.00 142.00 932.80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="PetriNet" class="graph" transform="scale(1 1) rotate(0) translate(4 928.8)">
<title>97</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-928.8 138,-928.8 138,4 -4,4"/>
<text text-anchor="middle" x="67" y="-8.2" font-family="Courier New" font-size="14.00">PN 3.30 2</text>
<!-- 102 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p1&#39;]" class="node"><title>102</title>
<ellipse fill="#ffff00" stroke="black" cx="30" cy="-54.8" rx="27" ry="18"/>
<text text-anchor="middle" x="30" y="-50.6" font-family="Courier New" font-size="14.00">p1</text>
</g>
<!-- 115 -->
<g id="PetriNet/Transitions/TransitionPN[@roleName=&#39;t1CNOT&#39;]" class="node"><title>115</title>
<polygon fill="#00ffff" stroke="black" points="100.393,-156.8 33.6072,-156.8 33.6072,-120.8 100.393,-120.8 100.393,-156.8"/>
<text text-anchor="middle" x="67" y="-134.6" font-family="Courier New" font-size="14.00">t1CNOT</text>
</g>
<!-- 102&#45;&gt;115 -->
<g id="PetriNet_edge1" class="edge"><title>102&#45;&gt;115</title>
<path fill="none" stroke="black" d="M37.4875,-72.3939C42.5356,-83.5816 49.3037,-98.5812 55.0851,-111.394"/>
<polygon fill="black" stroke="black" points="59.2689,-120.666 51.0542,-113.402 57.2125,-116.109 55.156,-111.551 55.156,-111.551 55.156,-111.551 57.2125,-116.109 59.2578,-109.7 59.2689,-120.666 59.2689,-120.666"/>
</g>
<!-- 103 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p2&#39;]" class="node"><title>103</title>
<ellipse fill="#ffff00" stroke="black" cx="104" cy="-54.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="104" y="-59" font-family="Courier New" font-size="14.00">p2</text>
<text text-anchor="middle" x="104" y="-42.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 103&#45;&gt;115 -->
<g id="PetriNet_edge2" class="edge"><title>103&#45;&gt;115</title>
<path fill="none" stroke="black" d="M92.293,-81.7453C88.0504,-91.1478 83.2543,-101.777 78.9879,-111.232"/>
<polygon fill="black" stroke="black" points="74.779,-120.56 74.7901,-109.594 76.8354,-116.003 78.8919,-111.445 78.8919,-111.445 78.8919,-111.445 76.8354,-116.003 82.9937,-113.296 74.779,-120.56 74.779,-120.56"/>
</g>
<!-- 104 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p3&#39;]" class="node"><title>104</title>
<ellipse fill="#ffff00" stroke="black" cx="30" cy="-222.8" rx="27" ry="18"/>
<text text-anchor="middle" x="30" y="-218.6" font-family="Courier New" font-size="14.00">p3</text>
</g>
<!-- 122 -->
<g id="PetriNet/Transitions/TransitionPN[2]" class="node"><title>122</title>
<polygon fill="#00ffff" stroke="black" points="100.393,-324.8 33.6072,-324.8 33.6072,-288.8 100.393,-288.8 100.393,-324.8"/>
<text text-anchor="middle" x="67" y="-302.6" font-family="Courier New" font-size="14.00">t2SWAP</text>
</g>
<!-- 104&#45;&gt;122 -->
<g id="PetriNet_edge5" class="edge"><title>104&#45;&gt;122</title>
<path fill="none" stroke="black" d="M37.4875,-240.394C42.5356,-251.582 49.3037,-266.581 55.0851,-279.394"/>
<polygon fill="black" stroke="black" points="59.2689,-288.666 51.0542,-281.402 57.2125,-284.109 55.156,-279.551 55.156,-279.551 55.156,-279.551 57.2125,-284.109 59.2578,-277.7 59.2689,-288.666 59.2689,-288.666"/>
</g>
<!-- 105 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p4&#39;]" class="node"><title>105</title>
<ellipse fill="#ffff00" stroke="black" cx="104" cy="-222.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="104" y="-227" font-family="Courier New" font-size="14.00">p4</text>
<text text-anchor="middle" x="104" y="-210.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 105&#45;&gt;122 -->
<g id="PetriNet_edge6" class="edge"><title>105&#45;&gt;122</title>
<path fill="none" stroke="black" d="M92.293,-249.745C88.0504,-259.148 83.2543,-269.777 78.9879,-279.232"/>
<polygon fill="black" stroke="black" points="74.779,-288.56 74.7901,-277.594 76.8354,-284.003 78.8919,-279.445 78.8919,-279.445 78.8919,-279.445 76.8354,-284.003 82.9937,-281.296 74.779,-288.56 74.779,-288.56"/>
</g>
<!-- 106 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p5&#39;]" class="node"><title>106</title>
<ellipse fill="#ffff00" stroke="black" cx="30" cy="-390.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="30" y="-395" font-family="Courier New" font-size="14.00">p5</text>
<text text-anchor="middle" x="30" y="-378.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 129 -->
<g id="PetriNet/Transitions/TransitionPN[@roleName=&#39;t3CNOT&#39;]" class="node"><title>129</title>
<polygon fill="#00ffff" stroke="black" points="100.393,-492.8 33.6072,-492.8 33.6072,-456.8 100.393,-456.8 100.393,-492.8"/>
<text text-anchor="middle" x="67" y="-470.6" font-family="Courier New" font-size="14.00">t3CNOT</text>
</g>
<!-- 106&#45;&gt;129 -->
<g id="PetriNet_edge9" class="edge"><title>106&#45;&gt;129</title>
<path fill="none" stroke="black" d="M41.707,-417.745C45.9496,-427.148 50.7457,-437.777 55.0121,-447.232"/>
<polygon fill="black" stroke="black" points="59.221,-456.56 51.0063,-449.296 57.1646,-452.003 55.1081,-447.445 55.1081,-447.445 55.1081,-447.445 57.1646,-452.003 59.2099,-445.594 59.221,-456.56 59.221,-456.56"/>
</g>
<!-- 107 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p6&#39;]" class="node"><title>107</title>
<ellipse fill="#ffff00" stroke="black" cx="104" cy="-390.8" rx="27" ry="18"/>
<text text-anchor="middle" x="104" y="-386.6" font-family="Courier New" font-size="14.00">p6</text>
</g>
<!-- 107&#45;&gt;129 -->
<g id="PetriNet_edge10" class="edge"><title>107&#45;&gt;129</title>
<path fill="none" stroke="black" d="M96.5125,-408.394C91.4644,-419.582 84.6963,-434.581 78.9149,-447.394"/>
<polygon fill="black" stroke="black" points="74.7311,-456.666 74.7422,-445.7 76.7875,-452.109 78.844,-447.551 78.844,-447.551 78.844,-447.551 76.7875,-452.109 82.9458,-449.402 74.7311,-456.666 74.7311,-456.666"/>
</g>
<!-- 108 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p7&#39;]" class="node"><title>108</title>
<ellipse fill="#ffff00" stroke="black" cx="29" cy="-558.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="29" y="-563" font-family="Courier New" font-size="14.00">p7</text>
<text text-anchor="middle" x="29" y="-546.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 136 -->
<g id="PetriNet/Transitions/TransitionPN[4]" class="node"><title>136</title>
<polygon fill="#00ffff" stroke="black" points="100.393,-660.8 33.6072,-660.8 33.6072,-624.8 100.393,-624.8 100.393,-660.8"/>
<text text-anchor="middle" x="67" y="-638.6" font-family="Courier New" font-size="14.00">t4SWAP</text>
</g>
<!-- 108&#45;&gt;136 -->
<g id="PetriNet_edge13" class="edge"><title>108&#45;&gt;136</title>
<path fill="none" stroke="black" d="M41.0234,-585.745C45.3807,-595.148 50.3064,-605.777 54.6881,-615.232"/>
<polygon fill="black" stroke="black" points="59.0108,-624.56 50.7232,-617.379 56.9085,-620.024 54.8061,-615.487 54.8061,-615.487 54.8061,-615.487 56.9085,-620.024 58.889,-613.595 59.0108,-624.56 59.0108,-624.56"/>
</g>
<!-- 109 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p8&#39;]" class="node"><title>109</title>
<ellipse fill="#ffff00" stroke="black" cx="105" cy="-558.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="105" y="-563" font-family="Courier New" font-size="14.00">p8</text>
<text text-anchor="middle" x="105" y="-546.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 109&#45;&gt;136 -->
<g id="PetriNet_edge14" class="edge"><title>109&#45;&gt;136</title>
<path fill="none" stroke="black" d="M92.9766,-585.745C88.6193,-595.148 83.6936,-605.777 79.3119,-615.232"/>
<polygon fill="black" stroke="black" points="74.9892,-624.56 75.111,-613.595 77.0915,-620.024 79.1939,-615.487 79.1939,-615.487 79.1939,-615.487 77.0915,-620.024 83.2768,-617.379 74.9892,-624.56 74.9892,-624.56"/>
</g>
<!-- 110 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p9&#39;]" class="node"><title>110</title>
<ellipse fill="#ffff00" stroke="black" cx="29" cy="-726.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="29" y="-731" font-family="Courier New" font-size="14.00">p9</text>
<text text-anchor="middle" x="29" y="-714.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 143 -->
<g id="PetriNet/Transitions/TransitionPN[@roleName=&#39;t5CNOT&#39;]" class="node"><title>143</title>
<polygon fill="#00ffff" stroke="black" points="100.393,-828.8 33.6072,-828.8 33.6072,-792.8 100.393,-792.8 100.393,-828.8"/>
<text text-anchor="middle" x="67" y="-806.6" font-family="Courier New" font-size="14.00">t5CNOT</text>
</g>
<!-- 110&#45;&gt;143 -->
<g id="PetriNet_edge17" class="edge"><title>110&#45;&gt;143</title>
<path fill="none" stroke="black" d="M41.0234,-753.745C45.3807,-763.148 50.3064,-773.777 54.6881,-783.232"/>
<polygon fill="black" stroke="black" points="59.0108,-792.56 50.7232,-785.379 56.9085,-788.024 54.8061,-783.487 54.8061,-783.487 54.8061,-783.487 56.9085,-788.024 58.889,-781.595 59.0108,-792.56 59.0108,-792.56"/>
</g>
<!-- 111 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p10&#39;]" class="node"><title>111</title>
<ellipse fill="#ffff00" stroke="black" cx="105" cy="-726.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="105" y="-731" font-family="Courier New" font-size="14.00">p10</text>
<text text-anchor="middle" x="105" y="-714.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 111&#45;&gt;143 -->
<g id="PetriNet_edge18" class="edge"><title>111&#45;&gt;143</title>
<path fill="none" stroke="black" d="M92.9766,-753.745C88.6193,-763.148 83.6936,-773.777 79.3119,-783.232"/>
<polygon fill="black" stroke="black" points="74.9892,-792.56 75.111,-781.595 77.0915,-788.024 79.1939,-783.487 79.1939,-783.487 79.1939,-783.487 77.0915,-788.024 83.2768,-785.379 74.9892,-792.56 74.9892,-792.56"/>
</g>
<!-- 112 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p11&#39;]" class="node"><title>112</title>
<ellipse fill="#ffff00" stroke="black" cx="29" cy="-894.8" rx="29.2602" ry="29.3315"/>
<text text-anchor="middle" x="29" y="-899" font-family="Courier New" font-size="14.00">p11</text>
<text text-anchor="middle" x="29" y="-882.2" font-family="Courier New" font-size="14.00">⬤</text>
</g>
<!-- 113 -->
<g id="PetriNet/Places/PlacePN[@roleName=&#39;p12&#39;]" class="node"><title>113</title>
<ellipse fill="#ffff00" stroke="black" cx="105" cy="-894.8" rx="28.3325" ry="18"/>
<text text-anchor="middle" x="105" y="-890.6" font-family="Courier New" font-size="14.00">p12</text>
</g>
<!-- 115&#45;&gt;104 -->
<g id="PetriNet_edge3" class="edge"><title>115&#45;&gt;104</title>
<path fill="none" stroke="black" d="M59.1533,-157.19C54.0482,-168.504 47.3014,-183.456 41.5841,-196.127"/>
<polygon fill="black" stroke="black" points="37.4569,-205.274 37.4681,-194.308 39.5134,-200.716 41.5698,-196.159 41.5698,-196.159 41.5698,-196.159 39.5134,-200.716 45.6716,-198.01 37.4569,-205.274 37.4569,-205.274"/>
</g>
<!-- 115&#45;&gt;105 -->
<g id="PetriNet_edge4" class="edge"><title>115&#45;&gt;105</title>
<path fill="none" stroke="black" d="M74.8467,-157.19C78.7121,-165.757 83.5188,-176.409 88.1071,-186.578"/>
<polygon fill="black" stroke="black" points="92.2262,-195.707 84.0115,-188.443 90.1698,-191.149 88.1133,-186.592 88.1133,-186.592 88.1133,-186.592 90.1698,-191.149 92.2151,-184.741 92.2262,-195.707 92.2262,-195.707"/>
</g>
<!-- 122&#45;&gt;106 -->
<g id="PetriNet_edge7" class="edge"><title>122&#45;&gt;106</title>
<path fill="none" stroke="black" d="M59.1533,-325.19C55.2879,-333.757 50.4812,-344.409 45.8929,-354.578"/>
<polygon fill="black" stroke="black" points="41.7738,-363.707 41.7849,-352.741 43.8302,-359.149 45.8867,-354.592 45.8867,-354.592 45.8867,-354.592 43.8302,-359.149 49.9885,-356.443 41.7738,-363.707 41.7738,-363.707"/>
</g>
<!-- 122&#45;&gt;107 -->
<g id="PetriNet_edge8" class="edge"><title>122&#45;&gt;107</title>
<path fill="none" stroke="black" d="M74.8467,-325.19C79.9518,-336.504 86.6986,-351.456 92.4159,-364.127"/>
<polygon fill="black" stroke="black" points="96.5431,-373.274 88.3284,-366.01 94.4866,-368.716 92.4302,-364.159 92.4302,-364.159 92.4302,-364.159 94.4866,-368.716 96.5319,-362.308 96.5431,-373.274 96.5431,-373.274"/>
</g>
<!-- 129&#45;&gt;108 -->
<g id="PetriNet_edge11" class="edge"><title>129&#45;&gt;108</title>
<path fill="none" stroke="black" d="M58.9412,-493.19C54.9713,-501.757 50.0348,-512.409 45.3224,-522.578"/>
<polygon fill="black" stroke="black" points="41.092,-531.707 41.2137,-520.742 43.1943,-527.17 45.2966,-522.634 45.2966,-522.634 45.2966,-522.634 43.1943,-527.17 49.3795,-524.526 41.092,-531.707 41.092,-531.707"/>
</g>
<!-- 129&#45;&gt;109 -->
<g id="PetriNet_edge12" class="edge"><title>129&#45;&gt;109</title>
<path fill="none" stroke="black" d="M75.0588,-493.19C79.0287,-501.757 83.9652,-512.409 88.6776,-522.578"/>
<polygon fill="black" stroke="black" points="92.908,-531.707 84.6205,-524.526 90.8057,-527.17 88.7034,-522.634 88.7034,-522.634 88.7034,-522.634 90.8057,-527.17 92.7863,-520.742 92.908,-531.707 92.908,-531.707"/>
</g>
<!-- 136&#45;&gt;110 -->
<g id="PetriNet_edge15" class="edge"><title>136&#45;&gt;110</title>
<path fill="none" stroke="black" d="M58.9412,-661.19C54.9713,-669.757 50.0348,-680.409 45.3224,-690.578"/>
<polygon fill="black" stroke="black" points="41.092,-699.707 41.2137,-688.742 43.1943,-695.17 45.2966,-690.634 45.2966,-690.634 45.2966,-690.634 43.1943,-695.17 49.3795,-692.526 41.092,-699.707 41.092,-699.707"/>
</g>
<!-- 136&#45;&gt;111 -->
<g id="PetriNet_edge16" class="edge"><title>136&#45;&gt;111</title>
<path fill="none" stroke="black" d="M75.0588,-661.19C79.0287,-669.757 83.9652,-680.409 88.6776,-690.578"/>
<polygon fill="black" stroke="black" points="92.908,-699.707 84.6205,-692.526 90.8057,-695.17 88.7034,-690.634 88.7034,-690.634 88.7034,-690.634 90.8057,-695.17 92.7863,-688.742 92.908,-699.707 92.908,-699.707"/>
</g>
<!-- 143&#45;&gt;112 -->
<g id="PetriNet_edge19" class="edge"><title>143&#45;&gt;112</title>
<path fill="none" stroke="black" d="M58.9412,-829.19C54.9713,-837.757 50.0348,-848.409 45.3224,-858.578"/>
<polygon fill="black" stroke="black" points="41.092,-867.707 41.2137,-856.742 43.1943,-863.17 45.2966,-858.634 45.2966,-858.634 45.2966,-858.634 43.1943,-863.17 49.3795,-860.526 41.092,-867.707 41.092,-867.707"/>
</g>
<!-- 143&#45;&gt;113 -->
<g id="PetriNet_edge20" class="edge"><title>143&#45;&gt;113</title>
<path fill="none" stroke="black" d="M75.0588,-829.19C80.3018,-840.504 87.231,-855.456 93.1028,-868.127"/>
<polygon fill="black" stroke="black" points="97.3416,-877.274 89.054,-870.093 95.2392,-872.737 93.1369,-868.201 93.1369,-868.201 93.1369,-868.201 95.2392,-872.737 97.2198,-866.309 97.3416,-877.274 97.3416,-877.274"/>
</g>
</g>
</svg>
]]></Attribute_String><Attribute_String roleName="setup">${MODELNAME_DEFAULT},${SVGURI_DEFAULT}</Attribute_String></SvgClient>
</XholonWorkbook>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment