y_petri 2.0.15 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/lib/y_petri/{manipulator → agent}/hash_key_pointer.rb +2 -2
  3. data/lib/y_petri/agent/petri_net_related.rb +115 -0
  4. data/lib/y_petri/{manipulator → agent}/selection.rb +2 -1
  5. data/lib/y_petri/{manipulator/simulation_related_methods.rb → agent/simulation_related.rb} +93 -110
  6. data/lib/y_petri/agent.rb +22 -0
  7. data/lib/y_petri/core/timed/euler.rb +20 -0
  8. data/lib/y_petri/core/timed/pseudo_euler.rb +31 -0
  9. data/lib/y_petri/core/timed/quasi_euler.rb +23 -0
  10. data/lib/y_petri/core/timed.rb +70 -0
  11. data/lib/y_petri/core/timeless/pseudo_euler.rb +20 -0
  12. data/lib/y_petri/core/timeless.rb +12 -0
  13. data/lib/y_petri/core.rb +100 -0
  14. data/lib/y_petri/dsl.rb +66 -0
  15. data/lib/y_petri/fixed_assets.rb +7 -0
  16. data/lib/y_petri/net/element_access.rb +239 -0
  17. data/lib/y_petri/net/state/feature/delta.rb +88 -0
  18. data/lib/y_petri/net/state/feature/firing.rb +57 -0
  19. data/lib/y_petri/net/state/feature/flux.rb +58 -0
  20. data/lib/y_petri/net/state/feature/gradient.rb +75 -0
  21. data/lib/y_petri/net/state/feature/marking.rb +62 -0
  22. data/lib/y_petri/net/state/feature.rb +79 -0
  23. data/lib/y_petri/net/state/features/dataset.rb +135 -0
  24. data/lib/y_petri/net/state/features/record.rb +50 -0
  25. data/lib/y_petri/net/state/features.rb +126 -0
  26. data/lib/y_petri/net/state.rb +121 -0
  27. data/lib/y_petri/net/timed.rb +8 -0
  28. data/lib/y_petri/net/visualization.rb +3 -3
  29. data/lib/y_petri/net.rb +73 -77
  30. data/lib/y_petri/place.rb +8 -3
  31. data/lib/y_petri/simulation/dependency.rb +107 -0
  32. data/lib/y_petri/simulation/element_representation.rb +20 -0
  33. data/lib/y_petri/simulation/elements/access.rb +57 -0
  34. data/lib/y_petri/simulation/elements.rb +45 -0
  35. data/lib/y_petri/simulation/feature_set.rb +21 -0
  36. data/lib/y_petri/simulation/initial_marking/access.rb +55 -0
  37. data/lib/y_petri/simulation/initial_marking.rb +15 -0
  38. data/lib/y_petri/simulation/marking_clamps/access.rb +34 -0
  39. data/lib/y_petri/simulation/marking_clamps.rb +18 -0
  40. data/lib/y_petri/simulation/marking_vector/access.rb +106 -0
  41. data/lib/y_petri/simulation/marking_vector.rb +156 -0
  42. data/lib/y_petri/simulation/matrix.rb +64 -0
  43. data/lib/y_petri/simulation/place_mapping.rb +62 -0
  44. data/lib/y_petri/simulation/place_representation.rb +74 -0
  45. data/lib/y_petri/simulation/places/access.rb +121 -0
  46. data/lib/y_petri/simulation/places/clamped.rb +8 -0
  47. data/lib/y_petri/simulation/places/free.rb +8 -0
  48. data/lib/y_petri/simulation/places/types.rb +25 -0
  49. data/lib/y_petri/simulation/places.rb +41 -0
  50. data/lib/y_petri/simulation/recorder.rb +54 -0
  51. data/lib/y_petri/simulation/timed/recorder.rb +53 -0
  52. data/lib/y_petri/simulation/timed.rb +161 -261
  53. data/lib/y_petri/simulation/timeless/recorder.rb +25 -0
  54. data/lib/y_petri/simulation/timeless.rb +35 -0
  55. data/lib/y_petri/simulation/transition_representation/A.rb +58 -0
  56. data/lib/y_petri/simulation/transition_representation/S.rb +45 -0
  57. data/lib/y_petri/simulation/transition_representation/T.rb +80 -0
  58. data/lib/y_petri/simulation/transition_representation/TS.rb +46 -0
  59. data/lib/y_petri/simulation/transition_representation/Ts.rb +32 -0
  60. data/lib/y_petri/simulation/transition_representation/a.rb +30 -0
  61. data/lib/y_petri/simulation/transition_representation/s.rb +29 -0
  62. data/lib/y_petri/simulation/transition_representation/t.rb +37 -0
  63. data/lib/y_petri/simulation/transition_representation/tS.rb +38 -0
  64. data/lib/y_petri/simulation/transition_representation/ts.rb +32 -0
  65. data/lib/y_petri/simulation/transition_representation/types.rb +62 -0
  66. data/lib/y_petri/simulation/transition_representation.rb +79 -0
  67. data/lib/y_petri/simulation/transitions/A.rb +40 -0
  68. data/lib/y_petri/simulation/transitions/S.rb +24 -0
  69. data/lib/y_petri/simulation/transitions/T.rb +34 -0
  70. data/lib/y_petri/simulation/transitions/TS.rb +57 -0
  71. data/lib/y_petri/simulation/transitions/Ts.rb +60 -0
  72. data/lib/y_petri/simulation/transitions/a.rb +8 -0
  73. data/lib/y_petri/simulation/transitions/access.rb +186 -0
  74. data/lib/y_petri/simulation/transitions/s.rb +9 -0
  75. data/lib/y_petri/simulation/transitions/t.rb +22 -0
  76. data/lib/y_petri/simulation/transitions/tS.rb +55 -0
  77. data/lib/y_petri/simulation/transitions/ts.rb +58 -0
  78. data/lib/y_petri/simulation/transitions/types.rb +98 -0
  79. data/lib/y_petri/simulation/transitions.rb +21 -0
  80. data/lib/y_petri/simulation.rb +176 -781
  81. data/lib/y_petri/transition/assignment.rb +7 -5
  82. data/lib/y_petri/transition/construction.rb +119 -187
  83. data/lib/y_petri/transition/init.rb +311 -0
  84. data/lib/y_petri/transition/ordinary_timeless.rb +8 -6
  85. data/lib/y_petri/transition/timed.rb +11 -18
  86. data/lib/y_petri/transition.rb +104 -132
  87. data/lib/y_petri/version.rb +1 -1
  88. data/lib/y_petri/world/dependency.rb +40 -0
  89. data/lib/y_petri/world/petri_net_related.rb +61 -0
  90. data/lib/y_petri/{workspace/simulation_related_methods.rb → world/simulation_related.rb} +42 -49
  91. data/lib/y_petri/world.rb +27 -0
  92. data/lib/y_petri.rb +47 -99
  93. data/test/{manipulator_test.rb → agent_test.rb} +19 -17
  94. data/{lib/y_petri → test/examples}/demonstrator.rb +0 -0
  95. data/{lib/y_petri → test/examples}/demonstrator_2.rb +1 -0
  96. data/{lib/y_petri → test/examples}/demonstrator_3.rb +0 -0
  97. data/{lib/y_petri → test/examples}/demonstrator_4.rb +0 -0
  98. data/test/examples/example_2.rb +16 -0
  99. data/test/{manual_examples.rb → examples/manual_examples.rb} +0 -0
  100. data/test/net_test.rb +126 -121
  101. data/test/place_test.rb +1 -1
  102. data/test/sim_test +565 -0
  103. data/test/simulation_test.rb +338 -264
  104. data/test/transition_test.rb +77 -174
  105. data/test/world_mock.rb +12 -0
  106. data/test/{workspace_test.rb → world_test.rb} +19 -20
  107. data/test/y_petri_test.rb +4 -5
  108. metadata +101 -26
  109. data/lib/y_petri/dependency_injection.rb +0 -45
  110. data/lib/y_petri/manipulator/petri_net_related_methods.rb +0 -74
  111. data/lib/y_petri/manipulator.rb +0 -20
  112. data/lib/y_petri/net/selections.rb +0 -209
  113. data/lib/y_petri/simulation/collections.rb +0 -460
  114. data/lib/y_petri/workspace/parametrized_subclassing.rb +0 -22
  115. data/lib/y_petri/workspace/petri_net_related_methods.rb +0 -88
  116. data/lib/y_petri/workspace.rb +0 -16
  117. data/test/timed_simulation_test.rb +0 -153
