y_nelson 2.3.7 → 2.3.8

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.
@@ -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