Function Repository Resource:

MakePetriNet

Source Notebook

Make an abstract representation of a Petri net configuration

Contributed by: Jonathan Gorard

ResourceFunction["MakePetriNet"][p,t,a,init]

makes a Petri net using the list of places p, the list of transitions t and the list of arcs a, with initial token distribution init.

ResourceFunction["MakePetriNet"][assoc,init]

makes a Petri net using the association of places, transitions and arcs assoc, with initial token distribution init.

Details

A Petri net is an abstract mathematical representation of a distributed system (frequently used for describing chemical reactions, biological processes, concurrent computing, etc.) consisting of a directed bipartite graph whose vertices are classified as either "places" or "transitions". The directed edges connecting places and tokens together are known as "arcs".
Each place can contain a number of "tokens", and a given transition will "fire" if the places connected to it by input arcs all contain at least one token. When a transition fires, it redistributes tokens from places connected to it by input arcs to places connected to it by output arcs.
ResourceFunction["MakePetriNet"] supports the specification of Petri nets either by three lists (places p, transitions t and arcs a), or by an explicit association of the form <|"Places"p,"Transitions"t,"Arcs"a|>. The list of arcs a should be a list of either rules or DirectedEdge objects (each connecting a place to a transition, or vice versa).
If ResourceFunction["MakePetriNet"] succeeds in constructing the specified Petri net, then it returns a PetriNetObject expression.
The list init should be a list of integers specifying how many initial tokens to assign to each place. If a list init is not given, ResourceFunction["MakePetriNet"] will assume that each place contains no tokens.
In PetriNetObject, the following properties are supported:
"AssociationForm"Petri net represented as an association of places, transitions and arcs
"Places"list of places in the Petri net
"PlaceCount"number of places in the Petri net
"Transitions"list of transitions in the Petri net
"TransitionCount"number of transitions in the Petri net
"Arcs"list of arcs in the Petri net
"ArcCount"number of arcs in the Petri net
"Tokens"list of token numbers associated to each place in the Petri net
"TokenCount"total number of tokens across all places in the Petri net
"UnlabeledGraph"directed graph form of the Petri net without token counts represented graphically
"LabeledGraph"directed graph form of the Petri net with token counts represented graphically
"WeightedGraph"directed graph form of the Petri net with token counts represented as vertex weights
By convention, ResourceFunction["MakePetriNet"] renders places as circles, transitions as squares, arcs as directed edges and tokens as black dots.

Examples

Basic Examples (3) 

Construct a simple Petri net from lists of four places, three transitions and eight arcs, with an initial distribution of six tokens:

In[1]:=
petriNet = ResourceFunction[
  "MakePetriNet"][{p1, p2, p3, p4}, {t1, t2, t3}, {p1 -> t1, t1 -> p1,
    p2 -> t1, p3 -> t1, t2 -> p2, p3 -> t3, t3 -> p4, p4 -> t2}, {1, 2, 1, 2}]
Out[1]=

Show the unlabeled graph:

In[2]:=
petriNet["UnlabeledGraph"]
Out[2]=

Show the labeled graph with token counts represented graphically:

In[3]:=
petriNet["LabeledGraph"]
Out[3]=

Show the weighted graph with token counts represented as vertex weights:

In[4]:=
Graph[petriNet["WeightedGraph"], VertexLabels -> "VertexWeight"]
Out[4]=

Construct a Petri net representing a simple reversible chemical reaction from an association of three places, two transitions and six arcs, with an initial distribution of twelve tokens:

In[5]:=
petriNet = ResourceFunction[
  "MakePetriNet"][<|"Places" -> {"O2", "H2O", "H2"}, "Transitions" -> {"Hydrolysis", "Combination"}, "Arcs" -> {"Hydrolysis" -> "O2", "O2" -> "Combination", "Combination" -> "H2O", "H2O" -> "Hydrolysis", "Hydrolysis" -> "H2", "H2" -> "Combination"}|>, {1, 4, 7}]
Out[5]=

Show the labeled graph with token counts represented graphically:

In[6]:=
petriNet["LabeledGraph"]
Out[6]=

Show the association of places, transitions and arcs:

In[7]:=
petriNet["AssociationForm"]
Out[7]=

Show the list of arcs (directed edges):