data/lib/y_petri.rb CHANGED
@@ -1,116 +1,64 @@
1
- require 'gnuplot'
2
- require 'csv'
3
- require 'graphviz'
4
-
5
- require 'y_support/local_object'
6
- require 'y_support/respond_to'
7
- require 'y_support/name_magic'
8
- require 'y_support/unicode'
9
- require 'y_support/typing'
10
- require 'y_support/try'
11
- require 'y_support/core_ext/hash'
12
- require 'y_support/core_ext/array'
13
- require 'y_support/stdlib_ext/matrix'
14
- require 'y_support/abstract_algebra'
15
- require 'y_support/kde'
1
+ #encoding: utf-8
16
2
 
17
3
  require 'active_support/core_ext/module/delegation'
18
4
  require 'active_support/core_ext/array/extract_options'
5
+ require 'active_support/inflector'
6
+
7
+ # The following are the Ruby libraries used by YPetri:
8
+ require 'gnuplot' # used for graph visualization
9
+ require 'csv' # not used at the moment
10
+ require 'graphviz' # used for Petri net visualization
11
+
12
+ # The following are the YSupport components used by YPetri:
13
+ require 'y_support/local_object' # object aware of its creation scope
14
+ require 'y_support/respond_to' # Symbol#~@ + RespondTo#===
15
+ require 'y_support/name_magic' # naming by assignment & more
16
+ require 'y_support/unicode' # ç means self.class
17
+ require 'y_support/typing' # run-time assertions
18
+ require 'y_support/try' # increased awareness in danger
19
+ require 'y_support/core_ext' # core extensions
20
+ require 'y_support/stdlib_ext/matrix' # matrix extensions
21
+ require 'y_support/abstract_algebra' #
22
+ require 'y_support/kde' # popup file with kioclient
19
23
 
