y_nelson 2.0.6 → 2.0.7

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