In[8]:=
petriNet["Arcs"]
Out[8]=

Show the distribution of tokens across places:

In[9]:=
petriNet["Tokens"]
Out[9]=

Construct a more complicated Petri net representing a concurrent communications protocol between two agents:

In[10]:=
petriNet = ResourceFunction[
  "MakePetriNet"][{p1, p2, p3, p4, p5, p6, p7, p8}, {"Person 1", "Person 2", "Send Message", "Receive Message", "Receive Acknowledgement", "Send Acknowledgement"}, {"Person 1" -> p1, p1 -> "Send Message", "Send Message" -> p3, "Send Message" -> p4, p3 -> "Receive Message", p4 -> "Receive Acknowledgement", "Receive Acknowledgement" -> p7, p7 -> "Person 1", "Receive Message" -> p5, p5 -> "Send Acknowledgement", "Send Acknowledgement" -> p6, "Send Acknowledgement" -> p8, p8 -> "Person 2", "Person 2" -> p2, p2 -> "Receive Message", p6 -> "Receive Acknowledgement"}, {0, 2, 0, 6, 1, 1, 2, 1}]
Out[10]=

Show the labeled graph with token counts represented graphically:

In[11]:=
petriNet["LabeledGraph"]
Out[11]=

Show the list of transitions:

In[12]:=
petriNet["Transitions"]
Out[12]=

Scope (2) 

If MakePetriNet is called without an explicit list of token numbers, it is assumed that each place contains no tokens:

In[13]:=
petriNet = ResourceFunction[
  "MakePetriNet"][{p1, p2, p3}, {t1, t2, t3, t4}, {p1 -> t1, t1 -> p2,
    p2 -> t2, t2 -> p3, p3 -> t3, p3 -> t4}]
Out[13]=

Show the labeled graph:

In[14]:=
petriNet["LabeledGraph"]
Out[14]=

Show the default distribution of tokens across places:

In[15]:=
petriNet["Tokens"]
Out[15]=

Construct a Petri net representing a simple producer-consumer problem in concurrency theory:

In[16]:=
petriNet = ResourceFunction[
  "MakePetriNet"][{p1, p2, p3, "Buffer", p4}, {"Produce", t1, t2, "Consume"}, {p1 -> "Produce", "Produce" -> p3, p3 -> t2, t2 -> p1, t2 -> "Buffer", "Buffer" -> t1, t1 -> p4, p4 -> "Consume", "Consume" -> p2, p2 -> t1}, {1, 3, 0, 6, 2}]
Out[16]=

Show the list of properties:

In[17]:=
petriNet["Properties"]
Out[17]=

Show the representation of the Petri net as an association of places, transitions and arcs:

In[18]:=
petriNet["AssociationForm"]
Out[18]=

Show the list of places in the Petri net:

In[19]:=
petriNet["Places"]
Out[19]=

Show the number of places in the Petri net:

In[20]:=
petriNet["PlaceCount"]
Out[20]=

Show the list of transitions in the Petri net:

In[21]:=
petriNet["Transitions"]
Out[21]=

Show the number of transitions in the Petri net:

In[22]:=
petriNet["TransitionCount"]
Out[22]=

Show the list of arcs in the Petri net:

In[23]:=
petriNet["Arcs"]
Out[23]=

Show the number of arcs in the Petri net:

In[24]:=
petriNet["ArcCount"]
Out[24]=

Show the list of token numbers associated to each place in the Petri net:

In[25]:=
petriNet["Tokens"]
Out[25]=

Show the total number of tokens across all places in the Petri net:

In[26]:=
petriNet["TokenCount"]
Out[26]=

Show the directed graph form of the Petri net without token counts represented graphically:

In[27]:=
petriNet["UnlabeledGraph"]
Out[27]=

Show the directed graph form of the Petri net with token counts represented graphically:

In[28]:=
petriNet["LabeledGraph"]
Out[28]=

Show the directed graph form of the Petri net with token counts represented as vertex weights:

In[29]:=
petriNet["WeightedGraph"]
Out[29]=
In[30]:=
Graph[%, VertexLabels -> "VertexWeight"]
Out[30]=

Publisher

Jonathan Gorard

Version History

  • 1.0.0 – 22 November 2021

Source Metadata

Related Resources

License Information