y_nelson 2.0.6 → 2.0.7

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.
@@ -0,0 +1,2766 @@
1
+ #LyX 2.0 created this file. For more info see http://www.lyx.org/
2
+ \lyxformat 413
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_default_family default
16
+ \use_non_tex_fonts false
17
+ \font_sc false
18
+ \font_osf false
19
+ \font_sf_scale 100
20
+ \font_tt_scale 100
21
+
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_amsmath 1
33
+ \use_esint 1
34
+ \use_mhchem 1
35
+ \use_mathdots 1
36
+ \cite_engine natbib_authoryear
37
+ \use_bibtopic false
38
+ \use_indices false
39
+ \paperorientation portrait
40
+ \suppress_date false
41
+ \use_refstyle 0
42
+ \index Index
43
+ \shortcut idx
44
+ \color #008000
45
+ \end_index
46
+ \leftmargin 2.2cm
47
+ \topmargin 3cm
48
+ \rightmargin 2.2cm
49
+ \bottommargin 3cm
50
+ \secnumdepth 3
51
+ \tocdepth 3
52
+ \paragraph_separation indent
53
+ \paragraph_indentation default
54
+ \quotes_language english
55
+ \papercolumns 1
56
+ \papersides 1
57
+ \paperpagestyle default
58
+ \tracking_changes false
59
+ \output_changes false
60
+ \html_math_output 0
61
+ \html_css_as_file 0
62
+ \html_be_strict false
63
+ \end_header
64
+
65
+ \begin_body
66
+
67
+ \begin_layout Title
68
+ Hands-on Guide to YPetri
69
+ \end_layout
70
+
71
+ \begin_layout Part*
72
+ Introduction
73
+ \end_layout
74
+
75
+ \begin_layout Standard
76
+ This document is a hands-on guide to
77
+ \family typewriter
78
+ \color blue
79
+ YPetri
80
+ \family default
81
+ \color inherit
82
+ ,
83
+ \emph on
84
+ \color green
85
+ Petri nets
86
+ \emph default
87
+ \color inherit
88
+ and
89
+ \color red
90
+ Ruby
91
+ \color inherit
92
+ .
93
+ It is not assumed that the reader is familiar with any of these, though
94
+ such familiarity would be an advantage.
95
+ If you follow this guide closely, you will receive a concise and efficient
96
+ introduction to each of these three.
97
+ Newly introduced
98
+ \color red
99
+ Ruby keywords and terms
100
+ \color inherit
101
+ are highlighted in red,
102
+ \color green
103
+ Petri net terms
104
+ \color inherit
105
+ in green, and
106
+ \color blue
107
+ YPetri keywords and terms
108
+ \color inherit
109
+ in blue throughout this document.
110
+ \end_layout
111
+
112
+ \begin_layout Standard
113
+
114
+ \family typewriter
115
+ \color blue
116
+ YPetri
117
+ \family default
118
+ \color inherit
119
+ is a domain model and a simulator of
120
+ \emph on
121
+ \color green
122
+ functional
123
+ \emph default
124
+
125
+ \emph on
126
+ Petri nets
127
+ \emph default
128
+ \color inherit
129
+ similar, but not identical with
130
+ \emph on
131
+ \color green
132
+ hybrid functional Petri nets
133
+ \emph default
134
+ (HFPNs)
135
+ \color inherit
136
+ introduced by
137
+ \begin_inset CommandInset citation
138
+ LatexCommand citet
139
+ key "Matsuno2011brs"
140
+
141
+ \end_inset
142
+
143
+ .
144
+ For a recent review of the various flavors of Petri nets, see eg.
145
+
146
+ \begin_inset CommandInset citation
147
+ LatexCommand citet
148
+ key "Bos2008mbs"
149
+
150
+ \end_inset
151
+
152
+ .
153
+
154
+ \family typewriter
155
+ YPetri
156
+ \family default
157
+ is implemented in
158
+ \emph on
159
+ \color red
160
+ Ruby programming language
161
+ \emph default
162
+ \color inherit
163
+ .
164
+ It will be publicly available as
165
+ \emph on
166
+ \color blue
167
+ y_petri
168
+ \emph default
169
+ \color inherit
170
+ gem.
171
+
172
+ \family typewriter
173
+ YPetri
174
+ \family default
175
+ is the first in the series of Ruby gems (
176
+ \family typewriter
177
+ YPetri
178
+ \family default
179
+ ,
180
+ \family typewriter
181
+ \color blue
182
+ YCell
183
+ \family default
184
+ \color inherit
185
+ ,
186
+ \family typewriter
187
+ \color blue
188
+ YChem
189
+ \family default
190
+ \color inherit
191
+ , metrology library
192
+ \family typewriter
193
+ \color blue
194
+ SY
195
+ \family default
196
+ \color inherit
197
+ ) intended to bring ergonomy to biochemical modeling.
198
+ Note that
199
+ \family typewriter
200
+ YPetri
201
+ \family default
202
+ does not depend on these, though it can be used together with
203
+ \family typewriter
204
+ SY
205
+ \family default
206
+ if desired.
207
+ Also,
208
+ \family typewriter
209
+ YPetri
210
+ \family default
211
+ is a general purpose simulator not limited to biochemistry.
212
+ \end_layout
213
+
214
+ \begin_layout Standard
215
+
216
+ \family typewriter
217
+ YPetri
218
+ \family default
219
+ provides a
220
+ \emph on
221
+ \color red
222
+ domain-specific language
223
+ \emph default
224
+ (DSL)
225
+ \color inherit
226
+ , which you can access eg.
227
+ from
228
+ \color red
229
+ inferior Ruby interpreter (
230
+ \emph on
231
+ irb
232
+ \emph default
233
+ )
234
+ \color inherit
235
+ .
236
+ DSLs can be thought of as APIs with user-friendly syntax.
237
+ As a believer in robot equality, I dislike the distinction between API
238
+ and UI (user interface), and prefer common textual command interface (CI)
239
+ for humanoid as well as cybernetic users.
240
+ \end_layout
241
+
242
+ \begin_layout Standard
243
+ And why bother learning Ruby syntax and
244
+ \family typewriter
245
+ YPetri
246
+ \family default
247
+ ? Half-jokingly,
248
+ \family typewriter
249
+ YPetri
250
+ \family default
251
+ is
252
+ \emph on
253
+ The Simplest Way To Work With Complicated Petri Nets
254
+ \emph default
255
+ ™.
256
+ Petri net software at higher development stage, or written for a different
257
+ purpose than
258
+ \family typewriter
259
+ YPetri
260
+ \family default
261
+ , does exist.
262
+ But none of the programs written for the same purpose as
263
+ \family typewriter
264
+ YPetri
265
+ \family default
266
+ can avoid taking the user through the same learning process as
267
+ \family typewriter
268
+ YPetri
269
+ \family default
270
+ does.
271
+ There are programs, that make handling of very simple Petri nets seem easier
272
+ than learning
273
+ \family typewriter
274
+ YPetri
275
+ \family default
276
+ , but this ease is skin-deep, and you will realize it once your models get
277
+ less simple.
278
+ And if you are serious about modelling, you can bet they will.
279
+ \end_layout
280
+
281
+ \begin_layout Part*
282
+ Using This Guide, or
283
+ \begin_inset Quotes eld
284
+ \end_inset
285
+
286
+ The Hard Way Is Easier
287
+ \begin_inset Quotes erd
288
+ \end_inset
289
+
290
+
291
+ \end_layout
292
+
293
+ \begin_layout Standard
294
+ The phrase above is borrowed from the textbook by Zed Shaw named
295
+ \begin_inset Quotes erd
296
+ \end_inset
297
+
298
+
299
+ \emph on
300
+ Learn Ruby the Hard Way
301
+ \emph default
302
+
303
+ \begin_inset Quotes eld
304
+ \end_inset
305
+
306
+ .
307
+ Apart from being a great shark-jumper, Zed is a great teacher familiar
308
+ with many programming languages, and I will borrow his teaching method
309
+ here.
310
+ Citing Zed,
311
+ \begin_inset Quotes eld
312
+ \end_inset
313
+
314
+ The title says it's the hard way...
315
+ but actually it's not.
316
+ \begin_inset Quotes erd
317
+ \end_inset
318
+
319
+ It's only
320
+ \begin_inset Quotes eld
321
+ \end_inset
322
+
323
+ hard
324
+ \begin_inset Quotes erd
325
+ \end_inset
326
+
327
+ because of the way people
328
+ \emph on
329
+ used
330
+ \emph default
331
+ to teach things.
332
+
333
+ \family typewriter
334
+ YPetri
335
+ \family default
336
+ is a language.
337
+ To learn it and see its usefulness, you will still need to do the incredibly
338
+ simple things that all language learners do:
339
+ \end_layout
340
+
341
+ \begin_layout Enumerate
342
+ Go through each example.
343
+ \end_layout
344
+
345
+ \begin_layout Enumerate
346
+ Type each sample code exactly.
347
+ \end_layout
348
+
349
+ \begin_layout Enumerate
350
+ Make it run.
351
+ \end_layout
352
+
353
+ \begin_layout Standard
354
+ \noindent
355
+ That's it.
356
+ This might feel
357
+ \emph on
358
+ very
359
+ \emph default
360
+ difficult at first, but stick with it.
361
+ It seems stupidly obvious, but, if you have a problem installing
362
+ \family typewriter
363
+ YPetri
364
+ \family default
365
+ , running
366
+ \emph on
367
+ irb
368
+ \emph default
369
+ and typing, you will have a problem learning.
370
+ If you go through this document without actually doing the exercises, you
371
+ might as well just not even read it.
372
+ Do not skip and do not skim.
373
+ By typing each example
374
+ \emph on
375
+ exactly
376
+ \emph default
377
+ , you will be training your brain to focus on the details of what you are
378
+ doing, as you are doing it.
379
+ While you do these examples, typing each one in, you will be making mistakes.
380
+ It's inevitable; humans do make mistakes.
381
+ By doing so, you will train yourself to notice mistakes and other problems.
382
+ Do not copy-paste.
383
+ Type each code sample in, manually.
384
+ The point is to train your hands, your brain, and your mind in how to read,
385
+ write and see Ruby and
386
+ \family typewriter
387
+ YPetri
388
+ \family default
389
+ code.
390
+ If you skip, skim and copy-paste, you are cheating yourself out of the
391
+ effectiveness of this guide.
392
+ \end_layout
393
+
394
+ \begin_layout Part*
395
+ Prerequisites
396
+ \end_layout
397
+
398
+ \begin_layout Standard
399
+
400
+ \family typewriter
401
+ YPetri
402
+ \family default
403
+ is currently in alpha stage and its installation is not covered in this
404
+ document.
405
+ As a prerequisite, you will need a working installation of Ruby 1.9 on your
406
+ computer.
407
+ If you have installed
408
+ \family typewriter
409
+ YPetri
410
+ \family default
411
+ as
412
+ \emph on
413
+ y_petri
414
+ \emph default
415
+ gem, then simply run
416
+ \emph on
417
+ irb
418
+ \emph default
419
+ and once inside, type:
420
+ \end_layout
421
+
422
+ \begin_layout LyX-Code
423
+
424
+ \color red
425
+ require
426
+ \color inherit
427
+ 'y_petri'
428
+ \end_layout
429
+
430
+ \begin_layout Standard
431
+ After succesful
432
+ \family typewriter
433
+ require
434
+ \family default
435
+ , type:
436
+ \end_layout
437
+
438
+ \begin_layout LyX-Code
439
+
440
+ \color red
441
+ include
442
+ \color inherit
443
+ YPetri
444
+ \end_layout
445
+
446
+ \begin_layout Standard
447
+ This will augment your irb command session with interactive
448
+ \family typewriter
449
+ YPetri
450
+ \family default
451
+ command interface (
452
+ \family typewriter
453
+ YPetri
454
+ \family default
455
+ DSL CI).
456
+ You have to re-run
457
+ \emph on
458
+ irb
459
+ \emph default
460
+ from the scratch, and re-type '
461
+ \family typewriter
462
+ require
463
+ \family default
464
+ ' and '
465
+ \family typewriter
466
+ include
467
+ \family default
468
+ ' statements before each of the usage examples written below.
469
+ Please, also notice that this guide itself is alpha stage, so the actual
470
+
471
+ \family typewriter
472
+ YPetri
473
+ \family default
474
+ version you will be using may somewhat differ from this guide.
475
+ Also, the nucleotide metabolism model in Example 3 is yet to be tuned to
476
+ be realistic.
477
+ If something in this guide does not work, please do not hesitate to notify
478
+ us, we will appreciate your feedback.
479
+ \end_layout
480
+
481
+ \begin_layout Part*
482
+ Example I
483
+ \end_layout
484
+
485
+ \begin_layout Standard
486
+ This example is a gentle introduction to Petri net terminology,
487
+ \family typewriter
488
+ YPetri
489
+ \family default
490
+ DSL terminology, and Ruby syntax.
491
+ The most basic capability that
492
+ \family typewriter
493
+ YPetri
494
+ \family default
495
+ offers is that of user-driven
496
+ \emph on
497
+ \color green
498
+ token game
499
+ \emph default
500
+ \color inherit
501
+ .
502
+ We will thus create a small Petri net containing 2
503
+ \emph on
504
+ \color green
505
+ places
506
+ \emph default
507
+ \color inherit
508
+ and play token game with it.
509
+ \end_layout
510
+
511
+ \begin_layout Subsection*
512
+ Places
513
+ \end_layout
514
+
515
+ \begin_layout Standard
516
+ Type:
517
+ \end_layout
518
+
519
+ \begin_layout LyX-Code
520
+ A =
521
+ \color blue
522
+ Place
523
+ \color inherit
524
+ ()
525
+ \end_layout
526
+
527
+ \begin_layout Standard
528
+ Syntactically, this will call
529
+ \emph on
530
+ \color red
531
+ method
532
+ \emph default
533
+ \color inherit
534
+ '
535
+ \family typewriter
536
+ Place
537
+ \family default
538
+ ' of
539
+ \family typewriter
540
+ YPetri
541
+ \family default
542
+ DSL and assign its
543
+ \emph on
544
+ \color red
545
+ return value
546
+ \emph default
547
+ \color inherit
548
+ to the
549
+ \emph on
550
+ \color red
551
+ constant
552
+ \emph default
553
+ \color inherit
554
+
555
+ \family typewriter
556
+ A
557
+ \family default
558
+ .
559
+ In this case, the return value is an
560
+ \emph on
561
+ \color red
562
+ object
563
+ \emph default
564
+ \color inherit
565
+ , which is an
566
+ \emph on
567
+ \color red
568
+ instance
569
+ \emph default
570
+ \color inherit
571
+ of
572
+ \family typewriter
573
+ \color blue
574
+ YPetri::Place
575
+ \family default
576
+ \color inherit
577
+
578
+ \emph on
579
+ \color red
580
+ class
581
+ \emph default
582
+ \color inherit
583
+ .
584
+ We say that
585
+ \family typewriter
586
+ YPetri::Place
587
+ \family default
588
+ class
589
+ \emph on
590
+ \color red
591
+ represents
592
+ \emph default
593
+ \color inherit
594
+ the concept of Petri net places in
595
+ \family typewriter
596
+ YPetri
597
+ \family default
598
+
599
+ \emph on
600
+ domain model
601
+ \emph default
602
+ (and '
603
+ \family typewriter
604
+ Place
605
+ \family default
606
+ ' method is called a
607
+ \emph on
608
+ \color red
609
+ constructor
610
+ \emph default
611
+ \color inherit
612
+ of
613
+ \family typewriter
614
+ YPetri::Place
615
+ \family default
616
+ , which is not important.).
617
+ Whole this object has now been assigned to
618
+ \family typewriter
619
+ A
620
+ \family default
621
+ .
622
+ On the screen, you will see the output:
623
+ \family typewriter
624
+ #<Place: name: A, marking: nil, default_marking: ø>
625
+ \family default
626
+ .
627
+ (This is the
628
+ \emph on
629
+ \color red
630
+ inspect string
631
+ \emph default
632
+ \color inherit
633
+ of the object, created by
634
+ \family typewriter
635
+ YPetri::Place#
636
+ \color red
637
+ inspect
638
+ \family default
639
+ \color inherit
640
+ method, which is not important.) In the following, screen output will always
641
+ be written immediately under the code sample, preceded by sherocket (
642
+ \family typewriter
643
+ #=>):
644
+ \end_layout
645
+
646
+ \begin_layout LyX-Code
647
+ B = Place()
648
+ \end_layout
649
+
650
+ \begin_layout LyX-Code
651
+
652
+ \family typewriter
653
+ #=> #<Place: name: B, marking: nil, default_marking: ø>
654
+ \end_layout
655
+
656
+ \begin_layout Standard
657
+ We have so far defined 2 Petri net places named
658
+ \family typewriter
659
+ A
660
+ \family default
661
+ ,
662
+ \family typewriter
663
+ B
664
+ \family default
665
+ .
666
+ You can check it by typing:
667
+ \end_layout
668
+
669
+ \begin_layout LyX-Code
670
+
671
+ \color blue
672
+ places
673
+ \color inherit
674
+ ()
675
+ \end_layout
676
+
677
+ \begin_layout LyX-Code
678
+ #=> [#<Place: name: A, marking: nil, default_marking: ø>,
679
+ \end_layout
680
+
681
+ \begin_layout LyX-Code
682
+ #<Place: name: B, marking: nil, default_marking: ø>]
683
+ \end_layout
684
+
685
+ \begin_layout LyX-Code
686
+ A.
687
+ \color blue
688
+ name
689
+ \color inherit
690
+ ()
691
+ \end_layout
692
+
693
+ \begin_layout LyX-Code
694
+ #=> :A
695
+ \end_layout
696
+
697
+ \begin_layout Standard
698
+ These have automatically become part of a default Petri net instance (of
699
+
700
+ \family typewriter
701
+ YPetri::Net
702
+ \family default
703
+ class; object id may vary):
704
+ \end_layout
705
+
706
+ \begin_layout LyX-Code
707
+
708
+ \color blue
709
+ net
710
+ \color inherit
711
+ ()
712
+ \end_layout
713
+
714
+ \begin_layout LyX-Code
715
+ #=> #<Net: name: Top, 2 pp, 0 tt >
716
+ \end_layout
717
+
718
+ \begin_layout Standard
719
+ Of course, you have full power of Ruby at your disposal.
720
+ To eg.
721
+ list only place names as strings, you can use standard Ruby methods:
722
+ \end_layout
723
+
724
+ \begin_layout LyX-Code
725
+ places.
726
+ \color red
727
+ map
728
+ \color inherit
729
+ ( &:name )
730
+ \end_layout
731
+
732
+ \begin_layout LyX-Code
733
+ #=> [:A, :B]
734
+ \end_layout
735
+
736
+ \begin_layout Standard
737
+ Here, Ruby
738
+ \family typewriter
739
+ map
740
+ \family default
741
+ method transforms the
742
+ \emph on
743
+ \color red
744
+ array
745
+ \emph default
746
+ \color inherit
747
+ of places to the array of their names.
748
+ The advantage of internal DSLs is, that one retains full power of the language,
749
+ augmented with human-friendly, domain-specific CI.
750
+ GUI systems generally sandbox the user inside their interface, with no
751
+ way to overcome its limitations.
752
+ But let us go on.
753
+ Way above, you might have noticed '
754
+ \family typewriter
755
+ \color red
756
+ nil
757
+ \family default
758
+ \color inherit
759
+ ' in the places' inspect strings.
760
+ This is because we have specified no
761
+ \emph on
762
+ \color green
763
+ marking
764
+ \emph default
765
+ \color inherit
766
+ for
767
+ \family typewriter
768
+ A
769
+ \family default
770
+ ,
771
+ \family typewriter
772
+ B
773
+ \family default
774
+ :
775
+ \end_layout
776
+
777
+ \begin_layout LyX-Code
778
+ A.
779
+ \color blue
780
+ marking
781
+ \color inherit
782
+ ()
783
+ \end_layout
784
+
785
+ \begin_layout LyX-Code
786
+ #=> nil
787
+ \end_layout
788
+
789
+ \begin_layout LyX-Code
790
+ places.map( &:marking )
791
+ \end_layout
792
+
793
+ \begin_layout LyX-Code
794
+ #=> [nil, nil]
795
+ \end_layout
796
+
797
+ \begin_layout Standard
798
+ Let us give these two places some marking:
799
+ \end_layout
800
+
801
+ \begin_layout LyX-Code
802
+ A.
803
+ \color blue
804
+ marking =
805
+ \color inherit
806
+ 2
807
+ \end_layout
808
+
809
+ \begin_layout LyX-Code
810
+ #=> 2
811
+ \end_layout
812
+
813
+ \begin_layout LyX-Code
814
+ B.marking = 5
815
+ \end_layout
816
+
817
+ \begin_layout LyX-Code
818
+ #=> 5
819
+ \end_layout
820
+
821
+ \begin_layout Standard
822
+ The marking has indeed changed:
823
+ \end_layout
824
+
825
+ \begin_layout LyX-Code
826
+ places.map( &:marking )
827
+ \end_layout
828
+
829
+ \begin_layout LyX-Code
830
+ #=> [2, 5]
831
+ \end_layout
832
+
833
+ \begin_layout Standard
834
+ In classical Petri nets, this marking is understood as the number of
835
+ \emph on
836
+ \color green
837
+ tokens
838
+ \emph default
839
+ \color inherit
840
+ in each place, and is always an integer.
841
+ In this case,
842
+ \family typewriter
843
+ A
844
+ \family default
845
+ contains 2 tokens, while
846
+ \family typewriter
847
+ B
848
+ \family default
849
+ contains 5 tokens.
850
+ Tokens can represent anything: molecules, parts in the production line,
851
+ trains in the railway network...
852
+ \end_layout
853
+
854
+ \begin_layout Subsection*
855
+ Transitions
856
+ \end_layout
857
+
858
+ \begin_layout Standard
859
+ The behavior of a Petri net is defined by
860
+ \emph on
861
+ \color green
862
+ transitions
863
+ \emph default
864
+ \color inherit
865
+ .
866
+ Each transition defines a single operation: Adding / subtracting some amount
867
+ of tokens to / from some places.
868
+ Transition operation can often be expressed by the transition's
869
+ \emph on
870
+ stoichiometry
871
+ \emph default
872
+ – a list of places together with the number of tokens added / subtracted
873
+ when the transition
874
+ \emph on
875
+ \color green
876
+ fires
877
+ \emph default
878
+ \color inherit
879
+ .
880
+ For example, let us define:
881
+ \end_layout
882
+
883
+ \begin_layout LyX-Code
884
+ A2B =
885
+ \color blue
886
+ Transition
887
+ \color inherit
888
+ ( stoichiometry: { A: -1, B: 1 } )
889
+ \end_layout
890
+
891
+ \begin_layout LyX-Code
892
+ #=> #<Transition: A2B (tS) >
893
+ \end_layout
894
+
895
+ \begin_layout Standard
896
+ Stoichiometry of this transition is given by
897
+ \emph on
898
+ \color red
899
+ hash
900
+ \emph default
901
+ \color inherit
902
+
903
+ \family typewriter
904
+ { A: -1, B: 1 }
905
+ \family default
906
+ .
907
+ This hash is available from
908
+ \family typewriter
909
+ A2B
910
+ \family default
911
+ via '
912
+ \family typewriter
913
+ \color blue
914
+ s
915
+ \family default
916
+ \color inherit
917
+ ' method:
918
+ \end_layout
919
+
920
+ \begin_layout LyX-Code
921
+ A2B.
922
+ \color blue
923
+ s
924
+ \color inherit
925
+ ()
926
+ \end_layout
927
+
928
+ \begin_layout LyX-Code
929
+ #=> {:A=>-1, :B=>1}
930
+ \end_layout
931
+
932
+ \begin_layout Standard
933
+
934
+ \emph on
935
+ \color red
936
+ Keys
937
+ \emph default
938
+ \color inherit
939
+ of this hash are place names,
940
+ \emph on
941
+ \color red
942
+ values
943
+ \emph default
944
+ \color inherit
945
+ are
946
+ \emph on
947
+ \color green
948
+ stoichiometry coefficients
949
+ \emph default
950
+ \color inherit
951
+ .
952
+ ('Stoichiometry' is a word known from the domain of chemistry, but '
953
+ \emph on
954
+ stoicheion
955
+ \emph default
956
+ ' means simply 'element' in Greek, so there is no problem with using it
957
+ in the domain of general Petri nets.) To see the stoichiometry coefficients
958
+ of
959
+ \family typewriter
960
+ A2B
961
+ \family default
962
+ as an array, type:
963
+ \end_layout
964
+
965
+ \begin_layout LyX-Code
966
+ A2B.
967
+ \color blue
968
+ stoichiometry
969
+ \color inherit
970
+ ()
971
+ \end_layout
972
+
973
+ \begin_layout LyX-Code
974
+ #=> [-1, 1]
975
+ \end_layout
976
+
977
+ \begin_layout Standard
978
+ Simply,
979
+ \family typewriter
980
+ A2B
981
+ \family default
982
+ subtracts 1 token from
983
+ \family typewriter
984
+ A
985
+ \family default
986
+ , and adds 1 token to
987
+ \family typewriter
988
+ B
989
+ \family default
990
+ .
991
+ This can represent conversion of
992
+ \family typewriter
993
+ A
994
+ \family default
995
+ to
996
+ \family typewriter
997
+ B
998
+ \family default
999
+ .
1000
+ In classical Petri nets, the arrows connecting places and transitions are
1001
+ called
1002
+ \emph on
1003
+ \color green
1004
+ arcs
1005
+ \emph default
1006
+ \color inherit
1007
+ .
1008
+ (The term was borrowed from graph theory.) For example, at this moment,
1009
+ our Petri net would contain one arc going from
1010
+ \family typewriter
1011
+ A
1012
+ \family default
1013
+ to
1014
+ \family typewriter
1015
+ A2B
1016
+ \family default
1017
+ , and one arc going from
1018
+ \family typewriter
1019
+ A2B
1020
+ \family default
1021
+ to
1022
+ \family typewriter
1023
+ B
1024
+ \family default
1025
+ .
1026
+ In
1027
+ \family typewriter
1028
+ YPetri
1029
+ \family default
1030
+ domain model, 'arcs' are not first-class citizens.
1031
+ The word is understood simply as a synonym for transitions' connectivity
1032
+ – the list of places connected to each transition:
1033
+ \end_layout
1034
+
1035
+ \begin_layout LyX-Code
1036
+ A2B.
1037
+ \color blue
1038
+ arcs
1039
+ \color inherit
1040
+ ()
1041
+ \end_layout
1042
+
1043
+ \begin_layout LyX-Code
1044
+ #=> [#<Place: name: A, marking: 2, default_marking: ø >,
1045
+ \end_layout
1046
+
1047
+ \begin_layout LyX-Code
1048
+ #<Place: name: B, marking: 5, default_marking: ø >]
1049
+ \end_layout
1050
+
1051
+ \begin_layout Standard
1052
+ The transition
1053
+ \family typewriter
1054
+ A2B
1055
+ \family default
1056
+ is
1057
+ \emph on
1058
+ \color blue
1059
+ timeless
1060
+ \emph default
1061
+ \color inherit
1062
+ :
1063
+ \end_layout
1064
+
1065
+ \begin_layout LyX-Code
1066
+ A2B.
1067
+ \color blue
1068
+ timeless?
1069
+ \color inherit
1070
+ ()
1071
+ \end_layout
1072
+
1073
+ \begin_layout LyX-Code
1074
+ #=> true
1075
+ \end_layout
1076
+
1077
+ \begin_layout Standard
1078
+ 'Timeless' means that the transition's firing is not defined in time – it
1079
+ can fire anytime, as long as it is
1080
+ \emph on
1081
+ \color green
1082
+ enabled
1083
+ \emph default
1084
+ \color inherit
1085
+ .
1086
+ Classical Petri nets are timeless.
1087
+ In classical Petri nets, a transition is enabled whenever its
1088
+ \emph on
1089
+ \color blue
1090
+ downstream arcs
1091
+ \emph default
1092
+ \color inherit
1093
+ allow it to happen.
1094
+ Downstream arcs, or
1095
+ \emph on
1096
+ \color blue
1097
+ codomain
1098
+ \emph default
1099
+ \color inherit
1100
+ of a transition (these two are synonyms) are those places, whose marking
1101
+ can be directly affected by the transition's firing.
1102
+ In this case, both
1103
+ \family typewriter
1104
+ A
1105
+ \family default
1106
+ and
1107
+ \family typewriter
1108
+ B
1109
+ \family default
1110
+ is affected:
1111
+ \end_layout
1112
+
1113
+ \begin_layout LyX-Code
1114
+ A2B.
1115
+ \color blue
1116
+ downstream_arcs
1117
+ \color inherit
1118
+ ()
1119
+ \end_layout
1120
+
1121
+ \begin_layout LyX-Code
1122
+ [#<Place: name: A, marking: 2, default_marking: ø>,
1123
+ \end_layout
1124
+
1125
+ \begin_layout LyX-Code
1126
+ #<Place: name: B, marking: 5, default_marking: ø>]
1127
+ \end_layout
1128
+
1129
+ \begin_layout LyX-Code
1130
+ A2B.
1131
+ \color blue
1132
+ codomain
1133
+ \color inherit
1134
+ ()
1135
+ \end_layout
1136
+
1137
+ \begin_layout LyX-Code
1138
+ [#<Place: name: A, marking: 2, default_marking: ø>,
1139
+ \end_layout
1140
+
1141
+ \begin_layout LyX-Code
1142
+ #<Place: name: B, marking: 5, default_marking: ø>]
1143
+ \end_layout
1144
+
1145
+ \begin_layout Standard
1146
+ Since
1147
+ \family typewriter
1148
+ A2B
1149
+ \family default
1150
+ subtracts tokens from
1151
+ \family typewriter
1152
+ A
1153
+ \family default
1154
+ , it will be enabled so long, as there are any tokens left in
1155
+ \family typewriter
1156
+ A
1157
+ \family default
1158
+ .
1159
+ \end_layout
1160
+
1161
+ \begin_layout LyX-Code
1162
+ A2B.
1163
+ \color blue
1164
+ enabled?
1165
+ \color inherit
1166
+ ()
1167
+ \end_layout
1168
+
1169
+ \begin_layout LyX-Code
1170
+ #=> true
1171
+ \end_layout
1172
+
1173
+ \begin_layout Subsection*
1174
+ Token game
1175
+ \end_layout
1176
+
1177
+ \begin_layout Standard
1178
+ After
1179
+ \family typewriter
1180
+ A2B
1181
+ \family default
1182
+ fires, the marking will change:
1183
+ \end_layout
1184
+
1185
+ \begin_layout LyX-Code
1186
+ A2B.
1187
+ \color blue
1188
+ fire!
1189
+ \color inherit
1190
+ ()
1191
+ \end_layout
1192
+
1193
+ \begin_layout LyX-Code
1194
+ #=> nil
1195
+ \end_layout
1196
+
1197
+ \begin_layout LyX-Code
1198
+ places.map( &:marking )
1199
+ \end_layout
1200
+
1201
+ \begin_layout LyX-Code
1202
+ #=> [1, 6]
1203
+ \end_layout
1204
+
1205
+ \begin_layout LyX-Code
1206
+ A2B.fire!()
1207
+ \end_layout
1208
+
1209
+ \begin_layout LyX-Code
1210
+ #=> nil
1211
+ \end_layout
1212
+
1213
+ \begin_layout LyX-Code
1214
+ places.map( &:marking )
1215
+ \end_layout
1216
+
1217
+ \begin_layout LyX-Code
1218
+ #=> [0, 7]
1219
+ \end_layout
1220
+
1221
+ \begin_layout Standard
1222
+ At this point, there are no tokens left in
1223
+ \family typewriter
1224
+ A
1225
+ \family default
1226
+ and
1227
+ \family typewriter
1228
+ A2B
1229
+ \family default
1230
+ becomes
1231
+ \emph on
1232
+ \color green
1233
+ disabled
1234
+ \emph default
1235
+ \color inherit
1236
+ :
1237
+ \end_layout
1238
+
1239
+ \begin_layout LyX-Code
1240
+ A2B.enabled?
1241
+ \end_layout
1242
+
1243
+ \begin_layout LyX-Code
1244
+ #=> false
1245
+ \end_layout
1246
+
1247
+ \begin_layout Standard
1248
+ Attempt to fire a disabled transition
1249
+ \emph on
1250
+ \color red
1251
+ raises
1252
+ \emph default
1253
+ \color inherit
1254
+ an
1255
+ \emph on
1256
+ \color red
1257
+ error
1258
+ \emph default
1259
+ \color inherit
1260
+ (in Ruby, errors are friendly objects, who, like damsels in distress, are
1261
+ meant to be rescued with a bonus outcome):
1262
+ \end_layout
1263
+
1264
+ \begin_layout LyX-Code
1265
+ A2B.fire!
1266
+ \end_layout
1267
+
1268
+ \begin_layout LyX-Code
1269
+ #=> RuntimeError: Firing of #<Transition: A2B (tS)> would result in negative
1270
+ marking!
1271
+ \end_layout
1272
+
1273
+ \begin_layout Subsection*
1274
+ Functional transitions and non-integer marking
1275
+ \end_layout
1276
+
1277
+ \begin_layout Standard
1278
+ So far, all the examples were compatible with classical Petri nets.
1279
+ But
1280
+ \family typewriter
1281
+ YPetri
1282
+ \family default
1283
+ goes beyond – it represents
1284
+ \emph on
1285
+ functional Petri nets
1286
+ \emph default
1287
+ , similar to HFPNs proposed by
1288
+ \begin_inset CommandInset citation
1289
+ LatexCommand citet
1290
+ key "Matsuno2011brs"
1291
+
1292
+ \end_inset
1293
+
1294
+ , which was already mentioned in the introduction.
1295
+
1296
+ \family typewriter
1297
+ YPetri
1298
+ \family default
1299
+ domain model is similar, but not identical.
1300
+ On the side of similarities, YPetri allows non-integer marking of places:
1301
+ \end_layout
1302
+
1303
+ \begin_layout LyX-Code
1304
+ C = Place(
1305
+ \color blue
1306
+ marking
1307
+ \color inherit
1308
+ : 7.77 )
1309
+ \end_layout
1310
+
1311
+ \begin_layout LyX-Code
1312
+ #=> #<Place: name: C, marking: 7.77, default_marking: ø>
1313
+ \end_layout
1314
+
1315
+ \begin_layout Standard
1316
+ Here, you can notice that marking of places can be specified already upon
1317
+ initialization using '
1318
+ \family typewriter
1319
+ :marking
1320
+ \family default
1321
+ '
1322
+ \emph on
1323
+ \color red
1324
+ named argument
1325
+ \emph default
1326
+ \color inherit
1327
+ .
1328
+ Let us now define a
1329
+ \emph on
1330
+ \color blue
1331
+ timed
1332
+ \emph default
1333
+ \color inherit
1334
+ transition, representing logarithmic decay of
1335
+ \family typewriter
1336
+ C
1337
+ \family default
1338
+ with a rate constant of 0.05:
1339
+ \end_layout
1340
+
1341
+ \begin_layout LyX-Code
1342
+ C_decay = Transition( stoichiometry: { C: -1 },
1343
+ \color blue
1344
+ rate
1345
+ \color inherit
1346
+ : 0.05 )
1347
+ \end_layout
1348
+
1349
+ \begin_layout LyX-Code
1350
+ #=> #<Transition: C_decay (TS)>
1351
+ \end_layout
1352
+
1353
+ \begin_layout LyX-Code
1354
+ C_decay.
1355
+ \color blue
1356
+ timed?
1357
+ \end_layout
1358
+
1359
+ \begin_layout LyX-Code
1360
+ #=> true
1361
+ \end_layout
1362
+
1363
+ \begin_layout Standard
1364
+ Here, in the
1365
+ \family typewriter
1366
+ transition
1367
+ \family default
1368
+ constructor method, apart from '
1369
+ \family typewriter
1370
+ stoichiometry:
1371
+ \family default
1372
+ ' named argument, another named argument, '
1373
+ \family typewriter
1374
+ rate:
1375
+ \family default
1376
+ ', is introduced.
1377
+ Under '
1378
+ \family typewriter
1379
+ rate:
1380
+ \family default
1381
+ ', it is possible to specify the transition's
1382
+ \emph on
1383
+ \color green
1384
+ function
1385
+ \emph default
1386
+ \color inherit
1387
+ , which governs its rate.
1388
+ Specifying a function in Ruby requires special syntax (called Ruby
1389
+ \emph on
1390
+ \color red
1391
+ closures
1392
+ \emph default
1393
+ \color inherit
1394
+ ), based on lambda calculus.
1395
+ Ruby closures are easy to learn.
1396
+ But for the moment, in
1397
+ \family typewriter
1398
+ C_decay
1399
+ \family default
1400
+ transition, we are taking use of the convenience, that allows us to pass
1401
+ a numeric value under '
1402
+ \family typewriter
1403
+ rate:
1404
+ \family default
1405
+ ' named argument, and have
1406
+ \family typewriter
1407
+ YPetri
1408
+ \family default
1409
+ create default mass action equation, using the supplied number as its rate
1410
+ constant.
1411
+ For
1412
+ \family typewriter
1413
+ C_decay
1414
+ \family default
1415
+ stoichiometry,
1416
+ \family typewriter
1417
+ { C: -1 }
1418
+ \family default
1419
+ , default mass action will be logarithmic decay with rate constant 0.05.
1420
+ Naturally, when firing timed transitions, the time interval (
1421
+ \begin_inset Formula $\Delta$
1422
+ \end_inset
1423
+
1424
+ time) must be specified, for which the transition should be active:
1425
+ \end_layout
1426
+
1427
+ \begin_layout LyX-Code
1428
+ C_decay.fire!( 1 )
1429
+ \end_layout
1430
+
1431
+ \begin_layout LyX-Code
1432
+ #=> nil
1433
+ \end_layout
1434
+
1435
+ \begin_layout LyX-Code
1436
+ C.marking
1437
+ \end_layout
1438
+
1439
+ \begin_layout LyX-Code
1440
+ #=> 7.3815
1441
+ \end_layout
1442
+
1443
+ \begin_layout LyX-Code
1444
+ C_decay.fire! 1
1445
+ \end_layout
1446
+
1447
+ \begin_layout LyX-Code
1448
+ #=> nil
1449
+ \end_layout
1450
+
1451
+ \begin_layout LyX-Code
1452
+ C.marking
1453
+ \end_layout
1454
+
1455
+ \begin_layout LyX-Code
1456
+ #=> 7.012425
1457
+ \end_layout
1458
+
1459
+ \begin_layout LyX-Code
1460
+ C_decay.fire!( 0.1 )
1461
+ \end_layout
1462
+
1463
+ \begin_layout LyX-Code
1464
+ #=> nil
1465
+ \end_layout
1466
+
1467
+ \begin_layout LyX-Code
1468
+ C.marking
1469
+ \end_layout
1470
+
1471
+ \begin_layout LyX-Code
1472
+ #=> 6.977362875000001
1473
+ \end_layout
1474
+
1475
+ \begin_layout LyX-Code
1476
+ 100.
1477
+ \color red
1478
+ times
1479
+ \color inherit
1480
+ do C_decay.fire! 1 end
1481
+ \end_layout
1482
+
1483
+ \begin_layout LyX-Code
1484
+ #=> 100
1485
+ \end_layout
1486
+
1487
+ \begin_layout LyX-Code
1488
+ C.marking
1489
+ \end_layout
1490
+
1491
+ \begin_layout LyX-Code
1492
+ #=> 0.04130968078231133
1493
+ \end_layout
1494
+
1495
+ \begin_layout Standard
1496
+ The penultimate statement was a call of Ruby '
1497
+ \family typewriter
1498
+ times
1499
+ \family default
1500
+ ' method with the integer
1501
+ \family typewriter
1502
+ 100
1503
+ \family default
1504
+ as the receiver, which results in 100 time repetition of the statement
1505
+ inside
1506
+ \family typewriter
1507
+ \color red
1508
+ do ...
1509
+ end
1510
+ \family default
1511
+ \emph on
1512
+ block
1513
+ \emph default
1514
+ \color inherit
1515
+ .
1516
+ Instead of
1517
+ \family typewriter
1518
+ do ...
1519
+ end
1520
+ \family default
1521
+ , it is possible to write a block using curly braces
1522
+ \family typewriter
1523
+ \color red
1524
+ { ...
1525
+ }
1526
+ \family default
1527
+ \color inherit
1528
+ :
1529
+ \end_layout
1530
+
1531
+ \begin_layout LyX-Code
1532
+ 100.times { C_decay.fire! 1 }
1533
+ \end_layout
1534
+
1535
+ \begin_layout LyX-Code
1536
+ #=> 100
1537
+ \end_layout
1538
+
1539
+ \begin_layout Standard
1540
+ This will cause another 100 time units of
1541
+ \family typewriter
1542
+ C_decay
1543
+ \family default
1544
+ firing.
1545
+ This brings
1546
+ \family typewriter
1547
+ C
1548
+ \family default
1549
+ marking down to almost zero:
1550
+ \end_layout
1551
+
1552
+ \begin_layout LyX-Code
1553
+ C.marking
1554
+ \end_layout
1555
+
1556
+ \begin_layout LyX-Code
1557
+ #=> 0.00024457517215434527
1558
+ \end_layout
1559
+
1560
+ \begin_layout Part*
1561
+ Example II
1562
+ \end_layout
1563
+
1564
+ \begin_layout Standard
1565
+ Instead of manually playing the token game using
1566
+ \family typewriter
1567
+ #fire!
1568
+ \family default
1569
+ method, let us now simulate a Petri net inside
1570
+ \family typewriter
1571
+ \color blue
1572
+ YPetri::TimedSimulation
1573
+ \family default
1574
+ \color inherit
1575
+ .
1576
+ Restart your irb session as described in the
1577
+ \series bold
1578
+ Prerequisites
1579
+ \series default
1580
+ chapter.
1581
+ We will now define 2 places.
1582
+ Since we are going to use
1583
+ \family typewriter
1584
+ TimedSimulation
1585
+ \family default
1586
+ , the marking owned by
1587
+ \family typewriter
1588
+ YPetri::Place
1589
+ \family default
1590
+ instances is irrelevant.
1591
+ We just need to specify the initial state.
1592
+ One way to do this is by specifying
1593
+ \family typewriter
1594
+ \color blue
1595
+ :default_marking
1596
+ \family default
1597
+ \color inherit
1598
+ named argument:
1599
+ \end_layout
1600
+
1601
+ \begin_layout LyX-Code
1602
+ A = Place(
1603
+ \color blue
1604
+ default_marking:
1605
+ \color inherit
1606
+ 0.5 )
1607
+ \end_layout
1608
+
1609
+ \begin_layout LyX-Code
1610
+ #=> #<Place: name: A, marking: 0.5, default_marking: 0.5>
1611
+ \end_layout
1612
+
1613
+ \begin_layout LyX-Code
1614
+ B = Place( default_marking: 0.5 )
1615
+ \end_layout
1616
+
1617
+ \begin_layout LyX-Code
1618
+ #=> #<Place: name: B, marking: 0.5, default_marking: 0.5>
1619
+ \end_layout
1620
+
1621
+ \begin_layout Standard
1622
+ Now let us define a transition corresponding to pumping
1623
+ \family typewriter
1624
+ A
1625
+ \family default
1626
+ out of the system at a constant rate 0.005 per time unit.
1627
+ \end_layout
1628
+
1629
+ \begin_layout LyX-Code
1630
+ A_pump = Transition( stoichiometry: { A: -1 }, rate: proc { 0.005 } )
1631
+ \end_layout
1632
+
1633
+ \begin_layout LyX-Code
1634
+ #=> #<Transition: A_pump (SR)>
1635
+ \end_layout
1636
+
1637
+ \begin_layout Standard
1638
+ Here,
1639
+ \family typewriter
1640
+ proc { 0.005 }
1641
+ \family default
1642
+ is a closure, that defines the rate function.
1643
+ Closure
1644
+ \family typewriter
1645
+ proc { 0.005 }
1646
+ \family default
1647
+ ensures fixed rate 0.005 per time unit regardless of the marking of
1648
+ \family typewriter
1649
+ A
1650
+ \family default
1651
+ .
1652
+ You can notice, that this closure expects no arguments and always outputs
1653
+ 0.005 as its return value.
1654
+ It is the simplest possible way to write a constant function.
1655
+ For comparison,
1656
+ \end_layout
1657
+
1658
+ \begin_layout LyX-Code
1659
+ B_decay = Transition( stoichiometry: { B: -1 }, rate: 0.05 )
1660
+ \end_layout
1661
+
1662
+ \begin_layout LyX-Code
1663
+ #=> #<Transition: B_decay (SR)>
1664
+ \end_layout
1665
+
1666
+ \begin_layout Standard
1667
+ will behind the scenes automatically create a slightly more complicated
1668
+ mass action closure, which is logarithmic decay of
1669
+ \family typewriter
1670
+ B
1671
+ \family default
1672
+ in this case.
1673
+ (You should remember this from
1674
+ \series bold
1675
+ Example I
1676
+ \series default
1677
+ .) Now we have created a net of 2 places and 2 transitions:
1678
+ \end_layout
1679
+
1680
+ \begin_layout LyX-Code
1681
+ net
1682
+ \end_layout
1683
+
1684
+ \begin_layout LyX-Code
1685
+ #=> #<Net: name: Top, 2 pp, 2 tt>
1686
+ \end_layout
1687
+
1688
+ \begin_layout Standard
1689
+ We can execute this Petri net as
1690
+ \family typewriter
1691
+ TimedSimulation
1692
+ \family default
1693
+ simply by typing:
1694
+ \end_layout
1695
+
1696
+ \begin_layout LyX-Code
1697
+
1698
+ \color blue
1699
+ run!
1700
+ \end_layout
1701
+
1702
+ \begin_layout LyX-Code
1703
+ #=> #<YPetri::TimedSimulation: 2 places, 2 transitions, time: 60, object
1704
+ id: 75530290>
1705
+ \end_layout
1706
+
1707
+ \begin_layout Standard
1708
+ At this point,
1709
+ \family typewriter
1710
+ run!
1711
+ \family default
1712
+ creates and executes a
1713
+ \family typewriter
1714
+ TimedSimulation
1715
+ \family default
1716
+ instance.
1717
+ The return value is the simulation instance itself (see the inspect string
1718
+ above), which by now has already finished execution and holds the simulation
1719
+ results.
1720
+ This simulation instance is accessible via
1721
+ \family typewriter
1722
+ simulation
1723
+ \family default
1724
+ method.
1725
+ \end_layout
1726
+
1727
+ \begin_layout LyX-Code
1728
+
1729
+ \color blue
1730
+ simulation
1731
+ \end_layout
1732
+
1733
+ \begin_layout LyX-Code
1734
+ #=> #<Simulation: Time: 60, 2 places, 2 transitions, object id: 75530290>
1735
+ \end_layout
1736
+
1737
+ \begin_layout Standard
1738
+ The simulation does not affect the net.
1739
+ The simulation instance works with its own
1740
+ \begin_inset Quotes eld
1741
+ \end_inset
1742
+
1743
+ mental image
1744
+ \begin_inset Quotes erd
1745
+ \end_inset
1746
+
1747
+ of the net, therefore the marking owned by
1748
+ \family typewriter
1749
+ YPetri::Place
1750
+ \family default
1751
+ instances does not change:
1752
+ \end_layout
1753
+
1754
+ \begin_layout LyX-Code
1755
+ places.map &:marking
1756
+ \end_layout
1757
+
1758
+ \begin_layout LyX-Code
1759
+ #=> [0.5, 0.5]
1760
+ \end_layout
1761
+
1762
+ \begin_layout Standard
1763
+ In a general case, it would be necessary to specify the simulation settings
1764
+ (step size, sampling rate, simulation time etc.) before running the simulation.
1765
+ Since we have not specified any, default settings were used:
1766
+ \end_layout
1767
+
1768
+ \begin_layout LyX-Code
1769
+ simulation.
1770
+ \color blue
1771
+ settings
1772
+ \end_layout
1773
+
1774
+ \begin_layout LyX-Code
1775
+ #=> {:step=>0.1, :sampling=>5, :time=>0..60}
1776
+ \end_layout
1777
+
1778
+ \begin_layout Standard
1779
+ We can see sampling done by the simulation by typing:
1780
+ \end_layout
1781
+
1782
+ \begin_layout LyX-Code
1783
+
1784
+ \color blue
1785
+ print_recording
1786
+ \end_layout
1787
+
1788
+ \begin_layout LyX-Code
1789
+ #=> 0.0,0.5,0.5
1790
+ \end_layout
1791
+
1792
+ \begin_layout LyX-Code
1793
+ 5.0,0.475,0.38916
1794
+ \end_layout
1795
+
1796
+ \begin_layout LyX-Code
1797
+ 10.0,0.45,0.30289
1798
+ \end_layout
1799
+
1800
+ \begin_layout LyX-Code
1801
+ 15.0,0.425,0.23574
1802
+ \end_layout
1803
+
1804
+ \begin_layout LyX-Code
1805
+ 20.0,0.4,0.18348
1806
+ \end_layout
1807
+
1808
+ \begin_layout LyX-Code
1809
+ 25.0,0.375,0.1428
1810
+ \end_layout
1811
+
1812
+ \begin_layout LyX-Code
1813
+ 30.0,0.35,0.11115
1814
+ \end_layout
1815
+
1816
+ \begin_layout LyX-Code
1817
+ 35.0,0.325,0.08651
1818
+ \end_layout
1819
+
1820
+ \begin_layout LyX-Code
1821
+ 40.0,0.3,0.06733
1822
+ \end_layout
1823
+
1824
+ \begin_layout LyX-Code
1825
+ 45.0,0.275,0.0524
1826
+ \end_layout
1827
+
1828
+ \begin_layout LyX-Code
1829
+ 50.0,0.25,0.04079
1830
+ \end_layout
1831
+
1832
+ \begin_layout LyX-Code
1833
+ 55.0,0.225,0.03174
1834
+ \end_layout
1835
+
1836
+ \begin_layout LyX-Code
1837
+ 60.0,0.2,0.02471
1838
+ \end_layout
1839
+
1840
+ \begin_layout LyX-Code
1841
+ nil
1842
+ \end_layout
1843
+
1844
+ \begin_layout Standard
1845
+ Indeed,
1846
+ \family typewriter
1847
+ A
1848
+ \family default
1849
+ is decreasing at a constant rate, while
1850
+ \family typewriter
1851
+ B
1852
+ \family default
1853
+ undergoes logarithmic decay.
1854
+ In a graphical desktop, we can plot a graph (requires
1855
+ \emph on
1856
+ gnuplot
1857
+ \emph default
1858
+ gem):
1859
+ \end_layout
1860
+
1861
+ \begin_layout LyX-Code
1862
+
1863
+ \color blue
1864
+ plot_recording
1865
+ \color inherit
1866
+ ; nil
1867
+ \end_layout
1868
+
1869
+ \begin_layout LyX-Code
1870
+ #=> ""
1871
+ \end_layout
1872
+
1873
+ \begin_layout Standard
1874
+ We can investigate features of the recording (marking, gradient, firing,
1875
+ flux, delta):
1876
+ \end_layout
1877
+
1878
+ \begin_layout LyX-Code
1879
+ simulation.recording.marking.plot
1880
+ \end_layout
1881
+
1882
+ \begin_layout LyX-Code
1883
+ simulation.recording.gradient.plot
1884
+ \end_layout
1885
+
1886
+ \begin_layout LyX-Code
1887
+ simulation.recording.flux.plot
1888
+ \end_layout
1889
+
1890
+ \begin_layout LyX-Code
1891
+ simulation.recording.delta.plot
1892
+ \end_layout
1893
+
1894
+ \begin_layout Standard
1895
+ (As for firing, which is a feature of tS transitions, the plot would show
1896
+ nothing here, as all the transitions are timed in this case.)
1897
+ \end_layout
1898
+
1899
+ \begin_layout Part*
1900
+ Example III
1901
+ \end_layout
1902
+
1903
+ \begin_layout Standard
1904
+ A highly simplified cell-biological pathway simulated with
1905
+ \family typewriter
1906
+ YPetri::TimedSimulation
1907
+ \family default
1908
+ .
1909
+ Let's first define some assumptions.
1910
+ Type in the following commands (output not shown):
1911
+ \end_layout
1912
+
1913
+ \begin_layout LyX-Code
1914
+ Cytoplasm_volume_in_litres = 5.0e-11
1915
+ \end_layout
1916
+
1917
+ \begin_layout LyX-Code
1918
+ NA = 6.022e23
1919
+ \end_layout
1920
+
1921
+ \begin_layout LyX-Code
1922
+ Pieces_per_micromolar = NA / 1_000_000 * Cytoplasm_volume_in_litres
1923
+ \end_layout
1924
+
1925
+ \begin_layout LyX-Code
1926
+
1927
+ \color blue
1928
+ set_step
1929
+ \color inherit
1930
+ 60
1931
+ \end_layout
1932
+
1933
+ \begin_layout LyX-Code
1934
+
1935
+ \color blue
1936
+ set_target_time
1937
+ \color inherit
1938
+ 60 * 60 * 24
1939
+ \end_layout
1940
+
1941
+ \begin_layout Standard
1942
+ Let's define places corresponding to chemical species first (note that
1943
+ \family typewriter
1944
+ :
1945
+ \color blue
1946
+ m!
1947
+ \family default
1948
+ \color inherit
1949
+ is a synonym for
1950
+ \family typewriter
1951
+ :default_marking)
1952
+ \end_layout
1953
+
1954
+ \begin_layout LyX-Code
1955
+ AMP = Place
1956
+ \color blue
1957
+ m!
1958
+ \color inherit
1959
+ : 8695.0
1960
+ \end_layout
1961
+
1962
+ \begin_layout LyX-Code
1963
+ ADP = Place m!: 6521.0
1964
+ \end_layout
1965
+
1966
+ \begin_layout LyX-Code
1967
+ ATP = Place m!: 3152.0
1968
+ \end_layout
1969
+
1970
+ \begin_layout LyX-Code
1971
+ Deoxycytidine = Place m!: 0.5
1972
+ \end_layout
1973
+
1974
+ \begin_layout LyX-Code
1975
+ DeoxyCTP = Place m!: 1.0
1976
+ \end_layout
1977
+
1978
+ \begin_layout LyX-Code
1979
+ DeoxyGMP = Place m!: 1.0
1980
+ \end_layout
1981
+
1982
+ \begin_layout LyX-Code
1983
+ UMP_UDP_pool = Place m!: 2737.0
1984
+ \end_layout
1985
+
1986
+ \begin_layout LyX-Code
1987
+ DeoxyUMP_DeoxyUDP_pool = Place m!: 0.0
1988
+ \end_layout
1989
+
1990
+ \begin_layout LyX-Code
1991
+ DeoxyTMP = Place m!: 3.3
1992
+ \end_layout
1993
+
1994
+ \begin_layout LyX-Code
1995
+ DeoxyTDP_DeoxyTTP_pool = Place m!: 5.0
1996
+ \end_layout
1997
+
1998
+ \begin_layout LyX-Code
1999
+ Thymidine = Place m!: 0.5
2000
+ \end_layout
2001
+
2002
+ \begin_layout Standard
2003
+ All the places above have their marking in micromolars.
2004
+ The enzyme places below will have their marking in molecules per cell:
2005
+ \end_layout
2006
+
2007
+ \begin_layout LyX-Code
2008
+ TK1 = Place m!: 100_000
2009
+ \end_layout
2010
+
2011
+ \begin_layout LyX-Code
2012
+ TYMS = Place m!: 100_000
2013
+ \end_layout
2014
+
2015
+ \begin_layout LyX-Code
2016
+ RNR = Place m!: 100_000
2017
+ \end_layout
2018
+
2019
+ \begin_layout LyX-Code
2020
+ TMPK = Place m!: 100_000
2021
+ \end_layout
2022
+
2023
+ \begin_layout Standard
2024
+ Enzyme molecular weights:
2025
+ \end_layout
2026
+
2027
+ \begin_layout LyX-Code
2028
+ TK1_kDa = 24.8
2029
+ \end_layout
2030
+
2031
+ \begin_layout LyX-Code
2032
+ TYMS_kDa = 66.0
2033
+ \end_layout
2034
+
2035
+ \begin_layout LyX-Code
2036
+ RNR_kDa = 140.0
2037
+ \end_layout
2038
+
2039
+ \begin_layout LyX-Code
2040
+ TMPK_kDa = 50.0
2041
+ \end_layout
2042
+
2043
+ \begin_layout Standard
2044
+ Enzyme specfic activities (micromolar / minute / mg ):
2045
+ \end_layout
2046
+
2047
+ \begin_layout LyX-Code
2048
+ TK1_a = 5.40
2049
+ \end_layout
2050
+
2051
+ \begin_layout LyX-Code
2052
+ TYMS_a = 3.80
2053
+ \end_layout
2054
+
2055
+ \begin_layout LyX-Code
2056
+ RNR_a = 1.00
2057
+ \end_layout
2058
+
2059
+ \begin_layout LyX-Code
2060
+ TMPK_a = 0.83
2061
+ \end_layout
2062
+
2063
+ \begin_layout Standard
2064
+ Some species are kept fixed (as simulation-level clamps):
2065
+ \end_layout
2066
+
2067
+ \begin_layout LyX-Code
2068
+
2069
+ \color blue
2070
+ clamp
2071
+ \color inherit
2072
+ AMP: 8695.0, ADP: 6521.0, ATP: 3152.0
2073
+ \end_layout
2074
+
2075
+ \begin_layout LyX-Code
2076
+ clamp Deoxycytidine: 0.5, DeoxyCTP: 1.0, DeoxyGMP: 1.0
2077
+ \end_layout
2078
+
2079
+ \begin_layout LyX-Code
2080
+ clamp Thymidine: 0.5
2081
+ \end_layout
2082
+
2083
+ \begin_layout LyX-Code
2084
+ clamp UMP_UDP_pool: 2737.0
2085
+ \end_layout
2086
+
2087
+ \begin_layout Standard
2088
+ Before defining transitions, let's define some functions first:
2089
+ \end_layout
2090
+
2091
+ \begin_layout LyX-Code
2092
+ Vmax_per_minute_per_enzyme_molecule =
2093
+ \end_layout
2094
+
2095
+ \begin_layout LyX-Code
2096
+ lambda { |enzyme_specific_activity_in_micromol_per_minute_per_mg,
2097
+ \end_layout
2098
+
2099
+ \begin_layout LyX-Code
2100
+ enzyme_molecular_mass_in_kDa|
2101
+ \end_layout
2102
+
2103
+ \begin_layout LyX-Code
2104
+ enzyme_specific_activity_in_micromol_per_minute_per_mg *
2105
+ \end_layout
2106
+
2107
+ \begin_layout LyX-Code
2108
+ enzyme_molecular_mass_in_kDa }
2109
+ \end_layout
2110
+
2111
+ \begin_layout LyX-Code
2112
+ Vmax_per_minute =
2113
+ \end_layout
2114
+
2115
+ \begin_layout LyX-Code
2116
+ lambda { |specific_activity, kDa, enzyme_molecules_per_cell|
2117
+ \end_layout
2118
+
2119
+ \begin_layout LyX-Code
2120
+ Vmax_per_minute_per_enzyme_molecule.( specific_activity, kDa )
2121
+ *
2122
+ \end_layout
2123
+
2124
+ \begin_layout LyX-Code
2125
+ enzyme_molecules_per_cell }
2126
+ \end_layout
2127
+
2128
+ \begin_layout LyX-Code
2129
+ Vmax_per_second =
2130
+ \end_layout
2131
+
2132
+ \begin_layout LyX-Code
2133
+ lambda { |specific_activity, kDa, enzyme_molecules_per_cell|
2134
+ \end_layout
2135
+
2136
+ \begin_layout LyX-Code
2137
+ Vmax_per_minute.( specific_activity, kDa,
2138
+ \end_layout
2139
+
2140
+ \begin_layout LyX-Code
2141
+ enzyme_molecules_per_cell ) / 60 }
2142
+ \end_layout
2143
+
2144
+ \begin_layout LyX-Code
2145
+ Km_reduced =
2146
+ \end_layout
2147
+
2148
+ \begin_layout LyX-Code
2149
+ lambda { |km, ki_hash={}|
2150
+ \end_layout
2151
+
2152
+ \begin_layout LyX-Code
2153
+ ki_hash.map { |concentration, ci_Ki|
2154
+ \end_layout
2155
+
2156
+ \begin_layout LyX-Code
2157
+ concentration / ci_Ki }.reduce( 1, :+ ) * km }
2158
+ \end_layout
2159
+
2160
+ \begin_layout LyX-Code
2161
+ Occupancy =
2162
+ \end_layout
2163
+
2164
+ \begin_layout LyX-Code
2165
+ lambda { |concentration, reactant_Km, compet_inh_w_Ki_hash={}|
2166
+ \end_layout
2167
+
2168
+ \begin_layout LyX-Code
2169
+ concentration / ( concentration +
2170
+ \end_layout
2171
+
2172
+ \begin_layout LyX-Code
2173
+ Km_reduced.( reactant_Km,
2174
+ \end_layout
2175
+
2176
+ \begin_layout LyX-Code
2177
+ compet_inh_w_Ki_hash ) ) }
2178
+ \end_layout
2179
+
2180
+ \begin_layout LyX-Code
2181
+ MM_with_inh_micromolars_per_second =
2182
+ \end_layout
2183
+
2184
+ \begin_layout LyX-Code
2185
+ lambda { |reactant_concentration,
2186
+ \end_layout
2187
+
2188
+ \begin_layout LyX-Code
2189
+ enzyme_specific_activity,
2190
+ \end_layout
2191
+
2192
+ \begin_layout LyX-Code
2193
+ enzyme_mass_kDa,
2194
+ \end_layout
2195
+
2196
+ \begin_layout LyX-Code
2197
+ enzyme_molecules_per_cell,
2198
+ \end_layout
2199
+
2200
+ \begin_layout LyX-Code
2201
+ reactant_Km,
2202
+ \end_layout
2203
+
2204
+ \begin_layout LyX-Code
2205
+ competitive_inh_w_Ki_hash={}|
2206
+ \end_layout
2207
+
2208
+ \begin_layout LyX-Code
2209
+ Vmax_per_second.( enzyme_specific_activity,
2210
+ \end_layout
2211
+
2212
+ \begin_layout LyX-Code
2213
+ enzyme_mass_kDa,
2214
+ \end_layout
2215
+
2216
+ \begin_layout LyX-Code
2217
+ enzyme_molecules_per_cell ) *
2218
+ \end_layout
2219
+
2220
+ \begin_layout LyX-Code
2221
+ Occupancy.( reactant_concentration,
2222
+ \end_layout
2223
+
2224
+ \begin_layout LyX-Code
2225
+ reactant_Km,
2226
+ \end_layout
2227
+
2228
+ \begin_layout LyX-Code
2229
+ competitive_inh_w_Ki_hash ) }
2230
+ \end_layout
2231
+
2232
+ \begin_layout LyX-Code
2233
+ MMi = MM_with_inh_micromolars_per_second
2234
+ \end_layout
2235
+
2236
+ \begin_layout Standard
2237
+ Michaelis constants:
2238
+ \end_layout
2239
+
2240
+ \begin_layout LyX-Code
2241
+ TK1_Thymidine_Km = 5.0
2242
+ \end_layout
2243
+
2244
+ \begin_layout LyX-Code
2245
+ TYMS_DeoxyUMP_Km = 2.0
2246
+ \end_layout
2247
+
2248
+ \begin_layout LyX-Code
2249
+ RNR_UDP_Km = 1.0
2250
+ \end_layout
2251
+
2252
+ \begin_layout LyX-Code
2253
+ DNA_creation_speed = 3_000_000_000 / ( 12 * 3600 )
2254
+ \end_layout
2255
+
2256
+ \begin_layout LyX-Code
2257
+ TMPK_DeoxyTMP_Km = 12.0
2258
+ \end_layout
2259
+
2260
+ \begin_layout Standard
2261
+ And finally, let us define the transitions:
2262
+ \end_layout
2263
+
2264
+ \begin_layout LyX-Code
2265
+ TK1_Thymidine_DeoxyTMP =
2266
+ \end_layout
2267
+
2268
+ \begin_layout LyX-Code
2269
+ Transition
2270
+ \color blue
2271
+ domain:
2272
+ \color inherit
2273
+ [ Thymidine, TK1, DeoxyTDP_DeoxyTTP_pool,
2274
+ \end_layout
2275
+
2276
+ \begin_layout LyX-Code
2277
+ DeoxyCTP, Deoxycytidine, AMP, ADP, ATP ],
2278
+ \end_layout
2279
+
2280
+ \begin_layout LyX-Code
2281
+ stoichiometry: { Thymidine: -1, DeoxyTMP: 1 },
2282
+ \end_layout
2283
+
2284
+ \begin_layout LyX-Code
2285
+ rate: proc { |rc, e, pool1, ci2, ci3, master1, master2, master3|
2286
+ \end_layout
2287
+
2288
+ \begin_layout LyX-Code
2289
+ ci1 = pool1 * master3 / ( master2 + master3 )
2290
+ \end_layout
2291
+
2292
+ \begin_layout LyX-Code
2293
+ MMi.( rc, TK1_a, TK1_kDa, e, TK1_Thymidine_Km,
2294
+ \end_layout
2295
+
2296
+ \begin_layout LyX-Code
2297
+ ci1 => 13.5, ci2 => 0.8, ci3 => 40.0 ) }
2298
+ \end_layout
2299
+
2300
+ \begin_layout LyX-Code
2301
+ TYMS_DeoxyUMP_DeoxyTMP =
2302
+ \end_layout
2303
+
2304
+ \begin_layout LyX-Code
2305
+ Transition domain: [ DeoxyUMP_DeoxyUDP_pool, TYMS, AMP, ADP, ATP ],
2306
+ \end_layout
2307
+
2308
+ \begin_layout LyX-Code
2309
+ stoichiometry: { DeoxyUMP_DeoxyUDP_pool: -1, DeoxyTMP: 1 },
2310
+ \end_layout
2311
+
2312
+ \begin_layout LyX-Code
2313
+ rate: proc { |pool, e, master1, master2, master3|
2314
+ \end_layout
2315
+
2316
+ \begin_layout LyX-Code
2317
+ rc = pool * master2 / ( master1 + master2 )
2318
+ \end_layout
2319
+
2320
+ \begin_layout LyX-Code
2321
+ MMi.( rc, TYMS_a, TYMS_kDa, e, TYMS_DeoxyUMP_Km
2322
+ ) }
2323
+ \end_layout
2324
+
2325
+ \begin_layout LyX-Code
2326
+ RNR_UDP_DeoxyUDP =
2327
+ \end_layout
2328
+
2329
+ \begin_layout LyX-Code
2330
+ Transition domain: [ UMP_UDP_pool, RNR, DeoxyUMP_DeoxyUDP_pool, AMP, ADP,
2331
+ ATP ],
2332
+ \end_layout
2333
+
2334
+ \begin_layout LyX-Code
2335
+ stoichiometry: { UMP_UDP_pool: -1, DeoxyUMP_DeoxyUDP_pool:
2336
+ 1 },
2337
+ \end_layout
2338
+
2339
+ \begin_layout LyX-Code
2340
+ rate: proc { |pool, e, master1, master2, master3|
2341
+ \end_layout
2342
+
2343
+ \begin_layout LyX-Code
2344
+ rc = pool * master2 / ( master1 + master2 )
2345
+ \end_layout
2346
+
2347
+ \begin_layout LyX-Code
2348
+ MMi.( rc, RNR_a, RNR_kDa, e, RNR_UDP_Km ) }
2349
+ \end_layout
2350
+
2351
+ \begin_layout LyX-Code
2352
+ DNA_polymerase_consumption_of_DeoxyTTP =
2353
+ \end_layout
2354
+
2355
+ \begin_layout LyX-Code
2356
+ Transition stoichiometry: { DeoxyTDP_DeoxyTTP_pool: -1 },
2357
+ \end_layout
2358
+
2359
+ \begin_layout LyX-Code
2360
+ rate: proc { DNA_creation_speed / 4 }
2361
+ \end_layout
2362
+
2363
+ \begin_layout LyX-Code
2364
+ TMPK_DeoxyTMP_DeoxyTDP =
2365
+ \end_layout
2366
+
2367
+ \begin_layout LyX-Code
2368
+ Transition domain: [ DeoxyTMP, TMPK, ADP, DeoxyTDP_DeoxyTTP_pool, DeoxyGMP,
2369
+ AMP, ATP ],
2370
+ \end_layout
2371
+
2372
+ \begin_layout LyX-Code
2373
+ stoichiometry: { DeoxyTMP: -1, TMPK: 0, DeoxyTDP_DeoxyTTP_pool:
2374
+ 1 },
2375
+ \end_layout
2376
+
2377
+ \begin_layout LyX-Code
2378
+ rate: proc { |rc, e, ci1, pool, ci4, master1, master3|
2379
+ \end_layout
2380
+
2381
+ \begin_layout LyX-Code
2382
+ master2 = ci1
2383
+ \end_layout
2384
+
2385
+ \begin_layout LyX-Code
2386
+ ci2 = pool * master2 / ( master2 + master3 )
2387
+ \end_layout
2388
+
2389
+ \begin_layout LyX-Code
2390
+ ci3 = pool * master3 / ( master2 + master3 )
2391
+ \end_layout
2392
+
2393
+ \begin_layout LyX-Code
2394
+ MMi.( rc, TMPK_a, TMPK_kDa, e, TMPK_DeoxyTMP_Km,
2395
+ \end_layout
2396
+
2397
+ \begin_layout LyX-Code
2398
+ ci1 => 250.0, ci2 => 30.0, ci3 => 750, ci4
2399
+ => 117 ) }
2400
+ \end_layout
2401
+
2402
+ \begin_layout Standard
2403
+ The simulation should work.
2404
+ \end_layout
2405
+
2406
+ \begin_layout LyX-Code
2407
+ run!
2408
+ \end_layout
2409
+
2410
+ \begin_layout LyX-Code
2411
+ plot_recording
2412
+ \end_layout
2413
+
2414
+ \begin_layout Part*
2415
+ Example IV
2416
+ \end_layout
2417
+
2418
+ \begin_layout Standard
2419
+ Here, I will demonstrate the idea of using
2420
+ \family typewriter
2421
+ YPetri
2422
+ \family default
2423
+ together with
2424
+ \family typewriter
2425
+ \color blue
2426
+ SY
2427
+ \family default
2428
+ metrology library
2429
+ \color inherit
2430
+ .
2431
+ If you are experienced with biochemical modeling, then you surely know
2432
+ how big pain in the heel physical units are.
2433
+ Also, in
2434
+ \series bold
2435
+ Example III
2436
+ \series default
2437
+ , you might have noticed how much attention has been spent on units (in
2438
+ the assumptions, variable names, constant names...) You could have noticed
2439
+ messy unit conversion formulas.
2440
+ The aim of
2441
+ \family typewriter
2442
+ SY
2443
+ \family default
2444
+ is to take care of all this, to relieve the modeler from this task, to
2445
+ clean up the model code, and let the modeler concentrate on the real issue.
2446
+ That's a great dream, which, in biochemical modeling, has not been realized
2447
+ so far.
2448
+ \end_layout
2449
+
2450
+ \begin_layout Subsection*
2451
+
2452
+ \family typewriter
2453
+ SY
2454
+ \family default
2455
+ metrology library
2456
+ \end_layout
2457
+
2458
+ \begin_layout Standard
2459
+
2460
+ \family typewriter
2461
+ SY
2462
+ \family default
2463
+ is publicly available as a Ruby gem '
2464
+ \family typewriter
2465
+ sy
2466
+ \family default
2467
+ '.
2468
+ After installing it (
2469
+ \family typewriter
2470
+ gem install sy
2471
+ \family default
2472
+ ), type:
2473
+ \end_layout
2474
+
2475
+ \begin_layout LyX-Code
2476
+ require 'sy'
2477
+ \end_layout
2478
+
2479
+ \begin_layout Standard
2480
+ Afterwards, your
2481
+ \family typewriter
2482
+ \color red
2483
+ Numeric
2484
+ \family default
2485
+ \color inherit
2486
+ objects (that is, numbers) should respond to methods representing physical
2487
+ units:
2488
+ \end_layout
2489
+
2490
+ \begin_layout LyX-Code
2491
+ 1.m
2492
+ \end_layout
2493
+
2494
+ \begin_layout LyX-Code
2495
+ #=> #<±Magnitude: 1.m>
2496
+ \end_layout
2497
+
2498
+ \begin_layout LyX-Code
2499
+ 1.s
2500
+ \end_layout
2501
+
2502
+ \begin_layout LyX-Code
2503
+ #=> #<±Magnitude: 1.s>
2504
+ \end_layout
2505
+
2506
+ \begin_layout LyX-Code
2507
+ 1.kg.m.s(-2)
2508
+ \end_layout
2509
+
2510
+ \begin_layout LyX-Code
2511
+ #=> #<±Magnitude: 1.N>
2512
+ \end_layout
2513
+
2514
+ \begin_layout LyX-Code
2515
+ 1.cm + 1.mm
2516
+ \end_layout
2517
+
2518
+ \begin_layout LyX-Code
2519
+ #=> #<±Magnitude: 0.011.m>
2520
+ \end_layout
2521
+
2522
+ \begin_layout Standard
2523
+ The core of the trick is that instead of naked numbers, numbers become magnitude
2524
+ s (
2525
+ \family typewriter
2526
+ SY::Magnitude
2527
+ \family default
2528
+ ) of specified physical quantities:
2529
+ \end_layout
2530
+
2531
+ \begin_layout LyX-Code
2532
+ 1.m.class
2533
+ \end_layout
2534
+
2535
+ \begin_layout LyX-Code
2536
+ #=> Length±@Magnitude
2537
+ \end_layout
2538
+
2539
+ \begin_layout LyX-Code
2540
+ 1.cm.min⁻¹.class
2541
+ \end_layout
2542
+
2543
+ \begin_layout LyX-Code
2544
+ #=> Speed±@Magnitude
2545
+ \end_layout
2546
+
2547
+ \begin_layout Standard
2548
+ (You can type
2549
+ \family typewriter
2550
+ 1.cm.min(-1)
2551
+ \family default
2552
+ if you find it difficult to type Unicode superscript characters "
2553
+ \family typewriter
2554
+ ⁻¹
2555
+ \family default
2556
+ ".) Magnitudes can be converted back to numbers with
2557
+ \family typewriter
2558
+ \color blue
2559
+ amount
2560
+ \family default
2561
+ \color inherit
2562
+ (alias
2563
+ \family typewriter
2564
+ \color blue
2565
+ to_f)
2566
+ \family default
2567
+ \color inherit
2568
+ method:
2569
+ \end_layout
2570
+
2571
+ \begin_layout LyX-Code
2572
+ 1.km.amount
2573
+ \end_layout
2574
+
2575
+ \begin_layout LyX-Code
2576
+ #=> 1000.0
2577
+ \end_layout
2578
+
2579
+ \begin_layout LyX-Code
2580
+ 1.cm.to_f
2581
+ \end_layout
2582
+
2583
+ \begin_layout LyX-Code
2584
+ #=> 0.01
2585
+ \end_layout
2586
+
2587
+ \begin_layout Subsection*
2588
+ Collaboration between
2589
+ \family typewriter
2590
+ SY
2591
+ \family default
2592
+ and
2593
+ \family typewriter
2594
+ YPetri
2595
+ \end_layout
2596
+
2597
+ \begin_layout Standard
2598
+ Enter:
2599
+ \end_layout
2600
+
2601
+ \begin_layout LyX-Code
2602
+ A = Place m!: 3.mM
2603
+ \end_layout
2604
+
2605
+ \begin_layout LyX-Code
2606
+ #=> #<Place: name: A, marking: 0.003.M, default_marking: 0.003.M >
2607
+ \end_layout
2608
+
2609
+ \begin_layout LyX-Code
2610
+ B = Place m!: 4.mM
2611
+ \end_layout
2612
+
2613
+ \begin_layout LyX-Code
2614
+ #=> #<Place: name: B, marking: 0.004.M, default_marking: 0.004.M >
2615
+ \end_layout
2616
+
2617
+ \begin_layout LyX-Code
2618
+ A2B = Transition s: { A: -1, B: 1 }, rate: 0.05.s⁻¹
2619
+ \end_layout
2620
+
2621
+ \begin_layout LyX-Code
2622
+ #=> #<Transition: A2B (SR) >
2623
+ \end_layout
2624
+
2625
+ \begin_layout LyX-Code
2626
+ B_decay = Transition s: { B: -1 }, rate: 0.002.s⁻¹
2627
+ \end_layout
2628
+
2629
+ \begin_layout LyX-Code
2630
+ #=> YPetri::Transition[ B_decay: stoichiometric transition with rate ]
2631
+ \end_layout
2632
+
2633
+ \begin_layout Standard
2634
+ Now we have created places and transitions, whose marking and rate closures
2635
+ are defined in physical units.
2636
+ Presently,
2637
+ \family typewriter
2638
+ YPetri::TimedSimulation
2639
+ \family default
2640
+ will not accept such a Petri net, so the only thing we can do is play the
2641
+ token game ourselves:
2642
+ \end_layout
2643
+
2644
+ \begin_layout LyX-Code
2645
+ fire_both_transitions = proc { |delta_t|
2646
+ \end_layout
2647
+
2648
+ \begin_layout LyX-Code
2649
+ A2B.fire! delta_t
2650
+ \end_layout
2651
+
2652
+ \begin_layout LyX-Code
2653
+ B_decay.fire! delta_t
2654
+ \end_layout
2655
+
2656
+ \begin_layout LyX-Code
2657
+ }
2658
+ \end_layout
2659
+
2660
+ \begin_layout LyX-Code
2661
+ #=> #<Proc:0x9b48f1c@(irb):19>
2662
+ \end_layout
2663
+
2664
+ \begin_layout Standard
2665
+ Here, we have defined a closure accepting one argument
2666
+ \begin_inset Formula $\Delta$
2667
+ \end_inset
2668
+
2669
+ t, which it will use to
2670
+ \family typewriter
2671
+ fire!
2672
+ \family default
2673
+ both
2674
+ \family typewriter
2675
+ A2B
2676
+ \family default
2677
+ and
2678
+ \family typewriter
2679
+ B_decay
2680
+ \family default
2681
+ .
2682
+ By calling this closure repeatedly, we can simulate the network without
2683
+ use of
2684
+ \family typewriter
2685
+ TimedSimulation
2686
+ \family default
2687
+ :
2688
+ \end_layout
2689
+
2690
+ \begin_layout LyX-Code
2691
+ places.map &:marking
2692
+ \end_layout
2693
+
2694
+ \begin_layout LyX-Code
2695
+ #=> [#<±Magnitude: 0.003.M>, #<±Magnitude: 0.004.M>]
2696
+ \end_layout
2697
+
2698
+ \begin_layout LyX-Code
2699
+ fire_both_transitions.( 1.s )
2700
+ \end_layout
2701
+
2702
+ \begin_layout LyX-Code
2703
+ #=> nil
2704
+ \end_layout
2705
+
2706
+ \begin_layout LyX-Code
2707
+ places.map &:marking
2708
+ \end_layout
2709
+
2710
+ \begin_layout LyX-Code
2711
+ #=> [#<±Magnitude: 0.00285.M>, #<±Magnitude: 0.00414.M>]
2712
+ \end_layout
2713
+
2714
+ \begin_layout LyX-Code
2715
+ 100.times do fire_both_transitions.( 1.s ) end
2716
+ \end_layout
2717
+
2718
+ \begin_layout LyX-Code
2719
+ #=> 100
2720
+ \end_layout
2721
+
2722
+ \begin_layout LyX-Code
2723
+ places.map &:marking
2724
+ \end_layout
2725
+
2726
+ \begin_layout LyX-Code
2727
+ #=> [#<±Magnitude: 1.69e-05.M>, #<±Magnitude: 0.0058.M>]
2728
+ \end_layout
2729
+
2730
+ \begin_layout LyX-Code
2731
+ A.marking.
2732
+ \color blue
2733
+ in
2734
+ \color inherit
2735
+ :µM
2736
+ \end_layout
2737
+
2738
+ \begin_layout LyX-Code
2739
+ #=> 16.873508277951963
2740
+ \end_layout
2741
+
2742
+ \begin_layout LyX-Code
2743
+ B.marking.in :µM
2744
+ \end_layout
2745
+
2746
+ \begin_layout LyX-Code
2747
+ #=> 5797.976678013365
2748
+ \end_layout
2749
+
2750
+ \begin_layout LyX-Code
2751
+
2752
+ \end_layout
2753
+
2754
+ \begin_layout LyX-Code
2755
+ \begin_inset CommandInset bibtex
2756
+ LatexCommand bibtex
2757
+ bibfiles "/home/boris/b/1num/num,/home/boris/b/2prp/prp"
2758
+ options "plainnat"
2759
+
2760
+ \end_inset
2761
+
2762
+
2763
+ \end_layout
2764
+
2765
+ \end_body
2766
+ \end_document