20
24
  require_relative 'y_petri/version'
25
+ require_relative 'y_petri/fixed_assets'
26
+ require_relative 'y_petri/world'
21
27
  require_relative 'y_petri/place'
22
28
  require_relative 'y_petri/transition'
23
29
  require_relative 'y_petri/net'
24
30
  require_relative 'y_petri/simulation'
25
- require_relative 'y_petri/workspace'
26
- require_relative 'y_petri/manipulator'
31
+ require_relative 'y_petri/core'
32
+ require_relative 'y_petri/agent'
33
+ require_relative 'y_petri/dsl'
27
34
 
28
- # YPetri represents Petri net (PN) formalism.
35
+ # YPetri represents Petri net (PN) formalims.
29
36
  #
30
- # A PN consists of places and transitions. There are also arcs, that is,
31
- # "arrows" connecting places and transitions, though arcs are not considered
32
- # first class citizens in YPetri.
37
+ # A PN consists of places and transitions. There are also arcs, "arrows"
38
+ # connecting places and transitions, but these are not considered first class
39
+ # citizens in YPetri.
33
40
  #
34
- # At the time of PN execution (or simulation), transitions act upon places
35
- # and change their marking by placing or removing tokens as dictated by
36
- # their operation method ("function").
41
+ # During PN execution (simulation), transitions act upon places and change their
42
+ # marking by adding / removing tokens as dictated by their function -- more
43
+ # precisely, their operation prescription. Borrowing more from the functional
44
+ # terminology, I define domain an codomain of a PN transition in a similar way
45
+ # to the functional domain and codomain.
37
46
  #
38
- # Hybrid Functional Petri Net formalism, motivated by modeling cellular
39
- # processes by their authors' Cell Illustrator software, explicitly
40
- # introduces the possibility of both discrete and continuous places and
41
- # transitions ('Hybrid'). YPetri does not emphasize this. Just like there is
42
- # fluid transition between Fixnum and Bignum, there should be fluid
43
- # transition between token amount representation as Integer (discrete) or
44
- # Float (continuous) - the decision should be on the simulator.
47
+ # Hybrid Functional Petri Net (HFPN) formalism, motivated by the needs of
48
+ # modeling of cellular processes, explicitly introduces the option of having
49
+ # discrete as well as continuous places and transitions (therefrom "hybrid").
50
+ # In YPetri, the emphasis is elsewhere. Just like in modern computer languages,
51
+ # there is a fluid transition between Fixnum and Bignum, YPetri attempts for
52
+ # similarly fluid transition between Integer (ie. discrete) and floating point
53
+ # (ie. continuous) representation of token amounts and reaction speeds. Whole
54
+ # discrete / continuous issue thus becomes the business of the simulator, not
55
+ # the model.
45
56
  #
46
57
  module YPetri
47
- DEFAULT_SIMULATION_SETTINGS = lambda do
48
- { step_size: 0.02,
49
- sampling_period: 2,
50
- time: 0..60 }
58
+ class << self
59
+ def included( receiver )
60
+ receiver.extend YPetri::DSL
61
+ receiver.delegate :y_petri_agent, to: "self.class"
62
+ end
51
63
  end
52
-
53
- GuardError = Class.new TypeError
54
-
55
- def self.included( receiver )
56
- # receiver.instance_variable_set :@YPetriManipulator, Manipulator.new
57
- # puts "included in #{receiver}"
58
- receiver.module_exec {
59
- define_method :y_petri_manipulator do
60
- singleton_class.instance_variable_get :@YPetriManipulator or
61
- ( puts "defining Manipulator for #{self} singleton class" if YPetri::DEBUG
62
- singleton_class.instance_variable_set :@YPetriManipulator, Manipulator.new )
63
- end
64
- }
65
- end
66
-
67
- delegate( :workspace, to: :y_petri_manipulator )
68
-
69
- # Petri net aspect.
70
- delegate( :Place, :Transition, :Net,
71
- :place, :transition, :pl, :tr,
72
- :places, :transitions, :nets,
73
- :pp, :tt, :nn,
74
- :net_point,
75
- :net_selection,
76
- :net, :ne,
77
- :net_point_reset,
78
- :net_point_set,
79
- to: :y_petri_manipulator )
80
-
81
- # Simulation aspect.
82
- delegate( :simulation_point, :ssc_point, :cc_point, :imc_point,
83
- :simulation_selection, :ssc_selection,
84
- :cc_selection, :imc_selection,
85
- :simulations,
86
- :clamp_collections,
87
- :initial_marking_collections,
88
- :simulation_settings_collections,
89
- :clamp_collection_names, :cc_names,
90
- :initial_marking_collection_names, :imc_names,
91
- :simulation_settings_collection_names, :ssc_names,
92
- :set_clamp_collection, :set_cc,
93
- :set_initial_marking_collection, :set_imc,
94
- :set_simulation_settings_collection, :set_ssc,
95
- :new_timed_simulation,
96
- :clamp_cc, :initial_marking_cc, :simulation_settings_cc,
97
- :simulation_point_position,
98
- :simulation,
99
- :clamp_collection, :cc,
100
- :initial_marking_collection, :imc,
101
- :simulation_settings_collection, :ssc,
102
- :clamp,
103
- :initial_marking,
104
- :set_step, :set_step_size,
105
- :set_time, :set_target_time,
106
- :set_sampling,
107
- :set_simulation_method,
108
- :new_timed_simulation,
109
- :run!,
110
- :print_recording,
111
- :plot,
112
- :plot_selected,
113
- :plot_state,
114
- :plot_flux,
115
- to: :y_petri_manipulator )
116
64
  end
@@ -7,16 +7,16 @@ require_relative '../lib/y_petri' # tested component itself
7
7
  # require 'y_petri'
8
8
  # require 'sy'
9
9
 
10
- describe ::YPetri::Manipulator do
10
+ describe YPetri::Agent do
11
11
  before do
12
- @m = ::YPetri::Manipulator.new
12
+ @m = YPetri::Agent.new
13
13
  end
14
14
 
15
15
  it "has net basic points" do
16
16
  # --- net point related assets ---
17
17
  @m.net_point_reset
18
- @m.net_point_set @m.workspace.net( :Top )
19
- @m.net.must_equal @m.workspace.Net::Top
18
+ @m.net_point_reset @m.world.net( :Top )
19
+ @m.net.must_equal @m.world.Net::Top
20
20
  # --- simulation point related assets ---
21
21
  @m.simulation_point.reset
22
22
  @m.simulation.must_equal nil
@@ -24,19 +24,19 @@ describe ::YPetri::Manipulator do
24
24
  # --- cc point related assets ---
25
25
  @m.cc_point.reset
26
26
  @m.cc_point.set :Base
27
- @m.cc.must_equal @m.workspace.clamp_collection
27
+ @m.cc.must_equal @m.world.clamp_collection
28
28
  @m.cc.wont_equal :Base
29
29
  @m.cc_point.key.must_equal :Base
30
30
  # --- imc point related assets ---
31
31
  @m.imc_point.reset
32
32
  @m.imc_point.set :Base
33
- @m.imc.must_equal @m.workspace.initial_marking_collection
33
+ @m.imc.must_equal @m.world.initial_marking_collection
34
34
  @m.imc.wont_equal :Base
35
35
  @m.imc_point.key.must_equal :Base
36
36
  # --- ssc point related assets ---
37
37
  @m.ssc_point.reset
38
38
  @m.ssc_point.set :Base
39
- @m.ssc.must_equal @m.workspace.simulation_settings_collection
39
+ @m.ssc.must_equal @m.world.simulation_settings_collection
40
40
  @m.ssc.wont_equal :Base
41
41
  @m.ssc_point.key.must_equal :Base
42
42
  end
@@ -64,8 +64,8 @@ describe ::YPetri::Manipulator do
64
64
  @m.initial_marking_collections,
65
65
  @m.simulation_settings_collections ]
66
66
  .map( &:keys ).must_equal [[:Base]] * 3
67
- @m.pp.must_equal []
68
- @m.tt.must_equal []
67
+ @m.pn.must_equal []
68
+ @m.tn.must_equal []
69
69
  @m.nn.must_equal [ :Top ] # ie. :Top net spanning whole workspace
70
70
  end
71
71
 
@@ -84,15 +84,17 @@ describe ::YPetri::Manipulator do
84
84
 
85
85
  it "works" do
86
86
  @m.run!
87
- @m.simulation.places.must_equal [ @p, @q ]
88
- @m.simulation.transitions.must_equal [ @decay_t, @constant_flux_t ]
89
- @m.simulation.SR_tt.must_equal [ :Tp, :Tq ]
90
- @m.simulation.sparse_stoichiometry_vector( :Tp )
87
+ @m.simulation.send( :places ).map( &:source )
88
+ .must_equal [ @p, @q ]
89
+ @m.simulation.send( :transitions ).map( &:source )
90
+ .must_equal [ @decay_t, @constant_flux_t ]
91
+ @m.simulation.nTS.must_equal [ :Tp, :Tq ]
92
+ @m.simulation.send( :transition, :Tp ).sparse_stoichiometry_vector
91
93
  .must_equal Matrix.column_vector( [-1, 0] )
92
- @m.simulation.stoichiometry_matrix_for( @m.transitions ).column_size
93
- .must_equal 2
94
- @m.simulation.stoichiometry_matrix_for( @m.transitions ).row_size
95
- .must_equal 2
94
+ @m.simulation.send( :S_transitions )
95
+ .stoichiometry_matrix.column_size.must_equal 2
96
+ @m.simulation.send( :S_transitions )
97
+ .stoichiometry_matrix.row_size.must_equal 2
96
98
  @m.simulation.flux_vector.row_size.must_equal 2
97
99
  # @m.plot_recording
98
100
  end
File without changes
@@ -31,6 +31,7 @@ DeoxyU12P = Place m!: 0.0.µM
31
31
  DeoxyTMP = Place m!: 3.3.µM
32
32
  DeoxyT23P = Place m!: 5.0.µM
33
33
  Thymidine = Place m!: 0.5.µM
34
+
34
35
  TK1 = Place m!: 100_000.unit.( SY::MoleAmount ) / Cytoplasm_volume
35
36
  TYMS = Place m!: 100_000.unit.( SY::MoleAmount ) / Cytoplasm_volume
36
37
  RNR = Place m!: 100_000.unit.( SY::MoleAmount ) / Cytoplasm_volume
File without changes
File without changes
@@ -0,0 +1,16 @@
1
+ #encoding: utf-8
2
+
3
+ require 'y_petri'
4
+ include YPetri
5
+
6
+ A = Place( default_marking: 0.5 )
7
+ B = Place( default_marking: 0.5 )
8
+ A_pump = Transition( stoichiometry: { A: -1 }, rate: proc { 0.005 } )
9
+ B_decay = Transition( stoichiometry: { B: -1 }, rate: 0.05 )
10
+ net
11
+ run!
12
+ simulation
13
+ places.map &:marking
14
+ simulation.settings
15
+ print_recording
16
+ plot_state; nil
data/test/net_test.rb CHANGED
@@ -1,170 +1,175 @@
1
1
  #! /usr/bin/ruby
2
- # -*- coding: utf-8 -*-
2
+ # encoding: utf-8
3
3
 
4
4
  require 'minitest/spec'
5
5
  require 'minitest/autorun'
6
6
  require_relative '../lib/y_petri' # tested component itself
7
7
  # require 'y_petri'
8
8
  # require 'sy'
9
+ require_relative 'world_mock'
9
10
 
10
11
  describe YPetri::Net do
11
12
  before do
12
- @ = tç = Class.new YPetri::Transition
13
- @pç = pç = Class.new YPetri::Place
14
- @nç = nç = Class.new YPetri::Net
15
- [ tç, pç, nç ].each { |ç|
16
- ç.namespace!
17
- ç.class_exec {
18
- define_method :Place do pç end
19
- define_method :Transition do tç end
20
- define_method :Net do nç end
21
- private :Place, :Transition, :Net
22
- }
23
- }
24
- @p1 = pç.new ɴ: "A", quantum: 0.1, marking: 1.1
25
- @p2 = pç.new ɴ: "B", quantum: 0.1, marking: 2.2
26
- @p3 = pç.new ɴ: "C", quantum: 0.1, marking: 3.3
27
- @net = nç.new
28
- [@p1, @p2, @p3].each { |p| @net.include_place! p }
29
- @p_not_included = pç.new ɴ: "X", marking: 0
13
+ @w = YPetri::World.new
30
14
  end
31
15
 
32
- describe "net of 3 places and no transitions" do
33
- before do
34
- @p1.m = 1.1
35
- @p2.m = 2.2
36
- @p3.m = 3.3
37
- end
38
-
39
- it "should expose its elements" do
40
- assert_equal [@p1, @p2, @p3], @net.places
41
- assert_equal [:A, :B, :C], @net.pp
42
- assert_equal [], @net.transitions
43
- end
16
+ it "should initialize" do
17
+ net = @w.Net.new
18
+ net.places.must_equal []
19
+ net.transitions.must_equal []
20
+ net.pp.must_equal []
21
+ net.tt.must_equal []
22
+ end
44
23
 
45
- it "should expose transition groups" do
46
- assert_equal [], @net.transitions_with_rate
47
- assert_equal [], @net.rateless_transitions
48
- assert_equal [], @net.transitions_without_rate
49
- assert_equal [], @net.stoichiometric_transitions
50
- assert_equal [], @net.nonstoichiometric_transitions
24
+ describe "element access" do
25
+ before do
26
+ @net = @w.Net.new
51
27
  end
52
28
 
53
- it "should tell its qualities" do
54
- assert_equal true, @net.functional?
55
- assert_equal true, @net.timed?
56
- assert @net.include?( @p1 ) && !@net.include?( YPetri::Place.new )
29
+ it "should work" do
30
+ p = @w.Place.new name: "A", quantum: 0.1, marking: 1.1
31
+ @net.includes_place?( p ).must_equal false
32
+ @net.include_place p
33
+ @net.places.must_equal [ p ]
34
+ @net.place( :A ).must_equal p
35
+ @net.places( [] ).must_equal []
36
+ @net.places( [:A] ).must_equal [ p ]
57
37
  end
38
+ end
58
39
 
59
- it "should have 'standard equipment' methods" do
60
- assert @net == @net.dup
61
- assert @net.inspect.start_with? "#<Net:"
62
- assert @net.include?( @p1 )
63
- assert ! @net.include?( @p_not_included )
64
- begin
65
- @net.exclude_place! @p_not_included
66
- @net.include_transition! YPetri::Transition.new( s: { @p_not_included => -1 } )
67
- flunk "Attempt to include illegal transition fails to raise"
68
- rescue; end
40
+ describe "world with 3 places" do
41
+ before do
42
+ @p1 = @w.Place.new name: "A", quantum: 0.1, marking: 1.1
43
+ @p2 = @w.Place.new name: "B", quantum: 0.1, marking: 2.2
44
+ @p3 = @w.Place.new name: "C", quantum: 0.1, marking: 3.3
45
+ @p4 = @w.Place.new name: "X", marking: 0
69
46
  end
70
47
 
71
- describe "plus 1 stoichio. transition with rate" do
48
+ describe "net of 3 places and no transitions" do
72
49
  before do
73
- @t1 = @tç.new!( ɴ: "T1",
74
- s: { @p1 => 1, @p2 => -1, @p3 => -1 },
75
- rate: 0.01 )
76
- @net.include_transition! @t1
50
+ # @p1.m = 1.1
51
+ # @p2.m = 2.2
52
+ # @p3.m = 3.3
53
+ @net = @w.Net.of @p1, @p2, @p3
77
54
  end
78
55
 
79
56
  it "should expose its elements" do
80
- assert_equal [@t1], @net.transitions
81
- assert_equal [:T1], @net.tt
57
+ assert_equal [@p1, @p2, @p3], @net.places
58
+ assert_equal [:A, :B, :C], @net.pn
59
+ assert_equal [], @net.transitions
82
60
  end
83
61
 
84
62
  it "should expose transition groups" do
85
- assert_equal true, @t1.has_rate?
86
- assert_equal [@t1], @net.transitions_with_rate
87
- assert_equal [], @net.rateless_transitions
88
- assert_equal [@t1], @net.stoichiometric_transitions
89
- assert_equal [], @net.nonstoichiometric_transitions
63
+ assert_equal [], @net.S_transitions
64
+ assert_equal [], @net.s_transitions
90
65
  end
91
66
 
92
67
  it "should tell its qualities" do
93
68
  assert_equal true, @net.functional?
