y_nelson 2.3.7 → 2.3.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3593 +0,0 @@
1
- #LyX 2.1 created this file. For more info see http://www.lyx.org/
2
- \lyxformat 474
3
- \begin_document
4
- \begin_header
5
- \textclass article
6
- \use_default_options false
7
- \maintain_unincluded_children false
8
- \language english
9
- \language_package default
10
- \inputencoding auto
11
- \fontencoding global
12
- \font_roman default
13
- \font_sans default
14
- \font_typewriter default
15
- \font_math auto
16
- \font_default_family default
17
- \use_non_tex_fonts false
18
- \font_sc false
19
- \font_osf false
20
- \font_sf_scale 100
21
- \font_tt_scale 100
22
- \graphics default
23
- \default_output_format default
24
- \output_sync 0
25
- \bibtex_command default
26
- \index_command default
27
- \paperfontsize default
28
- \spacing single
29
- \use_hyperref false
30
- \papersize default
31
- \use_geometry true
32
- \use_package amsmath 1
33
- \use_package amssymb 1
34
- \use_package cancel 1
35
- \use_package esint 1
36
- \use_package mathdots 1
37
- \use_package mathtools 1
38
- \use_package mhchem 1
39
- \use_package stackrel 1
40
- \use_package stmaryrd 1
41
- \use_package undertilde 1
42
- \cite_engine natbib
43
- \cite_engine_type authoryear
44
- \biblio_style plainnat
45
- \use_bibtopic false
46
- \use_indices false
47
- \paperorientation portrait
48
- \suppress_date false
49
- \justification true
50
- \use_refstyle 0
51
- \index Index
52
- \shortcut idx
53
- \color #008000
54
- \end_index
55
- \leftmargin 2.2cm
56
- \topmargin 3cm
57
- \rightmargin 2.2cm
58
- \bottommargin 3cm
59
- \secnumdepth 3
60
- \tocdepth 3
61
- \paragraph_separation indent
62
- \paragraph_indentation default
63
- \quotes_language english
64
- \papercolumns 1
65
- \papersides 1
66
- \paperpagestyle default
67
- \tracking_changes false
68
- \output_changes false
69
- \html_math_output 0
70
- \html_css_as_file 0
71
- \html_be_strict false
72
- \end_header
73
-
74
- \begin_body
75
-
76
- \begin_layout Title
77
- Introduction to YNelson and YPetri (hands-on tutorial)
78
- \end_layout
79
-
80
- \begin_layout Part*
81
- Introduction
82
- \end_layout
83
-
84
- \begin_layout Standard
85
- This document is a hands-on guide to
86
- \family typewriter
87
- \color blue
88
- YPetri
89
- \family default
90
- \color inherit
91
- ,
92
- \family typewriter
93
- \color blue
94
- YNelson
95
- \family default
96
- \color inherit
97
- and
98
- \emph on
99
- \color green
100
- Nelson nets
101
- \emph default
102
- \color inherit
103
- , which in turn rely on
104
- \color red
105
- Ruby
106
- \color inherit
107
- language.
108
- It is not assumed you are familiar with Ruby, you can follow this guide
109
- even if you never heard about it (but you will have to install it).
110
- You more than likely never heard about Nelson nets.
111
- Nelson net is a novel concept of
112
- \emph on
113
- \color green
114
- Petri nets
115
- \emph default
116
- \color inherit
117
- crossed with Ted Nelson's
118
- \emph on
119
- \color green
120
- ZZ structures
121
- \emph default
122
- \color inherit
123
- .
124
- Do not worry about them: just follow the guide and you will learn everything
125
- in time.
126
- The text of this guide lets you know when new keywords and are introduced.
127
- When mentioned for the first time,
128
- \color red
129
- Ruby keywords and terms
130
- \color inherit
131
- are highlighted in red,
132
- \color green
133
- Petri net terms
134
- \color inherit
135
- in green, and
136
- \family typewriter
137
- \color blue
138
- YPetri / YNelson
139
- \family default
140
- keywords and terms
141
- \color inherit
142
- in blue throughout this document.
143
- \end_layout
144
-
145
- \begin_layout Standard
146
-
147
- \family typewriter
148
- \color blue
149
- YNelson
150
- \family default
151
- \color inherit
152
- serves to specify and simulate Nelson nets, a derivative of
153
- \emph on
154
- \color green
155
- functional
156
- \emph default
157
-
158
- \emph on
159
- Petri nets
160
- \emph default
161
- \color inherit
162
- that live in
163
- \emph on
164
- \color green
165
- ZZ space
166
- \emph default
167
- \color inherit
168
- .
169
- (You don't need to worry about ZZ space yet.)
170
- \family typewriter
171
- \color blue
172
- YPetri
173
- \family default
174
- \color inherit
175
- serves to specify and simulate Petri nets.
176
- Petri nets are one of the basic formalisms in systems simulation.
177
- I designed
178
- \family typewriter
179
- YPetri
180
- \family default
181
- and
182
- \family typewriter
183
- YNelson
184
- \family default
185
- because I needed to specify biochemical systems and I believed a Ruby DSL
186
- would be ideal for that task.
187
- Use of Petri nets for specifying biochemical systems is reviewed eg.
188
- in
189
- \begin_inset CommandInset citation
190
- LatexCommand citet
191
- key "Bos2008mbs"
192
-
193
- \end_inset
194
-
195
- and
196
- \begin_inset CommandInset citation
197
- LatexCommand citet
198
- key "Koch2015pns"
199
-
200
- \end_inset
201
-
202
- .
203
-
204
- \family typewriter
205
- YPetri
206
- \family default
207
- provides a universal Petri net abstraction similar, but not identical with
208
-
209
- \emph on
210
- \color green
211
- hybrid functional Petri net (HFPN)
212
- \emph default
213
- \color inherit
214
- introduced by
215
- \begin_inset CommandInset citation
216
- LatexCommand citet
217
- key "Matsuno2011brs"
218
-
219
- \end_inset
220
-
221
- .
222
-
223
- \family typewriter
224
- YPetri
225
- \family default
226
- /
227
- \family typewriter
228
- YNelson
229
- \family default
230
- serve equally well not just for biochemical systems, but for arbitrary
231
- dynamical systems.
232
- \end_layout
233
-
234
- \begin_layout Standard
235
- Finally, please forgive me for taking your time with this guide.
236
- If you want to seriously work with
237
- \emph on
238
- complicated
239
- \emph default
240
- Petri Nets, no tool can avoid taking you through the process of learning
241
- the language and the tool's interface.
242
- Visual Petri net modelling tools are nice for simple tasks, such as drawing
243
- arcs between places and transitions, but you need text anyway to write
244
- the mathematical functions that govern firing of transitions.
245
-
246
- \family typewriter
247
- YPetri
248
- \family default
249
- /
250
- \family typewriter
251
- YNelson
252
- \family default
253
- are all textual without commiting the sin of introducing a new programming
254
- language.
255
- They are implemented as
256
- \emph on
257
- \color red
258
- internal domain-specific languages (DSL)
259
- \emph default
260
- \color inherit
261
- using Ruby as a host language.
262
- You can run them interactively from
263
- \color red
264
- Ruby interpreter (
265
- \emph on
266
- irb
267
- \emph default
268
- )
269
- \color inherit
270
- .
271
- In this way, you can freely use the host language to automate your interaction
272
- with Petri nets.
273
- \end_layout
274
-
275
- \begin_layout Standard
276
-
277
- \family typewriter
278
- YPetri
279
- \family default
280
- /
281
- \family typewriter
282
- YNelson
283
- \family default
284
- are publicly available as
285
- \emph on
286
- \color blue
287
-
288
- \begin_inset CommandInset href
289
- LatexCommand href
290
- name "y_petri"
291
- target "https://rubygems.org/gems/y_petri"
292
-
293
- \end_inset
294
-
295
-
296
- \emph default
297
- \color inherit
298
- and
299
- \emph on
300
- \color blue
301
-
302
- \begin_inset CommandInset href
303
- LatexCommand href
304
- name "y_nelson gem"
305
- target "https://rubygems.org/gems/y_nelson"
306
-
307
- \end_inset
308
-
309
-
310
- \emph default
311
- \color inherit
312
- gems (
313
- \emph on
314
- \color red
315
- gem
316
- \emph default
317
- \color inherit
318
- = Ruby library).
319
-
320
- \family typewriter
321
- YNelson
322
- \family default
323
- depends on
324
- \family typewriter
325
- YPetri
326
- \family default
327
- and
328
- \family typewriter
329
- Yzz
330
- \family default
331
- gems, which in turn depend on our
332
- \family typewriter
333
- YSupport
334
- \family default
335
- gem.
336
- Splitting the more general concerns to multiple gem is a desirable feature
337
- – separation of concerns is a maxim of good software engineering.
338
- I also separated dealing with physical units in your models out into
339
- \family typewriter
340
- SY
341
- \family default
342
- gem (
343
- \emph on
344
- \color blue
345
-
346
- \begin_inset CommandInset href
347
- LatexCommand href
348
- name "sy"
349
- target "https://rubygems.org/gems/sy"
350
-
351
- \end_inset
352
-
353
-
354
- \emph default
355
- \color inherit
356
- ).
357
- \end_layout
358
-
359
- \begin_layout Part*
360
- Using This Guide, or
361
- \begin_inset Quotes eld
362
- \end_inset
363
-
364
- The Hard Way Is Easier
365
- \begin_inset Quotes erd
366
- \end_inset
367
-
368
-
369
- \end_layout
370
-
371
- \begin_layout Standard
372
- The phrase above is borrowed from the textbook by Zed Shaw named
373
- \begin_inset Quotes eld
374
- \end_inset
375
-
376
- Learn Ruby the Hard Way
377
- \begin_inset Quotes erd
378
- \end_inset
379
-
380
- (highly recommended,
381
- \emph on
382
- \color magenta
383
-
384
- \begin_inset CommandInset href
385
- LatexCommand href
386
- name "hyperlink here"
387
- target "http://ruby.learncodethehardway.org/"
388
-
389
- \end_inset
390
-
391
-
392
- \emph default
393
- \color inherit
394
- ).
395
- Apart from being a great shark-jumper, Zed is a great teacher familiar
396
- with many programming languages, and I will borrow his teaching method
397
- here.
398
- Citing Zed,
399
- \begin_inset Quotes eld
400
- \end_inset
401
-
402
- The title says it's the hard way...
403
- but actually it's not.
404
- \begin_inset Quotes erd
405
- \end_inset
406
-
407
- It's only
408
- \begin_inset Quotes eld
409
- \end_inset
410
-
411
- hard
412
- \begin_inset Quotes erd
413
- \end_inset
414
-
415
- because of the way people
416
- \emph on
417
- used
418
- \emph default
419
- to teach things.
420
-
421
- \family typewriter
422
- YNelson
423
- \family default
424
- is a language.
425
- To learn it and see its usefulness, you will still need to do the incredibly
426
- simple things that all language learners do:
427
- \end_layout
428
-
429
- \begin_layout Enumerate
430
- Go through each example.
431
- \end_layout
432
-
433
- \begin_layout Enumerate
434
- Type each sample code exactly.
435
- \end_layout
436
-
437
- \begin_layout Enumerate
438
- Make it run.
439
- \end_layout
440
-
441
- \begin_layout Standard
442
- \noindent
443
- That's it.
444
- This might feel
445
- \emph on
446
- very
447
- \emph default
448
- difficult at first, but stick with it.
449
- It seems stupidly obvious, but if you have a problem installing
450
- \family typewriter
451
- YPetri
452
- \family default
453
- and
454
- \family typewriter
455
- YNelson
456
- \family default
457
- , running
458
- \emph on
459
- irb
460
- \emph default
461
- and typing, you will have a problem learning.
462
- If you go through this document without actually doing the exercises, you
463
- might as well just not even read it.
464
- Do not skip and do not skim.
465
- By typing each example
466
- \emph on
467
- exactly
468
- \emph default
469
- , you will be training your brain to focus on the details of what you are
470
- doing, as you are doing it.
471
- While you do these examples, typing each one in, you will be making mistakes.
472
- It's inevitable; humans do make mistakes.
473
- By doing so, you will train yourself to notice mistakes and other problems.
474
- Do not copy-paste.
475
- Type each code sample in, manually.
476
- The point is to train your hands, your brain, and your mind in how to read,
477
- write and see Ruby and
478
- \family typewriter
479
- YNelson
480
- \family default
481
- code.
482
- If you skip, skim and copy-paste, you are cheating yourself out of the
483
- effectiveness of this guide.
484
- \end_layout
485
-
486
- \begin_layout Part*
487
- Prerequisites
488
- \end_layout
489
-
490
- \begin_layout Standard
491
- Firstly, you will need a working installation of Ruby 2.3 or later on your
492
- computer.
493
- Once this condition is met, basic
494
- \family typewriter
495
- YNelson
496
- \family default
497
- installation is as simple as typing
498
- \begin_inset Quotes eld
499
- \end_inset
500
-
501
-
502
- \family typewriter
503
- gem install y_nelson
504
- \family default
505
-
506
- \begin_inset Quotes erd
507
- \end_inset
508
-
509
- in the command prompt.
510
- This will install most other dependencies, such as
511
- \family typewriter
512
- YPetri
513
- \family default
514
- .
515
- However,
516
- \family typewriter
517
- YNelson
518
- \family default
519
- currently uses dependencies (gnuplot gem, graphviz gem...), whose installation
520
- may pose challenges.
521
- Once
522
- \family typewriter
523
- YNelson
524
- \family default
525
- is installed, run
526
- \emph on
527
- irb
528
- \emph default
529
- command interpreter, and type:
530
- \end_layout
531
-
532
- \begin_layout LyX-Code
533
-
534
- \color red
535
- require
536
- \color inherit
537
- 'y_nelson' and
538
- \color red
539
- include
540
- \color inherit
541
- YNelson
542
- \end_layout
543
-
544
- \begin_layout Standard
545
- This will augment your irb command session with interactive
546
- \family typewriter
547
- YNelson
548
- \family default
549
- command interface (
550
- \family typewriter
551
- YNelson
552
- \family default
553
- DSL CI).
554
- You may also choose to work only with
555
- \family typewriter
556
- YPetri
557
- \family default
558
- alone, in which case the require line is:
559
- \end_layout
560
-
561
- \begin_layout LyX-Code
562
-
563
- \color red
564
- require
565
- \color inherit
566
- 'y_petri' and
567
- \color red
568
- include
569
- \color inherit
570
- YPetri
571
- \end_layout
572
-
573
- \begin_layout Standard
574
- You have to re-run
575
- \emph on
576
- irb
577
- \emph default
578
- from the scratch, and re-type '
579
- \family typewriter
580
- require
581
- \family default
582
- ' and '
583
- \family typewriter
584
- include
585
- \family default
586
- ' statements before each of the usage examples written below.
587
- The nucleotide metabolism model in Example 3 is not realiscit (its kinetics
588
- is not precise).
589
- If something in this guide does not work, please do not hesitate to notify
590
- me, I will appreciate your feedback.
591
- \end_layout
592
-
593
- \begin_layout Part*
594
- Example I: Basics
595
- \end_layout
596
-
597
- \begin_layout Standard
598
- This example is a gentle introduction to Petri net terminology,
599
- \family typewriter
600
- YNelson
601
- \family default
602
- DSL terminology, and Ruby syntax.
603
- The most basic capability that
604
- \family typewriter
605
- YNelson
606
- \family default
607
- offers, is that of user-driven
608
- \emph on
609
- \color green
610
- token game
611
- \emph default
612
- \color inherit
613
- .
614
- We will thus create a small Petri net containing 2
615
- \emph on
616
- \color green
617
- places
618
- \emph default
619
- \color inherit
620
- and play token game with it.
621
- \end_layout
622
-
623
- \begin_layout Subsection*
624
- Places
625
- \end_layout
626
-
627
- \begin_layout Standard
628
- Type:
629
- \end_layout
630
-
631
- \begin_layout LyX-Code
632
- A =
633
- \color blue
634
- Place
635
- \color inherit
636
- ( marking: 2 )
637
- \end_layout
638
-
639
- \begin_layout Standard
640
- Syntactically, this will call
641
- \emph on
642
- \color red
643
- method
644
- \emph default
645
- \color inherit
646
- '
647
- \family typewriter
648
- Place
649
- \family default
650
- ' of
651
- \family typewriter
652
- YNelson
653
- \family default
654
- DSL and assign its
655
- \emph on
656
- \color red
657
- return value
658
- \emph default
659
- \color inherit
660
- to the
661
- \emph on
662
- \color red
663
- constant
664
- \emph default
665
- \color inherit
666
-
667
- \family typewriter
668
- A
669
- \family default
670
- .
671
- In this case, the method is called with a single
672
- \emph on
673
- \color red
674
- argument
675
- \emph default
676
- \color inherit
677
- ,
678
- \family typewriter
679
- marking
680
- \family default
681
- .
682
- The return value is an
683
- \emph on
684
- \color red
685
- object
686
- \emph default
687
- \color inherit
688
- , which is an
689
- \emph on
690
- \color red
691
- instance
692
- \emph default
693
- \color inherit
694
- of
695
- \family typewriter
696
- \color blue
697
- YNelson::Place
698
- \family default
699
- \color inherit
700
-
701
- \emph on
702
- \color red
703
- class
704
- \emph default
705
- \color inherit
706
- .
707
- We say that
708
- \family typewriter
709
- YNelson::Place
710
- \family default
711
- class
712
- \emph on
713
- \color red
714
- represents
715
- \emph default
716
- \color inherit
717
- the concept of Petri net places in
718
- \family typewriter
719
- YNelson
720
- \family default
721
-
722
- \emph on
723
- domain model
724
- \emph default
725
- .
726
- ('
727
- \family typewriter
728
- Place
729
- \family default
730
- ' method is called a
731
- \emph on
732
- \color red
733
- constructor
734
- \emph default
735
- \color inherit
736
- of
737
- \family typewriter
738
- YNelson::Place
739
- \family default
740
- , which is not important.) This newly created Petri net place has now been
741
- assigned to
742
- \family typewriter
743
- A
744
- \family default
745
- .
746
- On the screen, you will see the output, which is simply the name of the
747
- place –
748
- \family typewriter
749
- A
750
- \family default
751
- .
752
- In the following text, screen output will always be written immediately
753
- under the code sample, preceded by sherocket (
754
- \family typewriter
755
- #=>)
756
- \family default
757
- :
758
- \end_layout
759
-
760
- \begin_layout LyX-Code
761
- B = Place()
762
- \end_layout
763
-
764
- \begin_layout LyX-Code
765
- #=> B
766
- \end_layout
767
-
768
- \begin_layout Standard
769
- In the above, we have so far defined 2 Petri net places (named
770
- \family typewriter
771
- A
772
- \family default
773
- ,
774
- \family typewriter
775
- B
776
- \family default
777
- ).
778
- You can check them by typing:
779
- \end_layout
780
-
781
- \begin_layout LyX-Code
782
-
783
- \color blue
784
- places
785
- \color inherit
786
- ()
787
- \end_layout
788
-
789
- \begin_layout LyX-Code
790
- #=> [A, B]
791
- \end_layout
792
-
793
- \begin_layout LyX-Code
794
- A.
795
- \color blue
796
- name
797
- \color inherit
798
- ()
799
- \end_layout
800
-
801
- \begin_layout LyX-Code
802
- #=> :A
803
- \end_layout
804
-
805
- \begin_layout Standard
806
- These have automatically become part of a default Petri net instance (of
807
-
808
- \family typewriter
809
- YNelson::Net
810
- \family default
811
- class; object id may vary):
812
- \end_layout
813
-
814
- \begin_layout LyX-Code
815
-
816
- \color blue
817
- net
818
- \color inherit
819
- ()
820
- \end_layout
821
-
822
- \begin_layout LyX-Code
823
- #=> #<Net: name: Top, 2 places, 0 transitions>
824
- \end_layout
825
-
826
- \begin_layout Standard
827
- Of course, you have full power of Ruby at your disposal.
828
- To eg.
829
- list only place names as strings, you can use standard Ruby methods:
830
- \end_layout
831
-
832
- \begin_layout LyX-Code
833
- places.
834
- \color red
835
- map
836
- \color inherit
837
- ( &:name )
838
- \end_layout
839
-
840
- \begin_layout LyX-Code
841
- #=> [:A, :B]
842
- \end_layout
843
-
844
- \begin_layout Standard
845
- Here, Ruby
846
- \family typewriter
847
- map
848
- \family default
849
- method transforms the
850
- \emph on
851
- \color red
852
- array
853
- \emph default
854
- \color inherit
855
- of places to the array of their names.
856
- The advantage of internal DSLs is, that one retains full power of the language,
857
- augmented with human-friendly, domain-specific commands.
858
- GUI systems generally sandbox the user inside their interface, with no
859
- way to overcome its limitations.
860
- But let us go on.
861
- You can notice that the
862
- \emph on
863
- \color green
864
- marking
865
- \emph default
866
- \color inherit
867
- of
868
- \family typewriter
869
- A
870
- \family default
871
- ,
872
- \family typewriter
873
- B
874
- \family default
875
- is one we gave them upon their creation:
876
- \end_layout
877
-
878
- \begin_layout LyX-Code
879
- places.map( &:marking )
880
- \end_layout
881
-
882
- \begin_layout LyX-Code
883
- #=> [2, 5]
884
- \end_layout
885
-
886
- \begin_layout Standard
887
- In classical Petri nets, marking is understood as the number of
888
- \emph on
889
- \color green
890
- tokens
891
- \emph default
892
- \color inherit
893
- in each place, which is always integer.
894
- In this case,
895
- \family typewriter
896
- A
897
- \family default
898
- contains 2 tokens, while
899
- \family typewriter
900
- B
901
- \family default
902
- contains 5 tokens.
903
- Tokens can represent anything: molecules, parts in the production line,
904
- trains in the railway network...
905
- \end_layout
906
-
907
- \begin_layout Subsection*
908
- Transitions
909
- \end_layout
910
-
911
- \begin_layout Standard
912
- The behavior of a Petri net is defined by
913
- \emph on
914
- \color green
915
- transitions
916
- \emph default
917
- \color inherit
918
- .
919
- Each transition defines a single operation: Adding / subtracting some amount
920
- of tokens to / from some places.
921
- Transition operation can often be expressed by
922
- \emph on
923
- stoichiometry
924
- \emph default
925
- – pairs of places with a corresponding number of tokens to add / subtract
926
- when the transition
927
- \emph on
928
- \color green
929
- fires
930
- \emph default
931
- \color inherit
932
- .
933
- For example, let us define:
934
- \end_layout
935
-
936
- \begin_layout LyX-Code
937
- A2B =
938
- \color blue
939
- Transition
940
- \color inherit
941
- ( stoichiometry: { A: -1, B: 1 } )
942
- \end_layout
943
-
944
- \begin_layout LyX-Code
945
- #=> A2B
946
- \end_layout
947
-
948
- \begin_layout Standard
949
- Stoichiometry of this transition is given by the
950
- \emph on
951
- \color red
952
- hash
953
- \emph default
954
- \color inherit
955
-
956
- \family typewriter
957
- { A: -1, B: 1 }
958
- \family default
959
- .
960
- This hash is available from
961
- \family typewriter
962
- A2B
963
- \family default
964
- via '
965
- \family typewriter
966
- \color blue
967
- s
968
- \family default
969
- \color inherit
970
- ' method:
971
- \end_layout
972
-
973
- \begin_layout LyX-Code
974
- A2B.
975
- \color blue
976
- s
977
- \color inherit
978
- ()
979
- \end_layout
980
-
981
- \begin_layout LyX-Code
982
- #=> {:A=>-1, :B=>1}
983
- \end_layout
984
-
985
- \begin_layout Standard
986
-
987
- \emph on
988
- \color red
989
- Keys
990
- \emph default
991
- \color inherit
992
- of this hash are place names,
993
- \emph on
994
- \color red
995
- values
996
- \emph default
997
- \color inherit
998
- are
999
- \emph on
1000
- \color green
1001
- stoichiometry coefficients
1002
- \emph default
1003
- \color inherit
1004
- .
1005
- ('Stoichiometry' is a word known from the domain of chemistry, but '
1006
- \emph on
1007
- stoicheion
1008
- \emph default
1009
- ' means simply 'element' in Greek, so there is no problem with using it
1010
- in the domain of general Petri nets.) To see the stoichiometry coefficients
1011
- of
1012
- \family typewriter
1013
- A2B
1014
- \family default
1015
- as an array, type:
1016
- \end_layout
1017
-
1018
- \begin_layout LyX-Code
1019
- A2B.
1020
- \color blue
1021
- stoichiometry
1022
- \color inherit
1023
- ()
1024
- \end_layout
1025
-
1026
- \begin_layout LyX-Code
1027
- #=> [-1, 1]
1028
- \end_layout
1029
-
1030
- \begin_layout Standard
1031
- Simply,
1032
- \family typewriter
1033
- A2B
1034
- \family default
1035
- subtracts 1 token from
1036
- \family typewriter
1037
- A
1038
- \family default
1039
- , and adds 1 token to
1040
- \family typewriter
1041
- B
1042
- \family default
1043
- .
1044
- This can represent conversion of
1045
- \family typewriter
1046
- A
1047
- \family default
1048
- to
1049
- \family typewriter
1050
- B
1051
- \family default
1052
- .
1053
- In classical Petri nets, the arrows connecting places and transitions are
1054
- called
1055
- \emph on
1056
- \color green
1057
- arcs
1058
- \emph default
1059
- \color inherit
1060
- .
1061
- (The term was borrowed from graph theory.) For example, at this moment,
1062
- our Petri net would contain one arc going from
1063
- \family typewriter
1064
- A
1065
- \family default
1066
- to
1067
- \family typewriter
1068
- A2B
1069
- \family default
1070
- , and one arc going from
1071
- \family typewriter
1072
- A2B
1073
- \family default
1074
- to
1075
- \family typewriter
1076
- B
1077
- \family default
1078
- .
1079
- In
1080
- \family typewriter
1081
- YNelson
1082
- \family default
1083
- domain model, 'arcs' are not first-class citizens.
1084
- The word is understood simply as a synonym for transitions' connectivity
1085
- – the list of places connected to each transition:
1086
- \end_layout
1087
-
1088
- \begin_layout LyX-Code
1089
- A2B.
1090
- \color blue
1091
- arcs
1092
- \color inherit
1093
- ()
1094
- \end_layout
1095
-
1096
- \begin_layout LyX-Code
1097
- #=> [A, B]
1098
- \end_layout
1099
-
1100
- \begin_layout Standard
1101
- The transition
1102
- \family typewriter
1103
- A2B
1104
- \family default
1105
- is
1106
- \emph on
1107
- \color blue
1108
- timeless
1109
- \emph default
1110
- \color inherit
1111
- :
1112
- \end_layout
1113
-
1114
- \begin_layout LyX-Code
1115
- A2B.
1116
- \color blue
1117
- timeless?
1118
- \color inherit
1119
- ()
1120
- \end_layout
1121
-
1122
- \begin_layout LyX-Code
1123
- #=> true
1124
- \end_layout
1125
-
1126
- \begin_layout Standard
1127
- 'Timeless' means that the transition's firing is not defined in time – it
1128
- can fire anytime, as long as it is
1129
- \emph on
1130
- \color green
1131
- enabled
1132
- \emph default
1133
- \color inherit
1134
- .
1135
- Classical Petri nets are timeless.
1136
- In classical Petri nets, a transition is enabled whenever its
1137
- \emph on
1138
- \color blue
1139
- downstream arcs
1140
- \emph default
1141
- \color inherit
1142
- allow it to happen.
1143
- Downstream arcs, or
1144
- \emph on
1145
- \color blue
1146
- codomain
1147
- \emph default
1148
- \color inherit
1149
- of a transition (these two are synonyms) are those places, whose marking
1150
- can be directly affected by the transition's firing.
1151
- In this case, both
1152
- \family typewriter
1153
- A
1154
- \family default
1155
- and
1156
- \family typewriter
1157
- B
1158
- \family default
1159
- is affected:
1160
- \end_layout
1161
-
1162
- \begin_layout LyX-Code
1163
- A2B.
1164
- \color blue
1165
- downstream_arcs
1166
- \color inherit
1167
- ()
1168
- \end_layout
1169
-
1170
- \begin_layout LyX-Code
1171
- [A, B]
1172
- \end_layout
1173
-
1174
- \begin_layout LyX-Code
1175
- A2B.
1176
- \color blue
1177
- codomain
1178
- \color inherit
1179
- ()
1180
- \end_layout
1181
-
1182
- \begin_layout LyX-Code
1183
- [A, B]
1184
- \end_layout
1185
-
1186
- \begin_layout Standard
1187
- Since
1188
- \family typewriter
1189
- A2B
1190
- \family default
1191
- subtracts tokens from
1192
- \family typewriter
1193
- A
1194
- \family default
1195
- , it will be enabled so long, as there are any tokens left in
1196
- \family typewriter
1197
- A
1198
- \family default
1199
- .
1200
- \end_layout
1201
-
1202
- \begin_layout LyX-Code
1203
- A2B.
1204
- \color blue
1205
- enabled?
1206
- \color inherit
1207
- ()
1208
- \end_layout
1209
-
1210
- \begin_layout LyX-Code
1211
- #=> true
1212
- \end_layout
1213
-
1214
- \begin_layout Subsection*
1215
- Token game
1216
- \end_layout
1217
-
1218
- \begin_layout Standard
1219
- After
1220
- \family typewriter
1221
- A2B
1222
- \family default
1223
- fires, the marking will change:
1224
- \end_layout
1225
-
1226
- \begin_layout LyX-Code
1227
- A2B.
1228
- \color blue
1229
- fire!
1230
- \color inherit
1231
- ()
1232
- \end_layout
1233
-
1234
- \begin_layout LyX-Code
1235
- #=> nil
1236
- \end_layout
1237
-
1238
- \begin_layout LyX-Code
1239
- places.map( &:marking )
1240
- \end_layout
1241
-
1242
- \begin_layout LyX-Code
1243
- #=> [1, 6]
1244
- \end_layout
1245
-
1246
- \begin_layout LyX-Code
1247
- A2B.fire!()
1248
- \end_layout
1249
-
1250
- \begin_layout LyX-Code
1251
- #=> nil
1252
- \end_layout
1253
-
1254
- \begin_layout LyX-Code
1255
- places.map( &:marking )
1256
- \end_layout
1257
-
1258
- \begin_layout LyX-Code
1259
- #=> [0, 7]
1260
- \end_layout
1261
-
1262
- \begin_layout Standard
1263
- At this point, there are no tokens left in
1264
- \family typewriter
1265
- A
1266
- \family default
1267
- and
1268
- \family typewriter
1269
- A2B
1270
- \family default
1271
- becomes
1272
- \emph on
1273
- \color green
1274
- disabled
1275
- \emph default
1276
- \color inherit
1277
- :
1278
- \end_layout
1279
-
1280
- \begin_layout LyX-Code
1281
- A2B.enabled?
1282
- \end_layout
1283
-
1284
- \begin_layout LyX-Code
1285
- #=> false
1286
- \end_layout
1287
-
1288
- \begin_layout Standard
1289
- Attempt to fire a disabled transition
1290
- \emph on
1291
- \color red
1292
- raises
1293
- \emph default
1294
- \color inherit
1295
- an
1296
- \emph on
1297
- \color red
1298
- error
1299
- \emph default
1300
- \color inherit
1301
- (in Ruby, errors are friendly objects, who, like damsels in distress, are
1302
- meant to be rescued with a bonus outcome):
1303
- \end_layout
1304
-
1305
- \begin_layout LyX-Code
1306
- A2B.fire!
1307
- \end_layout
1308
-
1309
- \begin_layout LyX-Code
1310
- #=> YPetri::GuardError: When trying call #fire method, adding action node
1311
- no.
1312
- 0 to A, marking change being -1, YPetri::GuardError occurred: Marking -1:Fixnum
1313
- of A should not be negative!
1314
- \end_layout
1315
-
1316
- \begin_layout Subsection*
1317
- Functional transitions and non-integer marking
1318
- \end_layout
1319
-
1320
- \begin_layout Standard
1321
- So far, all the examples were compatible with classical Petri nets.
1322
- But
1323
- \family typewriter
1324
- YNelson
1325
- \family default
1326
- goes beyond – it represents
1327
- \emph on
1328
- functional Petri nets
1329
- \emph default
1330
- , similar to
1331
- \emph on
1332
- Hybrid Functional Petri Net (HFPN)
1333
- \emph default
1334
- proposed by
1335
- \begin_inset CommandInset citation
1336
- LatexCommand citet
1337
- key "Matsuno2011brs"
1338
-
1339
- \end_inset
1340
-
1341
- , which I already mentioned in the introductory part of this document.
1342
-
1343
- \family typewriter
1344
- YNelson
1345
- \family default
1346
- domain model is similar, but not identical to HFPN.
1347
- On the side of similarities,
1348
- \family typewriter
1349
- YNelson
1350
- \family default
1351
- allows non-integer marking of places:
1352
- \end_layout
1353
-
1354
- \begin_layout LyX-Code
1355
- C = Place(
1356
- \color blue
1357
- marking
1358
- \color inherit
1359
- : 7.77 )
1360
- \end_layout
1361
-
1362
- \begin_layout LyX-Code
1363
- #=> C
1364
- \end_layout
1365
-
1366
- \begin_layout Standard
1367
- Here, you can notice that marking of places can be specified already upon
1368
- initialization using '
1369
- \family typewriter
1370
- :marking
1371
- \family default
1372
- '
1373
- \emph on
1374
- \color red
1375
- named argument
1376
- \emph default
1377
- \color inherit
1378
- .
1379
- Let us now define a
1380
- \emph on
1381
- \color blue
1382
- timed
1383
- \emph default
1384
- \color inherit
1385
- transition, representing logarithmic decay of
1386
- \family typewriter
1387
- C
1388
- \family default
1389
- with a rate constant of 0.05:
1390
- \end_layout
1391
-
1392
- \begin_layout LyX-Code
1393
- C_decay = Transition( stoichiometry: { C: -1 },
1394
- \color blue
1395
- rate
1396
- \color inherit
1397
- : 0.05 )
1398
- \end_layout
1399
-
1400
- \begin_layout LyX-Code
1401
- #=> C_decay
1402
- \end_layout
1403
-
1404
- \begin_layout LyX-Code
1405
- C_decay.
1406
- \color blue
1407
- timed?
1408
- \end_layout
1409
-
1410
- \begin_layout LyX-Code
1411
- #=> true
1412
- \end_layout
1413
-
1414
- \begin_layout Standard
1415
- Here, in the
1416
- \family typewriter
1417
- transition
1418
- \family default
1419
- constructor method, apart from '
1420
- \family typewriter
1421
- stoichiometry:
1422
- \family default
1423
- ' named argument, another named argument, '
1424
- \family typewriter
1425
- rate:
1426
- \family default
1427
- ', is introduced.
1428
- Under '
1429
- \family typewriter
1430
- rate:
1431
- \family default
1432
- ', it is possible to specify the transition's
1433
- \emph on
1434
- \color green
1435
- function
1436
- \emph default
1437
- \color inherit
1438
- , which governs its rate.
1439
- Specifying a function in Ruby requires special syntax (called Ruby
1440
- \emph on
1441
- \color red
1442
- closures
1443
- \emph default
1444
- \color inherit
1445
- ), based on lambda calculus.
1446
- Ruby closures are easy to learn.
1447
- But for the moment, in
1448
- \family typewriter
1449
- C_decay
1450
- \family default
1451
- transition, we are taking use of the convenience, that allows us to pass
1452
- a numeric value under '
1453
- \family typewriter
1454
- rate:
1455
- \family default
1456
- ' named argument, and have
1457
- \family typewriter
1458
- YNelson
1459
- \family default
1460
- create default mass action equation, using the supplied number as its rate
1461
- constant.
1462
- For
1463
- \family typewriter
1464
- C_decay
1465
- \family default
1466
- stoichiometry,
1467
- \family typewriter
1468
- { C: -1 }
1469
- \family default
1470
- , default mass action will be logarithmic decay with rate constant 0.05.
1471
- Naturally, when firing timed transitions, the time interval (
1472
- \begin_inset Formula $\Delta$
1473
- \end_inset
1474
-
1475
- time) must be specified, for which the transition should be active:
1476
- \end_layout
1477
-
1478
- \begin_layout LyX-Code
1479
- C_decay.fire!( 1 )
1480
- \end_layout
1481
-
1482
- \begin_layout LyX-Code
1483
- #=> nil
1484
- \end_layout
1485
-
1486
- \begin_layout LyX-Code
1487
- C.marking
1488
- \end_layout
1489
-
1490
- \begin_layout LyX-Code
1491
- #=> 7.3815
1492
- \end_layout
1493
-
1494
- \begin_layout LyX-Code
1495
- C_decay.fire! 1
1496
- \end_layout
1497
-
1498
- \begin_layout LyX-Code
1499
- #=> nil
1500
- \end_layout
1501
-
1502
- \begin_layout LyX-Code
1503
- C.marking
1504
- \end_layout
1505
-
1506
- \begin_layout LyX-Code
1507
- #=> 7.012425
1508
- \end_layout
1509
-
1510
- \begin_layout LyX-Code
1511
- C_decay.fire!( 0.1 )
1512
- \end_layout
1513
-
1514
- \begin_layout LyX-Code
1515
- #=> nil
1516
- \end_layout
1517
-
1518
- \begin_layout LyX-Code
1519
- C.marking
1520
- \end_layout
1521
-
1522
- \begin_layout LyX-Code
1523
- #=> 6.977362875000001
1524
- \end_layout
1525
-
1526
- \begin_layout LyX-Code
1527
- 100.
1528
- \color red
1529
- times
1530
- \color inherit
1531
- do C_decay.fire! 1 end
1532
- \end_layout
1533
-
1534
- \begin_layout LyX-Code
1535
- #=> 100
1536
- \end_layout
1537
-
1538
- \begin_layout LyX-Code
1539
- C.marking
1540
- \end_layout
1541
-
1542
- \begin_layout LyX-Code
1543
- #=> 0.04130968078231133
1544
- \end_layout
1545
-
1546
- \begin_layout Standard
1547
- The penultimate statement was a call of Ruby '
1548
- \family typewriter
1549
- times
1550
- \family default
1551
- ' method with the integer
1552
- \family typewriter
1553
- 100
1554
- \family default
1555
- as the receiver, which results in 100 time repetition of the statement
1556
- inside
1557
- \family typewriter
1558
- \color red
1559
- do ...
1560
- end
1561
- \family default
1562
- \emph on
1563
- block
1564
- \emph default
1565
- \color inherit
1566
- .
1567
- Instead of
1568
- \family typewriter
1569
- do ...
1570
- end
1571
- \family default
1572
- , it is possible to write a block using curly braces
1573
- \family typewriter
1574
- \color red
1575
- { ...
1576
- }
1577
- \family default
1578
- \color inherit
1579
- :
1580
- \end_layout
1581
-
1582
- \begin_layout LyX-Code
1583
- 100.times { C_decay.fire! 1 }
1584
- \end_layout
1585
-
1586
- \begin_layout LyX-Code
1587
- #=> 100
1588
- \end_layout
1589
-
1590
- \begin_layout Standard
1591
- This will cause another 100 time units of
1592
- \family typewriter
1593
- C_decay
1594
- \family default
1595
- firing.
1596
- This brings
1597
- \family typewriter
1598
- C
1599
- \family default
1600
- marking down to almost zero:
1601
- \end_layout
1602
-
1603
- \begin_layout LyX-Code
1604
- C.marking
1605
- \end_layout
1606
-
1607
- \begin_layout LyX-Code
1608
- #=> 0.00024457517215434527
1609
- \end_layout
1610
-
1611
- \begin_layout Subsection*
1612
- Four transition types
1613
- \end_layout
1614
-
1615
- \begin_layout Standard
1616
- Thus far, we have demonstrated transitions with stoichiometry, which were
1617
- either
1618
- \emph on
1619
- timed
1620
- \emph default
1621
- or not timed (
1622
- \emph on
1623
- timeless
1624
- \emph default
1625
- ).
1626
- Timed transitions are denoted by capital
1627
- \begin_inset Quotes eld
1628
- \end_inset
1629
-
1630
-
1631
- \family typewriter
1632
- T
1633
- \family default
1634
-
1635
- \begin_inset Quotes erd
1636
- \end_inset
1637
-
1638
- , timeless transitions by small
1639
- \begin_inset Quotes eld
1640
- \end_inset
1641
-
1642
-
1643
- \family typewriter
1644
- t
1645
- \family default
1646
-
1647
- \begin_inset Quotes erd
1648
- \end_inset
1649
-
1650
- .
1651
- Similarly, stoichiometric transitions are denoted by capital
1652
- \begin_inset Quotes eld
1653
- \end_inset
1654
-
1655
-
1656
- \family typewriter
1657
- S
1658
- \family default
1659
-
1660
- \begin_inset Quotes erd
1661
- \end_inset
1662
-
1663
- , while transitions without stoichiometry (
1664
- \emph on
1665
- non-stoichiometric
1666
- \emph default
1667
- transitions) by small
1668
- \begin_inset Quotes eld
1669
- \end_inset
1670
-
1671
-
1672
- \family typewriter
1673
- s
1674
- \family default
1675
-
1676
- \begin_inset Quotes erd
1677
- \end_inset
1678
-
1679
- .
1680
- Together, this gives 4 basic types of transitions:
1681
- \family typewriter
1682
- TS
1683
- \family default
1684
- ,
1685
- \family typewriter
1686
- tS
1687
- \family default
1688
- ,
1689
- \family typewriter
1690
- Ts
1691
- \family default
1692
- , and
1693
- \family typewriter
1694
- ts
1695
- \family default
1696
- .
1697
- \end_layout
1698
-
1699
- \begin_layout Standard
1700
- The user can ask the type of a transition by calling the
1701
- \family typewriter
1702
- \color blue
1703
- type
1704
- \family default
1705
- \color inherit
1706
- method:
1707
- \end_layout
1708
-
1709
- \begin_layout LyX-Code
1710
- A2B.type
1711
- \end_layout
1712
-
1713
- \begin_layout LyX-Code
1714
- #=> :tS
1715
- \end_layout
1716
-
1717
- \begin_layout Standard
1718
- Or investigate the type with inquirer methods:
1719
- \end_layout
1720
-
1721
- \begin_layout LyX-Code
1722
- A2B.
1723
- \color blue
1724
- t?
1725
- \end_layout
1726
-
1727
- \begin_layout LyX-Code
1728
- #=> true
1729
- \end_layout
1730
-
1731
- \begin_layout LyX-Code
1732
- A2B.
1733
- \color blue
1734
- T?
1735
- \end_layout
1736
-
1737
- \begin_layout LyX-Code
1738
- #=> false
1739
- \end_layout
1740
-
1741
- \begin_layout LyX-Code
1742
- A2B.
1743
- \color blue
1744
- s?
1745
- \end_layout
1746
-
1747
- \begin_layout LyX-Code
1748
- #=> false
1749
- \end_layout
1750
-
1751
- \begin_layout LyX-Code
1752
- A2B.
1753
- \color blue
1754
- S?
1755
- \end_layout
1756
-
1757
- \begin_layout LyX-Code
1758
- #=> true
1759
- \end_layout
1760
-
1761
- \begin_layout LyX-Code
1762
- A2B.
1763
- \color blue
1764
- TS?
1765
- \end_layout
1766
-
1767
- \begin_layout LyX-Code
1768
- #=> false
1769
- \end_layout
1770
-
1771
- \begin_layout LyX-Code
1772
- A2B.
1773
- \color blue
1774
- tS?
1775
- \end_layout
1776
-
1777
- \begin_layout LyX-Code
1778
- #=> true
1779
- \end_layout
1780
-
1781
- \begin_layout LyX-Code
1782
- A2B.
1783
- \color blue
1784
- Ts?
1785
- \end_layout
1786
-
1787
- \begin_layout LyX-Code
1788
- #=> false
1789
- \end_layout
1790
-
1791
- \begin_layout LyX-Code
1792
- A2B.
1793
- \color blue
1794
- ts?
1795
- \end_layout
1796
-
1797
- \begin_layout LyX-Code
1798
- #=> false
1799
- \end_layout
1800
-
1801
- \begin_layout Subsection*
1802
- Assignment transitions
1803
- \end_layout
1804
-
1805
- \begin_layout Standard
1806
- In
1807
- \family typewriter
1808
- YNelson
1809
- \family default
1810
- , there is one more transition type: an assignment transition, denoted by
1811
-
1812
- \begin_inset Quotes eld
1813
- \end_inset
1814
-
1815
-
1816
- \family typewriter
1817
- A
1818
- \family default
1819
-
1820
- \begin_inset Quotes erd
1821
- \end_inset
1822
-
1823
- .
1824
- Assignment transitions do not add or subtract tokens from their target,
1825
- but completely replace the codomain marking with their output.
1826
- (Again, in
1827
- \family typewriter
1828
- YNelson
1829
- \family default
1830
- transitions,
1831
- \emph on
1832
- domain
1833
- \emph default
1834
- and
1835
- \emph on
1836
- codomain
1837
- \emph default
1838
- mean respectively upstream and downstream places.) Transitions other than
1839
-
1840
- \family typewriter
1841
- A
1842
- \family default
1843
- transitions can be collectively called non-assignment transitions, denoted
1844
- by small
1845
- \begin_inset Quotes eld
1846
- \end_inset
1847
-
1848
-
1849
- \family typewriter
1850
- a
1851
- \family default
1852
-
1853
- \begin_inset Quotes erd
1854
- \end_inset
1855
-
1856
- .
1857
- Note that assignment action is already achievable with plain
1858
- \family typewriter
1859
- ts
1860
- \family default
1861
- transitions (by subtracting away the previous codomain marking), so
1862
- \family typewriter
1863
- A
1864
- \family default
1865
- transitions are not strictly needed – their separate existence is just
1866
- a syntactic convenience.
1867
- \end_layout
1868
-
1869
- \begin_layout Standard
1870
- One way to construct assignment transitions is by setting
1871
- \family typewriter
1872
- :assignment
1873
- \family default
1874
- named argument to
1875
- \emph on
1876
- true
1877
- \emph default
1878
- :
1879
- \end_layout
1880
-
1881
- \begin_layout LyX-Code
1882
- A_to_42 = Transition codomain: A, assignment: lambda { 42 }
1883
- \end_layout
1884
-
1885
- \begin_layout LyX-Code
1886
- #=> A_to_42
1887
- \end_layout
1888
-
1889
- \begin_layout Standard
1890
- Firing this transition results in marking of
1891
- \family typewriter
1892
- A
1893
- \family default
1894
- being set to 42:
1895
- \end_layout
1896
-
1897
- \begin_layout LyX-Code
1898
- A_to_42.fire!
1899
- \end_layout
1900
-
1901
- \begin_layout LyX-Code
1902
- #=> nil
1903
- \end_layout
1904
-
1905
- \begin_layout LyX-Code
1906
- A.marking
1907
- \end_layout
1908
-
1909
- \begin_layout LyX-Code
1910
- #=> 42
1911
- \end_layout
1912
-
1913
- \begin_layout Standard
1914
- Assignment transitions are of special type
1915
- \family typewriter
1916
- A
1917
- \family default
1918
- :
1919
- \end_layout
1920
-
1921
- \begin_layout LyX-Code
1922
- A_to_42.type
1923
- \end_layout
1924
-
1925
- \begin_layout LyX-Code
1926
- #=> :A
1927
- \end_layout
1928
-
1929
- \begin_layout LyX-Code
1930
- A_to_42.A?
1931
- \end_layout
1932
-
1933
- \begin_layout LyX-Code
1934
- #=> true
1935
- \end_layout
1936
-
1937
- \begin_layout LyX-Code
1938
- A_to_42.a?
1939
- \end_layout
1940
-
1941
- \begin_layout LyX-Code
1942
- #=> false
1943
- \end_layout
1944
-
1945
- \begin_layout Part*
1946
- Example II: Convenience
1947
- \end_layout
1948
-
1949
- \begin_layout Standard
1950
- So far, to avoid confusing you, I used fairly conservative syntax.
1951
-
1952
- \family typewriter
1953
- YNelson
1954
- \family default
1955
- can do better than that.
1956
- For convenience, many long keywords have short aliases.
1957
- Frequently used syntactic constructs usually have shorter way of expressing
1958
- the same.
1959
- \end_layout
1960
-
1961
- \begin_layout Standard
1962
- As you have seen, in
1963
- \family typewriter
1964
- YNelson
1965
- \family default
1966
- one often uses transition constructors.
1967
- Thus far, we have seen only one
1968
- \emph on
1969
- constructor method
1970
- \emph default
1971
- for transitions:
1972
- \family typewriter
1973
- Transition()
1974
- \family default
1975
- .
1976
-
1977
- \family typewriter
1978
- Transition()
1979
- \family default
1980
- method accepts several different named arguments (
1981
- \family typewriter
1982
- :domain
1983
- \family default
1984
- ,
1985
- \family typewriter
1986
- :codomain
1987
- \family default
1988
- ,
1989
- \family typewriter
1990
- :stoichiometry
1991
- \family default
1992
-
1993
- \family typewriter
1994
- :assignment
1995
- \family default
1996
- ,
1997
- \family typewriter
1998
- :rate
1999
- \family default
2000
- ,
2001
- \family typewriter
2002
- :action
2003
- \family default
2004
- ,
2005
- \family typewriter
2006
- :name
2007
- \family default
2008
- ...) and depending on their values, returns a
2009
- \family typewriter
2010
- YNelson::Transition
2011
- \family default
2012
- class object of required type and properties.
2013
- \end_layout
2014
-
2015
- \begin_layout Standard
2016
- Using long keywords in the constructor method makes the
2017
- \family typewriter
2018
- YNelson
2019
- \family default
2020
- code easy to read.
2021
- But for the cases where trading readability for brevity is desirable, such
2022
- as when you are playing with YNelson inside
2023
- \emph on
2024
- irb
2025
- \emph default
2026
- session, you will appreciate convenience.
2027
- Actually, we already used syntactic shorthands in the earlier examples.
2028
- We didn't type :
2029
- \end_layout
2030
-
2031
- \begin_layout LyX-Code
2032
- Transition( name:
2033
- \begin_inset Quotes eld
2034
- \end_inset
2035
-
2036
- A2B
2037
- \begin_inset Quotes erd
2038
- \end_inset
2039
-
2040
- ,
2041
- \end_layout
2042
-
2043
- \begin_layout LyX-Code
2044
- codomain: [A, B],
2045
- \end_layout
2046
-
2047
- \begin_layout LyX-Code
2048
- stoichiometry: [-1, 1] )
2049
- \end_layout
2050
-
2051
- \begin_layout LyX-Code
2052
- A2B = transition( :A2B )
2053
- \end_layout
2054
-
2055
- \begin_layout Standard
2056
- Instead, we just typed
2057
- \end_layout
2058
-
2059
- \begin_layout LyX-Code
2060
- A2B = Transition( stoichiometry: { A: -1, B: 1 } )
2061
- \end_layout
2062
-
2063
- \begin_layout Standard
2064
- Just so you know, the above shorthand is not easy to program in Ruby.
2065
- When designing
2066
- \family typewriter
2067
- YNelson
2068
- \family default
2069
- , I took a lot of pain for your convenience.
2070
- Even shorter way to express the same would be:
2071
- \end_layout
2072
-
2073
- \begin_layout LyX-Code
2074
- A2B = Transition
2075
- \color blue
2076
- s
2077
- \color inherit
2078
- : { A: -1, B: 1 }
2079
- \end_layout
2080
-
2081
- \begin_layout Standard
2082
- The above is a very simple timeless transition that just takes one token
2083
- from
2084
- \family typewriter
2085
- A
2086
- \family default
2087
- and puts it into
2088
- \family typewriter
2089
- B
2090
- \family default
2091
- .
2092
- (Constructor convenience is even more powerful for complex transitions.)
2093
- Start a new
2094
- \family typewriter
2095
- irb
2096
- \family default
2097
- session and type:
2098
- \end_layout
2099
-
2100
- \begin_layout LyX-Code
2101
- require 'y_nelson'
2102
- \end_layout
2103
-
2104
- \begin_layout LyX-Code
2105
- include YNelson
2106
- \end_layout
2107
-
2108
- \begin_layout LyX-Code
2109
- A = Place
2110
- \color blue
2111
- default_marking
2112
- \color inherit
2113
- : 5
2114
- \end_layout
2115
-
2116
- \begin_layout Standard
2117
- Constantly typing
2118
- \family typewriter
2119
- default_marking
2120
- \family default
2121
- is tiresome.
2122
- Shorter way to say the same is by using the alias
2123
- \family typewriter
2124
- \color blue
2125
- m!
2126
- \family default
2127
- \color inherit
2128
- of the same:
2129
- \end_layout
2130
-
2131
- \begin_layout LyX-Code
2132
- B = Place m!: 5
2133
- \end_layout
2134
-
2135
- \begin_layout LyX-Code
2136
- C = Place m!: 1
2137
- \end_layout
2138
-
2139
- \begin_layout LyX-Code
2140
- D = Place m!: 1
2141
- \end_layout
2142
-
2143
- \begin_layout Standard
2144
- Let's check the net's marking vector now:
2145
- \end_layout
2146
-
2147
- \begin_layout LyX-Code
2148
- places.map &:marking #=> [5, 5, 1, 1]
2149
- \end_layout
2150
-
2151
- \begin_layout Standard
2152
- If you typed everything correctly, you should see the above result.
2153
- Shorter way to ask for the same information is:
2154
- \end_layout
2155
-
2156
- \begin_layout LyX-Code
2157
- net.marking #=> [5, 5, 1, 1]
2158
- \end_layout
2159
-
2160
- \begin_layout Standard
2161
- Even shorter way to say the same is:
2162
- \end_layout
2163
-
2164
- \begin_layout LyX-Code
2165
- net.
2166
- \color blue
2167
- m
2168
- \color inherit
2169
- #=> [5, 5, 1, 1]
2170
- \end_layout
2171
-
2172
- \begin_layout Standard
2173
- Now let's define the transition we want:
2174
- \end_layout
2175
-
2176
- \begin_layout LyX-Code
2177
- B2A = Transition( stoichiometry: { B: -1, A: 1 },
2178
- \end_layout
2179
-
2180
- \begin_layout LyX-Code
2181
- domain: [C, D],
2182
- \end_layout
2183
-
2184
- \begin_layout LyX-Code
2185
- rate: lambda { |x, y| ( x * y ) ** 0.5 } )
2186
- \end_layout
2187
-
2188
- \begin_layout Standard
2189
- To prove that it works, let's fire it for 0.1 time units:
2190
- \end_layout
2191
-
2192
- \begin_layout LyX-Code
2193
- B2A.fire! 0.1 #=> nil
2194
- \end_layout
2195
-
2196
- \begin_layout LyX-Code
2197
- net.m #=> [5.1, 4.9, 1, 1]
2198
- \end_layout
2199
-
2200
- \begin_layout Standard
2201
- Can we express its constructor more concisely? The answer is yes.
2202
-
2203
- \family typewriter
2204
- B2A
2205
- \family default
2206
- is a
2207
- \family typewriter
2208
- TS
2209
- \family default
2210
- transition (check
2211
- \family typewriter
2212
- B2A.type
2213
- \family default
2214
- to make sure it is true), and for
2215
- \family typewriter
2216
- TS
2217
- \family default
2218
- transitions,
2219
- \family typewriter
2220
- \color blue
2221
- TS()
2222
- \family default
2223
- \color inherit
2224
- convenience constructor is available.
2225
- With
2226
- \family typewriter
2227
- TS()
2228
- \family default
2229
- constructor, the definition of B2A would be much shorter:
2230
- \end_layout
2231
-
2232
- \begin_layout LyX-Code
2233
- B2A = TS domain: [C, D], A: 1, B: -1 do |x, y| ( x * y ) ** 0.5 end
2234
- \end_layout
2235
-
2236
- \begin_layout Standard
2237
- Note the
2238
- \family typewriter
2239
- \color red
2240
- do ...
2241
- end
2242
- \family default
2243
- \color inherit
2244
- part in the above line: Using lambda syntax, it defines the rate function
2245
- of the transition.
2246
- Another convenience constructor worth mentioning is
2247
- \family typewriter
2248
- \color blue
2249
- AT()
2250
- \family default
2251
- \color inherit
2252
- for assignment transition.
2253
- Earlier, we defined:
2254
- \end_layout
2255
-
2256
- \begin_layout LyX-Code
2257
- A_to_42 = Transition codomain: A, assignment: lambda { 42 }
2258
- \end_layout
2259
-
2260
- \begin_layout Standard
2261
- Using
2262
- \family typewriter
2263
- AT()
2264
- \family default
2265
- constructor, we can shorten this to:
2266
- \end_layout
2267
-
2268
- \begin_layout LyX-Code
2269
- A_to_42 = AT A do 42 end
2270
- \end_layout
2271
-
2272
- \begin_layout Standard
2273
- In short, syntactic shorthands can save a lot of typing.
2274
- If you still miss some syntactic shorthand, feel free to define it on your
2275
- own.
2276
- For example, let us define a custom method named
2277
- \family typewriter
2278
- Foo
2279
- \family default
2280
- that acts as a constructor of places with default marking.
2281
- \end_layout
2282
-
2283
- \begin_layout LyX-Code
2284
-
2285
- \color red
2286
- def
2287
- \color inherit
2288
- Foo( m )
2289
- \end_layout
2290
-
2291
- \begin_layout LyX-Code
2292
- Place( default_marking: m )
2293
- \end_layout
2294
-
2295
- \begin_layout LyX-Code
2296
- end
2297
- \end_layout
2298
-
2299
- \begin_layout Standard
2300
- After this, you can define places with default marking with even less typing:
2301
- \end_layout
2302
-
2303
- \begin_layout LyX-Code
2304
- X = Foo 42
2305
- \end_layout
2306
-
2307
- \begin_layout LyX-Code
2308
- Y = Foo 43
2309
- \end_layout
2310
-
2311
- \begin_layout Part*
2312
- Example III: YNelson::Simulation
2313
- \end_layout
2314
-
2315
- \begin_layout Standard
2316
- So far, we have been defining Petri nets and playing the token game using
2317
-
2318
- \family typewriter
2319
- #fire!
2320
- \family default
2321
- method, let us now simulate a Petri net inside
2322
- \family typewriter
2323
- YNelson
2324
- \color blue
2325
- ::Simulation
2326
- \family default
2327
- \color inherit
2328
- .
2329
- Restart your irb session as described in the
2330
- \series bold
2331
- Prerequisites
2332
- \series default
2333
- chapter.
2334
- We will now define 2 places.
2335
- Since we are going to use
2336
- \family typewriter
2337
- TimedSimulation
2338
- \family default
2339
- , the marking owned by
2340
- \family typewriter
2341
- YNelson::Place
2342
- \family default
2343
- instances is irrelevant.
2344
- We just need to specify the initial state eg.
2345
- by specifying the default marking of the places:
2346
- \end_layout
2347
-
2348
- \begin_layout LyX-Code
2349
- require 'y_nelson'
2350
- \end_layout
2351
-
2352
- \begin_layout LyX-Code
2353
- include YNelson
2354
- \end_layout
2355
-
2356
- \begin_layout LyX-Code
2357
- A = Place
2358
- \color blue
2359
- m!:
2360
- \color inherit
2361
- 0.5
2362
- \end_layout
2363
-
2364
- \begin_layout LyX-Code
2365
- B = Place m!: 0.5
2366
- \end_layout
2367
-
2368
- \begin_layout Standard
2369
- Now let us define a transition corresponding to pumping
2370
- \family typewriter
2371
- A
2372
- \family default
2373
- out of the system at a constant rate 0.005 per time unit.
2374
- \end_layout
2375
-
2376
- \begin_layout LyX-Code
2377
- A_pump = Transition s: { A: -1 }, rate:
2378
- \color red
2379
- proc
2380
- \color inherit
2381
- { 0.005 }
2382
- \end_layout
2383
-
2384
- \begin_layout Standard
2385
- Here,
2386
- \family typewriter
2387
- proc { 0.005 }
2388
- \family default
2389
- is a closure, that defines the rate function.
2390
- Closure
2391
- \family typewriter
2392
- proc { 0.005 }
2393
- \family default
2394
- ensures fixed rate 0.005 per time unit regardless of the marking of
2395
- \family typewriter
2396
- A
2397
- \family default
2398
- .
2399
- You can notice that this closure expects no arguments and always outputs
2400
- 0.005 as its return value.
2401
- It is the simplest possible way to write a constant function.
2402
- For comparison,
2403
- \end_layout
2404
-
2405
- \begin_layout LyX-Code
2406
- B_decay = Transition s: { B: -1 }, rate: 0.05
2407
- \end_layout
2408
-
2409
- \begin_layout Standard
2410
- will behind the scenes automatically create a slightly more complicated
2411
- mass action closure, which is logarithmic decay of
2412
- \family typewriter
2413
- B
2414
- \family default
2415
- in this case.
2416
- (You should remember this from
2417
- \series bold
2418
- Example I
2419
- \series default
2420
- .) Now we have created a net of 2 places and 2 transitions:
2421
- \end_layout
2422
-
2423
- \begin_layout LyX-Code
2424
- net
2425
- \end_layout
2426
-
2427
- \begin_layout LyX-Code
2428
- #=> #<Net: name: Top, 2 places, 2 transitions>
2429
- \end_layout
2430
-
2431
- \begin_layout Standard
2432
- We can execute this Petri net as a
2433
- \family typewriter
2434
- Simulation
2435
- \family default
2436
- object simply by typing:
2437
- \end_layout
2438
-
2439
- \begin_layout LyX-Code
2440
-
2441
- \color blue
2442
- run!
2443
- \color inherit
2444
- #=> 60
2445
- \end_layout
2446
-
2447
- \begin_layout Standard
2448
- At this point,
2449
- \family typewriter
2450
- run!
2451
- \family default
2452
- creates and executes a
2453
- \family typewriter
2454
- Simulation
2455
- \family default
2456
- instance.
2457
- The return value is the simulation instance itself (see the inspect string
2458
- above), which by now has already finished execution and holds the simulation
2459
- results.
2460
- This simulation instance is accessible via
2461
- \family typewriter
2462
- simulation
2463
- \family default
2464
- method.
2465
- \end_layout
2466
-
2467
- \begin_layout LyX-Code
2468
-
2469
- \color blue
2470
- simulation
2471
- \end_layout
2472
-
2473
- \begin_layout LyX-Code
2474
- #=> #<Simulation: time: 60, pp: 2, tt: 2, oid: 75530290>
2475
- \end_layout
2476
-
2477
- \begin_layout Standard
2478
- The simulation does not affect the net.
2479
- The simulation instance works with its own
2480
- \begin_inset Quotes eld
2481
- \end_inset
2482
-
2483
- mental image
2484
- \begin_inset Quotes erd
2485
- \end_inset
2486
-
2487
- of the net, therefore the marking owned by
2488
- \family typewriter
2489
- YNelson::Place
2490
- \family default
2491
- instances does not change:
2492
- \end_layout
2493
-
2494
- \begin_layout LyX-Code
2495
- net.marking #=> [0.5, 0.5]
2496
- \end_layout
2497
-
2498
- \begin_layout Standard
2499
- In a general case, it would be necessary to specify the simulation settings
2500
- (step size, sampling rate, simulation time etc.) before running the simulation.
2501
- Since we have not specified any, default settings were used:
2502
- \end_layout
2503
-
2504
- \begin_layout LyX-Code
2505
- simulation.
2506
- \color blue
2507
- settings
2508
- \end_layout
2509
-
2510
- \begin_layout LyX-Code
2511
- #=> {:method=>:basic, :guarded=>false, :step=>0.1, :sampling=>5, :time=>0..60}
2512
- \end_layout
2513
-
2514
- \begin_layout Standard
2515
- We can see sampling done by the simulation by typing:
2516
- \end_layout
2517
-
2518
- \begin_layout LyX-Code
2519
-
2520
- \color blue
2521
- print_recording
2522
- \end_layout
2523
-
2524
- \begin_layout LyX-Code
2525
- #=> :A :B
2526
- \end_layout
2527
-
2528
- \begin_layout LyX-Code
2529
- ----------------
2530
- \end_layout
2531
-
2532
- \begin_layout LyX-Code
2533
- 0.5000 0.5000
2534
- \end_layout
2535
-
2536
- \begin_layout LyX-Code
2537
- 0.4750 0.3892
2538
- \end_layout
2539
-
2540
- \begin_layout LyX-Code
2541
- 0.4500 0.3029
2542
- \end_layout
2543
-
2544
- \begin_layout LyX-Code
2545
- 0.4250 0.2357
2546
- \end_layout
2547
-
2548
- \begin_layout LyX-Code
2549
- 0.4000 0.1835
2550
- \end_layout
2551
-
2552
- \begin_layout LyX-Code
2553
- 0.3750 0.1428
2554
- \end_layout
2555
-
2556
- \begin_layout LyX-Code
2557
- 0.3500 0.1111
2558
- \end_layout
2559
-
2560
- \begin_layout LyX-Code
2561
- 0.3250 0.0865
2562
- \end_layout
2563
-
2564
- \begin_layout LyX-Code
2565
- 0.3000 0.0673
2566
- \end_layout
2567
-
2568
- \begin_layout LyX-Code
2569
- 0.2750 0.0524
2570
- \end_layout
2571
-
2572
- \begin_layout LyX-Code
2573
- 0.2500 0.0408
2574
- \end_layout
2575
-
2576
- \begin_layout LyX-Code
2577
- 0.2250 0.0317
2578
- \end_layout
2579
-
2580
- \begin_layout LyX-Code
2581
- 0.2000 0.0247
2582
- \end_layout
2583
-
2584
- \begin_layout LyX-Code
2585
- nil
2586
- \end_layout
2587
-
2588
- \begin_layout Standard
2589
- Indeed,
2590
- \family typewriter
2591
- A
2592
- \family default
2593
- is decreasing at a constant rate, while
2594
- \family typewriter
2595
- B
2596
- \family default
2597
- undergoes logarithmic decay.
2598
- In a graphical desktop, we can plot a graph (requires
2599
- \emph on
2600
- gnuplot
2601
- \emph default
2602
- gem):
2603
- \end_layout
2604
-
2605
- \begin_layout LyX-Code
2606
-
2607
- \color blue
2608
- recording.plot
2609
- \color inherit
2610
- # plots a graph
2611
- \end_layout
2612
-
2613
- \begin_layout Standard
2614
- Previous command plots the default feature set, which is marking of the
2615
- places.
2616
- We can investigate also features of the recording (gradient or delta of
2617
- places, firing or flux of the transitions...):
2618
- \end_layout
2619
-
2620
- \begin_layout LyX-Code
2621
- recording.
2622
- \color blue
2623
- gradient
2624
- \color inherit
2625
- .plot
2626
- \end_layout
2627
-
2628
- \begin_layout LyX-Code
2629
- recording.
2630
- \color blue
2631
- flux
2632
- \color inherit
2633
- .plot
2634
- \end_layout
2635
-
2636
- \begin_layout LyX-Code
2637
- recording.
2638
- \color blue
2639
- delta
2640
- \color inherit
2641
- (
2642
- \color blue
2643
- delta_time
2644
- \color inherit
2645
- : 0.1 ).plot
2646
- \end_layout
2647
-
2648
- \begin_layout Standard
2649
- The last feature set – delta – requires
2650
- \family typewriter
2651
- delta_time
2652
- \family default
2653
- named argument to extrapolate the changes (deltas) of the places in the
2654
- given delta time.
2655
- As for
2656
- \family typewriter
2657
- \color blue
2658
- firing
2659
- \family default
2660
- \color inherit
2661
- , a feature of
2662
- \family typewriter
2663
- tS
2664
- \family default
2665
- transitions, the plot would show nothing here, as there ar no
2666
- \family typewriter
2667
- tS
2668
- \family default
2669
- transitions here.
2670
- \end_layout
2671
-
2672
- \begin_layout Part*
2673
- Example IV: A real system.
2674
- \end_layout
2675
-
2676
- \begin_layout Standard
2677
- A highly simplified cell-biological pathway.
2678
- Let's first define some assumptions.
2679
- Type in the following commands (output not shown):
2680
- \end_layout
2681
-
2682
- \begin_layout LyX-Code
2683
- require 'y_nelson'
2684
- \end_layout
2685
-
2686
- \begin_layout LyX-Code
2687
- include YNelson
2688
- \end_layout
2689
-
2690
- \begin_layout LyX-Code
2691
-
2692
- \end_layout
2693
-
2694
- \begin_layout LyX-Code
2695
- Pieces_per_microM = 100_000
2696
- \end_layout
2697
-
2698
- \begin_layout LyX-Code
2699
-
2700
- \color blue
2701
- set_step
2702
- \color inherit
2703
- 10
2704
- \end_layout
2705
-
2706
- \begin_layout LyX-Code
2707
-
2708
- \color blue
2709
- set_sampling
2710
- \color inherit
2711
- 30
2712
- \end_layout
2713
-
2714
- \begin_layout LyX-Code
2715
-
2716
- \color blue
2717
- set_target_time
2718
- \color inherit
2719
- 30 * 60
2720
- \end_layout
2721
-
2722
- \begin_layout Standard
2723
- Let's define places corresponding to chemical species first (note that
2724
- \family typewriter
2725
- :
2726
- \color blue
2727
- m!
2728
- \family default
2729
- \color inherit
2730
- is a synonym for
2731
- \family typewriter
2732
- :default_marking)
2733
- \end_layout
2734
-
2735
- \begin_layout LyX-Code
2736
- AMP = Place
2737
- \color blue
2738
- m!
2739
- \color inherit
2740
- : 8695.0
2741
- \end_layout
2742
-
2743
- \begin_layout LyX-Code
2744
- ADP = Place m!: 6521.0
2745
- \end_layout
2746
-
2747
- \begin_layout LyX-Code
2748
- ATP = Place m!: 3152.0
2749
- \end_layout
2750
-
2751
- \begin_layout LyX-Code
2752
- DeoxyCytidine = Place m!: 5.0
2753
- \end_layout
2754
-
2755
- \begin_layout LyX-Code
2756
- DeoxyCTP = Place m!: 20.0
2757
- \end_layout
2758
-
2759
- \begin_layout LyX-Code
2760
- DeoxyGMP = Place m!: 20.0
2761
- \end_layout
2762
-
2763
- \begin_layout LyX-Code
2764
- UMP_UDP_pool = Place m!: 2737.0
2765
- \end_layout
2766
-
2767
- \begin_layout LyX-Code
2768
- DeoxyUMP_DeoxyUDP_pool = Place m!: 10.0
2769
- \end_layout
2770
-
2771
- \begin_layout LyX-Code
2772
- DeoxyTMP = Place m!: 50.0
2773
- \end_layout
2774
-
2775
- \begin_layout LyX-Code
2776
- DeoxyTDP_DeoxyTTP_pool = Place m!: 100.0
2777
- \end_layout
2778
-
2779
- \begin_layout LyX-Code
2780
- Thymidine = Place m!: 10.0
2781
- \end_layout
2782
-
2783
- \begin_layout Standard
2784
- All the places above have their marking in micromolars.
2785
- The enzyme places below will have their marking in molecules per cell:
2786
- \end_layout
2787
-
2788
- \begin_layout LyX-Code
2789
- TK1 = Place m!: 100_000 / Pieces_per_microM
2790
- \end_layout
2791
-
2792
- \begin_layout LyX-Code
2793
- TYMS = Place m!: 100_000 / Pieces_per_microM
2794
- \end_layout
2795
-
2796
- \begin_layout LyX-Code
2797
- RNR = Place m!: 100_000 / Pieces_per_microM
2798
- \end_layout
2799
-
2800
- \begin_layout LyX-Code
2801
- TMPK = Place m!: 100_000 / Pieces_per_microM
2802
- \end_layout
2803
-
2804
- \begin_layout Standard
2805
- Enzyme molecular weights:
2806
- \end_layout
2807
-
2808
- \begin_layout LyX-Code
2809
- TK1_kDa = 24.8
2810
- \end_layout
2811
-
2812
- \begin_layout LyX-Code
2813
- TYMS_kDa = 66.0
2814
- \end_layout
2815
-
2816
- \begin_layout LyX-Code
2817
- RNR_kDa = 140.0
2818
- \end_layout
2819
-
2820
- \begin_layout LyX-Code
2821
- TMPK_kDa = 50.0
2822
- \end_layout
2823
-
2824
- \begin_layout Standard
2825
- Enzyme specific activities (in
2826
- \emph on
2827
- micromolar
2828
- \emph default
2829
- /
2830
- \emph on
2831
- minute
2832
- \emph default
2833
- /
2834
- \emph on
2835
- mg
2836
- \emph default
2837
- ):
2838
- \end_layout
2839
-
2840
- \begin_layout LyX-Code
2841
- TK1_a = 5.40
2842
- \end_layout
2843
-
2844
- \begin_layout LyX-Code
2845
- TYMS_a = 3.80
2846
- \end_layout
2847
-
2848
- \begin_layout LyX-Code
2849
- RNR_a = 1.00
2850
- \end_layout
2851
-
2852
- \begin_layout LyX-Code
2853
- TMPK_a = 0.83
2854
- \end_layout
2855
-
2856
- \begin_layout Standard
2857
- Some species are kept fixed (as simulation-level clamps):
2858
- \end_layout
2859
-
2860
- \begin_layout LyX-Code
2861
-
2862
- \color blue
2863
- clamp
2864
- \color inherit
2865
- AMP: 8695.0, ADP: 6521.0, ATP: 3152.0
2866
- \end_layout
2867
-
2868
- \begin_layout LyX-Code
2869
- clamp DeoxyCytidine: 0.5, DeoxyCTP: 1.0, DeoxyGMP: 1.0
2870
- \end_layout
2871
-
2872
- \begin_layout LyX-Code
2873
- clamp Thymidine: 0.5
2874
- \end_layout
2875
-
2876
- \begin_layout LyX-Code
2877
- clamp UMP_UDP_pool: 2737.0
2878
- \end_layout
2879
-
2880
- \begin_layout Standard
2881
- Before defining transitions, let's define some functions first:
2882
- \end_layout
2883
-
2884
- \begin_layout LyX-Code
2885
- Vmax_per_min_per_enz_molecule =
2886
- \end_layout
2887
-
2888
- \begin_layout LyX-Code
2889
- lambda { |spec_act_microM_per_min_per_mg, kDa|
2890
- \end_layout
2891
-
2892
- \begin_layout LyX-Code
2893
- spec_act_microM_per_min_per_mg * kDa }
2894
- \end_layout
2895
-
2896
- \begin_layout LyX-Code
2897
- Vmax_per_min =
2898
- \end_layout
2899
-
2900
- \begin_layout LyX-Code
2901
- lambda { |spec_act, kDa, enz_molecules_per_cell|
2902
- \end_layout
2903
-
2904
- \begin_layout LyX-Code
2905
- Vmax_per_min_per_enz_molecule.( spec_act, kDa ) *
2906
- \end_layout
2907
-
2908
- \begin_layout LyX-Code
2909
- enz_molecules_per_cell }
2910
- \end_layout
2911
-
2912
- \begin_layout LyX-Code
2913
- Vmax_per_s =
2914
- \end_layout
2915
-
2916
- \begin_layout LyX-Code
2917
- lambda { |spec_act, kDa, enz_mol_per_cell|
2918
- \end_layout
2919
-
2920
- \begin_layout LyX-Code
2921
- Vmax_per_min.( spec_act, kDa, enz_mol_per_cell ) / 60 }
2922
- \end_layout
2923
-
2924
- \begin_layout LyX-Code
2925
- Km_reduced =
2926
- \end_layout
2927
-
2928
- \begin_layout LyX-Code
2929
- lambda { |km, ki_hash={}|
2930
- \end_layout
2931
-
2932
- \begin_layout LyX-Code
2933
- ki_hash.map { |c, ki| c / ki }.reduce( 1, :+ ) * km }
2934
- \end_layout
2935
-
2936
- \begin_layout LyX-Code
2937
- Occupancy =
2938
- \end_layout
2939
-
2940
- \begin_layout LyX-Code
2941
- lambda { |c, km, compet_inh_w_Ki_hash={}|
2942
- \end_layout
2943
-
2944
- \begin_layout LyX-Code
2945
- c / ( c + Km_reduced.( km, compet_inh_w_Ki_hash ) ) }
2946
- \end_layout
2947
-
2948
- \begin_layout LyX-Code
2949
- MM_with_inh_microM_per_second =
2950
- \end_layout
2951
-
2952
- \begin_layout LyX-Code
2953
- lambda { |c, spec_act, kDa, enz_mol_per_cell, km, ki_hash={}|
2954
- \end_layout
2955
-
2956
- \begin_layout LyX-Code
2957
- Vmax_per_s.( spec_act, kDa, enz_mol_per_cell ) *
2958
- \end_layout
2959
-
2960
- \begin_layout LyX-Code
2961
- Occupancy.( c, km, ki_hash ) }
2962
- \end_layout
2963
-
2964
- \begin_layout LyX-Code
2965
- MMi = MM_with_inh_microM_per_second
2966
- \end_layout
2967
-
2968
- \begin_layout Standard
2969
- Michaelis constants:
2970
- \end_layout
2971
-
2972
- \begin_layout LyX-Code
2973
- TK1_Thymidine_Km = 5.0
2974
- \end_layout
2975
-
2976
- \begin_layout LyX-Code
2977
- TYMS_DeoxyUMP_Km = 2.0
2978
- \end_layout
2979
-
2980
- \begin_layout LyX-Code
2981
- RNR_UDP_Km = 1.0
2982
- \end_layout
2983
-
2984
- \begin_layout LyX-Code
2985
- DNA_creation_speed = 3_000_000_000 / ( 12 * 3600 )
2986
- \end_layout
2987
-
2988
- \begin_layout LyX-Code
2989
- TMPK_DeoxyTMP_Km = 12.0
2990
- \end_layout
2991
-
2992
- \begin_layout Standard
2993
- And finally, let us define the transitions:
2994
- \end_layout
2995
-
2996
- \begin_layout LyX-Code
2997
- Transition name: :TK1_Thymidine_DeoxyTMP,
2998
- \end_layout
2999
-
3000
- \begin_layout LyX-Code
3001
-
3002
- \color blue
3003
- domain:
3004
- \color inherit
3005
- [ Thymidine, TK1, DeoxyTDP_DeoxyTTP_pool, DeoxyCTP,
3006
- \end_layout
3007
-
3008
- \begin_layout LyX-Code
3009
- DeoxyCytidine, AMP, ADP, ATP ],
3010
- \end_layout
3011
-
3012
- \begin_layout LyX-Code
3013
- stoichiometry: { Thymidine: -1, DeoxyTMP: 1 },
3014
- \end_layout
3015
-
3016
- \begin_layout LyX-Code
3017
- rate: proc { |c, e, pool1, ci2, ci3, master1, master2, master3|
3018
- \end_layout
3019
-
3020
- \begin_layout LyX-Code
3021
- ci1 = pool1 * master3 / ( master2 + master3 )
3022
- \end_layout
3023
-
3024
- \begin_layout LyX-Code
3025
- MMi.( c, TK1_a, TK1_kDa, e, TK1_Thymidine_Km,
3026
- \end_layout
3027
-
3028
- \begin_layout LyX-Code
3029
- ci1 => 13.5, ci2 => 0.8, ci3 => 40.0 ) }
3030
- \end_layout
3031
-
3032
- \begin_layout LyX-Code
3033
-
3034
- \end_layout
3035
-
3036
- \begin_layout LyX-Code
3037
- Transition name: :TYMS_DeoxyUMP_DeoxyTMP,
3038
- \end_layout
3039
-
3040
- \begin_layout LyX-Code
3041
- domain: [ DeoxyUMP_DeoxyUDP_pool, TYMS, AMP, ADP, ATP ],
3042
- \end_layout
3043
-
3044
- \begin_layout LyX-Code
3045
- stoichiometry: { DeoxyUMP_DeoxyUDP_pool: -1, DeoxyTMP: 1 },
3046
- \end_layout
3047
-
3048
- \begin_layout LyX-Code
3049
- rate: proc { |pool, e, mono, di, tri|
3050
- \end_layout
3051
-
3052
- \begin_layout LyX-Code
3053
- c = pool * di / ( mono + di )
3054
- \end_layout
3055
-
3056
- \begin_layout LyX-Code
3057
- MMi.( c, TYMS_a, TYMS_kDa, e, TYMS_DeoxyUMP_Km
3058
- ) }
3059
- \end_layout
3060
-
3061
- \begin_layout LyX-Code
3062
-
3063
- \end_layout
3064
-
3065
- \begin_layout LyX-Code
3066
- Transition name: :RNR_UDP_DeoxyUDP,
3067
- \end_layout
3068
-
3069
- \begin_layout LyX-Code
3070
- domain: [ UMP_UDP_pool, RNR, DeoxyUMP_DeoxyUDP_pool, AMP, ADP,
3071
- ATP ],
3072
- \end_layout
3073
-
3074
- \begin_layout LyX-Code
3075
- stoichiometry: { UMP_UDP_pool: -1, DeoxyUMP_DeoxyUDP_pool: 1
3076
- },
3077
- \end_layout
3078
-
3079
- \begin_layout LyX-Code
3080
- rate: proc { |pool, e, mono, di, tri|
3081
- \end_layout
3082
-
3083
- \begin_layout LyX-Code
3084
- c = pool * di / ( mono + di )
3085
- \end_layout
3086
-
3087
- \begin_layout LyX-Code
3088
- MMi.( c, RNR_a, RNR_kDa, e, RNR_UDP_Km ) }
3089
- \end_layout
3090
-
3091
- \begin_layout LyX-Code
3092
-
3093
- \end_layout
3094
-
3095
- \begin_layout LyX-Code
3096
- Transition name: :DNA_polymerase_consumption_of_DeoxyTTP,
3097
- \end_layout
3098
-
3099
- \begin_layout LyX-Code
3100
- stoichiometry: { DeoxyTDP_DeoxyTTP_pool: -1 },
3101
- \end_layout
3102
-
3103
- \begin_layout LyX-Code
3104
- rate: proc { DNA_creation_speed / 4 }
3105
- \end_layout
3106
-
3107
- \begin_layout LyX-Code
3108
-
3109
- \end_layout
3110
-
3111
- \begin_layout LyX-Code
3112
- Transition name: :TMPK_DeoxyTMP_DeoxyTDP,
3113
- \end_layout
3114
-
3115
- \begin_layout LyX-Code
3116
- domain: [ DeoxyTMP, TMPK, DeoxyTDP_DeoxyTTP_pool, DeoxyGMP, AMP,
3117
- ADP, ATP ],
3118
- \end_layout
3119
-
3120
- \begin_layout LyX-Code
3121
- stoichiometry: { DeoxyTMP: -1, TMPK: 0, DeoxyTDP_DeoxyTTP_pool:
3122
- 1 },
3123
- \end_layout
3124
-
3125
- \begin_layout LyX-Code
3126
- rate: proc { |c, e, pool, ci4, mono, di, tri|
3127
- \end_layout
3128
-
3129
- \begin_layout LyX-Code
3130
- ci1 = di
3131
- \end_layout
3132
-
3133
- \begin_layout LyX-Code
3134
- ci2 = pool * di / ( di + tri )
3135
- \end_layout
3136
-
3137
- \begin_layout LyX-Code
3138
- ci3 = pool * tri / ( di + tri )
3139
- \end_layout
3140
-
3141
- \begin_layout LyX-Code
3142
- MMi.( c, TMPK_a, TMPK_kDa, e, TMPK_DeoxyTMP_Km,
3143
- \end_layout
3144
-
3145
- \begin_layout LyX-Code
3146
- ci1 => 250.0, ci2 => 30.0, ci3 => 750, ci4 =>
3147
- 117 ) }
3148
- \end_layout
3149
-
3150
- \begin_layout LyX-Code
3151
-
3152
- \end_layout
3153
-
3154
- \begin_layout LyX-Code
3155
- Transition name: :PhosphataseI,
3156
- \end_layout
3157
-
3158
- \begin_layout LyX-Code
3159
- stoichiometry: { DeoxyTMP: -1, Thymidine: 1 },
3160
- \end_layout
3161
-
3162
- \begin_layout LyX-Code
3163
- rate: 0.04
3164
- \end_layout
3165
-
3166
- \begin_layout LyX-Code
3167
-
3168
- \end_layout
3169
-
3170
- \begin_layout LyX-Code
3171
- Transition name: :PhosphataseII,
3172
- \end_layout
3173
-
3174
- \begin_layout LyX-Code
3175
- stoichiometry: { DeoxyTDP_DeoxyTTP_pool: -1, DeoxyTMP: 1 },
3176
- \end_layout
3177
-
3178
- \begin_layout LyX-Code
3179
- rate: 0.01
3180
- \end_layout
3181
-
3182
- \begin_layout Standard
3183
- The created net can be visualized by:
3184
- \end_layout
3185
-
3186
- \begin_layout LyX-Code
3187
- net.visualize
3188
- \end_layout
3189
-
3190
- \begin_layout Standard
3191
- The simulation should work.
3192
- \end_layout
3193
-
3194
- \begin_layout LyX-Code
3195
- run!
3196
- \end_layout
3197
-
3198
- \begin_layout Standard
3199
- State recording can be plotted by:
3200
- \end_layout
3201
-
3202
- \begin_layout LyX-Code
3203
- recording.plot
3204
- \end_layout
3205
-
3206
- \begin_layout Standard
3207
- Flux of the transitions can be plotted by:
3208
- \end_layout
3209
-
3210
- \begin_layout LyX-Code
3211
- recording.flux.plot
3212
- \end_layout
3213
-
3214
- \begin_layout Standard
3215
- Please note that although this system qualitatively represents part of the
3216
- deoxynucleotide metabolism network, its behavior is not realistic, because
3217
- the available kinetic constants are not precise.
3218
- \end_layout
3219
-
3220
- \begin_layout Part*
3221
- Example V: Using SY.
3222
- \end_layout
3223
-
3224
- \begin_layout Standard
3225
- Here, we'll take a look at using
3226
- \family typewriter
3227
- YNelson
3228
- \family default
3229
- with
3230
- \family typewriter
3231
- \color blue
3232
- SY
3233
- \family default
3234
- metrology library
3235
- \color inherit
3236
- .
3237
- If you are experienced with biochemical modeling, then you surely know
3238
- how big pain the physical units are.
3239
- Also, in
3240
- \series bold
3241
- Example III
3242
- \series default
3243
- , you might have noticed how much attention has been spent on units (in
3244
- the assumptions, variable names, constant names...) You could have noticed
3245
- messy unit conversion formulas.
3246
- The aim of
3247
- \family typewriter
3248
- SY
3249
- \family default
3250
- is to take care of all this, to relieve the modeler from the task of unit
3251
- conversion, to clean up the model code, and let the modeler concentrate
3252
- on the real issue.
3253
- \end_layout
3254
-
3255
- \begin_layout Subsection*
3256
-
3257
- \family typewriter
3258
- SY
3259
- \family default
3260
- metrology library
3261
- \end_layout
3262
-
3263
- \begin_layout Standard
3264
-
3265
- \family typewriter
3266
- SY
3267
- \family default
3268
- is publicly available as a Ruby gem '
3269
- \family typewriter
3270
- sy
3271
- \family default
3272
- '.
3273
- After installing it (
3274
- \family typewriter
3275
- gem install sy
3276
- \family default
3277
- ), type:
3278
- \end_layout
3279
-
3280
- \begin_layout LyX-Code
3281
- require 'sy'
3282
- \end_layout
3283
-
3284
- \begin_layout Standard
3285
- Afterwards, your
3286
- \family typewriter
3287
- \color red
3288
- Numeric
3289
- \family default
3290
- \color inherit
3291
- objects (that is, numbers) should respond to methods representing physical
3292
- units:
3293
- \end_layout
3294
-
3295
- \begin_layout LyX-Code
3296
- 1.m #=> #<±Magnitude: 1.m>
3297
- \end_layout
3298
-
3299
- \begin_layout LyX-Code
3300
- 1.s #=> #<±Magnitude: 1.s>
3301
- \end_layout
3302
-
3303
- \begin_layout LyX-Code
3304
- 1.kg.m.s(-2) #=> #<±Magnitude: 1.N>
3305
- \end_layout
3306
-
3307
- \begin_layout LyX-Code
3308
- 1.cm + 1.mm #=> #<±Magnitude: 0.011.m>
3309
- \end_layout
3310
-
3311
- \begin_layout Standard
3312
- The core of the trick is that instead of naked numbers, numbers become magnitude
3313
- s (
3314
- \family typewriter
3315
- SY::Magnitude
3316
- \family default
3317
- ) of specified physical quantities:
3318
- \end_layout
3319
-
3320
- \begin_layout LyX-Code
3321
- 1.m.quantity #=> #<Quantity:Length>
3322
- \end_layout
3323
-
3324
- \begin_layout LyX-Code
3325
- 1.cm.min⁻¹.quantity #=> #<Quantity:Speed>
3326
- \end_layout
3327
-
3328
- \begin_layout Standard
3329
- (You can type
3330
- \family typewriter
3331
- 1.cm.min(-1)
3332
- \family default
3333
- if you find it difficult to type Unicode superscript characters "
3334
- \family typewriter
3335
- ⁻¹
3336
- \family default
3337
- ".) Magnitudes can be converted back to numbers with
3338
- \family typewriter
3339
- \color blue
3340
- amount
3341
- \family default
3342
- \color inherit
3343
- (alias
3344
- \family typewriter
3345
- \color blue
3346
- to_f)
3347
- \family default
3348
- \color inherit
3349
- method:
3350
- \end_layout
3351
-
3352
- \begin_layout LyX-Code
3353
- 1.km.amount #=> 1000.0
3354
- \end_layout
3355
-
3356
- \begin_layout LyX-Code
3357
- 1.cm.to_f #=> 0.01
3358
- \end_layout
3359
-
3360
- \begin_layout Subsection*
3361
- Collaboration between
3362
- \family typewriter
3363
- SY
3364
- \family default
3365
- and
3366
- \family typewriter
3367
- YNelson
3368
- \end_layout
3369
-
3370
- \begin_layout Standard
3371
- In a fresh
3372
- \family typewriter
3373
- irb
3374
- \family default
3375
- session, enter:
3376
- \end_layout
3377
-
3378
- \begin_layout LyX-Code
3379
- require 'sy'
3380
- \end_layout
3381
-
3382
- \begin_layout LyX-Code
3383
- require 'y_nelson'
3384
- \end_layout
3385
-
3386
- \begin_layout LyX-Code
3387
- include YNelson
3388
- \end_layout
3389
-
3390
- \begin_layout LyX-Code
3391
- A = Place m!: 3.mM
3392
- \end_layout
3393
-
3394
- \begin_layout LyX-Code
3395
- B = Place m!: 4.mM
3396
- \end_layout
3397
-
3398
- \begin_layout LyX-Code
3399
- A2B = Transition s: { A: -1, B: 1 }, rate: 0.05.s⁻¹
3400
- \end_layout
3401
-
3402
- \begin_layout LyX-Code
3403
- B_decay = Transition s: { B: -1 }, rate: 0.002.s⁻¹
3404
- \end_layout
3405
-
3406
- \begin_layout Standard
3407
- We hereby specified marking and rate in physical units.
3408
- Presently,
3409
- \family typewriter
3410
- YNelson
3411
- \family default
3412
- is not able to simulate such nets, but we can play token game with it:
3413
- \end_layout
3414
-
3415
- \begin_layout LyX-Code
3416
- net.m #=> [#<±Magnitude: 0.003.M>, #<±Magnitude: 0.004.M>]
3417
- \end_layout
3418
-
3419
- \begin_layout LyX-Code
3420
- A2B.fire! 1.s
3421
- \end_layout
3422
-
3423
- \begin_layout LyX-Code
3424
- B_decay.fire! 1.s
3425
- \end_layout
3426
-
3427
- \begin_layout LyX-Code
3428
- net.m #=> [#<±Magnitude: 0.00285.M>, #<±Magnitude: 0.00414.M>]
3429
- \end_layout
3430
-
3431
- \begin_layout Standard
3432
- Let us fire the 2 defined transitions for 100 seconds:
3433
- \end_layout
3434
-
3435
- \begin_layout LyX-Code
3436
- 100.times do
3437
- \end_layout
3438
-
3439
- \begin_layout LyX-Code
3440
- A2B.fire! 1.s
3441
- \end_layout
3442
-
3443
- \begin_layout LyX-Code
3444
- B_decay.fire! 1.s
3445
- \end_layout
3446
-
3447
- \begin_layout LyX-Code
3448
- end
3449
- \end_layout
3450
-
3451
- \begin_layout LyX-Code
3452
- net.m #=> [#<±Magnitude: 1.69e-05.M>, #<±Magnitude: 0.0058.M>]
3453
- \end_layout
3454
-
3455
- \begin_layout Standard
3456
- Finally, let us inspect the resulting marking of
3457
- \family typewriter
3458
- A
3459
- \family default
3460
- and
3461
- \family typewriter
3462
- B
3463
- \family default
3464
- expressed in micromolars:
3465
- \end_layout
3466
-
3467
- \begin_layout LyX-Code
3468
- A.marking.
3469
- \color blue
3470
- in
3471
- \color inherit
3472
- :µM #=> 16.873508277951963
3473
- \end_layout
3474
-
3475
- \begin_layout LyX-Code
3476
- B.marking.in :µM #=> 5797.976678013365
3477
- \end_layout
3478
-
3479
- \begin_layout Part*
3480
- Example VI: Other simulation methods
3481
- \end_layout
3482
-
3483
- \begin_layout Standard
3484
- At this moment, the default simulation method
3485
- \family typewriter
3486
- basic
3487
- \family default
3488
- method.
3489
- This method is also called is implicit Euler, because when simulating timed
3490
- nets, it implies first-order Euler method.
3491
- For timed nets, YNelson provides two other methods: Runge-Kutta 4th order
3492
- method and Gillespie stochastic method.
3493
- Demonstrating Gillespie method:
3494
- \end_layout
3495
-
3496
- \begin_layout LyX-Code
3497
- require 'y_nelson'
3498
- \end_layout
3499
-
3500
- \begin_layout LyX-Code
3501
- include YNelson
3502
- \end_layout
3503
-
3504
- \begin_layout LyX-Code
3505
-
3506
- \end_layout
3507
-
3508
- \begin_layout LyX-Code
3509
- A = Place m!: 10
3510
- \end_layout
3511
-
3512
- \begin_layout LyX-Code
3513
- B = Place m!: 10
3514
- \end_layout
3515
-
3516
- \begin_layout LyX-Code
3517
- AB = Place m!: 0
3518
- \end_layout
3519
-
3520
- \begin_layout LyX-Code
3521
- AB_association = TS A: -1, B: -1, AB: 1, rate: 0.1
3522
- \end_layout
3523
-
3524
- \begin_layout LyX-Code
3525
- AB_dissociation = TS AB: -1, A: 1, B: 1, rate: 0.1
3526
- \end_layout
3527
-
3528
- \begin_layout LyX-Code
3529
- A2B = TS A: -1, B: 1, rate: 0.05
3530
- \end_layout
3531
-
3532
- \begin_layout LyX-Code
3533
- B2A = TS A: 1, B: -1, rate: 0.07
3534
- \end_layout
3535
-
3536
- \begin_layout LyX-Code
3537
-
3538
- \end_layout
3539
-
3540
- \begin_layout LyX-Code
3541
- set_step 1
3542
- \end_layout
3543
-
3544
- \begin_layout LyX-Code
3545
- set_target_time 50
3546
- \end_layout
3547
-
3548
- \begin_layout LyX-Code
3549
- set_sampling 1
3550
- \end_layout
3551
-
3552
- \begin_layout LyX-Code
3553
- set_simulation_method :gillespie
3554
- \end_layout
3555
-
3556
- \begin_layout LyX-Code
3557
-
3558
- \end_layout
3559
-
3560
- \begin_layout LyX-Code
3561
- run!
3562
- \end_layout
3563
-
3564
- \begin_layout LyX-Code
3565
- print_recording
3566
- \end_layout
3567
-
3568
- \begin_layout LyX-Code
3569
- plot_state
3570
- \end_layout
3571
-
3572
- \begin_layout Standard
3573
- The state recording should show a random walk of the system state over the
3574
- period of 50 time units.
3575
- \end_layout
3576
-
3577
- \begin_layout LyX-Code
3578
-
3579
- \end_layout
3580
-
3581
- \begin_layout LyX-Code
3582
- \begin_inset CommandInset bibtex
3583
- LatexCommand bibtex
3584
- bibfiles "/home/boris/b/8oav/ptn/ptn"
3585
- options "plainnat"
3586
-
3587
- \end_inset
3588
-
3589
-
3590
- \end_layout
3591
-
3592
- \end_body
3593
- \end_document