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 | 
				
			|||
******************* | 
				
			|||
********************************** | 
				
			|||
 | 
				
			|||
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 | 
				
			|||
============= | 
				
			|||
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"> | 
				
			|||
  <gspn name="gspn" > | 
				
			|||
  <gspn name="my_gspn" > | 
				
			|||
    <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> | 
				
			|||
    <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> | 
				
			|||
  </gspn> | 
				
			|||
</project> | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue