y_petri 2.1.9 → 2.1.10
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.
- checksums.yaml +4 -4
- data/lib/y_petri/agent/simulation_related.rb +58 -16
- data/lib/y_petri/net/data_set.rb +1 -1
- data/lib/y_petri/net/element_access.rb +1 -1
- data/lib/y_petri/net/state/feature/delta.rb +18 -4
- data/lib/y_petri/net/state/feature/firing.rb +10 -2
- data/lib/y_petri/net/state/feature/flux.rb +10 -2
- data/lib/y_petri/net/state/feature/gradient.rb +11 -3
- data/lib/y_petri/net/state/feature/marking.rb +7 -0
- data/lib/y_petri/net/state/feature.rb +6 -2
- data/lib/y_petri/net.rb +1 -1
- data/lib/y_petri/simulation/elements/access.rb +1 -1
- data/lib/y_petri/simulation/transition_representation/TS.rb +7 -7
- data/lib/y_petri/simulation/transitions/TS.rb +1 -1
- data/lib/y_petri/version.rb +1 -1
- data/lib/y_petri.rb +1 -1
- data/test/agent_test.rb +13 -4
- data/test/simulation_test.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1cac00b355a03f2d444b9a4937721d9ad895666d
|
4
|
+
data.tar.gz: 473f087960a3a4ed4b93cb2bef5262f0a4e8268e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c453dbdc36a679375cd5b0439a19ba12c0346847632997fd82c2bffca63827b41d4703454bdef91df863749ba1b933fa7b2987db7f9ec3c4ba8ae71559c5da8
|
7
|
+
data.tar.gz: d2e5603eb81a1633813beef6938fcccacf4eba4d7b1b8ce55ccda511763e1a414b1b5be671de54a3480add0d2f6a260d612aedafbb6a0943ca8330db1eb8fc80
|
@@ -280,26 +280,68 @@ module YPetri::Agent::SimulationRelated
|
|
280
280
|
title: "Selected features plot", ylabel: "Marking" )
|
281
281
|
end
|
282
282
|
|
283
|
-
# Plot
|
283
|
+
# Plot system state history.
|
284
284
|
#
|
285
|
-
def plot_state( place_ids=nil, except: []
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
dataset.plot
|
285
|
+
def plot_state( place_ids=nil, except: [],
|
286
|
+
title: "State plot", ylabel: "Marking [µM]",
|
287
|
+
**options )
|
288
|
+
rec = simulation.recording
|
289
|
+
pp = simulation.pp( place_ids ) - simulation.pp( except )
|
290
|
+
rec.marking( pp ).plot( title: title, ylabel: ylabel, **options )
|
292
291
|
end
|
293
292
|
alias plot_marking plot_state
|
294
293
|
|
295
|
-
# Plot
|
294
|
+
# Plot flux history of TS transitions.
|
296
295
|
#
|
297
|
-
def plot_flux( transition_ids=nil, except: [],
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
296
|
+
def plot_flux( transition_ids=nil, except: [],
|
297
|
+
title: "Flux plot", ylabel: "Flux [µM.s⁻¹]",
|
298
|
+
**options )
|
299
|
+
rec = simulation.recording
|
300
|
+
tt = transition_ids.nil? ? simulation.TS_tt : transition_ids
|
301
|
+
tt = simulation.TS_tt( tt )
|
302
|
+
tt -= simulation.tt( except )
|
303
|
+
rec.flux( tt ).plot( title: title, ylabel: ylabel, **options )
|
304
|
+
end
|
305
|
+
|
306
|
+
# Plot firing history of tS transitions.
|
307
|
+
#
|
308
|
+
def plot_firing( transition_ids=nil, except: [],
|
309
|
+
title: "Firing plot", ylabel: "Firing [µM]",
|
310
|
+
**options )
|
311
|
+
rec = simulation.recording
|
312
|
+
tt = transition_ids.nil? ? simulation.tS_tt : transition_ids
|
313
|
+
tt = simulation.tS_tt( tt )
|
314
|
+
tt -= simulation.tt( except )
|
315
|
+
rec.firing( tt ).plot( title: title, ylabel: ylabel, **options )
|
316
|
+
end
|
317
|
+
|
318
|
+
# Plot gradient history of selected places with respect to a set of T
|
319
|
+
# transitions.
|
320
|
+
#
|
321
|
+
def plot_gradient( place_ids=nil, except: [], transitions: nil,
|
322
|
+
title: "Gradient plot", ylabel: "Gradient [µM.s⁻¹]",
|
323
|
+
**options )
|
324
|
+
rec = simulation.recording
|
325
|
+
pp = simulation.pp( place_ids ) - simulation.ee( place_ids )
|
326
|
+
tt = transitions.nil? ? simulation.T_tt : transitions
|
327
|
+
tt = simulation.T_tt( tt )
|
328
|
+
tt -= simulation.ee( except )
|
329
|
+
rec.gradient( pp, transitions: tt )
|
330
|
+
.plot( title: title, ylabel: ylabel, **options )
|
331
|
+
end
|
332
|
+
|
333
|
+
# Plot delta history of selected places with respect to a set of transitions.
|
334
|
+
#
|
335
|
+
def plot_delta( place_ids=nil, except: [], transitions: nil,
|
336
|
+
title: "Delta plot", ylabel: "Delta [µM]",
|
337
|
+
**options )
|
338
|
+
options.may_have :delta_time, syn!: :Δt
|
339
|
+
rec = simulation.recording
|
340
|
+
pp = simulation.pp( place_ids ) - simulation.ee( except )
|
341
|
+
tt = transitions.nil? ? simulation.tt : tranisitions
|
342
|
+
tt = simulation.tt( tt )
|
343
|
+
tt -= simulation.ee( except )
|
344
|
+
rec.delta( pp, transitions: tt, delta_time: options[:delta_time] )
|
345
|
+
.plot( title: title, ylabel: ylabel, **options )
|
304
346
|
end
|
305
347
|
end # module YPetri::Agent::SimulationRelated
|
data/lib/y_petri/net/data_set.rb
CHANGED
@@ -11,12 +11,12 @@ class YPetri::Net::State::Feature::Delta < YPetri::Net::State::Feature
|
|
11
11
|
# First, prepare the hash of instances.
|
12
12
|
hsh = Hash.new do |ꜧ, id|
|
13
13
|
if id.is_a? self then # missing key "id" is a Delta instance
|
14
|
-
ꜧ[ [ id.place, transitions: id.transitions.
|
14
|
+
ꜧ[ [ id.place, transitions: id.transitions.sort_by( &:object_id ) ] ]
|
15
15
|
else
|
16
16
|
p = id.fetch( 0 )
|
17
17
|
tt = id.fetch( 1 ).fetch( :transitions ) # value of :transitions key
|
18
18
|
if p.is_a? ç.net.Place and tt.all? { |t| t.is_a? ç.net.Transition }
|
19
|
-
if tt == tt.
|
19
|
+
if tt == tt.sort_by( &:object_id ) then
|
20
20
|
# Cache the instance.
|
21
21
|
ꜧ[ id ] = if tt.all? &:timed? then
|
22
22
|
ç.timed( *id )
|
@@ -28,7 +28,7 @@ class YPetri::Net::State::Feature::Delta < YPetri::Net::State::Feature
|
|
28
28
|
"all timed, or all timeless!"
|
29
29
|
end
|
30
30
|
else
|
31
|
-
ꜧ[ [ p, transitions: tt.
|
31
|
+
ꜧ[ [ p, transitions: tt.sort_by( &:object_id ) ] ]
|
32
32
|
end
|
33
33
|
else # convert place and transition ids to places and transitions
|
34
34
|
ꜧ[ [ ç.net.place( p ), transitions: ç.net.transitions( tt ) ] ]
|
@@ -48,7 +48,14 @@ class YPetri::Net::State::Feature::Delta < YPetri::Net::State::Feature
|
|
48
48
|
# transition identifiers supplied as +:transitions: parameter.
|
49
49
|
#
|
50
50
|
def timed place, transitions: net.T_tt
|
51
|
-
|
51
|
+
tt = begin
|
52
|
+
net.T_tt( transitions )
|
53
|
+
rescue TypeError => err
|
54
|
+
msg = "Transitions #{transitions} not recognized as timed " +
|
55
|
+
"transitions in #{net}! (%s)"
|
56
|
+
raise TypeError, msg % err
|
57
|
+
end
|
58
|
+
__new__( place, transitions: tt )
|
52
59
|
.tap { |inst| inst.instance_variable_set :@timed, true }
|
53
60
|
end
|
54
61
|
|
@@ -56,6 +63,13 @@ class YPetri::Net::State::Feature::Delta < YPetri::Net::State::Feature
|
|
56
63
|
# timeless transition identifiers as +:transitions: parameter.
|
57
64
|
#
|
58
65
|
def timeless place, transitions: net.t_tt
|
66
|
+
tt = begin
|
67
|
+
net.t_tt( transitions )
|
68
|
+
rescue TypeError => err
|
69
|
+
msg = "Transitions #{transitions} not recognized as timed " +
|
70
|
+
"transitions in #{net}! (%s)"
|
71
|
+
raise TypeError, msg % err
|
72
|
+
end
|
59
73
|
__new__( place, transitions: net.t_tt( transitions ) )
|
60
74
|
.tap { |inst| inst.instance_variable_set :@timed, false }
|
61
75
|
end
|
@@ -14,7 +14,15 @@ class YPetri::Net::State::Feature::Firing < YPetri::Net::State::Feature
|
|
14
14
|
when self then
|
15
15
|
hsh[ id.transition ]
|
16
16
|
when ç.net.Transition then
|
17
|
-
|
17
|
+
t = begin
|
18
|
+
ç.net.tS_transitions( [ id ] ).first
|
19
|
+
rescue TypeError => err
|
20
|
+
msg = "Transition #{id} not " +
|
21
|
+
"recognized as tS transition in " +
|
22
|
+
"net #{ç.net}! (%s)"
|
23
|
+
raise TypeError, msg % err
|
24
|
+
end
|
25
|
+
hsh[ id ] = ç.__new__( t )
|
18
26
|
else
|
19
27
|
hsh[ ç.net.transition( id ) ]
|
20
28
|
end
|
@@ -42,7 +50,7 @@ class YPetri::Net::State::Feature::Firing < YPetri::Net::State::Feature
|
|
42
50
|
def extract_from arg, **nn
|
43
51
|
case arg
|
44
52
|
when YPetri::Simulation then
|
45
|
-
arg.send( :tS_transitions, [ transition ] ).firing
|
53
|
+
arg.send( :tS_transitions, [ transition ] ).first.firing
|
46
54
|
else
|
47
55
|
fail TypeError, "Argument type not supported!"
|
48
56
|
end
|
@@ -14,7 +14,15 @@ class YPetri::Net::State::Feature::Flux < YPetri::Net::State::Feature
|
|
14
14
|
when self then
|
15
15
|
hsh[ id.transition ]
|
16
16
|
when ç.net.Transition then
|
17
|
-
|
17
|
+
t = begin
|
18
|
+
ç.net.TS_transitions( [ id ] ).first
|
19
|
+
rescue TypeError => err
|
20
|
+
msg = "Transition #{id} not " +
|
21
|
+
"recognized as TS transition in " +
|
22
|
+
"net #{ç.net}! (%s)"
|
23
|
+
raise TypeError, msg % err
|
24
|
+
end
|
25
|
+
hsh[ id ] = ç.__new__( t )
|
18
26
|
else
|
19
27
|
hsh[ ç.net.transition( id ) ]
|
20
28
|
end
|
@@ -42,7 +50,7 @@ class YPetri::Net::State::Feature::Flux < YPetri::Net::State::Feature
|
|
42
50
|
def extract_from arg, **nn
|
43
51
|
case arg
|
44
52
|
when YPetri::Simulation then
|
45
|
-
arg.send( :TS_transitions, [ transition ] ).flux
|
53
|
+
arg.send( :TS_transitions, [ transition ] ).first.flux
|
46
54
|
else
|
47
55
|
fail TypeError, "Argument type not supported!"
|
48
56
|
end
|
@@ -11,17 +11,25 @@ class YPetri::Net::State::Feature::Gradient < YPetri::Net::State::Feature
|
|
11
11
|
# First, prepare the hash of instances.
|
12
12
|
hsh = Hash.new do |ꜧ, id|
|
13
13
|
if id.is_a? self then
|
14
|
-
ꜧ[ [ id.place, transitions: id.transitions.
|
14
|
+
ꜧ[ [ id.place, transitions: id.transitions.sort_by( &:object_id ) ] ]
|
15
15
|
else
|
16
16
|
p = id.fetch( 0 )
|
17
17
|
tt = id
|
18
18
|
.fetch( 1 )
|
19
19
|
.fetch( :transitions )
|
20
20
|
if p.is_a? ç.net.Place and tt.all? { |t| t.is_a? ç.net.Transition }
|
21
|
-
|
21
|
+
tt_sorted = tt.sort_by &:object_id
|
22
|
+
if tt == tt_sorted then
|
23
|
+
tt = begin
|
24
|
+
ç.net.T_transitions( tt )
|
25
|
+
rescue TypeError => err
|
26
|
+
msg = "Transitions #{tt} not recognized as T " +
|
27
|
+
"transitions in net #{ç.net}! (%s)"
|
28
|
+
raise TypeError, msg % err
|
29
|
+
end
|
22
30
|
ꜧ[ id ] = ç.__new__( *id )
|
23
31
|
else
|
24
|
-
ꜧ[ [ p, transitions: tt.
|
32
|
+
ꜧ[ [ p, transitions: tt.sort_by( &:object_id ) ] ]
|
25
33
|
end
|
26
34
|
else
|
27
35
|
ꜧ[ [ ç.net.place( p ), transitions: ç.net.transitions( tt ) ] ]
|
@@ -14,6 +14,13 @@ class YPetri::Net::State::Feature::Marking < YPetri::Net::State::Feature
|
|
14
14
|
when self then
|
15
15
|
hsh[ id.place ]
|
16
16
|
when ç.net.Place then
|
17
|
+
p = begin
|
18
|
+
ç.net.place id
|
19
|
+
rescue TypeError => err
|
20
|
+
msg = "Place #{id} not recognized " +
|
21
|
+
"a place in net #{ç.net}! (%s)"
|
22
|
+
raise TypeError, msg % err
|
23
|
+
end
|
17
24
|
hsh[ id ] = ç.__new__( id )
|
18
25
|
else
|
19
26
|
hsh[ ç.net.place( id ) ]
|
@@ -49,7 +49,9 @@ class YPetri::Net::State::Feature
|
|
49
49
|
when Gradient() then id
|
50
50
|
when Gradient then
|
51
51
|
Gradient().of( id.place, transitions: id.transitions )
|
52
|
-
else
|
52
|
+
else
|
53
|
+
Gradient().of( id, transitions: transitions )
|
54
|
+
end # assume it's a place
|
53
55
|
end
|
54
56
|
|
55
57
|
def Flux id=L!
|
@@ -57,7 +59,9 @@ class YPetri::Net::State::Feature
|
|
57
59
|
case id
|
58
60
|
when Flux() then id
|
59
61
|
when Flux then Flux().of( id.transition )
|
60
|
-
else
|
62
|
+
else
|
63
|
+
Flux().of( id )
|
64
|
+
end # assume it's a place
|
61
65
|
end
|
62
66
|
|
63
67
|
def Delta id=L!, transitions: net.tt
|
data/lib/y_petri/net.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#encoding: utf-8
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
# A mixin for TS transition representations.
|
4
4
|
#
|
@@ -6,16 +6,16 @@ class YPetri::Simulation::TransitionRepresentation
|
|
6
6
|
module Type_TS
|
7
7
|
include Type_T
|
8
8
|
include Type_S
|
9
|
-
|
9
|
+
|
10
10
|
attr_reader :rate_closure
|
11
|
-
|
11
|
+
|
12
12
|
# Initialization subroutine.
|
13
13
|
#
|
14
14
|
def init
|
15
15
|
super
|
16
16
|
@rate_closure = to_rate_closure
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
# Transition's rate, given the current system state.
|
20
20
|
#
|
21
21
|
def rate
|
@@ -23,20 +23,20 @@ class YPetri::Simulation::TransitionRepresentation
|
|
23
23
|
end
|
24
24
|
alias flux rate
|
25
25
|
alias propensity rate
|
26
|
-
|
26
|
+
|
27
27
|
# Firing of the transition (rate * Δtime).
|
28
28
|
#
|
29
29
|
def firing Δt
|
30
30
|
rate * Δt
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
# Gradient contribution of the transition to all places.
|
34
34
|
#
|
35
35
|
def ∇
|
36
36
|
codomain >> stoichiometry.map { |coeff| rate * coeff }
|
37
37
|
end
|
38
38
|
alias gradient_all ∇
|
39
|
-
|
39
|
+
|
40
40
|
# Builds a flux closure.
|
41
41
|
#
|
42
42
|
def to_rate_closure
|
data/lib/y_petri/version.rb
CHANGED
data/lib/y_petri.rb
CHANGED
data/test/agent_test.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#! /usr/bin/ruby
|
2
|
-
#
|
2
|
+
# encoding: utf-8
|
3
3
|
|
4
4
|
gem 'minitest', '=4.7.4'
|
5
5
|
require 'minitest/autorun'
|
@@ -11,7 +11,7 @@ describe YPetri::Agent do
|
|
11
11
|
before do
|
12
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
|
@@ -68,7 +68,7 @@ describe YPetri::Agent do
|
|
68
68
|
@m.tn.must_equal []
|
69
69
|
@m.nn.must_equal [ :Top ] # ie. :Top net spanning whole workspace
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
describe "slightly more complicated case" do
|
73
73
|
before do
|
74
74
|
@p = @m.Place ɴ: "P", default_marking: 1
|
@@ -81,7 +81,7 @@ describe YPetri::Agent do
|
|
81
81
|
@m.set_sampling 1
|
82
82
|
@m.set_time 0..30
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
it "works" do
|
86
86
|
@m.run!
|
87
87
|
@m.simulation.send( :places ).map( &:source )
|
@@ -97,6 +97,15 @@ describe YPetri::Agent do
|
|
97
97
|
.stoichiometry_matrix.row_size.must_equal 2
|
98
98
|
@m.simulation.flux_vector.row_size.must_equal 2
|
99
99
|
# @m.plot_recording
|
100
|
+
rec = @m.simulation.recording
|
101
|
+
rec.marking.plot
|
102
|
+
rec.flux.plot
|
103
|
+
rec.gradient.plot
|
104
|
+
rec.delta( Δt: 1 ).plot
|
105
|
+
@m.plot_marking
|
106
|
+
@m.plot_flux
|
107
|
+
@m.plot_gradient
|
108
|
+
@m.plot_delta( Δt: 1 )
|
100
109
|
end
|
101
110
|
end
|
102
111
|
end
|
data/test/simulation_test.rb
CHANGED
@@ -288,9 +288,9 @@ describe "timeless simulation" do
|
|
288
288
|
ds.firing.slice( 1..2 ).series
|
289
289
|
.must_equal [[1, 1]]
|
290
290
|
ds.series( firing: [:U2V] )
|
291
|
-
.must_equal [[1, 1, 1, 1, 1, 1]]
|
291
|
+
.must_equal [ [ 1, 1, 1, 1, 1, 1 ] ]
|
292
292
|
ds.delta( [:U], transitions: [:Uplus] ).series
|
293
|
-
.must_equal [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0]]
|
293
|
+
.must_equal [ [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ]
|
294
294
|
tmp = ds.reduce_features( marking: [:U], firing: [:U2V] )
|
295
295
|
tmp.features
|
296
296
|
.must_equal( ds.net.State.features marking: [:U], firing: [:U2V] )
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: y_petri
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- boris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-08-
|
11
|
+
date: 2013-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: y_support
|