hannah
5 years ago
committed by
Matthias Volk
8 changed files with 292 additions and 59 deletions
-
87doc/source/doc/gspns.rst
-
49examples/gspns/01-gspns.py
-
53examples/gspns/02-gspns.py
-
2lib/stormpy/examples/files.py
-
130lib/stormpy/examples/files/gspn/gspn_simple.pnml
-
18lib/stormpy/examples/files/gspn/gspn_simple.pnpro
-
11src/gspn/gspn.cpp
-
1tests/gspn/test_gspn.py
@ -1,9 +1,88 @@ |
|||||
******************* |
|
||||
|
********************************** |
||||
Generalized Stochastic Petri Nets |
Generalized Stochastic Petri Nets |
||||
******************* |
|
||||
|
********************************** |
||||
|
|
||||
|
Loading GSPNs |
||||
|
============== |
||||
|
|
||||
|
.. |
||||
|
.. seealso:: `01-gspn.py <link to github: 01-gspn.py>`_ |
||||
|
.. |
||||
|
|
||||
|
|
||||
|
Generalized stochastic Petri nets can be given in either in the PNPRO format or in the PNML format. |
||||
|
We start by loading a GSPN stored in the PNML format:: |
||||
|
|
||||
|
>>> import stormpy |
||||
|
>>> import stormpy.gspn |
||||
|
>>> import stormpy.examples |
||||
|
>>> import stormpy.examples.files |
||||
|
|
||||
|
>>> import_path = stormpy.examples.files.gspn_pnml_simple |
||||
|
>>> gspn_parser = stormpy.gspn.GSPNParser() |
||||
|
>>> gspn = gspn_parser.parse(import_path) |
||||
|
|
||||
|
After loading, we can display some properties of the GSPN:: |
||||
|
|
||||
|
>>> print("Name of GSPN: {}.".format(gspn.get_name())) |
||||
|
Name of GSPN: simple_gspn. |
||||
|
>>> print("Number of places: {}.".format(gspn.get_number_of_places())) |
||||
|
Number of places: 4. |
||||
|
>>> print("Number of immediate transitions: {}.".format(gspn.get_number_of_immediate_transitions())) |
||||
|
Number of immediate transitions: 3. |
||||
|
>>> print("Number of timed transitions: {}.".format(gspn.get_number_of_timed_transitions())) |
||||
|
Number of timed transitions: 2. |
||||
|
|
||||
Building GSPNs |
Building GSPNs |
||||
============= |
|
||||
TODO |
|
||||
|
============================= |
||||
|
.. |
||||
|
todo .. seealso:: `02-gspn.py <link to github: 02-gspn.py>`_ |
||||
|
.. |
||||
|
|
||||
|
In the following, we describe how to construct GSPNs via the GSPNBuilder. |
||||
|
First, we create an instance of the GSPNBuilder and set the name of the GSPN:: |
||||
|
|
||||
|
>>> builder = stormpy.gspn.GSPNBuilder() |
||||
|
>>> builder.set_name("gspn") |
||||
|
|
||||
|
In the next step, we add an immediate transition to the GSPN. Additionally, we define the position of the transition by setting its layout information:: |
||||
|
|
||||
|
>>> it_1 = builder.add_immediate_transition(1, 0.0, "it_1") |
||||
|
>>> it_layout = stormpy.gspn.LayoutInfo(1.5, 2.0) |
||||
|
>>> builder.set_transition_layout_info(it_1, it_layout) |
||||
|
|
||||
|
Add timed transition and set its layout information:: |
||||
|
|
||||
|
>>> tt_1 = builder.add_timed_transition(0, 0.4, "tt_1") |
||||
|
>>> tt_layout = stormpy.gspn.LayoutInfo(12.5, 2.0) |
||||
|
>>> builder.set_transition_layout_info(tt_1, tt_layout) |
||||
|
|
||||
|
Next, we add two places to the GSPN and set their layouts:: |
||||
|
|
||||
|
>>> place_1 = builder.add_place(1, 1, "place_1") |
||||
|
>>> p1_layout = stormpy.gspn.LayoutInfo(6.5, 2.0) |
||||
|
>>> builder.set_place_layout_info(place_1, p1_layout) |
||||
|
|
||||
|
>>> place_2 = builder.add_place(1, 0, "place_2") |
||||
|
>>> p2_layout = stormpy.gspn.LayoutInfo(18.5, 2.0) |
||||
|
>>> builder.set_place_layout_info(place_2, p2_layout) |
||||
|
|
||||
|
Places and transitions can be linked by output, inhibition or input arcs:: |
||||
|
|
||||
|
>>> builder.add_output_arc(it_1, place_1) |
||||
|
>>> builder.add_inhibition_arc(place_1, it_1) |
||||
|
>>> builder.add_input_arc(place_1, tt_1) |
||||
|
>>> builder.add_output_arc(tt_1, place_2) |
||||
|
|
||||
|
We can now build the GSPN:: |
||||
|
|
||||
|
>>> gspn = builder.build_gspn() |
||||
|
|
||||
|
After building, we can export the GSPN. |
||||
|
GSPNs can be saved in the PNPRO format via ``export_gspn_pnpro_file(path)`` |
||||
|
and in the PNML format via ``export_gspn_pnml_file(path)``. |
||||
|
We export the GSPN into the PNPRO format:: |
||||
|
|
||||
|
>>> export_path = stormpy.examples.files.gspn_pnpro_simple |
||||
|
>>> gspn.export_gspn_pnpro_file(export_path) |
||||
|
|
@ -0,0 +1,53 @@ |
|||||
|
import stormpy |
||||
|
import stormpy.gspn |
||||
|
|
||||
|
import stormpy.examples |
||||
|
import stormpy.examples.files |
||||
|
|
||||
|
|
||||
|
def example_gspns_02(): |
||||
|
# Use GSPNBuilder to construct a GSPN |
||||
|
builder = stormpy.gspn.GSPNBuilder() |
||||
|
builder.set_name("my_gspn") |
||||
|
|
||||
|
# Add immediate transition |
||||
|
it_1 = builder.add_immediate_transition(1, 0.0, "it_1") |
||||
|
it_layout = stormpy.gspn.LayoutInfo(1.5, 2.0) |
||||
|
builder.set_transition_layout_info(it_1, it_layout) |
||||
|
|
||||
|
# Add timed transition |
||||
|
tt_1 = builder.add_timed_transition(0, 0.4, "tt_1") |
||||
|
tt_layout = stormpy.gspn.LayoutInfo(12.5, 2.0) |
||||
|
builder.set_transition_layout_info(tt_1, tt_layout) |
||||
|
|
||||
|
# Add places |
||||
|
place_1 = builder.add_place(1, 1, "place_1") |
||||
|
p1_layout = stormpy.gspn.LayoutInfo(6.5, 2.0) |
||||
|
builder.set_place_layout_info(place_1, p1_layout) |
||||
|
|
||||
|
place_2 = builder.add_place(1, 0, "place_2") |
||||
|
p2_layout = stormpy.gspn.LayoutInfo(18.5, 2.0) |
||||
|
builder.set_place_layout_info(place_2, p2_layout) |
||||
|
|
||||
|
# Link places and transitions by arcs |
||||
|
builder.add_output_arc(it_1, place_1) |
||||
|
builder.add_inhibition_arc(place_1, it_1) |
||||
|
builder.add_input_arc(place_1, tt_1) |
||||
|
builder.add_output_arc(tt_1, place_2) |
||||
|
|
||||
|
# Build GSPN |
||||
|
gspn = builder.build_gspn() |
||||
|
|
||||
|
print("Name of GSPN: {}.".format(gspn.get_name())) |
||||
|
print("Number of places: {}.".format(gspn.get_number_of_places())) |
||||
|
print("Number of immediate transitions: {}.".format(gspn.get_number_of_immediate_transitions())) |
||||
|
print("Number of timed transitions: {}.".format(gspn.get_number_of_timed_transitions())) |
||||
|
|
||||
|
# Export to file (PNPRO format) |
||||
|
export_path = stormpy.examples.files.gspn_pnpro_simple |
||||
|
gspn.export_gspn_pnpro_file(export_path) |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
example_gspns_02() |
||||
|
|
@ -0,0 +1,130 @@ |
|||||
|
<pnml> |
||||
|
<net id="simple_gspn"> |
||||
|
<place id="place_1"> |
||||
|
<initialMarking> |
||||
|
<value>Default,1</value> |
||||
|
</initialMarking> |
||||
|
<capacity> |
||||
|
<value>Default,1</value> |
||||
|
</capacity> |
||||
|
</place> |
||||
|
<place id="place_2"> |
||||
|
<initialMarking> |
||||
|
<value>Default,0</value> |
||||
|
</initialMarking> |
||||
|
<capacity> |
||||
|
<value>Default,1</value> |
||||
|
</capacity> |
||||
|
</place> |
||||
|
<place id="place_3"> |
||||
|
<initialMarking> |
||||
|
<value>Default,0</value> |
||||
|
</initialMarking> |
||||
|
<capacity> |
||||
|
<value>Default,1</value> |
||||
|
</capacity> |
||||
|
</place> |
||||
|
<place id="place_4"> |
||||
|
<initialMarking> |
||||
|
<value>Default,0</value> |
||||
|
</initialMarking> |
||||
|
<capacity> |
||||
|
<value>Default,1</value> |
||||
|
</capacity> |
||||
|
</place> |
||||
|
<transition id="it_1"> |
||||
|
<rate> |
||||
|
<value>1</value> |
||||
|
</rate> |
||||
|
<timed> |
||||
|
<value>false</value> |
||||
|
</timed> |
||||
|
</transition> |
||||
|
<transition id="it_2"> |
||||
|
<rate> |
||||
|
<value>1</value> |
||||
|
</rate> |
||||
|
<timed> |
||||
|
<value>false</value> |
||||
|
</timed> |
||||
|
</transition> |
||||
|
<transition id="it_3"> |
||||
|
<rate> |
||||
|
<value>1</value> |
||||
|
</rate> |
||||
|
<timed> |
||||
|
<value>false</value> |
||||
|
</timed> |
||||
|
</transition> |
||||
|
<transition id="tt_1"> |
||||
|
<rate> |
||||
|
<value>0.4</value> |
||||
|
</rate> |
||||
|
<timed> |
||||
|
<value>true</value> |
||||
|
</timed> |
||||
|
</transition> |
||||
|
<transition id="tt_2"> |
||||
|
<rate> |
||||
|
<value>0.4</value> |
||||
|
</rate> |
||||
|
<timed> |
||||
|
<value>true</value> |
||||
|
</timed> |
||||
|
</transition> |
||||
|
<arc id="arc0" source="place_1" target="it_1" > |
||||
|
<inscription> |
||||
|
<value>Default,1</value> |
||||
|
</inscription> |
||||
|
<type value="inhibition" /> |
||||
|
</arc> |
||||
|
<arc id="arc1" source="it_1" target="place_1" > |
||||
|
<inscription> |
||||
|
<value>Default,1</value> |
||||
|
</inscription> |
||||
|
<type value="normal" /> |
||||
|
</arc> |
||||
|
<arc id="arc2" source="place_2" target="it_2" > |
||||
|
<inscription> |
||||
|
<value>Default,1</value> |
||||
|
</inscription> |
||||
|
<type value="normal" /> |
||||
|
</arc> |
||||
|
<arc id="arc3" source="it_2" target="place_3" > |
||||
|
<inscription> |
||||
|
<value>Default,1</value> |
||||
|
</inscription> |
||||
|
<type value="normal" /> |
||||
|
</arc> |
||||
|
<arc id="arc4" source="place_4" target="it_3" > |
||||
|
<inscription> |
||||
|
<value>Default,1</value> |
||||
|
</inscription> |
||||
|
<type value="normal" /> |
||||
|
</arc> |
||||
|
<arc id="arc5" source="place_1" target="tt_1" > |
||||
|
<inscription> |
||||
|
<value>Default,1</value> |
||||
|
</inscription> |
||||
|
<type value="normal" /> |
||||
|
</arc> |
||||
|
<arc id="arc6" source="tt_1" target="place_2" > |
||||
|
<inscription> |
||||
|
<value>Default,1</value> |
||||
|
</inscription> |
||||
|
<type value="normal" /> |
||||
|
</arc> |
||||
|
<arc id="arc7" source="place_3" target="tt_2" > |
||||
|
<inscription> |
||||
|
<value>Default,1</value> |
||||
|
</inscription> |
||||
|
<type value="normal" /> |
||||
|
</arc> |
||||
|
<arc id="arc8" source="tt_2" target="place_4" > |
||||
|
<inscription> |
||||
|
<value>Default,1</value> |
||||
|
</inscription> |
||||
|
<type value="normal" /> |
||||
|
</arc> |
||||
|
</net> |
||||
|
</pnml> |
@ -1,16 +1,16 @@ |
|||||
<project name="storm-export" version="121"> |
<project name="storm-export" version="121"> |
||||
<gspn name="gspn" > |
|
||||
|
<gspn name="my_gspn" > |
||||
<nodes> |
<nodes> |
||||
<place marking="1" name ="place_0" x="6.5" y="1.5" /> |
|
||||
<place marking="0" name ="place_1" x="18.5" y="1.5" /> |
|
||||
<transition name="tt_0" type="EXP" nservers="1" delay="0.4000000000" x="12.50000000" y="1.500000000" /> |
|
||||
<transition name="it_0" type="IMM" priority="1" weight="1.000000000" x="1.500000000" y="1.500000000" /> |
|
||||
|
<place marking="1" name ="place_1" x="6.5" y="2" /> |
||||
|
<place marking="0" name ="place_2" x="18.5" y="2" /> |
||||
|
<transition name="tt_1" type="EXP" nservers="1" delay="0.4000000000" x="12.50000000" y="2.000000000" /> |
||||
|
<transition name="it_1" type="IMM" priority="1" weight="1.000000000" x="1.500000000" y="2.000000000" /> |
||||
</nodes> |
</nodes> |
||||
<edges> |
<edges> |
||||
<arc head="tt_0" tail="place_0" kind="INPUT" mult="1" /> |
|
||||
<arc head="place_1" tail="tt_0" kind="OUTPUT" mult="1" /> |
|
||||
<arc head="it_0" tail="place_0" kind="INHIBITOR" mult="1" /> |
|
||||
<arc head="place_0" tail="it_0" kind="OUTPUT" mult="1" /> |
|
||||
|
<arc head="tt_1" tail="place_1" kind="INPUT" mult="1" /> |
||||
|
<arc head="place_2" tail="tt_1" kind="OUTPUT" mult="1" /> |
||||
|
<arc head="it_1" tail="place_1" kind="INHIBITOR" mult="1" /> |
||||
|
<arc head="place_1" tail="it_1" kind="OUTPUT" mult="1" /> |
||||
</edges> |
</edges> |
||||
</gspn> |
</gspn> |
||||
</project> |
</project> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue