y_petri 2.0.15 → 2.1.3

Sign up to get free protection for your applications and to get access to all the features.
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"