94
- assert_equal true, @net.timed?
95
- assert @net.include?( @t1 )
96
- end
97
-
98
- it "should have #place & #transition for safe access to the said elements" do
99
- @net.send( :place, @p1 ).must_equal @p1
100
- @net.send( :transition, @t1 ).must_equal @t1
69
+ assert_equal false, @net.timed?
70
+ assert @net.include?( @p1 ) && !@net.include?( YPetri::Place.new )
101
71
  end
102
72
 
103
- it "has #new_simulation & #new_timed_simulation constructors" do
104
- @net.must_respond_to :new_simulation
105
- @net.must_respond_to :new_timed_simulation
73
+ it "should have 'standard equipment' methods" do
74
+ assert @net == @net.dup
75
+ assert @net.inspect.start_with? "#<Net:"
76
+ assert @net.include?( @p1 )
77
+ assert ! @net.include?( @p_not_included )
78
+ begin
79
+ @net.exclude_place! @p_not_included
80
+ @net.include_transition! YPetri::Transition.new( s: { @p_not_included => -1 } )
81
+ flunk "Attempt to include illegal transition fails to raise"
82
+ rescue; end
106
83
  end
107
84
 
108
- it "should have other methods" do
109
- assert_equal [1.1, 2.2, 3.3], [@p1, @p2, @p3].map( &:marking ).map{ |n| n.round 6 }
110
- assert_equal 2.2 * 3.3 * 0.01, @t1.rate_closure.call( @p2.marking, @p3.marking )
111
- assert_equal [ @p2, @p3 ], @t1.domain
112
- @t1.fire! 1
113
- assert_equal [1.1726, 2.1274, 3.2274], [@p1, @p2, @p3].map( &:marking ).map{ |n| n.round 6 }
114
- end
115
-
116
- describe "plus 1 more nameless timeless functionless transition" do
85
+ describe "plus 1 stoichio. transition with rate" do
117
86
  before do
118
- @t2 = @tç.new s: { @p2 => -1, @p3 => 1 }
119
- @net.include_transition! @t2
87
+ @t1 = @w.Transition.avid( ɴ: "T1",
88
+ s: { @p1 => 1, @p2 => -1, @p3 => -1 },
89
+ rate: 0.01 )
90
+ @net.include_transition @t1
120
91
  end
121
92
 
122
93
  it "should expose its elements" do
123
- assert_equal [@t1, @t2], @net.transitions
124
- assert_equal [:T1, nil], @net.tt
125
- @net.tap{ |n| n.exclude_transition! @t1 }.exclude_transition! @t2
126
- @net.tap{ |n| n.exclude_place! @p3 }.pp.must_equal [:A, :B]
94
+ assert_equal [ @t1 ], @net.transitions
95
+ assert_equal [ :T1 ], @net.tn
96
+ @net.transition( :T1 ).must_equal @t1
97
+ @net.transitions( [] ).must_equal []
98
+ @net.transitions( [ :T1 ] ).must_equal [ @t1 ]
99
+ @net.element( :T1 ).must_equal @t1
100
+ @net.elements( [] ).must_equal []
101
+ @net.elements( [ :T1 ] ).must_equal [ @t1 ]
102
+ @net.elements( [ :A, :T1 ] ).must_equal [ @p1, @t1 ]
127
103
  end
128
104
 
129
105
  it "should expose transition groups" do
130
- assert_equal [], @net.timeless_nonstoichiometric_transitions
131
- assert_equal [], @net.timeless_nonstoichiometric_tt
132
- assert_equal [@t2], @net.timeless_stoichiometric_transitions
133
- assert_equal [nil], @net.timeless_stoichiometric_tt
134
- assert_equal [], @net.timed_nonstoichiometric_transitions_without_rate
135
- assert_equal [], @net.timed_rateless_nonstoichiometric_transitions
136
- assert_equal [], @net.timed_nonstoichiometric_tt_without_rate
137
- assert_equal [], @net.timed_rateless_nonstoichiometric_tt
138
- assert_equal [], @net.timed_nonstoichiometric_transitions_without_rate
139
- assert_equal [], @net.timed_rateless_nonstoichiometric_transitions
140
- assert_equal [], @net.timed_nonstoichiometric_tt_without_rate
141
- assert_equal [], @net.timed_rateless_nonstoichiometric_tt
142
- assert_equal [], @net.nonstoichiometric_transitions_with_rate
143
- assert_equal [], @net.nonstoichiometric_tt_with_rate
144
- assert_equal [@t1], @net.stoichiometric_transitions_with_rate
145
- assert_equal [:T1], @net.stoichiometric_tt_with_rate
146
- assert_equal [], @net.assignment_transitions
147
- assert_equal [], @net.assignment_tt
148
- assert_equal [@t1, @t2], @net.stoichiometric_transitions
149
- assert_equal [:T1, nil], @net.stoichiometric_tt
150
- assert_equal [], @net.nonstoichiometric_transitions
151
- assert_equal [], @net.nonstoichiometric_tt
152
- assert_equal [@t1], @net.timed_transitions
153
- assert_equal [:T1], @net.timed_tt
154
- assert_equal [@t2], @net.timeless_transitions
155
- assert_equal [nil], @net.timeless_tt
156
- assert_equal [@t1], @net.transitions_with_rate
157
- assert_equal [:T1], @net.tt_with_rate
158
- assert_equal [@t2], @net.rateless_transitions
159
- assert_equal [nil], @net.rateless_tt
106
+ assert_equal [@t1], @net.S_transitions
107
+ assert_equal [], @net.s_transitions
160
108
  end
