123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- from api.od import ODAPI
- from concrete_syntax.graphviz.make_url import show_graphviz
- from concrete_syntax.graphviz.renderer import make_graphviz_id
- try:
- import graphviz
- HAVE_GRAPHVIZ = True
- except ImportError:
- HAVE_GRAPHVIZ = False
- def render_tokens(num_tokens: int):
- if 0 <= num_tokens <= 3:
- return '●'*num_tokens
- if num_tokens == 4:
- return '●●\\n●●'
- return str(num_tokens)
- def render_petri_net_to_dot(od: ODAPI) -> str:
- dot = ""
- dot += "rankdir=LR;"
- dot += "center=true;"
- dot += "margin=1;"
- dot += "nodesep=1;"
- dot += "subgraph places {"
- dot += " node [fontname=Arial,fontsize=10,shape=circle,fixedsize=true,label=\"\", height=.35,width=.35];"
- for place_name, place in od.get_all_instances("PNPlace"):
- # place_name = od.get_name(place)
- try:
- place_state = od.get_source(od.get_incoming(place, "pn_of")[0])
- num_tokens = od.get_slot_value(place_state, "numTokens")
- except IndexError:
- num_tokens = 0
- print("PLACE", place)
- dot += f" {make_graphviz_id(place)} [label=\"{place_name}\\n\\n{render_tokens(num_tokens)}\\n\\n\"];\n"
- dot += "}\n"
- dot += "subgraph transitions {\n"
- dot += " edge [arrowhead=normal];\n"
- dot += " node [fontname=Arial,fontsize=10,shape=rect,fixedsize=true,height=.3,width=.12,style=filled,fillcolor=black,color=white];\n"
- for transition_name, transition in od.get_all_instances("PNTransition"):
- dot += f" {make_graphviz_id(transition)} [label=\"{transition_name}\\n\\n\\n\"];\n"
- dot += "}\n"
- for _, arc in od.get_all_instances("arc"):
- src = od.get_source(arc)
- tgt = od.get_target(arc)
- # src_name = od.get_name(od.get_source(arc))
- # tgt_name = od.get_name(od.get_target(arc))
- dot += f"{make_graphviz_id(src)} -> {make_graphviz_id(tgt)};"
- for _, inhib_arc in od.get_all_instances("inh_arc"):
- src = od.get_source(inhib_arc)
- tgt = od.get_target(inhib_arc)
- dot += f"{make_graphviz_id(src)} -> {make_graphviz_id(tgt)} [arrowhead=odot];\n"
- return dot
- # deprecated
- def render_petri_net(od: ODAPI, engine="neato"):
- show_graphviz(render_petri_net_to_dot(od), engine=engine)
- # use this instead:
- def show_petri_net(od: ODAPI, engine="neato"):
- show_graphviz(render_petri_net_to_dot(od), engine=engine)
|