Skip to content

Instantly share code, notes, and snippets.

@kenwebb
Last active November 20, 2017 15:32
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/063bc93c7c5deb1a16c75d84b2170a58 to your computer and use it in GitHub Desktop.
Save kenwebb/063bc93c7c5deb1a16c75d84b2170a58 to your computer and use it in GitHub Desktop.
Operads - Domain Specific Language, and Parsing
<?xml version="1.0" encoding="UTF-8"?>
<!--Xholon Workbook http://www.primordion.com/Xholon/gwt/ MIT License, Copyright (C) Ken Webb, Mon Nov 20 2017 10:31:30 GMT-0500 (EST)-->
<XholonWorkbook>
<Notes><![CDATA[
Xholon
------
Title: Operads - Domain Specific Language, and Parsing
Description:
Url: http://www.primordion.com/Xholon/gwt/
InternalName: 063bc93c7c5deb1a16c75d84b2170a58
Keywords:
My Notes
--------
November 3, 2017
In this workbook I will explore:
- creating a Domain Specific Language (DSL) for specifying operads
- based on the notation that David Spivak uses in his papers and other writings
- I'm using David as my domain expert
- it's important to adhere as closely as possible to a notation that feels natural for him and others working in that field
- parsing the DSL in order to generate a Xholon model
Everything here is VERY TENTATIVE
- I'm just getting my thinking together
Some initial notes:
- this will be a text-only format
- all DSL keyword and symbol characters should be from the ASCII character set
- for now I don't want to deal with superscripts and subscripts
- I will not be able to use the apostrophe character (ex: v') because of its uses in HTML and JavaScript
- perhaps I could convert it internally to some unique string such as __PRIME__
- see also https://en.wikipedia.org/wiki/Prime_%28symbol%29
- what convention should the DSL provide for writing comments? // /* */ # or other single character
- for now I'll use # as in Python
- allow Greek letters, but for now in my examples I will probably not use them
α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω
Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω
- the following type of characters may not work
î ĵ a⃗ b⃗ c⃗ d⃗ e⃗ f⃗ g⃗ h⃗ i⃗ j⃗ k⃗ l⃗ m⃗ n⃗ o⃗ p⃗ q⃗ r⃗ s⃗ t⃗ u⃗ v⃗ w⃗ x⃗ y⃗ z⃗
- a name or token can consist of any number of letters, digits, and underscores
- the first letter can be any of these
- users may wish to restrict names to only a single character
- in this case, a second character would be interpreted as a subscript or superscript
- use "->" as an arrow, rather than something like "→"
- spaces and tabs can optionally be inserted between tokens
- uppercase vs lowercase letters
- look at some of the tools and methodologies from software engineering that I think are similar to operads:
- ROOM
- ObjecTime, Rose RealTime
- eTrice
- UML
- SysML
- Bigraphs, and Bigraph tools such as BigraphER
- David Harel papers on State Machines and Visual Formalisms
- UML associatiions for ideas on hypergraphs
- ISO ODP
- SDL
- SBML, and Xholon SBML models
-
- look at other tools and approaches
- AQL
- other math DSLs
- Eclipse XText and XTend
-
- the order of statements/expressions in the DSL is important
- ex: nodes must be defined first
November 4, 2017
Here's one way to represent variables as hyperedges in Xholon:
- create each cable/variable/hyperedge/link as a normal Xholon passive object, that lives somewhere in the CSH tree
- perhaps as children of a <Hyperedges/> node
- have each node port connect to its named cable
- then set the parentNode of each node to null, and perhaps also set the nextSibling to null
- probably just do node.remove() in JavaScript
- the cables would then be connected to other nodes only through ports, but would no longer exist within the overall tree
- they would only exist in some hyperedge domain
- an Avatar would still be able to visit them
- nodes (packs) would still be able to share access to them
- maybe I could also keep them in an array somewhere; perhaps inside the <Hyperedges/> node
- when viewing a visual representation of a model, a hyperedge should appear as a labeled undirected (hyper)line between ports
- maybe display a small black dot
- Xholon exporters (ex: Graphviz) would recognize them as remote nodes with a null parentNode
- or just put cables under a <Hyperedges/> node that's removed from the main part of the model
- Graphviz/etc would recognize the remote node as a hyperedge and would traet it differently - draw undirected connector with small dot and label
- maybe I need a Hyperedge.java class, and Hyperedge mechanism and node types
November 5, 2017
TODO
- possibly implement code to allow nodes to specify IPort ports from within the CSH
-
Edited Graphviz output from the Xholon/SBML Brusselator model
-------------------------------------------------------------
graph 0 {
graph [label="Brusselator",id="compartment",stylesheet="Xholon.css",size=20,fontname="Courier New"]
node [style=filled,fillcolor="#f0f8ff",shape=circle,fontname="Courier New"]
edge [arrowhead=vee]
1 [xlabel="X" shape=point fillcolor="#000000" id="compartment/X"]
2 [xlabel="Y" shape=point fillcolor="#000000" id="compartment/Y"]
3 [xlabel="E" shape=point fillcolor="#000000" id="compartment/E"]
4 [xlabel="D" shape=point fillcolor="#000000" id="compartment/D"]
5 [xlabel="B" shape=point fillcolor="#000000" id="compartment/B"]
6 [xlabel="A" shape=point fillcolor="#000000" id="compartment/A"]
7 [label="R1" id="compartment/R1"]
7 -- 6;
7 -- 1;
8 [label="R2" id="compartment/R2"]
8 -- 1;
8 -- 2;
8 -- 1;
9 [label="R3" id="compartment/R3"]
9 -- 1;
9 -- 5;
9 -- 2;
9 -- 4;
10 [label="R4" id="compartment/R4"]
10 -- 1;
10 -- 3;
}
November 7, 2017
Morphisms
---------
- morphism statements need to be poitioned sequentially in the DSL, so they are processed in the correct (bottom-up?) order
- morphism rules for parsing into a Xholon tree
- leaf nodes are always retained; internal/non-leaf nodes gradually vanish
- the ultimate root node is retained
- intermediate-level nodes (internal/non-leaf nodes) with behaviors should be retained as separate leaf nodes
Graphviz output from Pixel Array paper[2], section 2.1 and 2.2
--------------------------------------------------------------
/*
Automatically generated by Xholon version 0.8.1, using org.primordion.ef.Xholon2Graphviz.java
Tue Nov 07 13:57:24 GMT-500 2017 1510081044364
model: Operads - Domain Specific Language, and Parsing
www.primordion.com/Xholon
To view this file, use Graphviz dot|fdp|neato|twopi|circo|sfdp from http://www.graphviz.org/
For example, to generate an SVG file:
neato -Tsvg -O OperadExample_158_1510081044364.gv
Alternatively try one of these:
dot -Tsvg -O OperadExample_158_1510081044364.gv
dot -Tsvg -O -Grankdir=LR OperadExample_158_1510081044364.gv
fdp -Tsvg -O OperadExample_158_1510081044364.gv
neato -Tsvg -O OperadExample_158_1510081044364.gv
circo -Tsvg -O OperadExample_158_1510081044364.gv
Or use one of: -Tgif -Tjpg -Tpdf -Tpng -Txdot -Txlib
See also: http://hughesbennett.net/Graphviz
See also: http://graphviz-dev.appspot.com/
See also: http://www.webgraphviz.com/
See also: http://rise4fun.com/agl/
To repeat this Xholon export:
$wnd.xh.xport("Graphviz", $wnd.xh.root().parent().xpath("Chameleon/PhysicalSystem/OperadExample[@roleName='Pixel Array 2.1']"), '{"gvFileExt":".gv","gvGraph":"graph","layout":"neato","edgeOp":"--","gvCluster":"","shouldShowStateMachineEntities":false,"filter":"--Behavior,Script","nameTemplateNodeId":"^^^^i^","nameTemplateNodeLabel":"R^^^^^","shouldQuoteLabels":true,"shouldShowLinks":true,"shouldShowLinkLabels":true,"shouldSpecifyLayout":true,"maxLabelLen":-1,"shouldColor":true,"defaultColor":"#f0f8ff","shouldSpecifyShape":true,"shape":"circle,Cable:point","shouldSpecifySize":true,"size":"20","shouldSpecifyFontname":true,"fontname":"\"Courier New\"","shouldSpecifyArrowhead":true,"arrowhead":"vee","shouldSpecifyStylesheet":true,"stylesheet":"Xholon.css","shouldSpecifyRankdir":false,"rankdir":"LR","shouldDisplayGraph":true,"outputFormat":"svg"}');
*/
graph 158 {
graph [label="Pixel Array 2.1",id="OperadExample[@roleName='Pixel Array 2.1']",layout=neato,stylesheet="Xholon.css",size=20,fontname="Courier New"]
node [style=filled,fillcolor="#f0f8ff",shape=circle,fontname="Courier New"]
edge [arrowhead=vee]
239 [label="R'" id="OperadExample[@roleName='Pixel Array 2.1']/Pack[@roleName='R'']"]
[fillcolor="orange"]
239 -- 255 [label="v'"];
239 -- 259 [label="z'"];
242 [label="R1" id="OperadExample[@roleName='Pixel Array 2.1']/Pack[@roleName='R1']"]
[fillcolor="orange"]
242 -- 257 [label="x1"];
242 -- 258 [label="y1"];
245 [label="R2" id="OperadExample[@roleName='Pixel Array 2.1']/Pack[@roleName='R2']"]
[fillcolor="orange"]
245 -- 255 [label="v2"];
245 -- 256 [label="w2"];
245 -- 258 [label="y2"];
249 [label="R3" id="OperadExample[@roleName='Pixel Array 2.1']/Pack[@roleName='R3']"]
[fillcolor="orange"]
249 -- 254 [label="u3"];
249 -- 256 [label="w3"];
249 -- 257 [label="x3"];
249 -- 259 [label="z3"];
254 [xlabel="u" id="OperadExample[@roleName='Pixel Array 2.1']/Cable[@roleName='u']"]
[fillcolor="indigo"]
[shape=point fillcolor="#000000"]
255 [xlabel="v" id="OperadExample[@roleName='Pixel Array 2.1']/Cable[@roleName='v']"]
[fillcolor="indigo"]
[shape=point fillcolor="#000000"]
256 [xlabel="w" id="OperadExample[@roleName='Pixel Array 2.1']/Cable[@roleName='w']"]
[fillcolor="indigo"]
[shape=point fillcolor="#000000"]
257 [xlabel="x" id="OperadExample[@roleName='Pixel Array 2.1']/Cable[@roleName='x']"]
[fillcolor="indigo"]
[shape=point fillcolor="#000000"]
258 [xlabel="y" id="OperadExample[@roleName='Pixel Array 2.1']/Cable[@roleName='y']"]
[fillcolor="indigo"]
[shape=point fillcolor="#000000"]
259 [xlabel="z" id="OperadExample[@roleName='Pixel Array 2.1']/Cable[@roleName='z']"]
[fillcolor="indigo"]
[shape=point fillcolor="#000000"]
}
Use the Avatar to implement the morphism
----------------------------------------
move the Avatar to "Pixel Array 2.1:operadExample"
have it execute: take;drop R';enter R';drop;exit;
TODO
----
- should all the cables also go inside the new parent node after a morphism?
- xpath fails on roleNames that contain '
- probably because the xpath expression itself uses '
- I can use `
November 8, 2017
a cable is an n-ary association between two or more packs
- see p.470 Rumbaugh et al (2005) "The Unified Modeling Language Reference Manual, Second Edition"
- see Rumbaugh Figure 14-191
- Pixel Arrays example 3.1.3: cable y is a three-way association between packs P1, P2, and P3; y is also a variable that can have a value (it's an attribute on an association)
- keep in mind that UML associations have to do with classes
Chap network
------------
_other,ChapNetwork
P′:pack_151
{"showNetwork":true,"showTree":false,"maxTreeLevels":1,"width":"600px","height":"600px","nameTemplate":"R^^^^^","maxChars":2,"linksLength":100,"showPortName":true,"nodesStyle":"circle,Cable:dot","linksStyle":"line","stabilize":"false","jsLibName":"network-min"}
Place DSL on web page
---------------------
var div = document.querySelector("div#xhappspecific");
div.innerHTML = "<pre>pack P' = {x', v', z'}\npack P1 = {x1, y1}\npack P2 = {u2,v2,w2,y2}\npack P3 = {u3,y3,z3}\ncables L = {u,v,w,x,y, z}\nbindings u2,u3 |-> u\nbindings v2,v' |-> v\nbindings w2 |-> w\nbindings x1,x' |-> x\nbindings y1,y2,y3 |-> y\nbindings z3,z' |-> z\nmorphism (P1, P2, P3) -> P'</pre>";
November 12, 2017
Problem with short port names
-----------------------------
- if a Xholon JavaScript port name has only 1, 2, or 3 characters, it may conflict with a GWT-generated property name
- ex: a b aa aaa ff
- there are several possible solutions
1. append some special character(s) to the end of each port name
2. place all JavaScript ports inside a special "port" object within each Xholon node
- one quick fix
- append unicode character \uFEFF to the end of each port name (ref [7])
- I've added this to ExampleBuilderbehavior, and it seems to work
- port names end in \uFEFF, but are displayed in Chap Networks, d3cp with no indication that the special character is there
- in Developer Tools:
var pack = xh.root().xpath("descendant::Pack");
pack // has a property "a" that is displayed as "a"
pack.a // undefined
pack["a"] // undefined
pack["a\uFEFF"].name() // "1:cable_140"
pack.links(false, true) // an array with 5 PortInformation items
pack.links(false, true)[0].fieldName // "a"
pack.links(false, true)[0].fieldName == "a" // false
pack.links(false, true)[0].fieldName == "a\uFEFF" // true
November 14, 2017
TODO
----
- I'm unable to get cables 4 and 7 to amalgamate
- they are connected thru node 10
- I may need to do the following:
- don't remove intermediate nodes until I've completely processed the morphism
- possibly search an indefinite number of intermediate hops until I can discover that nodes like the ports involved in 4 and 7 are connected thru a common cable
Springy.js
----------
http://127.0.0.1:8888/XholonSpringy.html?app=Operads+-+Domain+Specific+Language%2C+and+Parsing&src=lstr&gui=clsc
_other,Springy
Compose Operad Morphisms with ports and bindings - composed:operadExample_95
{"showAnnotations":true,"showPorts":3,"showPortName":true,"showParentLink":false,"showPrevSiblingLink":false,"showNextSiblingLink":false,"showFirstChildLink":false,"nameTemplate":"R^^^^^","underlineReplacement":"‗","scopeToRoot":true,"shouldSplitCamelCase":true,"shouldBeLowerCase":false,"shouldBeCapitalized":true,"shouldColorNodes":false,"shouldColorLinks":false,"nodeFont":"12px Arial, sans-serif","edgeFont":"8px Arial, sans-serif","stiffness":400,"repulsion":400,"damping":0.5,"inEnergyThreshold":0.01}
References
----------
(1) paper
THE OPERAD OF WIRING DIAGRAMS: FORMALIZING A GRAPHICAL LANGUAGE FOR DATABASES, RECURSION, AND PLUG-AND-PLAY CIRCUITS, by DAVID i. SPIVAK, 2013
(2) paper
Pixel Arrays: A fast and elementary method for solving nonlinear systems, by David I. Spivak, Magdalen R. C. Dobson, Sapna Kumari, Lawrence Wu
(3) email correspondence with David Spivak
(4) search engine: math ascii
) http://asciimath.org/
I should look at this stuff later
(5) http://www.dcs.gla.ac.uk/~michele/bigrapher.html
BigraphER
uses # as the comment indicator
lines/expressions always start with a keyword
ex: ctrl A = 1;
(6) http://www.primordion.com/Xholon/gwt/Xholon.html?app=Brusselator&gui=clsc
Xholon Brusselator model, auto-generated from SBML model
(7) http://jkorpela.fi/chars/spaces.html
Unicode spaces
lists 20 or so unicode space characters
U+FEFF ZERO WIDTH NO-BREAK SPACE foobar No width (the character is invisible)
]]></Notes>
<_-.XholonClass>
<PhysicalSystem/>
<OperadExample/>
<ExampleBuilder/>
<ExampleHelper/>
<Pack/>
<Packs/>
<Cable/>
<Cables/>
<!-- Petri Net -->
<PackPN superClass="TransitionPN"/>
<CablePN superClass="PlacePN"/>
</_-.XholonClass>
<xholonClassDetails>
<Pack xhType="XhtypePureActiveObject"><Color>orange</Color></Pack>
<Cable><Color>indigo</Color></Cable>
<Avatar><Color>rgba(220,20,60,0.5)</Color></Avatar>
</xholonClassDetails>
<PhysicalSystem>
<!-- example from FIGURE 6 in reference [1] -->
<OperadExample roleName="Figure 6">
<Annotation>example from FIGURE 6 in reference [1]</Annotation>
<ExampleBuilder>
<Attribute_String><![CDATA[
# example of the DSL format
# these keywords are just placeholders; for now they are just the first thing that came to mind
#
# NODES
node Y = {a, b, c, d, e} # Create a node of type Y with 5 ports (wires)
node X1 = {r, s, t} # Create 3 more nodes with ports (wires)
node X2 = {u, v}
node X3 = {w, x, y, z}
# the additional domain objects ("inner stars") that are inside X1 X2 X3
# nodes inside X1 Φ1
node V1 = {aa, bb, cc}
#node W1 = {dd, ee, ff} # Firefox fails on this line "TypeError: a.ac.ff is not a function"
# nodes inside X2 Φ2
node V2 = {gg, hh, ii}
node W2 = {jj, kk}
# nodes inside X3 Φ3
node U3 = {ll, mm}
node V3 = {nn, oo}
node W3 = {pp, qq}
# CABLES
cables C = {1, 2, 3, 4, 5, 6} # Create 6 cables
#cables C = {_1, _2, _3, _4, _5, _6} # Xholon, XML, JavaScript names can't start with a digit
# new inner cables
cables D = {11, 21, 31, 32}
# BINDINGS
#bindings f1(s) = f3(w) = g(a) = 1 # Connect the ports (wires), port connections
bindings s,w,a |-> 1
bindings r,b |-> 2
bindings t,v,c |-> 3
bindings u,x |-> 4
bindings y,d |-> 5
bindings z,e |-> 6
# TODO new bindings
# 2 approaches: (1) go all the way through to cables in Y,X1,X2,X3 (as in Xholon), or (2) just go to a cable that connects to a local relay port (as in eTrice)
#bindings aa |-> 1 # ?
# MORPHISMS
# new morphisms
#morphism (V1, W1) -> X1
#morphism (V2, W2) -> X2
#morphism (U3, V3, W3) -> X3
morphism (X1, X2, X3) -> Y # Move X1, X2, and X3 inside Y
]]></Attribute_String>
</ExampleBuilder>
<!-- one possible Xholon specificattion for this OperadExample; target format for the DSL format -->
<!--<port name="a" multiplicity="1" isConjugated="false"/>--> <!-- creates a property called a with a value of null; this is just a normal non-IPort port that ignores multiplicity and isConjugated -->
<!--<port name="c" multiplicity="1" isConjugated="true"/>-->
<!--
<Packs>
<Pack roleName="Y">
<port name="a" connector="../../Cables/Cable[@roleName='1']"/>
<port name="b" connector="../../Cables/Cable[@roleName='2']"/>
<port name="c" connector="../../Cables/Cable[@roleName='3']"/>
<port name="d" connector="../../Cables/Cable[@roleName='5']"/>
<port name="e" connector="../../Cables/Cable[@roleName='6']"/>
</Pack>
<Pack roleName="X1">
<port name="r" connector="../../Cables/Cable[@roleName='2']"/>
<port name="s" connector="../../Cables/Cable[@roleName='1']"/>
<port name="t" connector="../../Cables/Cable[@roleName='3']"/>
</Pack>
<Pack roleName="X2">
<port name="u" connector="../../Cables/Cable[@roleName='4']"/>
<port name="v" connector="../../Cables/Cable[@roleName='3']"/>
</Pack>
<Pack roleName="X3">
<port name="w" connector="../../Cables/Cable[@roleName='1']"/>
<port name="x" connector="../../Cables/Cable[@roleName='4']"/>
<port name="y" connector="../../Cables/Cable[@roleName='5']"/>
<port name="z" connector="../../Cables/Cable[@roleName='6']"/>
</Pack>
</Packs>
<Cables>
<Cable roleName="1">
</Cable>
<Cable roleName="2"/>
<Cable roleName="3"/>
<Cable roleName="4"/>
<Cable roleName="5"/>
<Cable roleName="6"/>
</Cables>
-->
</OperadExample>
<!-- example from Example 3.1.3 in reference [2] -->
<OperadExample roleName="Pixel Array">
<Annotation>example from Example 3.1.3 in reference [2]</Annotation>
<ExampleBuilder>
<Attribute_String><![CDATA[
# another example of the DSL format
# this example uses a different notation for links/cables; I assume links and cables are the same thing?
#
pack P' = {x', v', z'}
#pack P_ = {x_,v_,z_} # node with ports; I can't use P' as an XML tag name; can't use ' or ` or  ′ &prime; but could use _
pack P1 = {x1, y1}
pack P2 = {u2,v2,w2,y2}
pack P3 = {u3,y3,z3}
cables L = {u,v,w,x,y, z} # Λ, links, hyperedges see Remark 3.1.8
#bindings f2(u2) = f3(u3) = lu # linking function u2,u3 |-> lu etc.
bindings u2,u3 |-> u
bindings v2,v' |-> v
bindings w2 |-> w
bindings x1,x' |-> x
bindings y1,y2,y3 |-> y
bindings z3,z' |-> z
morphism (P1, P2, P3) -> P'
]]></Attribute_String>
</ExampleBuilder>
<!-- one possible Xholon specificattion for this OperadExample -->
<!--
<Packs>
<Pack roleName="P'">
<port name="x'" connector="../../Cables/Cable[@roleName='x']"/>
<port name="v'" connector="../../Cables/Cable[@roleName='v']"/>
<port name="z'" connector="../../Cables/Cable[@roleName='z']"/>
</Pack>
<Pack roleName="P1">
<port name="x1" connector="../../Cables/Cable[@roleName='x']"/>
<port name="y1" connector="../../Cables/Cable[@roleName='y']"/>
</Pack>
<Pack roleName="P2">
<port name="u2" connector="../../Cables/Cable[@roleName='u']"/>
<port name="v2" connector="../../Cables/Cable[@roleName='v']"/>
<port name="w2" connector="../../Cables/Cable[@roleName='w']"/>
<port name="y2" connector="../../Cables/Cable[@roleName='y']"/>
</Pack>
<Pack roleName="P3">
<port name="u3" connector="../../Cables/Cable[@roleName='u']"/>
<port name="y3" connector="../../Cables/Cable[@roleName='y']"/>
<port name="z3" connector="../../Cables/Cable[@roleName='z']"/>
</Pack>
</Packs>
<Cables>
<Cable roleName="u"/>
<Cable roleName="v"/>
<Cable roleName="w"/>
<Cable roleName="x"/>
<Cable roleName="y"/>
<Cable roleName="z"/>
</Cables>
-->
<!-- another possible Xholon specificattion for this OperadExample -->
<!--
<Pack roleName="P'">
<port name="x'" connector="../Cable[@roleName='x']"/>
<port name="v'" connector="../Cable[@roleName='v']"/>
<port name="z'" connector="../Cable[@roleName='z']"/>
</Pack>
<Pack roleName="P1">
<port name="x1" connector="../Cable[@roleName='x']"/>
<port name="y1" connector="../Cable[@roleName='y']"/>
</Pack>
<Pack roleName="P2">
<port name="u2" connector="../Cable[@roleName='u']"/>
<port name="v2" connector="../Cable[@roleName='v']"/>
<port name="w2" connector="../Cable[@roleName='w']"/>
<port name="y2" connector="../Cable[@roleName='y']"/>
</Pack>
<Pack roleName="P3">
<port name="u3" connector="../Cable[@roleName='u']"/>
<port name="y3" connector="../Cable[@roleName='y']"/>
<port name="z3" connector="../Cable[@roleName='z']"/>
</Pack>
<Cable roleName="u"/>
<Cable roleName="v"/>
<Cable roleName="w"/>
<Cable roleName="x"/>
<Cable roleName="y"/>
<Cable roleName="z"/>
-->
</OperadExample>
<!-- example from Example 3.1.3 in reference [2], as a Petri Net structure
The basic structure is OK. But Petri Net and Operad don't feel like a good match for each other, in a varity of ways.
-->
<PetriNet roleName="Pixel Array" kineticsType="0"> <!-- IKinetics.KINETICS_NULL = 0 -->
<Annotation>example from Example 3.1.3 in reference [2], as a Petri Net structure</Annotation>
<QueueTransitions/>
<AnalysisCRN/>
<Transitions> <!-- Packs -->
<PackPN roleName="P'"/>
<PackPN roleName="P1">
<!-- how do I know if an arc is input or output; maybe arcs are both input and output in this model -->
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='x']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='y']"/>
</InputArcs>
<!--<OutputArcs>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='x']"/>
<OutputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='y']"/>
</OutputArcs>-->
</PackPN>
<PackPN roleName="P2">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='u']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='v']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='w']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='y']"/>
</InputArcs>
</PackPN>
<PackPN roleName="P3">
<InputArcs>
<InputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='u']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='y']"/>
<InputArc weight="1" connector="ancestor::PetriNet/Places/CablePN[@roleName='z']"/>
</InputArcs>
</PackPN>
</Transitions>
<Places> <!-- Cables -->
<CablePN roleName="u" token="0"/>
<CablePN roleName="v" token="0"/>
<CablePN roleName="w" token="0"/>
<CablePN roleName="x" token="0"/>
<CablePN roleName="y" token="0"/>
<CablePN roleName="z" token="0"/>
</Places>
</PetriNet>
<!-- example from Xholon/SBML Brusselator model in reference [6] -->
<OperadExample roleName="Brusselator">
<Annotation>example from Xholon/SBML Brusselator model in reference [6]</Annotation>
<ExampleBuilder>
<Attribute_String><![CDATA[
# Brusselator
# I'm getting the port names from the Xholon CD file (ClassDetails.xml):
# <R1 xhType="XhtypePureActiveObject">
# <port name="port" index="P_SM_SUB1" connector="#xpointer(ancestor::compartment/descendant::A)"/>
# <port name="port" index="P_SM_PRD1" connector="#xpointer(ancestor::compartment/descendant::X)"/>
# <attribute name="reversible" value="false"/>
# </R1>
# The Xholon parser would generate actual nodes for all implied variables, as specified by the DSL cable/link names
# Which ports are external vs internal (exposed vs not-exposed); maybe use prime ' to distinguish
# The Brusselator doesn't compute an end result; the variables X and Y continnuously cycle through a sequence of values
#
pack C = {} # compartment_0
pack R1 = {a1, x1} # Xholon parser would generate: <port name="a1" connector="../A"/> and <port name="x1" connector="../X"/>
pack R2 = {x2, y2, x2} # 2 ports reference the X cable/link, once as a substrate and once as a product; these need to have different names
pack R3 = {x3, b3, y3, d3}
pack R4 = {x4, e4}
cables L = {X, Y, E, D, B, A} # these are the XholonClass names as specified in the Xholon IH and CSH files; the passive objects, variables
bindings a1 |-> A
bindings b3 |-> B
bindings d3 |-> D
bindings e4 |-> E
bindings x1,x2,x3,x4 |-> X
bindings y2,y3 |-> Y
morphism (R1, R2, R3, R4) -> C
]]></Attribute_String>
</ExampleBuilder>
<!-- one possible Xholon specificattion for the above OperadExample -->
<!-- var pack = xh.root().xpath("PhysicalSystem/OperadExample[3]/Packs/Pack[3]"); pack x2 is an array with 2 references to cable X; y2 is a scalar with a ref to cable Y -->
<!--<Packs>
<Pack roleName="C"/>
<Pack roleName="R1">
<port name="a1" connector="../following-sibling::Cables/Cable[@roleName='A']"/>
<port name="x1" connector="../../Cables/Cable[@roleName='X']"/>
</Pack>
<Pack roleName="R2">
<port name="x2" index="0" connector="../../Cables/Cable[@roleName='X']"/>
<port name="y2" connector="../../Cables/Cable[@roleName='Y']"/>
<port name="x2" index="1" connector="../../Cables/Cable[@roleName='X']"/>
</Pack>
<Pack roleName="R3">
<port name="x3" connector="../../Cables/Cable[@roleName='X']"/>
<port name="b3" connector="../../Cables/Cable[@roleName='B']"/>
<port name="y3" connector="../../Cables/Cable[@roleName='Y']"/>
<port name="d3" connector="../../Cables/Cable[@roleName='D']"/>
</Pack>
<Pack roleName="R4">
<port name="x4" connector="../../Cables/Cable[@roleName='X']"/>
<port name="e4" connector="../../Cables/Cable[@roleName='E']"/>
</Pack>
</Packs>
<Cables roleName="L">
<Cable roleName="X"/>
<Cable roleName="Y"/>
<Cable roleName="E"/>
<Cable roleName="D"/>
<Cable roleName="B"/>
<Cable roleName="A"/>
</Cables>-->
</OperadExample>
<!-- example from 1.1 "A simple example" in reference [2] -->
<OperadExample roleName="Pixel Array 1.1">
<Annotation>example from 1.1 "A simple example" in reference [2]</Annotation>
<ExampleBuilder>
<Attribute_String><![CDATA[
# another example
# two equations: x² = w w = 1 - y²
# I'm inferring the packs and cables from the two equations; the packs and cables are not specified in the paper
pack P' = {}
pack P1 = {w1, x1}
pack P2 = {w2, y2}
cables C = {w, x, y}
bindings w1,w2 |-> w
bindings x1 |-> x
bindings y2 |-> y
morphism (P1, P2) -> P'
]]></Attribute_String>
</ExampleBuilder>
</OperadExample>
<!-- example from 2.1 and 2.2 in reference [2] -->
<OperadExample roleName="Pixel Array 2.1">
<Annotation>example from 2.1 and 2.2 in reference [2]</Annotation>
<ExampleBuilder>
<Attribute_String><![CDATA[
# another example
# three relations
# "variables v, z are to be exposed"
#
pack R' = {v', z'}
pack R1 = {x1, y1}
pack R2 = {v2, w2, y2}
pack R3 = {u3, w3, x3, z3}
cables C = {u, v, w, x, y, z}
bindings u3 |-> u
bindings v2, v' |-> v
bindings w2, w3 |-> w
bindings x1, x3 |-> x
bindings y1, y2 |-> y
bindings z3, z' |-> z
morphism (R1, R2, R3) -> R'
]]></Attribute_String>
</ExampleBuilder>
</OperadExample>
<!-- example from David email Nov 9, 2017 -->
<OperadExample roleName="Compose Operad Morphisms">
<Annotation>example from David email Nov 9, 2017 - Compose Operad Morphisms</Annotation>
<ExampleBuilder>
<Attribute_String><![CDATA[
# Compose Operad Morphisms
# f: P1, P2, P3-->P'
# g:Q1, Q2-->Q'
# h:P', Q'-->R
# ------------
# (f,g)//h: P1, P2, P3, Q1, Q2-->R
#
pack P' = {} # no ports
pack P1 = {a1,b1}
pack P2 = {}
pack P3 = {}
#cables C1 = {u,v,w} # this works
#
pack Q' = {}
pack Q1 = {}
pack Q2 = {}
#cables C2 = {x,y,z} # this works
#
pack R = {}
# no cables
# no bindings
bindings # dummy bindings for now, to force generation of Xholon Pack nodes
#bindings a1 |-> u # this works
morphism (P1, P2, P3) -> P'
morphism (Q1, Q2) -> Q'
morphism (P', Q') -> R
]]></Attribute_String>
</ExampleBuilder>
</OperadExample>
<!-- example from example from David email Nov 10, 2017 -->
<OperadExample roleName="Compose Operad Morphisms with ports and bindings">
<Annotation>example from David email Nov 10, 2017</Annotation>
<ExampleBuilder>
<Attribute_String><![CDATA[
# Compose Operad Morphisms with ports and bindings
# David uses := instead of = in Pack statements; I've changed := to =
# TODO my parser does not handle this correctly yet
#
pack P' = {a',c',f',d'}
pack P1 = {a1,b1,f1}
pack P2 = {b2,c2,d2,e2}
pack P3 = {e3,f3}
# morphism phi_1: (P1, P2, P3) -> P' := {a'=a1, b1=b2, c2=c', d2=d', e2=e3, f1=f3=f'}
#
pack Q' = {dd, gg}
pack Q = {ddd, ggg}
# morphism phi_2: (Q) -> Q' := {dd=ddd, gg=ggg}
#
pack R = {aR, fR, gR}
# morphism psi: (P', Q') -> R := {aR=a', dd=d', fR=f', gg=gR, c'} // c' is "dangling".
#
bindings # dummy bindings
morphism phi_1: (P1, P2, P3) -> P' := {a'=a1, b1=b2, c2=c', d2=d', e2=e3, f1=f3=f'}
morphism phi_2: (Q) -> Q' := {dd=ddd, gg=ggg}
morphism psi: (P', Q') -> R := {aR=a', dd=d', fR=f', gg=gR, c'} # c' is "dangling".
]]></Attribute_String>
</ExampleBuilder>
</OperadExample>
<!-- example from example from David email Nov 10, 2017 - composed -->
<OperadExample roleName="Compose Operad Morphisms with ports and bindings - composed">
<Annotation>example from David email Nov 10, 2017 - composed</Annotation>
<ExampleBuilder>
<Attribute_String><![CDATA[
# Compose Operad Morphisms with ports and bindings - composed
#
pack P1 = {a1,b1,f1}
pack P2 = {b2,c2,d2,e2}
pack P3 = {e3,f3}
pack Q = {ddd, ggg}
pack R = {aR, fR, gR}
#
bindings # dummy bindings
morphism comp: (P1, P2, P3, Q) -> R := {a1=aR, b1=b2, c2, d2=ddd, e2=e3, f1=f3=fR, ggg=gR}
]]></Attribute_String>
</ExampleBuilder>
</OperadExample>
<ExampleHelper/>
<Animate duration="2" selection="#xhgraph" xpath="./PhysicalSystem" efParams="{&quot;selection&quot;:&quot;#xhgraph&quot;,&quot;sort&quot;:&quot;disable&quot;,&quot;labelContainers&quot;:true,&quot;width&quot;:800,&quot;height&quot;:800,&quot;mode&quot;:&quot;tween&quot;,&quot;maxChars&quot;:2}"/>
</PhysicalSystem>
<ExampleBuilderbehavior implName="org.primordion.xholon.base.Behavior_gwtjs"><![CDATA[
// this is a very early prototype parser for the DSL
var me, xhRoot, xmlStrIH, xmlStrCD, xmlStrCSH, commentToken, portNameFiller, nextCableName, removeIntermediates, removeUnusedCables, portsObj, beh = {
postConfigure: function() {
"use strict";
me = this.cnode.parent();
$wnd.console.log("\n" + me.parent().name());
// get xhRoot
xhRoot = me.xpath("ancestor::OperadExample");
// get xhcRoot
var xhcRoot = xhRoot.xhc().parent();
// get the DSL content
var dslContentNode = me.xpath("./Attribute_String");
var dslContent = dslContentNode.text();
//me.println(dslContent);
var bindingsFound = false; // has the first "bindings" statement been found
portsObj = {}; // dictionary of port names, where each port name points to a non-null cable node
removeUnusedCables = true; // can set to false for debugging
removeIntermediates = true; // can set to false for debugging
nextCableName = 1; // for use in makeCablesAndBindings()
portNameFiller = "\uFEFF";
commentToken = "#";
xmlStrIH = "<_-.XholonClass>\n"
+ "<Pack></Pack>\n"
+ "<Cable></Cable>\n"
+ "</_-.XholonClass>\n";
xhcRoot.append(xmlStrIH);
xmlStrCD = "<xholonClassDetails>\n"
+ " <Pack xhType=\"XhtypePureActiveObject\"><Color>orange</Color></Pack>\n"
+ " <Cable><Color>indigo</Color></Cable>\n"
+ " <Avatar><Color>rgba(220,20,60,0.5)</Color></Avatar>\n"
+ "</xholonClassDetails>\n";
xhcRoot.append(xmlStrCD);
xmlStrCSH = "<_-.operadCSH>\n";
var firstPack = null;
var dslLineArr = dslContent.split("\n", 1000);
for (var i = 0; i < dslLineArr.length; i++) {
var dslLine = dslLineArr[i].trim();
var commentTokenIndex = dslLine.indexOf(commentToken);
if (commentTokenIndex != -1) {
dslLine = dslLine.substring(0, commentTokenIndex).trim();
}
if (dslLine.length == 0) {continue;}
me.println(dslLine);
dslLine = dslLine.replace(/'/g, "′"); // replace the apostrophe (single quote) with the unicode prime character U+2032 ′
// str = str.replace(/abc/g, '');
//var dslTokenArr = dslLine.split(" ", 2);
var ixSpace1 = dslLine.indexOf(" ");
var dslStatementType = null;
if (ixSpace1 == -1) {
dslStatementType = dslLine;
}
else {
dslStatementType = dslLine.substring(0, ixSpace1);
}
switch (dslStatementType) {
case "node":
case "pack":
// pack P' = {x', v', z'}
// pack P1 = {x1, y1}
this.makePack(dslLine.substring(ixSpace1+1));
break;
case "cables":
// cables C = {1, 2, 3, 4, 5, 6}
// cables L = {X, Y, E, D, B, A}
// cables L = {u,v,w,x,y, z}
this.makeCables(dslLine.substring(ixSpace1+1));
break;
case "morphism":
// morphism (R1, R2, R3) -> R'
this.makeMorphism(dslLine.substring(ixSpace1+1));
break;
case "bindings":
// bindings u2,u3 |-> u
if (!bindingsFound) {
xmlStrCSH += "</_-.operadCSH>\n";
me.println(xmlStrCSH);
xhRoot.append(xmlStrCSH);
bindingsFound = true;
xmlStrCSH = null;
firstPack = me.xpath("../Pack");
}
this.makeBindings(dslLine.substring(ixSpace1+1), firstPack);
break;
//case commentToken: break;
default: break;
}
}
//xmlStrCSH += "</_-.operadCSH>\n";
//me.println(xmlStrCSH);
//xhRoot.append(xmlStrCSH);
this.removeUnusedCables(me.xpath("../Pack")); // pass in the root pack
for (var prop in portsObj) {$wnd.console.log(prop + " " + portsObj[prop].name())};
me.remove();
},
/*
P' = {x', v', z'}
P1 = {x1, y1}
*/
makePack: function(packStr) {
"use strict";
me.println("pack: " + packStr);
var equalsIx = packStr.indexOf("=");
if (equalsIx == -1) {return;}
var startPortsIx = packStr.indexOf("{", equalsIx+1);
if (startPortsIx == -1) {return;}
var endPortsIx = packStr.indexOf("}", startPortsIx+1);
if (endPortsIx == -1) {return;}
var packName = packStr.substring(0, equalsIx).trim();
xmlStrCSH += ' <Pack roleName="' + packName + '">\n';
var portsStr = packStr.substring(startPortsIx+1, endPortsIx).trim();
var portsArr = portsStr.split(",");
for (var i = 0; i < portsArr.length; i++) {
var portName = portsArr[i].trim() + portNameFiller;
//xmlStrCSH += ' <port name="' + portName + '" connector="../Cable[@roleName=' + "'" + 'TODO' + "'" + ']"></port>\n';
xmlStrCSH += ' <port name="' + portName + '" connector="."></port>\n';
}
xmlStrCSH += " </Pack>\n";
},
/*
{a'=a1, b1=b2, c2=c', d2=d', e2=e3, f1=f3=f'}
*/
makeCablesAndBindings: function(str) {
"use strict";
me.println("cables and bindings: " + str);
var startIx = str.indexOf("{");
if (startIx == -1) {return;}
var endIx = str.indexOf("}", startIx+1);
if (endIx == -1) {return;}
var cb = str.substring(startIx+1, endIx).trim();
var cbArr = cb.split(",");
for (var i = 0; i < cbArr.length; i++) {
var cbStr = cbArr[i].trim(); // ex: a'=a1
var firstPack = me.xpath("../Pack");
var portArr = cbStr.split("=");
var packNodesArr = [];
var portNamesArr = [];
var cableNode = null;
for (var j = 0; j < portArr.length; j++) {
var portName = portArr[j].trim() + portNameFiller; // ex: a'
if (cableNode == null) {
//cableNode = this.findCableReffedByNamedPort(me.parent(), portName);
cableNode = portsObj[portName];
//$wnd.console.log("existingCable: " + portName + " : " + cableNode);
}
var packNode = firstPack;
// OLD
/*
while (packNode && (packNode.xhc().name() == "Pack")) {
if (packNode[portName] === null) {
// the port has been created (!== undefined) and has a value of null
//packNode[portName] = cableNode;
packNodesArr.push(packNode);
portNamesArr.push(portName);
}
packNode = packNode.next()
}
*/
// NEW
this.findPacksWithPortNameEqualNull(me.parent(), portName, packNodesArr, portNamesArr);
} // end for j
if (cableNode == null) {
var xmlStr = '<Cable roleName="' + nextCableName + '"></Cable>';
xhRoot.append(xmlStr);
//nextCableName++;
cableNode = xhRoot.last();
}
me.println("CABLE " + nextCableName + " " + cableNode + " " + packNodesArr.length);
nextCableName++; // put this here temporarily
for (var k = 0; k < packNodesArr.length; k++) {
packNodesArr[k][portNamesArr[k]] = cableNode;
if (!portsObj[portNamesArr[k]]) {
portsObj[portNamesArr[k]] = cableNode;
}
else {
//portsObj[portNamesArr[k]] = cableNode; // TODO try this; no effect
}
}
} // end for i
},
/*
C = {1, 2, 3, 4, 5, 6}
L = {X, Y, E, D, B, A}
L = {u,v,w,x,y, z}
*/
makeCables: function(cablesStr) {
"use strict";
me.println("cables: " + cablesStr);
var startCablesIx = cablesStr.indexOf("{");
if (startCablesIx == -1) {return;}
var endCablesIx = cablesStr.indexOf("}", startCablesIx+1);
if (endCablesIx == -1) {return;}
var cables = cablesStr.substring(startCablesIx+1, endCablesIx).trim();
var cablesArr = cables.split(",");
for (var i = 0; i < cablesArr.length; i++) {
//var cableName = cablesArr[i].trim();
//xmlStrCSH += ' <Cable roleName="' + cableName + '"></Cable>\n';
this.makeCable(cablesArr[i].trim());
}
},
makeCable: function(cableName) {
xmlStrCSH += ' <Cable roleName="' + cableName + '"></Cable>\n';
},
/*
u2,u3 |-> u
*/
makeBindings: function(bindingsStr, firstPack) {
"use strict";
me.println("bindings: " + bindingsStr);
if (!firstPack) {return;}
var bindingsArr = bindingsStr.split("|->");
if (bindingsArr.length != 2) {return;}
var portList = bindingsArr[0].trim();
var cableName = bindingsArr[1].trim();
if (portList.length == 0) {return;}
if (cableName.length == 0) {return;}
//var opex = me.parent(); // OperadExample node
var portArr = portList.split(",");
for (var i = 0; i < portArr.length; i++) {
var portName = portArr[i].trim() + portNameFiller;
var packNode = firstPack;
while (packNode && (packNode.xhc().name() == "Pack")) {
//if (packNode[portName] === null) {
if (typeof packNode[portName] !== 'undefined') {
// the port has been created (!== undefined) and has a value of null
packNode[portName] = packNode.xpath("../Cable[@roleName='" + cableName + "']");
}
packNode = packNode.next()
}
}
},
/*
(R1, R2, R3) -> R'
*/
makeMorphism: function(morphStr) {
"use strict";
me.println("morph: " + morphStr);
var morphArr = morphStr.split("->");
if (morphArr.length != 2) {return;}
var packList = morphArr[0].trim();
var parentPackName = morphArr[1].trim();
if (packList.length == 0) {return;}
if (parentPackName.length == 0) {return;}
var part2Arr = parentPackName.split(":=");
if (part2Arr.length == 2) {
parentPackName = part2Arr[0].trim();
this.makeCablesAndBindings(part2Arr[1].trim());
}
var parentNode = me.xpath("../Pack[@roleName='" + parentPackName + "']");
if (!parentNode) {return;}
var startIx = packList.indexOf("(");
if (startIx == -1) {return;}
var endIx = packList.indexOf(")", startIx+1);
if (endIx == -1) {return;}
var packs = packList.substring(startIx+1, endIx).trim();
var packArr = packs.split(",");
for (var i = 0; i < packArr.length; i++) {
var packRoleName = packArr[i].trim();
var packNode = me.xpath("../Pack[@roleName='" + packRoleName + "']");
if (packNode) {
if (removeIntermediates && packNode.first()) {
// remove the intermediate node
var childNode = packNode.first();
while (childNode) {
var nextChild = childNode.next();
parentNode.append(childNode.remove());
childNode = nextChild;
}
packNode.remove();
}
else {
parentNode.append(packNode.remove());
}
}
}
// also put all the cables inside the new parent node; TODO ask if this is the correct thing to do
var cable = parentNode.xpath("../Cable");
while (cable && (cable.xhc().name() == "Cable")) {
var nextCable = cable.next();
parentNode.append(cable.remove());
cable = nextCable;
}
},
/*
Remove unused cables. These are cables that are not referenced by any Pack.
@param the root Pack
*/
removeUnusedCables: function(parentNode) {
"use strict";
if (!removeUnusedCables) {return;}
if (parentNode == null) {return;}
var node = parentNode.first(); // node may be a Pack or a Cable
while (node) {
var nextNode = node.next();
if (node.xhc().name() == "Cable") {
var packArr = this.findPacksThatRefCable(node);
if (packArr.length == 0) {
// there are no Packs that reference this Cable, so remove the Cable
node.remove();
}
}
node = nextNode;
}
},
/*
Find all Pack nodes that reference (through one or more ports) a specified Cable node.
This function is used by morphism() to determine if a cable should be retained (should be appended to a new parent node).
TODO should this be recursive?
@param a Cable node
@returns an array of Pack nodes, or an empty array
*/
findPacksThatRefCable: function(cableNode) {
"use strict";
var packArr = [];
if (cableNode == null) {return packArr;}
var parentNode = cableNode.parent(); // first check the cable's parent node which should be a Pack
var linksArr = parentNode.links(false, true);
for (var i = 0; i < linksArr.length; i++) {
var reffedNode = linksArr[i].reffedNode
if (cableNode == reffedNode) {
packArr.push(parentNode);
}
}
var node = parentNode.first();
while (node) {
if (node.xhc().name() == "Pack") {
var linksArr = node.links(false, true);
for (var i = 0; i < linksArr.length; i++) {
var reffedNode = linksArr[i].reffedNode;
if (cableNode == reffedNode) {
packArr.push(parentNode);
}
}
}
node = node.next()
}
return packArr;
},
/*
Find the Pack that has a specified port name, and return the Cable node referenced by that port.
Recursively search the entire subtree.
@param node a Pack or other node
@param portName
@returns a Cable node or null
*/
/*findCableReffedByNamedPort: function(node, portName) {
if (node == null) {return null;}
if (node.xhc().name() == "Cable") {return null;}
if (node[portName]) {
return node[portName];
}
var childNode = node.first();
while (childNode) {
var reffedNode = this.findCableReffedByNamedPort(childNode, portName);
if (reffedNode) {
return reffedNode;
}
childNode = childNode.next();
}
return null;
},*/
/*
Find Packs that already have a specified portName, where the portName's value is still null.
@param node a Pack or other node
@param portName
@param packNodesArr an array of Pack nodes
@param portNamesArr an array of corresponding Port names (both arrays must remain the same size)
*/
findPacksWithPortNameEqualNull(node, portName, packNodesArr, portNamesArr) {
"use strict";
if (node == null) {return;}
if (node.xhc().name() == "Cable") {return;}
//if (node[portName] === null) {
if (typeof node[portName] !== 'undefined') {
// the port has been created (!== undefined) and has a value of null
packNodesArr.push(node);
portNamesArr.push(portName);
}
var childNode = node.first();
while (childNode) {
this.findPacksWithPortNameEqualNull(childNode, portName, packNodesArr, portNamesArr);
childNode = childNode.next();
}
}
}
//# sourceURL=ExampleBuilderbehavior.js
]]></ExampleBuilderbehavior>
<ExampleHelperbehavior implName="org.primordion.xholon.base.Behavior_gwtjs"><![CDATA[
var me, beh = {
postConfigure: function() {
"use strict";
me = this.cnode.parent();
var div = $doc.querySelector("div#xhappspecific");
div.innerHTML = "<pre><span style='font-size: 16px'># Example of the Operad Domain Specific Language (DSL)\n# source: Spivak et al, Pixel Arrays paper, Example 3.1.3\npack P' = {x', v', z'}\npack P1 = {x1, y1}\npack P2 = {u2,v2,w2,y2}\npack P3 = {u3,y3,z3}\ncables L = {u,v,w,x,y, z}\nbindings u2,u3 |-> u\nbindings v2,v' |-> v\nbindings w2 |-> w\nbindings x1,x' |-> x\nbindings y1,y2,y3 |-> y\nbindings z3,z' |-> z\nmorphism (P1, P2, P3) -> P'</span></pre>";
$wnd.xh.xport("_other,ChapNetwork", $wnd.xh.root().parent().xpath("Chameleon/PhysicalSystem/OperadExample[@roleName='Pixel Array']/Pack[@roleName='P′']"), '{"showNetwork":true,"showTree":false,"maxTreeLevels":1,"width":"600px","height":"600px","nameTemplate":"R^^^^^","maxChars":2,"linksLength":100,"showPortName":true,"nodesStyle":"circle,Cable:dot","linksStyle":"line","stabilize":"false","jsLibName":"network-min"}');
me.remove();
}
}
]]></ExampleHelperbehavior>
<SvgClient><Attribute_String roleName="svgUri"><![CDATA[data:image/svg+xml,
<svg width="100" height="50" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Example - Figure 6</title>
<rect id="PhysicalSystem/OperadExample[1]" fill="#98FB98" height="50" width="50" x="25" y="0"/>
<g>
<title>Example - Pixel</title>
<rect id="PhysicalSystem/OperadExample[2]" fill="#6AB06A" height="50" width="10" x="80" y="0"/>
</g>
</g>
</svg>
<!-- Brusselator graphviz dot
dot -Tsvg -O Brusselator_hyperedge01.gv
-->
<svg width="234pt" height="113pt"
viewBox="0.00 0.00 233.90 113.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="compartment" class="graph" transform="scale(1 1) rotate(0) translate(4 109.496)">
<title>0</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-109.496 229.896,-109.496 229.896,4 -4,4"/>
<text text-anchor="middle" x="112.948" y="-7.8" font-family="Courier New" font-size="14.00">Brusselator</text>
<!-- 1 -->
<g id="compartment/X" class="node"><title>1</title>
<ellipse fill="#000000" stroke="black" cx="82.4481" cy="-24.8" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="76.1481" y="-30.4" font-family="Courier New" font-size="14.00">X</text>
</g>
<!-- 2 -->
<g id="compartment/Y" class="node"><title>2</title>
<ellipse fill="#000000" stroke="black" cx="108.448" cy="-24.8" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="102.148" y="-30.4" font-family="Courier New" font-size="14.00">Y</text>
</g>
<!-- 3 -->
<g id="compartment/E" class="node"><title>3</title>
<ellipse fill="#000000" stroke="black" cx="204.448" cy="-24.8" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="198.148" y="-30.4" font-family="Courier New" font-size="14.00">E</text>
</g>
<!-- 4 -->
<g id="compartment/D" class="node"><title>4</title>
<ellipse fill="#000000" stroke="black" cx="138.448" cy="-24.8" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="132.148" y="-30.4" font-family="Courier New" font-size="14.00">D</text>
</g>
<!-- 5 -->
<g id="compartment/B" class="node"><title>5</title>
<ellipse fill="#000000" stroke="black" cx="160.448" cy="-24.8" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="154.148" y="-30.4" font-family="Courier New" font-size="14.00">B</text>
</g>
<!-- 6 -->
<g id="compartment/A" class="node"><title>6</title>
<ellipse fill="#000000" stroke="black" cx="21.4481" cy="-24.8" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="15.1481" y="-30.4" font-family="Courier New" font-size="14.00">A</text>
</g>
<!-- 7 -->
<g id="compartment/R1" class="node"><title>7</title>
<ellipse fill="#f0f8ff" stroke="black" cx="21.4481" cy="-84.0481" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="21.4481" y="-80.3481" font-family="Courier New" font-size="14.00">R1</text>
</g>
<!-- 7&#45;&#45;1 -->
<g id="compartment_edge2" class="edge"><title>7&#45;&#45;1</title>
<path fill="none" stroke="black" d="M36.841,-68.602C52.6529,-53.7626 75.7119,-32.1219 81.2296,-26.9436"/>
</g>
<!-- 7&#45;&#45;6 -->
<g id="compartment_edge1" class="edge"><title>7&#45;&#45;6</title>
<path fill="none" stroke="black" d="M21.4481,-62.3802C21.4481,-48.0319 21.4481,-30.7864 21.4481,-26.6992"/>
</g>
<!-- 8 -->
<g id="compartment/R2" class="node"><title>8</title>
<ellipse fill="#f0f8ff" stroke="black" cx="82.4481" cy="-84.0481" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="82.4481" y="-80.3481" font-family="Courier New" font-size="14.00">R2</text>
</g>
<!-- 8&#45;&#45;1 -->
<g id="compartment_edge3" class="edge"><title>8&#45;&#45;1</title>
<path fill="none" stroke="black" d="M75.9984,-63.3465C74.9568,-48.3392 76.6248,-29.6961 81.0025,-26.3324"/>
</g>
<!-- 8&#45;&#45;1 -->
<g id="compartment_edge5" class="edge"><title>8&#45;&#45;1</title>
<path fill="none" stroke="black" d="M88.8978,-63.3465C89.9394,-48.3392 88.2714,-29.6961 83.8937,-26.3324"/>
</g>
<!-- 8&#45;&#45;2 -->
<g id="compartment_edge4" class="edge"><title>8&#45;&#45;2</title>
<path fill="none" stroke="black" d="M90.9615,-64.3029C97.5963,-49.694 106.008,-31.1719 108.008,-26.7696"/>
</g>
<!-- 9 -->
<g id="compartment/R3" class="node"><title>9</title>
<ellipse fill="#f0f8ff" stroke="black" cx="143.448" cy="-84.0481" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="143.448" y="-80.3481" font-family="Courier New" font-size="14.00">R3</text>
</g>
<!-- 9&#45;&#45;1 -->
<g id="compartment_edge6" class="edge"><title>9&#45;&#45;1</title>
<path fill="none" stroke="black" d="M128.055,-68.602C112.243,-53.7626 89.1843,-32.1219 83.6666,-26.9436"/>
</g>
<!-- 9&#45;&#45;2 -->
<g id="compartment_edge8" class="edge"><title>9&#45;&#45;2</title>
<path fill="none" stroke="black" d="M132.566,-65.2483C123.576,-50.5436 111.853,-31.3695 109.063,-26.8058"/>
</g>
<!-- 9&#45;&#45;4 -->
<g id="compartment_edge9" class="edge"><title>9&#45;&#45;4</title>
<path fill="none" stroke="black" d="M141.643,-62.3802C140.39,-48.0319 138.884,-30.7864 138.527,-26.6992"/>
</g>
<!-- 9&#45;&#45;5 -->
<g id="compartment_edge7" class="edge"><title>9&#45;&#45;5</title>
<path fill="none" stroke="black" d="M149.299,-63.3465C153.601,-48.8567 158.911,-30.9775 160.171,-26.7341"/>
</g>
<!-- 10 -->
<g id="compartment/R4" class="node"><title>10</title>
<ellipse fill="#f0f8ff" stroke="black" cx="204.448" cy="-84.0481" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="204.448" y="-80.3481" font-family="Courier New" font-size="14.00">R4</text>
</g>
<!-- 10&#45;&#45;1 -->
<g id="compartment_edge10" class="edge"><title>10&#45;&#45;1</title>
<path fill="none" stroke="black" d="M187.439,-70.9574C182.991,-68.0402 178.128,-65.0587 173.448,-62.6 138.447,-44.2134 92.1481,-28.9291 83.7747,-26.2249"/>
</g>
<!-- 10&#45;&#45;3 -->
<g id="compartment_edge11" class="edge"><title>10&#45;&#45;3</title>
<path fill="none" stroke="black" d="M204.448,-62.3802C204.448,-48.0319 204.448,-30.7864 204.448,-26.6992"/>
</g>
</g>
</svg>
<!-- Brusselator graphviz neato
neato -Tsvg -O Brusselator_hyperedge01.gv
-->
<svg width="295pt" height="354pt"
viewBox="0.00 0.00 295.14 354.27" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="compartment" class="graph" transform="scale(1 1) rotate(0) translate(180.728 149.185)">
<title>0</title>
<polygon fill="white" stroke="none" points="-180.728,205.084 -180.728,-149.185 114.411,-149.185 114.411,205.084 -180.728,205.084"/>
<text text-anchor="middle" x="-33.1584" y="193.284" font-family="Courier New" font-size="14.00">Brusselator</text>
<!-- 1 -->
<g id="compartment/X" class="node"><title>1</title>
<ellipse fill="#000000" stroke="black" cx="-6.69218" cy="16.8343" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="-12.9922" y="11.2343" font-family="Courier New" font-size="14.00">X</text>
</g>
<!-- 2 -->
<g id="compartment/Y" class="node"><title>2</title>
<ellipse fill="#000000" stroke="black" cx="108.611" cy="-31.8455" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="102.311" y="-37.4455" font-family="Courier New" font-size="14.00">Y</text>
</g>
<!-- 3 -->
<g id="compartment/E" class="node"><title>3</title>
<ellipse fill="#000000" stroke="black" cx="-6.85618" cy="176.284" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="-13.1562" y="170.684" font-family="Courier New" font-size="14.00">E</text>
</g>
<!-- 4 -->
<g id="compartment/D" class="node"><title>4</title>
<ellipse fill="#000000" stroke="black" cx="-14.0596" cy="-128.385" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="-20.3596" y="-133.985" font-family="Courier New" font-size="14.00">D</text>
</g>
<!-- 5 -->
<g id="compartment/B" class="node"><title>5</title>
<ellipse fill="#000000" stroke="black" cx="78.8235" cy="-126.428" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="72.5235" y="-132.028" font-family="Courier New" font-size="14.00">B</text>
</g>
<!-- 6 -->
<g id="compartment/A" class="node"><title>6</title>
<ellipse fill="#000000" stroke="black" cx="-165.928" cy="7.53073" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="-172.228" y="1.93073" font-family="Courier New" font-size="14.00">A</text>
</g>
<!-- 7 -->
<g id="compartment/R1" class="node"><title>7</title>
<ellipse fill="#f0f8ff" stroke="black" cx="-89.2005" cy="11.832" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="-89.2005" y="15.532" font-family="Courier New" font-size="14.00">R1</text>
</g>
<!-- 7&#45;&#45;1 -->
<g id="compartment_edge2" class="edge"><title>7&#45;&#45;1</title>
<path fill="none" stroke="black" d="M-67.5224,13.1463C-46.5143,14.42 -16.6892,16.2282 -8.71635,16.7116"/>
</g>
<!-- 7&#45;&#45;6 -->
<g id="compartment_edge1" class="edge"><title>7&#45;&#45;6</title>
<path fill="none" stroke="black" d="M-110.982,10.6109C-130.476,9.5181 -157.044,8.02876 -164.13,7.6315"/>
</g>
<!-- 8 -->
<g id="compartment/R2" class="node"><title>8</title>
<ellipse fill="#f0f8ff" stroke="black" cx="73.4952" cy="35.2461" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="73.4952" y="38.9461" font-family="Courier New" font-size="14.00">R2</text>
</g>
<!-- 8&#45;&#45;1 -->
<g id="compartment_edge3" class="edge"><title>8&#45;&#45;1</title>
<path fill="none" stroke="black" d="M51.9284,36.4015C29.9791,33.2945 -1.44292,24.5889 -6.13444,18.5974"/>
</g>
<!-- 8&#45;&#45;1 -->
<g id="compartment_edge5" class="edge"><title>8&#45;&#45;1</title>
<path fill="none" stroke="black" d="M54.5926,24.7986C33.4863,18.0197 1.41402,12.1463 -5.42121,15.4911"/>
</g>
<!-- 8&#45;&#45;2 -->
<g id="compartment_edge4" class="edge"><title>8&#45;&#45;2</title>
<path fill="none" stroke="black" d="M83.4641,16.1998C92.2238,-0.536136 104.104,-23.2343 107.603,-29.9189"/>
</g>
<!-- 9 -->
<g id="compartment/R3" class="node"><title>9</title>
<ellipse fill="#f0f8ff" stroke="black" cx="31.0328" cy="-60.867" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="31.0328" y="-57.167" font-family="Courier New" font-size="14.00">R3</text>
</g>
<!-- 9&#45;&#45;1 -->
<g id="compartment_edge6" class="edge"><title>9&#45;&#45;1</title>
<path fill="none" stroke="black" d="M21.5132,-41.2597C11.9091,-21.4782 -2.01836,7.20777 -5.74552,14.8845"/>
</g>
<!-- 9&#45;&#45;2 -->
<g id="compartment_edge8" class="edge"><title>9&#45;&#45;2</title>
<path fill="none" stroke="black" d="M51.4156,-53.2419C71.1685,-45.8525 99.2116,-35.3618 106.708,-32.5575"/>
</g>
<!-- 9&#45;&#45;4 -->
<g id="compartment_edge9" class="edge"><title>9&#45;&#45;4</title>
<path fill="none" stroke="black" d="M18.9489,-78.9605C7.47028,-96.1476 -8.65705,-120.295 -12.9659,-126.747"/>
</g>
<!-- 9&#45;&#45;5 -->
<g id="compartment_edge7" class="edge"><title>9&#45;&#45;5</title>
<path fill="none" stroke="black" d="M43.8398,-78.436C56.0053,-95.1249 73.0977,-118.573 77.6644,-124.837"/>
</g>
<!-- 10 -->
<g id="compartment/R4" class="node"><title>10</title>
<ellipse fill="#f0f8ff" stroke="black" cx="-9.22625" cy="99.7977" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="-9.22625" y="103.498" font-family="Courier New" font-size="14.00">R4</text>
</g>
<!-- 10&#45;&#45;1 -->
<g id="compartment_edge10" class="edge"><title>10&#45;&#45;1</title>
<path fill="none" stroke="black" d="M-8.56045,78.0001C-7.91523,56.8761 -6.99922,26.8865 -6.75435,18.8697"/>
</g>
<!-- 10&#45;&#45;3 -->
<g id="compartment_edge11" class="edge"><title>10&#45;&#45;3</title>
<path fill="none" stroke="black" d="M-8.55342,121.511C-7.96221,140.59 -7.16037,166.467 -6.92423,174.087"/>
</g>
</g>
</svg>
<!-- Brusselator graphviz neato
neato -Tsvg -O OperadExample_84_1509902008387_edited.gv
-->
<svg width="298pt" height="279pt"
viewBox="0.00 0.00 298.46 279.15" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]" class="graph" transform="scale(1 1) rotate(0) translate(146.905 137.565)">
<title>84</title>
<polygon fill="white" stroke="none" points="-146.905,141.587 -146.905,-137.565 151.559,-137.565 151.559,141.587 -146.905,141.587"/>
<text text-anchor="middle" x="2.32698" y="129.787" font-family="Courier New" font-size="14.00">Brusselator</text>
<!-- 89 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]/Packs/Pack[@roleName=&#39;R1&#39;]" class="node"><title>89</title>
<ellipse fill="#f0f8ff" stroke="black" cx="-70.111" cy="55.9654" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="-70.111" y="59.6654" font-family="Courier New" font-size="14.00">R1</text>
</g>
<!-- 105 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]/Cables/Cable[@roleName=&#39;X&#39;]" class="node"><title>105</title>
<ellipse fill="#000000" stroke="black" cx="-16.5116" cy="-7.00692" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="-22.8116" y="-12.6069" font-family="Courier New" font-size="14.00">X</text>
</g>
<!-- 89&#45;&#45;105 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge2" class="edge"><title>89&#45;&#45;105</title>
<path fill="none" stroke="black" d="M-56.0284,39.4202C-42.381,23.3863 -23.0059,0.623054 -17.8265,-5.46203"/>
</g>
<!-- 110 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]/Cables/Cable[@roleName=&#39;A&#39;]" class="node"><title>110</title>
<ellipse fill="#000000" stroke="black" cx="-121.851" cy="112.787" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="-128.151" y="107.187" font-family="Courier New" font-size="14.00">A</text>
</g>
<!-- 89&#45;&#45;110 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge1" class="edge"><title>89&#45;&#45;110</title>
<path fill="none" stroke="black" d="M-84.7992,72.0964C-97.9446,86.5331 -115.86,106.208 -120.639,111.456"/>
</g>
<!-- 92 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]/Packs/Pack[@roleName=&#39;R2&#39;]" class="node"><title>92</title>
<ellipse fill="#f0f8ff" stroke="black" cx="26.0677" cy="-77.4791" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="26.0677" y="-73.7791" font-family="Courier New" font-size="14.00">R2</text>
</g>
<!-- 92&#45;&#45;105 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge3" class="edge"><title>92&#45;&#45;105</title>
<path fill="none" stroke="black" d="M20.4178,-56.6178C10.5989,-36.7241 -7.50232,-9.57463 -14.6621,-6.98641"/>
</g>
<!-- 92&#45;&#45;105 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge4" class="edge"><title>92&#45;&#45;105</title>
<path fill="none" stroke="black" d="M10.2285,-62.7742C-2.81503,-44.8288 -18.4291,-16.1766 -17.39,-8.63459"/>
</g>
<!-- 106 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]/Cables/Cable[@roleName=&#39;Y&#39;]" class="node"><title>106</title>
<ellipse fill="#000000" stroke="black" cx="98.6697" cy="-55.7931" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="92.3697" y="-61.3931" font-family="Courier New" font-size="14.00">Y</text>
</g>
<!-- 92&#45;&#45;106 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge5" class="edge"><title>92&#45;&#45;106</title>
<path fill="none" stroke="black" d="M46.6783,-71.3228C64.7889,-65.9132 89.3513,-58.5765 96.5849,-56.4158"/>
</g>
<!-- 96 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]/Packs/Pack[@roleName=&#39;R3&#39;]" class="node"><title>96</title>
<ellipse fill="#f0f8ff" stroke="black" cx="65.4628" cy="20.0858" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="65.4628" y="23.7858" font-family="Courier New" font-size="14.00">R3</text>
</g>
<!-- 96&#45;&#45;105 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge6" class="edge"><title>96&#45;&#45;105</title>
<path fill="none" stroke="black" d="M44.7772,13.2492C23.9079,6.35184 -6.3556,-3.65034 -14.4545,-6.32706"/>
</g>
<!-- 96&#45;&#45;106 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge8" class="edge"><title>96&#45;&#45;106</title>
<path fill="none" stroke="black" d="M74.1875,0.149557C82.6426,-19.1706 94.6462,-46.5993 97.8551,-53.9315"/>
</g>
<!-- 108 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]/Cables/Cable[@roleName=&#39;D&#39;]" class="node"><title>108</title>
<ellipse fill="#000000" stroke="black" cx="145.759" cy="31.6311" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="139.459" y="26.0311" font-family="Courier New" font-size="14.00">D</text>
</g>
<!-- 96&#45;&#45;108 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge9" class="edge"><title>96&#45;&#45;108</title>
<path fill="none" stroke="black" d="M86.9806,23.1798C107.42,26.1187 136.138,30.2479 143.811,31.3511"/>
</g>
<!-- 109 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]/Cables/Cable[@roleName=&#39;B&#39;]" class="node"><title>109</title>
<ellipse fill="#000000" stroke="black" cx="82.3867" cy="99.5236" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="76.0867" y="93.9236" font-family="Courier New" font-size="14.00">B</text>
</g>
<!-- 96&#45;&#45;109 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge7" class="edge"><title>96&#45;&#45;109</title>
<path fill="none" stroke="black" d="M69.9981,41.3737C74.3062,61.5952 80.359,90.0062 81.9762,97.5969"/>
</g>
<!-- 101 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]/Packs/Pack[@roleName=&#39;R4&#39;]" class="node"><title>101</title>
<ellipse fill="#f0f8ff" stroke="black" cx="-77.7675" cy="-62.9498" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="-77.7675" y="-59.2498" font-family="Courier New" font-size="14.00">R4</text>
</g>
<!-- 101&#45;&#45;105 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge10" class="edge"><title>101&#45;&#45;105</title>
<path fill="none" stroke="black" d="M-61.6732,-48.2515C-46.0763,-34.0074 -23.9336,-13.7852 -18.0144,-8.37936"/>
</g>
<!-- 107 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]/Cables/Cable[@roleName=&#39;E&#39;]" class="node"><title>107</title>
<ellipse fill="#000000" stroke="black" cx="-132.105" cy="-116.765" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="-138.405" y="-122.365" font-family="Courier New" font-size="14.00">E</text>
</g>
<!-- 101&#45;&#45;107 -->
<g id="OperadExample[@roleName=&#39;Brusselator&#39;]_edge11" class="edge"><title>101&#45;&#45;107</title>
<path fill="none" stroke="black" d="M-93.193,-78.227C-106.747,-91.6511 -125.13,-109.857 -130.544,-115.219"/>
</g>
</g>
</svg>
<!-- Pixel Array graphviz neato
neato -Tsvg -O OperadExample_66_1509903749436_edited.gv
-->
<svg width="300pt" height="347pt"
viewBox="0.00 0.00 299.78 346.76" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]" class="graph" transform="scale(1 1) rotate(0) translate(157.327 151.523)">
<title>66</title>
<polygon fill="white" stroke="none" points="-157.327,195.235 -157.327,-151.523 142.448,-151.523 142.448,195.235 -157.327,195.235"/>
<text text-anchor="middle" x="-7.43951" y="183.435" font-family="Courier New" font-size="14.00">Pixel Array</text>
<!-- 70 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]/Packs/Pack[@roleName=&#39;P&#39;&#39;]" class="node"><title>70</title>
<ellipse fill="#f0f8ff" stroke="black" cx="117" cy="75" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="117" y="78.7" font-family="Courier New" font-size="14.00">P&#39;</text>
</g>
<!-- 74 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]/Packs/Pack[@roleName=&#39;P1&#39;]" class="node"><title>74</title>
<ellipse fill="#f0f8ff" stroke="black" cx="21.2375" cy="91.9075" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="21.2375" y="95.6075" font-family="Courier New" font-size="14.00">P1</text>
</g>
<!-- 90 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]/Cables/Cable[@roleName=&#39;x&#39;]" class="node"><title>90</title>
<ellipse fill="#000000" stroke="black" cx="26.6625" cy="166.435" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="20.3625" y="160.835" font-family="Courier New" font-size="14.00">x</text>
</g>
<!-- 74&#45;&#45;90 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]_edge1" class="edge"><title>74&#45;&#45;90</title>
<path fill="none" stroke="black" d="M22.8067,113.464C24.1585,132.035 25.9741,156.978 26.5085,164.319"/>
</g>
<!-- 91 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]/Cables/Cable[@roleName=&#39;y&#39;]" class="node"><title>91</title>
<ellipse fill="#000000" stroke="black" cx="8.88362" cy="13.6655" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="2.58362" y="8.06552" font-family="Courier New" font-size="14.00">y</text>
</g>
<!-- 74&#45;&#45;91 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]_edge2" class="edge"><title>74&#45;&#45;91</title>
<path fill="none" stroke="black" d="M17.8618,70.5275C14.7184,50.6192 10.3471,22.9343 9.17984,15.5416"/>
</g>
<!-- 77 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]/Packs/Pack[@roleName=&#39;P2&#39;]" class="node"><title>77</title>
<ellipse fill="#f0f8ff" stroke="black" cx="56.6358" cy="-55.4409" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="56.6358" y="-51.7409" font-family="Courier New" font-size="14.00">P2</text>
</g>
<!-- 87 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]/Cables/Cable[@roleName=&#39;u&#39;]" class="node"><title>87</title>
<ellipse fill="#000000" stroke="black" cx="-19.6341" cy="-87.786" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="-25.9341" y="-93.386" font-family="Courier New" font-size="14.00">u</text>
</g>
<!-- 77&#45;&#45;87 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]_edge3" class="edge"><title>77&#45;&#45;87</title>
<path fill="none" stroke="black" d="M36.5968,-63.9392C17.1771,-72.1748 -10.3929,-83.8669 -17.763,-86.9925"/>
</g>
<!-- 88 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]/Cables/Cable[@roleName=&#39;v&#39;]" class="node"><title>88</title>
<ellipse fill="#000000" stroke="black" cx="136.184" cy="-43.3686" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="129.884" y="-48.9686" font-family="Courier New" font-size="14.00">v</text>
</g>
<!-- 77&#45;&#45;88 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]_edge4" class="edge"><title>77&#45;&#45;88</title>
<path fill="none" stroke="black" d="M77.9532,-52.2057C98.2027,-49.1326 126.653,-44.815 134.254,-43.6614"/>
</g>
<!-- 89 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]/Cables/Cable[@roleName=&#39;w&#39;]" class="node"><title>89</title>
<ellipse fill="#000000" stroke="black" cx="85.9013" cy="-130.723" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="79.6013" y="-136.323" font-family="Courier New" font-size="14.00">w</text>
</g>
<!-- 77&#45;&#45;89 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]_edge5" class="edge"><title>77&#45;&#45;89</title>
<path fill="none" stroke="black" d="M64.4784,-75.615C71.9282,-94.7786 82.395,-121.703 85.1915,-128.897"/>
</g>
<!-- 77&#45;&#45;91 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]_edge6" class="edge"><title>77&#45;&#45;91</title>
<path fill="none" stroke="black" d="M44.3384,-37.6443C32.1794,-20.0479 14.7344,5.19828 10.0685,11.9508"/>
</g>
<!-- 82 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]/Packs/Pack[@roleName=&#39;P3&#39;]" class="node"><title>82</title>
<ellipse fill="#f0f8ff" stroke="black" cx="-65.3433" cy="-21.8027" rx="21.3963" ry="21.3963"/>
<text text-anchor="middle" x="-65.3433" y="-18.1027" font-family="Courier New" font-size="14.00">P3</text>
</g>
<!-- 82&#45;&#45;87 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]_edge7" class="edge"><title>82&#45;&#45;87</title>
<path fill="none" stroke="black" d="M-53.094,-39.485C-41.4584,-56.2815 -25.1105,-79.8805 -20.7427,-86.1856"/>
</g>
<!-- 82&#45;&#45;91 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]_edge8" class="edge"><title>82&#45;&#45;91</title>
<path fill="none" stroke="black" d="M-45.841,-12.4838C-26.9415,-3.453 -0.109998,9.36805 7.06262,12.7954"/>
</g>
<!-- 92 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]/Cables/Cable[@roleName=&#39;z&#39;]" class="node"><title>92</title>
<ellipse fill="#000000" stroke="black" cx="-142.527" cy="-22.887" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="-148.827" y="-28.487" font-family="Courier New" font-size="14.00">z</text>
</g>
<!-- 82&#45;&#45;92 -->
<g id="OperadExample[@roleName=&#39;Pixel Array&#39;]_edge9" class="edge"><title>82&#45;&#45;92</title>
<path fill="none" stroke="black" d="M-86.8433,-22.1047C-106.47,-22.3805 -133.487,-22.76 -140.698,-22.8613"/>
</g>
</g>
</svg>
<!-- Pixel Array paper, sections 2.1 and 2.2 -->
<svg width="273pt" height="302pt"
viewBox="0.00 0.00 272.75 302.11" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]" class="graph" transform="scale(1 1) rotate(0) translate(4 298.115)">
<title>158</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-298.115 268.754,-298.115 268.754,4 -4,4"/>
<text text-anchor="middle" x="132.377" y="-8.2" font-family="Courier New" font-size="14.00">Pixel Array 2.1</text>
<!-- 239 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]/Pack[@roleName=&#39;R&#39;&#39;]" class="node"><title>239</title>
<ellipse fill="orange" stroke="black" cx="213.826" cy="-271.492" rx="22.7465" ry="22.7465"/>
<text text-anchor="middle" x="213.826" y="-267.292" font-family="Courier New" font-size="14.00">R&#39;</text>
</g>
<!-- 255 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]/Cable[@roleName=&#39;v&#39;]" class="node"><title>255</title>
<ellipse fill="#000000" stroke="black" cx="262.954" cy="-202.987" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="256.954" y="-208.987" font-family="Courier New" font-size="14.00">v</text>
</g>
<!-- 239&#45;&#45;255 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge1" class="edge"><title>239&#45;&#45;255</title>
<path fill="none" stroke="black" d="M227.25,-252.772C239.75,-235.342 257.134,-211.102 261.776,-204.629"/>
<text text-anchor="middle" x="238.683" y="-232.901" font-family="Times,serif" font-size="14.00">v&#39;</text>
</g>
<!-- 259 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]/Cable[@roleName=&#39;z&#39;]" class="node"><title>259</title>
<ellipse fill="#000000" stroke="black" cx="129.847" cy="-268.702" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="123.847" y="-274.702" font-family="Courier New" font-size="14.00">z</text>
</g>
<!-- 239&#45;&#45;259 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge2" class="edge"><title>239&#45;&#45;259</title>
<path fill="none" stroke="black" d="M190.878,-270.729C169.51,-270.019 139.795,-269.032 131.86,-268.769"/>
<text text-anchor="middle" x="155.932" y="-273.949" font-family="Times,serif" font-size="14.00">z&#39;</text>
</g>
<!-- 242 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]/Pack[@roleName=&#39;R1&#39;]" class="node"><title>242</title>
<ellipse fill="orange" stroke="black" cx="109.295" cy="-47.4229" rx="22.7465" ry="22.7465"/>
<text text-anchor="middle" x="109.295" y="-43.2229" font-family="Courier New" font-size="14.00">R1</text>
</g>
<!-- 257 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]/Cable[@roleName=&#39;x&#39;]" class="node"><title>257</title>
<ellipse fill="#000000" stroke="black" cx="57.5365" cy="-113.499" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="51.5372" y="-119.499" font-family="Courier New" font-size="14.00">x</text>
</g>
<!-- 242&#45;&#45;257 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge3" class="edge"><title>242&#45;&#45;257</title>
<path fill="none" stroke="black" d="M95.152,-65.4785C81.9822,-82.2912 63.668,-105.671 58.7776,-111.915"/>
<text text-anchor="middle" x="69.9648" y="-92.8965" font-family="Times,serif" font-size="14.00">x1</text>
</g>
<!-- 258 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]/Cable[@roleName=&#39;y&#39;]" class="node"><title>258</title>
<ellipse fill="#000000" stroke="black" cx="193.229" cy="-53.9813" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="187.229" y="-59.9813" font-family="Courier New" font-size="14.00">y</text>
</g>
<!-- 242&#45;&#45;258 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge4" class="edge"><title>242&#45;&#45;258</title>
<path fill="none" stroke="black" d="M132.23,-49.215C153.587,-50.8838 183.286,-53.2044 191.216,-53.824"/>
<text text-anchor="middle" x="154.723" y="-55.7195" font-family="Times,serif" font-size="14.00">y1</text>
</g>
<!-- 245 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]/Pack[@roleName=&#39;R2&#39;]" class="node"><title>245</title>
<ellipse fill="orange" stroke="black" cx="222.347" cy="-131.136" rx="22.7465" ry="22.7465"/>
<text text-anchor="middle" x="222.347" y="-126.936" font-family="Courier New" font-size="14.00">R2</text>
</g>
<!-- 245&#45;&#45;255 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge5" class="edge"><title>245&#45;&#45;255</title>
<path fill="none" stroke="black" d="M233.658,-151.15C243.984,-169.421 258.198,-194.571 261.991,-201.284"/>
<text text-anchor="middle" x="240.825" y="-180.417" font-family="Times,serif" font-size="14.00">v2</text>
</g>
<!-- 245&#45;&#45;258 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge7" class="edge"><title>245&#45;&#45;258</title>
<path fill="none" stroke="black" d="M214.236,-109.644C206.832,-90.0248 196.639,-63.0178 193.919,-55.81"/>
<text text-anchor="middle" x="197.077" y="-86.9269" font-family="Times,serif" font-size="14.00">y2</text>
</g>
<!-- 256 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]/Cable[@roleName=&#39;w&#39;]" class="node"><title>256</title>
<ellipse fill="#000000" stroke="black" cx="150.949" cy="-165.105" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="144.95" y="-171.105" font-family="Courier New" font-size="14.00">w</text>
</g>
<!-- 245&#45;&#45;256 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge6" class="edge"><title>245&#45;&#45;256</title>
<path fill="none" stroke="black" d="M201.696,-140.961C183.575,-149.582 159.122,-161.217 152.602,-164.318"/>
<text text-anchor="middle" x="168.596" y="-156.84" font-family="Times,serif" font-size="14.00">w2</text>
</g>
<!-- 249 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]/Pack[@roleName=&#39;R3&#39;]" class="node"><title>249</title>
<ellipse fill="orange" stroke="black" cx="81.503" cy="-196.648" rx="22.7465" ry="22.7465"/>
<text text-anchor="middle" x="81.503" y="-192.448" font-family="Courier New" font-size="14.00">R3</text>
</g>
<!-- 249&#45;&#45;259 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge11" class="edge"><title>249&#45;&#45;259</title>
<path fill="none" stroke="black" d="M94.2048,-215.579C106.514,-233.925 123.989,-259.971 128.661,-266.934"/>
<text text-anchor="middle" x="104.825" y="-245.457" font-family="Times,serif" font-size="14.00">z3</text>
</g>
<!-- 249&#45;&#45;257 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge10" class="edge"><title>249&#45;&#45;257</title>
<path fill="none" stroke="black" d="M75.2061,-174.801C69.1038,-153.63 60.4404,-123.574 58.1245,-115.539"/>
<text text-anchor="middle" x="59.6653" y="-149.37" font-family="Times,serif" font-size="14.00">x3</text>
</g>
<!-- 249&#45;&#45;256 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge9" class="edge"><title>249&#45;&#45;256</title>
<path fill="none" stroke="black" d="M102.339,-187.184C119.599,-179.344 142.339,-169.016 149.024,-165.979"/>
<text text-anchor="middle" x="117.128" y="-180.782" font-family="Times,serif" font-size="14.00">w3</text>
</g>
<!-- 254 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]/Cable[@roleName=&#39;u&#39;]" class="node"><title>254</title>
<ellipse fill="#000000" stroke="black" cx="10.1986" cy="-230.857" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="4.1993" y="-236.857" font-family="Courier New" font-size="14.00">u</text>
</g>
<!-- 249&#45;&#45;254 -->
<g id="OperadExample[@roleName=&#39;Pixel Array 2.1&#39;]_edge8" class="edge"><title>249&#45;&#45;254</title>
<path fill="none" stroke="black" d="M60.8788,-206.543C42.7813,-215.225 18.3603,-226.941 11.8497,-230.065"/>
<text text-anchor="middle" x="29.3643" y="-222.504" font-family="Times,serif" font-size="14.00">u3</text>
</g>
</g>
</svg>
<!-- Pixel Array paper Example 3.1.3 -->
<svg width="281pt" height="259pt"
viewBox="0.00 0.00 281.29 258.78" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Pack" class="graph" transform="scale(1 1) rotate(0) translate(4 254.777)">
<title>P′</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-254.777 277.289,-254.777 277.289,4 -4,4"/>
<text text-anchor="middle" x="136.645" y="-8.2" font-family="Courier New" font-size="14.00">P′</text>
<!-- P1 -->
<g id="Pack/Pack[@roleName=&#39;P1&#39;]" class="node"><title>P1</title>
<ellipse fill="orange" stroke="black" cx="186.936" cy="-47.4229" rx="22.7465" ry="22.7465"/>
<text text-anchor="middle" x="186.936" y="-43.2229" font-family="Courier New" font-size="14.00">P1</text>
</g>
<!-- x -->
<g id="Pack/Cable[@roleName=&#39;x&#39;]" class="node"><title>x</title>
<ellipse fill="#000000" stroke="black" cx="262.97" cy="-37.4367" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="256.971" y="-43.4367" font-family="Courier New" font-size="14.00">x</text>
</g>
<!-- P1&#45;&#45;x -->
<g id="Pack_edge1" class="edge"><title>P1&#45;&#45;x</title>
<path fill="none" stroke="black" d="M209.748,-44.4267C228.645,-41.9448 253.543,-38.6748 260.862,-37.7135"/>
<text text-anchor="middle" x="228.305" y="-45.2701" font-family="Times,serif" font-size="14.00">x1</text>
</g>
<!-- y -->
<g id="Pack/Cable[@roleName=&#39;y&#39;]" class="node"><title>y</title>
<ellipse fill="#000000" stroke="black" cx="160.025" cy="-141.318" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="154.026" y="-147.318" font-family="Courier New" font-size="14.00">y</text>
</g>
<!-- P1&#45;&#45;y -->
<g id="Pack_edge2" class="edge"><title>P1&#45;&#45;y</title>
<path fill="none" stroke="black" d="M180.694,-69.2003C173.738,-93.4706 163.13,-130.483 160.587,-139.357"/>
<text text-anchor="middle" x="163.641" y="-108.478" font-family="Times,serif" font-size="14.00">y1</text>
</g>
<!-- P2 -->
<g id="Pack/Pack[@roleName=&#39;P2&#39;]" class="node"><title>P2</title>
<ellipse fill="orange" stroke="black" cx="86.7642" cy="-149.915" rx="22.7465" ry="22.7465"/>
<text text-anchor="middle" x="86.7642" y="-145.715" font-family="Courier New" font-size="14.00">P2</text>
</g>
<!-- P2&#45;&#45;y -->
<g id="Pack_edge6" class="edge"><title>P2&#45;&#45;y</title>
<path fill="none" stroke="black" d="M109.543,-147.242C127.688,-145.113 151.152,-142.359 158.042,-141.55"/>
<text text-anchor="middle" x="126.792" y="-148.596" font-family="Times,serif" font-size="14.00">y2</text>
</g>
<!-- u -->
<g id="Pack/Cable[@roleName=&#39;u&#39;]" class="node"><title>u</title>
<ellipse fill="#000000" stroke="black" cx="109.026" cy="-232.177" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="103.027" y="-238.177" font-family="Courier New" font-size="14.00">u</text>
</g>
<!-- P2&#45;&#45;u -->
<g id="Pack_edge3" class="edge"><title>P2&#45;&#45;u</title>
<path fill="none" stroke="black" d="M92.7299,-171.96C98.3968,-192.9 106.359,-222.321 108.486,-230.182"/>
<text text-anchor="middle" x="93.6079" y="-205.271" font-family="Times,serif" font-size="14.00">u2</text>
</g>
<!-- v -->
<g id="Pack/Cable[@roleName=&#39;v&#39;]" class="node"><title>v</title>
<ellipse fill="#000000" stroke="black" cx="140.221" cy="-88.1768" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="134.221" y="-94.1768" font-family="Courier New" font-size="14.00">v</text>
</g>
<!-- P2&#45;&#45;v -->
<g id="Pack_edge4" class="edge"><title>P2&#45;&#45;v</title>
<path fill="none" stroke="black" d="M101.655,-132.718C115.248,-117.019 133.96,-95.4077 138.953,-89.6401"/>
<text text-anchor="middle" x="113.304" y="-98.5788" font-family="Times,serif" font-size="14.00">v2</text>
</g>
<!-- w -->
<g id="Pack/Cable[@roleName=&#39;w&#39;]" class="node"><title>w</title>
<ellipse fill="#000000" stroke="black" cx="10.1986" cy="-135.6" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="4.1993" y="-141.6" font-family="Courier New" font-size="14.00">w</text>
</g>
<!-- P2&#45;&#45;w -->
<g id="Pack_edge5" class="edge"><title>P2&#45;&#45;w</title>
<path fill="none" stroke="black" d="M64.2061,-145.698C45.15,-142.135 19.8024,-137.396 12.3465,-136.002"/>
<text text-anchor="middle" x="29.723" y="-145.05" font-family="Times,serif" font-size="14.00">w2</text>
</g>
<!-- P3 -->
<g id="Pack/Pack[@roleName=&#39;P3&#39;]" class="node"><title>P3</title>
<ellipse fill="orange" stroke="black" cx="188.9" cy="-219.469" rx="22.7465" ry="22.7465"/>
<text text-anchor="middle" x="188.9" y="-215.269" font-family="Courier New" font-size="14.00">P3</text>
</g>
<!-- P3&#45;&#45;y -->
<g id="Pack_edge8" class="edge"><title>P3&#45;&#45;y</title>
<path fill="none" stroke="black" d="M181.01,-198.114C173.663,-178.229 163.446,-150.576 160.717,-143.192"/>
<text text-anchor="middle" x="163.864" y="-174.853" font-family="Times,serif" font-size="14.00">y3</text>
</g>
<!-- P3&#45;&#45;u -->
<g id="Pack_edge7" class="edge"><title>P3&#45;&#45;u</title>
<path fill="none" stroke="black" d="M166.225,-223.077C145.932,-226.306 118.274,-230.706 110.897,-231.88"/>
<text text-anchor="middle" x="131.561" y="-231.678" font-family="Times,serif" font-size="14.00">u3</text>
</g>
<!-- z -->
<g id="Pack/Cable[@roleName=&#39;z&#39;]" class="node"><title>z</title>
<ellipse fill="#000000" stroke="black" cx="261.974" cy="-188.398" rx="1.8" ry="1.8"/>
<text text-anchor="middle" x="255.975" y="-194.398" font-family="Courier New" font-size="14.00">z</text>
</g>
<!-- P3&#45;&#45;z -->
<g id="Pack_edge9" class="edge"><title>P3&#45;&#45;z</title>
<path fill="none" stroke="black" d="M210.036,-210.482C228.583,-202.596 253.61,-191.954 260.282,-189.117"/>
<text text-anchor="middle" x="228.552" y="-204" font-family="Times,serif" font-size="14.00">z3</text>
</g>
<!-- P′ -->
<g id="Pack_node10" class="node"><title>P′</title>
<ellipse fill="#f0f8ff" stroke="black" cx="239.08" cy="-109.248" rx="34.4199" ry="34.4199"/>
<text text-anchor="middle" x="239.08" y="-105.048" font-family="Courier New" font-size="14.00">P′</text>
</g>
<!-- P′&#45;&#45;x -->
<g id="Pack_edge10" class="edge"><title>P′&#45;&#45;x</title>
<path fill="none" stroke="black" d="M249.907,-76.7039C255.043,-61.2662 260.457,-44.9923 262.306,-39.4323"/>
<text text-anchor="middle" x="245.607" y="-62.2681" font-family="Times,serif" font-size="14.00">x′</text>
</g>
<!-- P′&#45;&#45;v -->
<g id="Pack_edge11" class="edge"><title>P′&#45;&#45;v</title>
<path fill="none" stroke="black" d="M205.611,-102.114C180.964,-96.8608 150.386,-90.3435 142.274,-88.6145"/>
<text text-anchor="middle" x="163.442" y="-82.7642" font-family="Times,serif" font-size="14.00">v′</text>
</g>
<!-- P′&#45;&#45;z -->
<g id="Pack_edge12" class="edge"><title>P′&#45;&#45;z</title>
<path fill="none" stroke="black" d="M248.657,-142.356C253.852,-160.317 259.576,-180.105 261.39,-186.377"/>
<text text-anchor="middle" x="244.916" y="-168.566" font-family="Times,serif" font-size="14.00">z′</text>
</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