161
109
 
162
110
  it "should tell its qualities" do
163
- assert_equal false, @net.functional?
164
- assert_equal false, @net.timed?
165
- @net.exclude_transition! @t2
166
111
  assert_equal true, @net.functional?
167
112
  assert_equal true, @net.timed?
113
+ assert @net.include?( @t1 )
114
+ end
115
+
116
+ it "should have #place & #transition for safe access to them" do
117
+ @net.send( :place, @p1 ).must_equal @p1
118
+ @net.send( :transition, @t1 ).must_equal @t1
119
+ @net.send( :element, @p1 ).must_equal @p1
120
+ end
121
+
122
+ it "has #new_simulation & #new_timed_simulation constructors" do
123
+ @net.must_respond_to :simulation
124
+ end
125
+
126
+ it "should have other methods" do
127
+ assert_equal [1.1, 2.2, 3.3], [@p1, @p2, @p3].map( &:marking ).map{ |n| n.round 6 }
128
+ assert_equal 2.2 * 3.3 * 0.01, @t1.rate_closure.call( @p2.marking, @p3.marking )
129
+ assert_equal [ @p2, @p3 ], @t1.domain
130
+ @t1.fire! 1
131
+ assert_equal [1.1726, 2.1274, 3.2274], [@p1, @p2, @p3].map( &:marking ).map{ |n| n.round 6 }
132
+ end
133
+
134
+ describe "plus 1 more nameless timeless functionless transition" do
135
+ before do
136
+ @t2 = @w.Transition.new s: { @p2 => -1, @p3 => 1 }
137
+ @net.include_transition @t2
138
+ end
139
+
140
+ it "should expose its elements" do
141
+ assert_equal [@t1, @t2], @net.transitions
142
+ assert_equal [:T1, nil], @net.tn
143
+ @net.tap{ |n| n.exclude_transition @t1 }.exclude_transition @t2
144
+ @net.tap{ |n| n.exclude_place @p3 }.pn.must_equal [:A, :B]
145
+ end
146
+
147
+ it "should expose transition groups" do
148
+ assert_equal [], @net.ts_transitions
149
+ assert_equal [], @net.nts
150
+ assert_equal [@t2], @net.tS_transitions
151
+ assert_equal [nil], @net.ntS
152
+ assert_equal [@t1], @net.TS_transitions
153
+ assert_equal [:T1], @net.nTS
154
+ assert_equal [], @net.A_transitions
155
+ assert_equal [], @net.nA
156
+ assert_equal [@t1, @t2], @net.S_transitions
157
+ assert_equal [:T1, nil], @net.nS
158
+ assert_equal [], @net.s_transitions
159
+ assert_equal [], @net.ns
160
+ assert_equal [@t1], @net.T_transitions
161
+ assert_equal [:T1], @net.nT
162
+ assert_equal [@t2], @net.t_transitions
163
+ assert_equal [nil], @net.nt
164
+ end
165
+
166
+ it "should tell its qualities" do
167
+ assert_equal false, @net.functional?
168
+ assert_equal true, @net.timed?
169
+ @net.exclude_transition @t2
170
+ assert_equal true, @net.functional?
171
+ assert_equal true, @net.timed?
172
+ end
168
173
  end
169
174
  end
170
175
  end
data/test/place_test.rb CHANGED
@@ -10,7 +10,7 @@ require_relative '../lib/y_petri' # tested component itself
10
10
  describe YPetri::Place do
11
11
  before do
12
12
  @pç = pç = Class.new YPetri::Place
13
- @p = pç.new! default_marking: 3.2,
13
+ @p = pç.avid default_marking: 3.2,
14
14
  marking: 1.1,
15
15
  quantum: 0.1,
16
16
  name: "P1"