-
Notifications
You must be signed in to change notification settings - Fork 0
/
Tutorial 2 - SIR Model in Pyro
911 lines (911 loc) · 144 KB
/
Tutorial 2 - SIR Model in Pyro
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Building on the tutorial at https://pyro.ai/examples/sir_hmc.html, the folks at Pyro created an additional interface for SIR modeling that compresses much of the info that that tutorial provided into a concrete interface for compartmental modeling. Below is that work, drawn from http://pyro.ai/examples/epi_intro.html"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:10:19.227985Z",
"start_time": "2021-01-13T20:10:14.214521Z"
}
},
"outputs": [],
"source": [
"import os\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import torch\n",
"import pyro\n",
"import pyro.distributions as dist\n",
"from pyro.contrib.epidemiology import CompartmentalModel, binomial_dist, infection_dist\n",
"\n",
"%matplotlib inline\n",
"#assert pyro.__version__.startswith('1.5.0') # I have 1.5.1, hopefully not a problem to comment this out. \n",
"torch.set_default_dtype(torch.double) # Required for MCMC inference.\n",
"pyro.enable_validation(True) # Always a good idea.\n",
"smoke_test = ('CI' in os.environ)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:10:19.238065Z",
"start_time": "2021-01-13T20:10:19.229882Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'1.5.1'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pyro.__version__"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:10:19.530483Z",
"start_time": "2021-01-13T20:10:19.242480Z"
}
},
"outputs": [],
"source": [
"ros = []\n",
"for i in range(1000):\n",
" R0 = pyro.sample(\"R0\", dist.LogNormal(0., 1.))\n",
" ros.append(R0.item())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:10:19.792511Z",
"start_time": "2021-01-13T20:10:19.552208Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"(array([761., 158., 54., 14., 4., 2., 2., 4., 0., 1.]),\n",
" array([ 0.03772956, 1.99673086, 3.95573217, 5.91473347, 7.87373478,\n",
" 9.83273608, 11.79173739, 13.75073869, 15.70974 , 17.6687413 ,\n",
" 19.62774261]),\n",
" <BarContainer object of 10 artists>)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.hist(ros)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Word. This is what it expects R0 to be, most likely btw 0 and 1. Is updated accordingly!"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:10:19.813804Z",
"start_time": "2021-01-13T20:10:19.796484Z"
}
},
"outputs": [],
"source": [
"class SimpleSIRModel(CompartmentalModel):\n",
" def __init__(self, population, recovery_time, data):\n",
" compartments = (\"S\", \"I\") # R is implicit.\n",
" duration = len(data)\n",
" super().__init__(compartments, duration, population)\n",
" assert isinstance(recovery_time, float)\n",
" assert recovery_time > 1\n",
" self.recovery_time = recovery_time\n",
" self.data = data\n",
"\n",
" def global_model(self):\n",
" \"\"\"\n",
" samples global parameters and packs them into a single return value (here a tuple, but any structure is allowed). \n",
" The return value is available as the params argument to the other two methods.\n",
" \"\"\"\n",
" tau = self.recovery_time\n",
" R0 = pyro.sample(\"R0\", dist.LogNormal(0., 1.))\n",
" rho = pyro.sample(\"rho\", dist.Beta(100, 100))\n",
" return R0, tau, rho\n",
"\n",
" def initialize(self, params):\n",
" \"\"\"\n",
" samples (or deterministically sets) initial values of time series,\n",
" returning a dictionary mapping time series name to initial value.\n",
" \"\"\"\n",
" # Start with a single infection.\n",
" return {\"S\": self.population - 1, \"I\": 1}\n",
"\n",
" def transition(self, params, state, t):\n",
" \"\"\"\n",
" inputs global params, the state at the previous time step, and the time index t (which may be a slice!). \n",
" It then samples flows and updates the state dict.\n",
" \"\"\"\n",
" R0, tau, rho = params # R0 \n",
"\n",
" # Sample flows between compartments.\n",
" S2I = pyro.sample(\"S2I_{}\".format(t),\n",
" infection_dist(individual_rate=R0 / tau,\n",
" num_susceptible=state[\"S\"],\n",
" num_infectious=state[\"I\"],\n",
" population=self.population))\n",
" I2R = pyro.sample(\"I2R_{}\".format(t),\n",
" binomial_dist(state[\"I\"], 1 / tau))\n",
"\n",
" # Update compartments with flows.\n",
" state[\"S\"] = state[\"S\"] - S2I\n",
" state[\"I\"] = state[\"I\"] + S2I - I2R\n",
"\n",
" # Condition on observations.\n",
" t_is_observed = isinstance(t, slice) or t < self.duration\n",
" pyro.sample(\"obs_{}\".format(t),\n",
" binomial_dist(S2I, rho),\n",
" obs=self.data[t] if t_is_observed else None)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generating Data\n",
"\n",
"What if I don't want to do this? "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:10:28.654607Z",
"start_time": "2021-01-13T20:10:19.824291Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Simulated 1550.0 infections after 30 attempts\n"
]
}
],
"source": [
"population = 3000\n",
"recovery_time = 21.\n",
"empty_data = [None] * 300\n",
"model = SimpleSIRModel(population, recovery_time, empty_data)\n",
"\n",
"# We'll repeatedly generate data until a desired number of infections is found.\n",
"pyro.set_rng_seed(20200709)\n",
"for attempt in range(100):\n",
" synth_data = model.generate({\"R0\": 3.0})\n",
" total_infections = synth_data[\"S2I\"].sum().item()\n",
" if 550 <= total_infections <= 2500:\n",
" break\n",
"print(\"Simulated {} infections after {} attempts\".format(total_infections, 1 + attempt))\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:10:28.686015Z",
"start_time": "2021-01-13T20:10:28.656894Z"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"OrderedDict([('R0', tensor(3.)),\n",
" ('rho', tensor(0.5465)),\n",
" ('I',\n",
" tensor([ 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1.,\n",
" 1., 1., 1., 1., 1., 1., 1., 2., 2., 2., 2., 2.,\n",
" 1., 1., 1., 1., 1., 2., 3., 3., 3., 3., 3., 4.,\n",
" 4., 4., 6., 7., 7., 8., 12., 14., 14., 15., 13., 15.,\n",
" 15., 18., 18., 20., 18., 20., 22., 27., 26., 34., 33., 34.,\n",
" 38., 42., 42., 44., 53., 60., 66., 75., 75., 78., 79., 81.,\n",
" 95., 102., 107., 119., 133., 147., 158., 170., 184., 209., 230., 256.,\n",
" 278., 303., 323., 342., 356., 398., 413., 434., 448., 468., 479., 500.,\n",
" 528., 555., 590., 632., 665., 685., 704., 726., 757., 788., 821., 845.])),\n",
" ('obs',\n",
" tensor([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0.,\n",
" 0., 0., 0., 1., 1., 0., 0., 1., 0., 1., 2., 1., 0., 2.,\n",
" 1., 1., 0., 1., 0., 1., 0., 2., 0., 3., 1., 3., 1., 2.,\n",
" 2., 3., 0., 2., 9., 7., 4., 7., 6., 3., 2., 0., 10., 10.,\n",
" 4., 11., 11., 12., 8., 10., 7., 16., 18., 13., 18., 20., 16., 16.,\n",
" 18., 25., 21., 24., 24., 18., 18., 24., 31., 27., 26., 31., 42., 32.,\n",
" 23., 27., 27., 38., 30., 36.])),\n",
" ('S2I',\n",
" tensor([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0.,\n",
" 0., 0., 0., 1., 1., 0., 2., 1., 0., 1., 4., 2., 1., 2.,\n",
" 1., 4., 1., 3., 0., 2., 0., 4., 2., 6., 2., 8., 1., 2.,\n",
" 5., 5., 3., 4., 11., 8., 8., 12., 7., 8., 5., 6., 17., 13.,\n",
" 12., 20., 17., 21., 20., 16., 20., 30., 27., 37., 34., 44., 33., 37.,\n",
" 27., 49., 44., 45., 37., 37., 35., 45., 51., 52., 56., 64., 61., 56.,\n",
" 49., 56., 61., 65., 59., 66.])),\n",
" ('S',\n",
" tensor([2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999., 2999.,\n",
" 2999., 2998., 2998., 2998., 2998., 2998., 2998., 2998., 2998., 2998.,\n",
" 2998., 2997., 2997., 2997., 2997., 2997., 2997., 2997., 2997., 2997.,\n",
" 2997., 2996., 2995., 2995., 2995., 2995., 2995., 2994., 2993., 2993.,\n",
" 2991., 2990., 2990., 2989., 2985., 2983., 2982., 2980., 2979., 2975.,\n",
" 2974., 2971., 2971., 2969., 2969., 2965., 2963., 2957., 2955., 2947.,\n",
" 2946., 2944., 2939., 2934., 2931., 2927., 2916., 2908., 2900., 2888.,\n",
" 2881., 2873., 2868., 2862., 2845., 2832., 2820., 2800., 2783., 2762.,\n",
" 2742., 2726., 2706., 2676., 2649., 2612., 2578., 2534., 2501., 2464.,\n",
" 2437., 2388., 2344., 2299., 2262., 2225., 2190., 2145., 2094., 2042.,\n",
" 1986., 1922., 1861., 1805., 1756., 1700., 1639., 1574., 1515., 1449.])),\n",
" ('I2R',\n",
" tensor([ 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 1., 1.,\n",
" 3., 2., 1., 0., 0., 0., 2., 2., 0., 1., 3., 0., 2., 1.,\n",
" 1., 1., 3., 2., 2., 1., 2., 3., 7., 5., 4., 4., 3., 6.,\n",
" 7., 8., 3., 7., 9., 4., 6., 5., 6., 11., 12., 19., 13., 18.,\n",
" 13., 7., 29., 24., 23., 17., 24., 24., 23., 25., 21., 22., 28., 36.,\n",
" 30., 34., 30., 34., 26., 42.]))])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"synth_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the model to work, it requires S, S2I, I, I2R, obs (noisy S2I), R0, and rho. \n",
"\n",
"\n",
"At the moment, all of these things are synthetically generated, after we first specify R0, rho and population. \n",
"\n",
"For real world, I'll try this now, but we set:\n",
"\n",
"S2I = obs, and use reported values for the others. In essence we no longer use the noisy observations and assume whatever is reported is right? \n",
"\n",
"I'm not sure if the model will work if we do not specify R0 or rho, so will have to try this and find out. "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:10:28.706688Z",
"start_time": "2021-01-13T20:10:28.695029Z"
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"I.shape = (300,)\n",
"I2R.shape = (300,)\n",
"R0.shape = ()\n",
"S.shape = (300,)\n",
"S2I.shape = (300,)\n",
"obs.shape = (300,)\n",
"rho.shape = ()\n"
]
}
],
"source": [
"for key, value in sorted(synth_data.items()):\n",
" print(\"{}.shape = {}\".format(key, tuple(value.shape)))\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:10:29.688778Z",
"start_time": "2021-01-13T20:10:28.711102Z"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAEYCAYAAABRMYxdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABahElEQVR4nO3dd5xU5fX48c+ZvrO9ssDSe1GKKwJ2E0tMUGMsSTRqTDTG9G5MfunN9ORriqhRNLHFjrH3BiogCAhIh2V32b4zs2Xq8/vjzla2zMIus+W8Xy9eu3Pn3ueeuazs8TxNjDEopZRSSg0ntmQHoJRSSinV3zTBUUoppdSwowmOUkoppYYdTXCUUkopNexogqOUUkqpYUcTHKWUUkoNO5rgKKX6RET2iMiH+6mt8SISEBF7P7T1TxH5f/0R19EiIjeKyG3JjkOp4UgTHKWGARE5SUTeFJF6EakRkTdE5Ph+aPdOEflFf8QYb69DcmSM2WeMSTPGRPvYzlUi8nr7Y8aY64wxP++vWI8GY8yvjDGfT3YcSg1HjmQHoJQ6MiKSATwBfBF4AHABJwPBZMaleiYiDmNMJNlxKDVcaQVHqaFvOoAx5l5jTNQY02SMedYY856IuOMVnWNaThaRAhFpEpF8ETlNREpE5FsiUiEiZSLy2fh51wKXAd+NdyOtbHfP+SLyXrxidL+IeNq1/zERWS8idfGq0rHx43cD44GV8fa+KyITRcSIiCN+To6I3CEipSJSKyKPdv6wIjIL+CewJN5OXfx4a7Wp3ef6brvPdYGInCsiH8SfyY3t2rSJyA0islNEqkXkARHJ6ephi0ieiDwR/3w1IvKaiNji740RkYdEpFJEdovIV9td9xMReVBE/i0iPuCq+LF/tztncfyZ1YnIBhE5rd17V4nILhHxx9u+rKcfCqVGOk1wlBr6PgCiIrJCRD4iItktbxhjgsB9wOXtzv8U8LwxpjL+uhDIBMYCnwP+JiLZxpjlwH+A38a7kZa1a+MS4BxgEnAscBWAiCwE/gV8AcgFbgEeFxG3MeYzwD5gWby933bxWe4GvMAcoAD4U+cTjDFbgOuAVfF2srp5LoWAJ/65fgTcGn8Ox2FVuH4kIpPj534VuAA4FRgD1AJ/66bdbwElQD4wCrgRMPEkZyWwIX7PDwFfF5Gz2117PvAgkIX1bFuJyFjgf8AvgBzg28BD8UQ0Ffgr8BFjTDqwFFjfTXxKKTTBUWrIM8b4gJMAg/VLvFJEHheRUfFTVgCfbqkyAJ/BSiRahIGfGWPCxpgngQAwo5fb/tUYU2qMqcH6pT4/fvwa4BZjzFvxatIKrK6yxb19DhEZDXwEuM4YUxuP55XerutBGPilMSaMleTlAX8xxviNMZuBzVjJGVgJ2Q+MMSXxpPAnwEUtlaUu2h0NTIjH+JqxNvU7Hsg3xvzMGBMyxuzC+vv4ZLtrVxljHjXGxIwxTZ3avRx40hjzZPz954A1wLnx92PAXBFJMcaUxT+DUqobmuAoNQwYY7YYY64yxhQBc7GqEH+Ov/cW0ACcKiIzganA4+0ur+40FqQRSOvlluXdnD8B+Fa8i6Uu3n00Lh5Pb8YBNcaY2gTOTUR1u8HLLcnEwXbvN9Ex7kfaxbwFiGJVaDr7HbADeDbeZXRDuzbGdPrsN3ZqY38P8U4ALu50/UnAaGNMA3ApVuWqTET+F/+7VEp1QwcZKzXMGGO2isidWFWJFiuwKgTlwIPGmOZEm+vj7fdjVU1+eRjt7QdyRCTLGFPXz3H1Zj9wtTHmjd5ONMb4sbqpviUic4CXROSdeBu7jTHTerq8lxjuNsZc0819nwGeEZEUrG6sW7G62pRSXdAKjlJDnIjMjA8SLoq/Hoc1zmZ1u9PuBj6OleTc1YfmDwKTez2rza3AdSJyglhSReSjIpLeW3vGmDLgKeDvIpItIk4ROaWHuIpExNWH2HryT+CXIjIBID7u5fyuTowPop4qIgL4sCo9UeBtwCci3xORFBGxi8hcSXy6/r+BZSJydvxaT3ywdJGIjBKR8+JjcYJY3Yh9mlqv1EijCY5SQ58fOAF4S0QasBKbTVhVBgCMMSXAOqwKwmt9aPt2YHa8y+TR3k42xqzBGodzM9ZA3R3EByDH/Rr4Yby9b3fRxGewxrhsBSqAr3dzqxexxtCUi0hVQp+kZ3/B6rZ7VkT8WM/whG7OnQY8j5VkrAL+box5Od4dtgxrPNJuoAq4DWsAd6+MMfuxBiHfCFRiVXS+g/XvtA3r77MUqMEaDH19Xz+kUiOJWGPjlFLDnYj8Cyg1xvww2bEopdRA0zE4So0AIjIRuBBYkORQlFLqqNAuKqWGORH5OVaX1e+MMbuTHY9SSh0N2kWllFJKqWFHKzhKKaWUGnaG9Bic3LxcM2HChGSHoXogSH81pAZIv/0dKaVUEqxdu7bKGJPf+fiQTnAa0xsJfzWc7DCUUqpL/ZE8WsvtHLl+iWUQ/Q9Lf8RiExs2sWEX+6FfbYceT+ScQ77a7DjEgdPuxGlz4rA5rD9ifXXana3ft/xJcaTgdXjxOr0dvqY6U/E6vaQ4UrCJdsC0EJG9XR0fkgmOiCwDlo2aPIrvFH/niNoy/b4g6uHrj/FQ/fV5+qOd/hrfNVj+jgbT5xlUsfTX308/NDOYPs+g+u95EI21HEw//zETI2qiXX+Ntb1uOXbIebG2Y5FYpOu2YjEiJkIkFiEcDROOhYnEIkSM9TrSYZeUxKU4UkhxpOCyu3DZXLgdbrLd2eSl5JGXkkd+Sj65Kbnke/PJ8+SR780nw5XRbwnzUDCkBxkXFxebNWvWJDsMpZRS6rAYY1oToJY/zZFmGiONNIYbaYg00BhubH3d4ftII6FoiFAsRDASpDZYS2VjJVVNVTRHD92NxWlzdkx+UvKthMibx5jUMczImUFeSl4SnsKREZG1xpjizseHZAVHKaWUGg5EBKdY3Vf9xRhDQ7iBqqYqKpsqqW6qprKpsu37xkpKAiWsr1hPbbDj3ra5nlxm5sxkRs4MZmTPYGbOTCZkTMBus/dbfEfLsEtwwuEwJSUlNDcnupfg4OfxeCgqKsLp7L//AJRSSg1PIkKaK400VxoTMyf2eG44Fqa6qZr9/v1sq9nG1pqtbKvdxl3v30UkZnWfpTpTmZc/jwUFC1hYsJBj8o8hxZFyFD7JkRl2XVS7d+8mPT2d3NzcYdHXaIyhuroav9/PpEmTkh2OUkqpESAcDbOrfhdba7aysWoj71a8y/ba7RgMDnEwO3e2lfCMWsjCgoVkebKSFmt3XVTDLsHZsmULM2fOHBbJTQtjDFu3bmXWrFnJDkUppdQI5Qv52FCxgXUV61h3cB2bqjYRioUAmJkzkyWjl7BkzBIWjlqI2+4+anGNqDE4wym5geH3eZRSSg09Ga4MTi46mZOLTgYgGA2yuWozaw6uYXXZau7ecjd3bL4Dt93NcaOOY+mYpSwevZhp2dOSMq19WCY4SimllBpYbrvb6qIatZBrj72WxnAjaw6uYVXpKt4sfZPfr/k9AFnuLI4vPJ6zJ57NqUWn4nF4jkp8muAMgLS0NAKBQLLDUEoppY4ar9PLKUWncErRKQCUN5Szumw1a8rX8PqB13lu73N4HV5OH386F0y9gBMKTxjQHgpNcJRSSinV7wpTC7lg6gVcMPUCorEoaw6u4andT/Hc3uf4367/MTFjIhdNv4gLpl5Apjuz3+8/JNd6FpFlIrK8vr4+2aEopZRSqhd2m50TRp/AT5b+hBcveZFfnfQrstxZ/H7N7znzwTP545o/UtVU1a/3HJazqFpmG/105WbeL/X16z1nj8ngx8vm9HjOQHRRtf9cSiml1HCwrWYbd2y+g6d2P4XL5uLiGRfz2TmfJd97yN6Z3epuFtWQrOAopZRSauibkTOD35z8Gx47/zHOmngW92y5h3MeOodfrP4Fu+t3H1Hbw7qCkyxawVFKKaX6br9/P7dvvJ3Hdj5GJBbh1KJT+cqCrzAjZ0a312gFRymllFKD2rj0cfxk6U947qLnuH7+9ayrWMfFKy/mhtduYL9/f5/a0gRHKaWUUoNKXkoeX5z3RZ668Cmunns1L+x9gfMePY+b372ZYDSYUBua4AwAXQNHKaWUOnKZ7ky+ftzX+d+F/+Ociedwy3u3cNHjF/FO+Tu9XqsJjlJKKaUGtQJvAb8++dfccuYtRGIRrn7man785o+pD3a/XIwu9KeUUkqpIWHpmKU8fP7D/HPDP1mxeQUv73+523O1gqOUUkqpISPFkcI3jvsG93/sfsanj+/2PE1wlFJKKTXkzMiZwV0fuavb9zXBUUoppdSQ1NNmnZrgKKWUUmrY0QRnAKSlpQGwfv16lixZwpw5czj22GO5//77W8857bTTmDFjBvPmzeP4449n/fr1SYpWKaWUGn40wRlAXq+Xu+66i82bN/P000/z9a9/nbq6utb3//Of/7Bhwwauv/56vvOd7yQvUKWUUmqY0QRnAE2fPp1p06YBMGbMGAoKCqisrDzkvCVLlnDgwIGjHZ5SSik1bA2adXBEZBbwNSAPeMEY848jbvSpG6B84xE300HhMfCR3/T5srfffptQKMSUKVMOee/pp5/mggsu6IfglFJKKQUDnOCIyL+AjwEVxpi57Y6fA/wFsAO3GWN+Y4zZAlwnIjbg1oGM62grKyvjM5/5DCtWrMBmayuaXXbZZTQ0NBCNRlm3bl0SI1RKKaWGl4Gu4NwJ3Ay0TlQXETvwN+BMoAR4R0QeN8a8LyLnATfErzlyh1Fp6W8+n4+PfvSj/OIXv2Dx4sUd3vvPf/7DvHnzuOGGG/jSl77Eww8/nKQolVJKqeFlQMfgGGNeBWo6HV4E7DDG7DLGhID7gPPj5z9ujFkKXNZdmyJyrYisEZE1XY1nGUxCoRAf//jHueKKK7j44ou7PMfpdPKLX/yC1atXs2XLlqMcoVJKKTU8JWOQ8Vhgf7vXJcBYETlNRP4qIrcAT3Z3sTFmuTGm2BhTnJ+fP9CxHpEHHniAV199lTvvvJP58+czf/78LqeDp6Sk8K1vfYvf//73Rz9IpZRSahhKxiDjrpYdNMaYl4GXj24oAyMQCABw+eWXc/nll3d5zssvv9zh9be+9a2BDksppZQaMZKR4JQA49q9LgJK+9KAiCwDlk2dOrU/41JKKaXUEFHha+bu1Xu7fT8ZCc47wDQRmQQcAD4JfLovDRhjVgIri4uLrxmA+JRSSik1SNU2hPjtM1t5cG0JkZjp9rwBHYMjIvcCq4AZIlIiIp8zxkSALwPPAFuAB4wxmwcyDqWUUkoNbcYYHnm3hA/98RX+u6aETx4/npe+dVq35w9oBccY86lujj9JDwOJe6NdVEoppdTIsbe6gR8+uonXtlexYHwWv77wGGYWZvR4zaBZybgvtItKKaWUGv4CwQgr3tzDX1/YjtNu4+fnz+HTJ0zAbutqvlJHQzLBUUoppdTwVVbfxJ1v7OGet/bhD0Y4e84ofnreXAozPQm3MSQTnKHQRfXLX/6Se+65B7vdjs1m45ZbbuGEE05IdlhKKaXUoLW5tJ7bXtvNyg2lxIzh3GNGc83Jk5k3LqvPbQ3JBGewd1GtWrWKJ554gnXr1uF2u6mqqiIUCiU7LKWUUmpQisYMf3ruA25+aQepLjtXLJnIZ0+cyLgc72G3OSQTnMGurKyMvLw83G43AHl5eUmOSCmllBqcmsNRvvjvtby0rZJLiov4wUdnk5niPOJ2h3WCc9PbN7G1Zmu/tjkzZybfW/S9Hs8566yz+NnPfsb06dP58Ic/zKWXXsqpp57ar3EopZRSQ104GuPL96zjpW2V/PyCuXxm8YR+azsZe1EdMRFZJiLL6+vrkx1Kl9LS0li7di3Lly8nPz+fSy+9lDvvvDPZYSmllFKDRlMoypf+s47nt1Tw8/Pn9GtyAyDGdL8K4GBXXFxs1qxZ0+HYli1bmDVrVpIi6tqDDz7IihUrWLly5WG3MRg/l1JKKXU4KnzNfP6uNWw8UM+PPjabz5446bDbEpG1xpjizseHdRdVsmzbtg2bzca0adMAWL9+PRMm9G9mqpRSSg1F75f6+NyKd6hvCnPrZ4r58OxRA3IfTXAGQCAQ4Ctf+Qp1dXU4HA6mTp3K8uXLkx2WUkoplVQvbDnIV+99l3SPk/9et4Q5YzIH7F6a4AyA4447jjfffDPZYSillFKDQixmuPW1Xdz09FbmjMnktiuLGZWR+KJ9h2NIJjhDYaE/pZRSaqQzxrB2by03Pb2Vd/bUcs6cQv546Ty8roFPP4ZkgjPYF/pTSimlRrrn3j/Iz594n301jWR4HPzh4nlcuHAsIr3vI9UfhmSCo5RSSqnBaU9VA396/gMeW1/KzMJ0/nDxPM6eW0ia++imHJrgKKWUUuqINYej/PrJLdy9ei9Ou42vfmgaXz59Ki5Hcpbc0wRHKaWUUkdk+0E/33xgAxsP1HPFkgl8+YypFKQP7CDi3miCo5RSSqnDEonG+OWTW7hr1V7S3A5uvaKYMwdoXZu+0q0aBsgvf/lL5syZw7HHHsv8+fN56623uOyyy5gxYwZz587l6quvJhwOA3DnnXfy5S9/OckRK6WUUn1z79v7uOONPVxSXMRL3z5t0CQ3MEQTHGPMSmPMtZmZA7dA0JFYtWoVTzzxBOvWreO9997j+eefZ9y4cVx22WVs3bqVjRs30tTUxG233ZbsUJVSSqnDUtcY4g/PfcDiyTn86uPHkJPqSnZIHWgX1QAoKysjLy8Pt9sNQF5eHgBjxoxpPWfRokWUlJQkJT6llFLqSISjMX72xPv4msL8eNmcozb1uy+GdYJT/qtfEdyytV/bdM+aSeGNN/Z4zllnncXPfvYzpk+fzoc//GEuvfRSTj311Nb3w+Ewd999N3/5y1/6NTallFJqoG0sqefb/93AtoN+rjt1CrNGZyQ7pC4NyS6qwS4tLY21a9eyfPly8vPzufTSS7nzzjtb37/++us55ZRTOPnkk5MXpFJKKdVHL2w5yMW3vImvOcytVxRzw0dmJjukbg3rCk5vlZaBZLfbOe200zjttNM45phjWLFiBVdddRU//elPqays5JZbbklabEoppVRfPbyuhG//dwNzxmTyr6uOJz/dneyQejSsE5xk2bZtGzabjWnTpgGwfv16JkyYwG233cYzzzzDCy+8gM2mxTOllFJDwwNr9vO9h95j6ZRcln+mmNSjvCrx4Rj8EQ5BgUCAr3zlK9TV1eFwOJg6dSrLly+nsLCQCRMmsGTJEgAuvPBCfvSjHyU5WqWUUqp7b+yo4oaH3uOkqXncekUxHqc92SElRIwxyY6hz9rtJn7N9u3bO7y3ZcsWZs2alZzABtBw/VxKKaUGr7L6Jj7219fJSXXx2JdPPCq7gPeViKw1xhR3Pj4k+0kG+zo4Siml1FAXisT40n/W0RyO8o/LjxuUyU1Phla0SimllDoqfv3UFtbtq+PmTy9gakFassPpsyFZwVFKKaXUwHlmczl3vLGHz544kY8dO6b3CwYhTXCUUkop1SoQjPDjxzYze3QG3//I0B37qV1USimllGr11xe2U+5r5m+XLcTlGLp1kKEbuVJKKaX61fulPm5/fTefPH4cx03ITnY4R0QTnKNkz549zJ07N9lhKKWUUl0KRWJ884H1ZHtdfO+cwbsFQ6K0i0oppZRS/PWF7Wwt93PbFcVkp7qSHc4R0wrOAPnjH//I3LlzmTt3Ln/+858BiEQiXHnllRx77LFcdNFFNDY2AnDDDTcwe/Zsjj32WL797W8nMWqllFIjUUltI7e8upMLF47lw7NHJTucfjEkKzjtVjLu8bzXHviAqv2Bfr133rg0Tr5keo/nrF27ljvuuIO33noLYwwnnHACp556Ktu2beP222/nxBNP5Oqrr+bvf/87V199NY888ghbt25FRKirq+vXeJVSSqne3PziDgThO2fPSHYo/WZIVnAG+0rGr7/+Oh//+MdJTU0lLS2NCy+8kNdee41x48Zx4oknAnD55Zfz+uuvk5GRgcfj4fOf/zwPP/wwXq83ydErpZQaSfZWN/DftSV8+oTxjM5MSXY4/WZIVnAS1VulZaB0t7+XiBzy2uFw8Pbbb/PCCy9w3333cfPNN/Piiy8ejTCVUkqNcLGY4acr38dhE64/bUqyw+lXQ7KCM9idcsopPProozQ2NtLQ0MAjjzzCySefzL59+1i1ahUA9957LyeddBKBQID6+nrOPfdc/vznP7N+/frkBq+UUmrE+MNz23hxawU3njuLggxPssPpV8O6gpMsCxcu5KqrrmLRokUAfP7znyc7O5tZs2axYsUKvvCFLzBt2jS++MUvUl9fz/nnn09zczPGGP70pz8lOXqllFIjwcPrSvjbSzv51KJxXLFkQrLD6XfSXXfKUFBcXGzWrFnT4diWLVuYNWvoLi3dneH6uZRSSh19r35QydV3vsPxE3NYcfWiIb1isYisNcYUdz4+dD+RUkoppfps04F6vvjvtUwtSOOWK44b0slNT4bnp1JKKaXUIfZVN3LVHW+T5XWx4upFZHicyQ5pwAzLMTjGmENmLA1lQ7kbUSml1OAQjsa49u41RGKG+65exKhhNqi4s2FXwfF4PFRXVw+bpMAYQ3V1NR7P8P5BVEopNbDueGM3W8v93PSJY5lakJbscAbcsKvgFBUVUVJSQmVlZbJD6Tcej4eioqJkh6GUUmqIKq1r4s/Pb+dDMws4a5hsxdCbYZfgOJ1OJk2alOwwlFJKqUHjpys3EzOGn5w3Z1gN4ejJsOuiUkoppVSbF7ce5JnNB/nKGdMYlzNytgNKKMERkYtFJD3+/Q9F5GERWTiwoSmllFLqSDSFovzosc1MLUjjmpMnJzucoyrRCs7/M8b4ReQk4GxgBfCPgQtLKaWUUkfq5pe2U1LbxM/Pnzts17vpTqKfNhr/+lHgH8aYxwDXwISklFJKqSO1o8LP8ld3ceGCsSyZkpvscI66RBOcAyJyC3AJ8KSIuPtwbcJE5AIRuVVEHhORs/q7faWUUmokqG8K872HNpLitHPjR0fmNj+JJimXAM8A5xhj6oAc4DuJXCgi/xKRChHZ1On4OSKyTUR2iMgNAMaYR40x1wBXAZcmGJtSSiml4t4rqeOjf32NDfvr+PkFc8lLcyc7pKToMcERkRwRyQE8wMtAdfx1EFjT07Xt3Amc06ldO/A34CPAbOBTIjK73Sk/jL+vlFJKqQRtKfNx2W1vYQz897olnD9/bLJDSpre1sFZCxhA2n1tYYBeh2QbY14VkYmdDi8CdhhjdgGIyH3A+SKyBfgN8JQxZl1X7YnItcC1AOPHj+/t9koppdSIUFrXxJX/eptUl4P7v7CYouyRMyW8Kz0mOMaYgVoxbyywv93rEuAE4CvAh4FMEZlqjPlnFzEtB5YDFBcXD4/9GJRSSqkjtPzVXdQ1hln5lZNGfHIDfVjJWESygWlY3VWAVZ05zPt2tYyiMcb8FfjrYbaplFJKjUiNoQgPrS3hI8cUMqMwPdnhDAoJJTgi8nnga0ARsB5YDKwCzjjM+5YA49q9LgJKE71YRJYBy6ZOnXqYt1dKKaWGj5UbSvEHI1y+eEKyQxk0Ep1F9TXgeGCvMeZ0YAFwJLtZvgNME5FJIuICPgk8nujFxpiVxphrMzMzjyAEpZRSaugLRqLcvXov00elUTwhO9nhDBqJdlE1G2OaRQQRcRtjtorIjEQuFJF7gdOAPBEpAX5sjLldRL6MNfXcDvzLGLP5cD6AUkopNdJU+Jt5ZvNBNpbU8ez7B6lrDPPrC48ZMRtpJiLRBKdERLKAR4HnRKSWBLuUjDGf6ub4k8CTCd6/A+2iUkopNdK8X+qjrL6J7RUBbn5xB4FghCyvkxOn5nFp8ThOnpaX7BAHFTGmbxORRORUIBN42hgTGpCoElRcXGzWrEl0OR6llFJqaNpf08gZf3iZcNT6nX3q9Hx+8NFZTCtIG/FVGxFZa4wp7nw80UHG7Rec2R3/Wgjs64fYlFJKKdWD/3txOyLCPdcsIj/NzVRNbHqVaBfV/2hb6M8DTAK2AXMGKK4eaReVUkqpkWJPVQMPrTvAFUsmsHSKdkO1F2tq6va9hGZRGWOOMcYcG/86DWsl4tf7Kb4+01lUSimlRorfP7sNp1344mlTkh3KgDHhMIkMmWne9gH+F18EIFxWxo7Tu1+tJuGF/joEYsw6ETn+cK5VSimlVGKe3lTGE++V8fUPT6Mg3dP7BUNQLBhk17LzcOTnM/Z3v8U5ZkyX5zWuW8f+a64l1tjIhLvvovbe+3qs4CQ6Bueb7V7agIUc2To4SimllOpBVSDIDx7ZxNyxGXzp9OE7JKPuoYcI79tH5OBBdn38Qsb/63ZS5nQcAdO0cRP7Pn8NzoICTCRCyde/QbSqirzrr4evfbXLdhNd6C+93R831pic8w//4xwZEVkmIsvr6+uTFYJSSik1oP7w7Af4msP88ZL5OO2J/roeWkwoRPWtt5GyYAGTH38Mm9fLga99najP13pOtK6OA1/7GvasTMbftYIxv/4V0aoqHIWF5H7+c922nVAFxxjz0yP/GP3HGLMSWFlcXHxNsmNRSiml+tueqgYeWLOfy08Yz/RRw3dvqbpHHiVSVsbon/4E14QJjP3jH9j7mSsovfFGiv7v/wAo/f6NhCsrmfjvu3EWFOAsKGDsn/+Mc1wRNm/3m4r2mOCIyEqs2VNdMsacd5ifSSmllFLd+NPzH+C0C186Y/h2TTVt3MTB3/yGlIULST35ZAC8CxaQ/7WvUvmHP9L41tsQixJ46SUKvvMdUubNa70245yze22/twrO7+NfL8Ra9+bf8defAvb07aMopZRSqjd7qhp4fEMpXzhlyrAcWBytqyPw6qsc/O3vcGRnU/SXP3dY0yfniiuouesuqv7xD4hGcYwaRfZnLu/zfXpMcIwxrwCIyM+NMae0e2uliLza57sppZRSqkePrbd2Qrpy6fDbGTxcWsquCz5OzOfDMWY0425djiM/v8M5Nreb3Ks/R8VNNwEw6sYbsblcfb5XoqOW8kVkcssLEZkE5Pdw/oDSQcZKKaWGI2MMj204wKKJOYzOTEl2OL2K1tez/ZRT8T39TELnV/3jH5imJib8+26mPv887ildr+2Tfekl2LOzsefmknXJxYcVW6Lr4HwDeFlEdsVfTwS+cFh37Ac6yFgppdRwtLnUx67KBj530qRkh5KQ0O7dRCoqKP/lL0g9cSn29O4HRIf27KHu4UfI/vSn8RYfsnVUBzavl6K//w0RweY5vG66RGdRPS0i04CZ8UNbjTHBw7qjUkoppbr0+IZSHDbh3Lmjkx1KB9FAAFtKCmK3dzgeLj9ovV9ZRfmPf4wtNQ3XhPHkfv7zh7RR9Y9/IC4XeV+4NqF7ehcsOKKYe5tFdYYx5kURubDTW1NEBGPMw0d0d6WUUkoB8Nj6A/xn9V5OnZ5Pdmrfx5wMlFhTEzs+9GHyr/8iOVde2eG9yMFyANLPOQffk08BIC4XWZ/8JPa0tNbzTCSC//kXyPzYx3Dk9dN+Wr1s7dBbBedU4EVgWVdNA5rgKKWUUofp7d01fOP+9fibw/iaIxw3IZufXzA32WF10PTuu8Tq6wm88cYhCU64/CDidjPmpt/QdMnFIMK+z15N4KWXyFzWljo0b9pErKGB1BOXdnufhvogK/9vA2ddPYecMam9B1ZfAn9f3O3bvc2i+nH8288bY6K9300ppZRSiWgMRfj2fzcAcOHCIibmerl88QQcg2zV4oa33gagaf0GTCyG2NriixwsxzFqFDa3m9SlSzGxGI5Ro/A9/UyHBKdh9VsAeBct6vY+JVtqqC4JsGt9BTljEhiDVLsbQoFu3050kPFuEXkauB940SSy5ecAEpFlwLKpU4fvAkhKKaWGtz8++wH7ahq579rFLJ6cm+xwutX4tpXgxHw+Qrt24W73uzd8sALnqFGtr8VmI/2ss6i7/36igUBrN1XDW6txz5iBIyen2/sc3OMHoHRH9zOkQ00Rgk0R0nM8ULunx7gTTRNnAM8DX8JKdm4WkZMSvLbfGWNWGmOuzczMTFYISiml1GHbXFrPv97YzadPGD8ok5vwgQPU3HUX0UADTRs3kn7mmQA0vvsuzVu2UP/YYwBEystxFBZ2uDbjnLMxoRBl3/8+FX/8E+GyMprWvUvq4u67kwAO7rYSm/Kd9cSisS7PWfXoTv7763eIxQzU7MaIs9v2EkpwjDFNxpgHjDEXAguADOCVRK5VSimlVBtjDD99/H2yvC6+d/bM3i9Igpp77uHgr37Nga99DSIRsi65BHtWFo3vvMOBb3yT0h/8kFhTE+GKCpyFozpcm7JgASkLF9Lw1ttU3347u86/ABMM4l18Qrf3i4SjVJUEyMjzEA5Gqbr9GxCNHHLewd0+mvxhKvb4aDpYxorK5d22mXBHn4icKiJ/B9YBHuCSRK9VSimlRrK1e2tpDFm/sB9df4C399Tw7bNmkOntvgKRTM2bNgPQ8MYb4HDgXbiAlPnz8a18gtCePRCJ0LBqFYTDOEZ1rOCIzcbEe/7DjLffYuJ99yJul9VGD2vfVO0PEIsa5n1oPACl26th18vWm6XvQqiRaDRG9QFrzM3+LTXs3JNKQySr2zYTGoMjIruB9cADwHeMMQ2JXKeUUkqNdGv31vKJf7xJltfJ9FHpvL27hmPGZnLp8eOSHVqXTCxG8+bNZF5wAc2bN2PPzcWWmkrKggUEXn4Z9+xZBN/fgv+55wEOqeC0l3LMMUx66CEiZWU9LgJ4cLcPgMnzctnwUAVlodnM3/gApBfC8tNh4RXULvwlsagBYux/vxoqppGT7uu2zUQHGc8zxnTfilJKKaW6tGpnFQDFE7LZURHgO2fP4PLFE7DbpJcrkyO0Zw+xQADvokUU/vhHrevNpJ1+GnUPPsjYm25ib3wqOHBIBaczZ0EBzoKCHs85uMdHapabtOB2xjg2sSd0POb9m5GGSsDAu/+mqvEUIIcp7tXs2rUUY6azeFZ5t232ttDfd40xvwV+0X6nzxbGmK/2GLFSSik1wr21u4aZhencduXxyQ4lIc0bNwLgmTsHW0rbflie6dOZ+tyzAKTMnUvg5ZeBnis4nUVCUZ64eQPF506kaKY1o8oYw8Hd9YyamAG7X6bQtZWtzWfgb04lY+eLcPw18O6/qXz7DRxyFnO9T7EzaK2nM21BRrf36q2CsyX+dW3C0SullFIKgEg0xtq9tVx0XFGyQ+nV3iuuxHPMXEwojHi93W6ECeA5Jp7gOBzYc+OzwCIhcPS8AnPZjnoOfFBHOLiTi27IRkSo3OfHV9XMwrMnwK6Xyc+Pgg8qnIvISFkFH/4xOFOoWllAbp5hdE4AZ10TeY7dZEw4rdt79bbQ38r41xU9RnyU6To4SimlhoLNpT4aQ1EWTep+/ZfBINbUROM779D4zjs48vPxzJ51yL5T7aUccwwAjoJ8a+G/rf+DR66DL79jjZvpRskHtQBU7PVTsq2WcTNz2LqqHLvDxtR52fDqm+QeewW23ULlpOuYevrXwJ2OOeW7VK18i+kzx2L3LuEjFb8m1V4L2Vd2e6/euqhWYm3J0CVjzHk9XT9QdDdxpZRSg1ljKEJTKMrbu2sAWDRxcCc4od27rbE2IkQqKsg499wez/fMtbaTcLaMv6nZBUEfbH4EFn+x2+sObKslf3w6DfVB1j29lzFTs9j+zkEmzcvDXfMuhBuxTz2ZnLGpVNW5YNx86iubqCltJhS2kTc+A1KXMm7DvZCaD+7uBy731kX1+/jXC4FC4N/x158C9vRyrVJKKTUi3fjwRp7cWE5OqotJeakUZHiSHVKPgjt3AZD3pS9RdfPNpPSyk7cjJwfXpEm4Jk60DoTik6s3PdxtghNqjlCx18+Cs8bj8Tp58+EdPHjTGpobwsxYXAi7HgOxwcSTyB9Xxu73qmioC3LPT1cTi1i1loKJGeA90Wowu+ftHHrronoFQER+bow5pd1bK0Xk1R5bVkoppUag5nCUZzYfJC/NRWl9M5cvHp/skHoV3LUTbDZyr72G9DPPxD2t9yEg4++8A5vHQ5M/hCfYgACUvA21eyF7wiHnl+2sx8QMRdOzGTsjCxNqYs1z5aRmuhg/OwfufAXGLICULPLHB9jyZhlvP7GbWMRw1ufmkJ7rIX9cOpg0yBwHBbN6jC/RaeL5IjLZGLMLQEQmAfkJXquUUkqNGK9tr6IpHOWWTxzHhFwvuWnuZIfUq9DOXbjGjcPmcuGZMT2ha5yjRhGobebuG9/gjGOymGFzEotGaVqzEjnhWlLSnYiI1fXVUMWBjaXY7ELh1Exsr/2Whev/xKxvvEw0cxK2cABK1sBJXwcgf7zV9fT+G6WMm5XNtOPbzdQSgaufAVfPO44nmuB8A3hZRHbFX08EvpDgtUoppdSI8czmcjI8DhZPzsXlGFw7g3cnuGsnrh5mTXWnfJePWNSweU8RMwpH82z5dex8aBY89DpLPj7Fmhm16mZ49occqL6JUW4nzrfehZd/DUDK9nvhzJ/BtpfBRGHSqQDkFqXRkhvNOXnsoTfO7OJYJ4nuRfU0MA34WvzPDGPMM4l9fKWUUmpkiERjvLDlIB+aNWrIJDcmEiG0dx/uKZP7fG3lPmsH8LK6fHY0nsDOullMz9pApr2Ufaut7R7Y8waR9MlURaYx2rMDXvgpFB4DU86ADfdbe07tehkcHhhn7VfldNnJHp2KN8PFxHl5h/W5Eq3gAByHVblxAPNEBGPMXYd1V6WUUmoYen1HFbWNYc6ek/jid8kW2rcfwmFck/tewanc7yct201DbRPP778Yl8fOKTd+gbd+83u2HMwnFo1hK3+PiswLiBmh8BPXQ3gCzFoGB9bAA1fAe/fDtidh/GJwtg3GPvVTVleZ3X54iWKie1HdDUzB2o8qGj9sAE1wlFJKKayp4T9d+T5js1I4dXrPWxMkS8ObbxILBkk//fTWY6Hd1uiTvlZwjDFU7vUzaX4eDRvfYJ9vMvNPL8Kd4WX0OCcba5xU7zhAvu8A5anWtPLCGaMg7TqrgdQ8SMmGx64HRwqc+/sO7Y+Zln0EnzTxCk4xMNsY0+2aOEoppdRIEo7GqAoEGZ1pbWfw26e3sbuqgXuuOYEUV/eL5B1twV27cU+ehInFOPDd7xGtqiLrkksY9YMbsbndrVPEXZO7T3DqK5tIzXLhcLZ9Ln9NM80NYQrGp5NR9ioN0SzmfegkAApnjYENULb6LfKBMn8hWaO8pKS1W+nY4YalX4Udz8PH/gT5M/r1cyda99mEtQ7OoCAiy0RkeX19fbJDUUopNUJ9/f71nPa7l9lVGWDNnhrufHMPVy2dyNIphzdmZCA0bd7MrnPPxff0MzS/9x7Rqiq8ixZR98AD1N59NwDNW97HUViIPS2tyzaqDwS45yerWfv03g7Hq/YFAMgbn85493t8cunTrQlM2vT5pNqqKd9agjFQXmancHIX+0ad/E347JP9ntxA4glOHvC+iDwjIo+3/On3aBJkjFlpjLk2MzMzWSEopZQawV7aVsH/3isjGInx/x7bxA8e2cTYrBS+e07//6I+EqGdOwGove8+/C+8CHY7Rf/3Vzxz5uB/8SVMJELDG2+SumRJl9ebmOGVe7YSixp2v727w3sV+3yITcgbm2Yt9Ndu2raMmkOhewflvlHUp8yjuSFK4eSj+zs70S6qnwxkEEoppdRQ8PSmMnZWNnDv2/uYnJ/KpxeN5xf/s/alvvWKYryuvszdGXjhAwcAaFy9muDOHXiPPx57ZiZpp55K1T//SeCVV4j5fKSdak3PjsUM2985yJQF+ThcdrasKqNsp48Cx3YqKqcRqG0mTSqgZheV+7LIGe3F4bLHE5x2FSC7g8L8BnbuG8XqwGcAKJwyCBOclhWNlVJKqZGqvL6ZL/5nHcZAmtvB7VcWUzwxh1c+qCQ/3c2ZswffzKlQSQm2tDRiTU1EK6tIv8bawjHt1FOo+vvfqfjt78DhIPXEpQC8/3opr9yzjWhkJrNPHMPmVw+QPwrOiNzMfdV/Ye+mauZU/Rr/+pc5UPMPZi0dDbEYhBvB6e1w7/HTvazeF2Jn1RQy81PIKex5Yb7+1ttmm68bY04SET8dN90UwBhjuuhQU0oppYaflRtKMQae+8YpTMpLxRGfvnzX1YusFXuTrPHddyn/6c+YcPdd2NOtlYDDB0pxT52KIz8P/3PPk3bGGYC1WaY9O5vQ3r14Fy3Cnp5OqDnC2yutAceVe/1ET4hRdSDAvNk+cg7uI81exd5NecyJreOt+osgFrMW8os0AeaQlYVzZs3m2o2fwnziTmxzT0dsR/cZ9TgGxxhzUvxrujEmo92fdE1ulFJKjSSPrj/AvKJMpo1Kb01ugEGR3AA0b9xIcOtWGt95p/VYuKQEZ1ERBd/9LqN/9StcRUUAiN1O2iknA1Y1B+DdZ/fR5A+Tlu2mYp+fmtIGYhFDvmc/IjDR9Q77t1Szce8ktjWfyry5PtJzPG0bbXbeOmHGudg+8ivss8856skNJD7IWCmllBqxdlT42Vzq4/z5vW8RkCxRn7WqcOM7awBrheJwWRnOsWNxjRtH1oUf73B++tnngNPZWtXZ8kYpE4/NY8pxBVSXBDi425qpnM9mEBuTPauJhAyv+q4l1VbDwsI3rIZaE5xOs7AcLmtncUdy9uIaXKOhlFJKqSQyxvCft/YxOS+VpVPz2F3VwN9e2sH2igA2gY/NG53sELsV88cTnDVWghM5eBCiUZxFXSdl6WeczvQ338Ceno6JGRr9YXLHpJIzJpVoJMa2t8pxpTjIbHoPxi1m3L43uWLS/yPiryE1LxtXZTxxaU1wvF3eJ1m0gqOUUkrF/eWF7fzw0U18+78bCEdj/P7ZbTy+vpTahhBXLJlIQbqn90aSJBpPcJrff59ooIFQiTWDyjW2+6pTy1idYFMEEzN40pwUTLBGoJTv8pE/Pg2p3QVjFkDGWNKbNpGdFcU163Q4uBmi4e67qJJMKzhKKaVGtN1VDXzzgfU0haJsLfczb1wWG/bXccsrO3lqYxnXnDKZ739kVrLD7FXM77O+iUZpevddIpWVADjj42560hwIA5CS5iQzPwWnx064OUpBoQ22NUHOJCiYBb4DMHq+lfBEg1CxBULWgn+HdFElmVZwlFJKjWi3vraLzaU+irK9XH/aFB68bglT8lP5/bMfYBPhs0snJTvEhER9ftyzZ4HdTuOaNYRLSkAEZ2HvGxE0N1gJjifNhdiE/HFWZSc/K75jQM5kyJ9pfT9mvpXgAJStt6aIwyHTxJNNExyllFIjVn1TmEfWHeCC+WO47cpivnvOTJx2G9ecbO3LdN78MRRmDt5uqfaifh/OUYV45swh8OqrhPbvx1FYiLhcvV7bFGhJcJwA5E+IJzieEuuE3ClQMNv6fvR8yJ4E7gwoXa9dVEoppdRg8+DaEprCUa5YMrHD8Y8vHMuuqgauWDIhOYEdhpjPj33aNNLPPJOyG28k+MEHpCyYn9C1zYEQYHVRAcw9eSzuFAeZkVfB5oSMIpj5Uaj8Kkw5HWw2K+mp3QOj4omPdlEppZRSyWeM4d+r97JwfBZzx3bcRsDtsHPjubMoyh483S4Vf/ozTe+91+37Ub8fW1o6WRd+nKxPfRKiUVxjO46/Wf/8PratLjvk2s4VnKxRXo7/6CSkahtkTwC7A1Ky4Kyfg9PaPZ30MeAvg1C8i0orOEoppVTyVfiD7K5q4Ipls5MdSq8itbVU33ILsYYGUo499pD3TSxGzO/HlmF1LRV+//sQiZJ+1pmt5+xcV8EbD+4gb1waMxZ3nO7eHAhjd9hwuu1tB7c/B9uehMXXdx1UxmjY+0ZbF9UgG4OjCY5SSqkRaUeFNftn+qj0JEdyqMArr5C6ZEnr+JmWXcHDpaVdnh9rbIRYDHu6NcVbXC5G//xnxGKGbavLaG6M8PZKazfwuvJGTMx0WF24ORDGk+ZsW5XZVwaPfAFGzYUP/ajrINNHQ3MdNFZbyY1tcHUKDZpoRGSyiNwuIg8mOxallFLDX0uCM7VgcI0dCe3Zw/4vXEf944+3HgvutPaI6jbB8VlTxO0ZHZO1ij0+nr9zC68/sB2708Zx50wgEo7hr2nucF5TPMFpteFeK3G56I62LqnO0uNVoOodg657CgY4wRGRf4lIhYhs6nT8HBHZJiI7ROQGAGPMLmPM5wYyHqWUUqrFjooA6W4HBenJ2UqgO5GaGgCa3tvYeiy0q+cKTssif7b0jttEtoytOe9r87nyl0sZPzcXgJqyhg7nNQfCrQOMAagvgZRsyJ/efaAZ7RKcQdY9BQNfwbkTOKf9ARGxA38DPgLMBj4lIoO/A1QppdSwsqMiwJSCtEGzWWaLaLwa07SpLcFpqeDEfD6igcAh18R8Pnzp43nkOSd33vAGL9+zDYBQo5XgZOR5sDtt5BRalZba8kaqSvw89Ns1NDeEaW7oVMHxl0FGL/tupY+xvtbvH3QzqGCAExxjzKtATafDi4Ad8YpNCLgPOD/RNkXkWhFZIyJrKuOrNCqllFJ9taMyMOi6p6Ctuyn4wXZiwaD1/a6dSIrVVRQ+cGgVJ+r3E0gdSyBgANi7sQqA5sYIAO4UK3nxpDlJSXdSW97A1jfLKd/lo3xXPU2BECmp7RIc34G2LqjuZLR7f6R1UXVjLLC/3esSYKyI5IrIP4EFIvL97i42xiw3xhQbY4rz8/MHOlallFLDUH1TmEp/cFAmOFGfn5jYIBIhuG0bsYYGIqVlpJ5wAgDh0gNdXONr/b5wcmZrYhNqsr66UtpmR2UXplJb1sDezdUAVO7zE2yMdKzg+MogY0zPgbozwBlPbDTBAaCrWqAxxlQbY64zxkwxxvz6qEellFJqxGgdYJw/+BKchpoAr570B6qzZ9K0cSPB3XsASD35JADCZYeuYxPz+Vu/96Q6iASjRMMxgg0RnB47Nnvbr/vsfAcVu6qpO2itX3Pggzow1jYNAERC0FDRe4IjAunxbSA0wQGsis24dq+LgK5HTXVDRJaJyPL6+vp+DUwppdTIsHOQzqACaKgNEbO7qC46geZNm1sHGKcuWoQ4nUS6GGgc9bdVcNzxrqbmxjDBpjDulI4rwmQ7y4hhnZM7NpXyndbv0tZBxoFy62tvCU77czTBAeAdYJqITBIRF/BJ4PFerunAGLPSGHNtZmZm7ycrpZRSneyoDOBy2BiXM/hm/4QarCnctTmzaN60yRpgbLfjmjABx5jRXc6kivn8rWvmeLzxBKchTLAxgtvr7HBudshaDTkrNcCkeflEIzHruvT4eb54++kJJDgt43RGWoIjIvcCq4AZIlIiIp8zxkSALwPPAFuAB4wxmwcyDqWUUqq9TQfqmZyXit028DOoIlVV7Dz7HIK7did0fjie4DRIOvX7KqlevhzX+PGIy4VzzBjCB0qpuesu9lx2ees1Ub+/dRCyO9Wq2AQbIgTrfbhr1kPV9tZzc2pfAGBCzh7yitoqWK0VnJYEJ6OXQcbtzxmE08QHdCVjY8ynujn+JPDk4bYrIsuAZVOnTj3cJpRSSo1QW8p8vLmzmq99aNpRuV9ozx5Ce/cS3L4d9+RJvZ4fbgxDfGmeyCe+SG5aNamLrQHGzjFjCDz/ApU3/82aMu7zYc/IIOb3YfNYyYontV0Fp6qcjFg1HNwMedMgUEla3So+lPkXxuc7CY39fOt9PanxMTj++BifRLqoWqo8I22a+EDRLiqllFKH6+aXdpDmdnD1ib0nG/0h1mgN5jWhYELnh5uttWtEwDe+mIJvfoPUpUsBcI4eQ7S+vnUqeWifNSk56vMjKR7AGmQMEDy4n2BjFLc0WFsqAOx5DYCZo3bgDZeQmZ+Cw2WlAp60eM3DVwqOFPBk9R6sDjJWSimlkicWMzywZj9/e2kHT24s44olE8jsNDZlwO7dkuAEE0xwglEACqdkUrKtFmOstW32v19DNNfqEnKOH2+du38fYA0ytnmsBKd1kPHmlwmZVFy2Bmiqsxrf/ao1vXvK6dBYhdiE3LFpON12HM74VHJfqVW9SWQBxNZBxoOvi2pIJjg6i0oppVRfPPt+Od998D1+98w2MlOcfO6ko1O9AYg1WAlOLMEEJxKyEpzxc3IJ1AZp9IWIhmM8cfMG1u1yY3PEGH2dtT5uSwUn5vMj8QTH5XEgNmg+sJuQ8eK2N7VVcMrWw9jjIG0UNNZALMa42Tnkj2+3h1VLgpOI3KngzYX8mYmdfxQNyd3EjTErgZXFxcXXJDsWpZRSg9+KN/cyNiuF/331JFJcdtwOe+8X9ZO2Ck6o13NNLEbEWpuPnNFWt0+gNkgkFCMWM+w94OGUC4Kk5jViz8sjtG8vYA0ytnlSIL6HpscZxhctAMDtirVVcBqqIW8GpOaBiUJzHScsm9wxCH8pjF+S2Ifz5sB3dyV27lE2JCs4SimlVKI+OOhn1a5qLl88gSyv66gmN9C3MTgxv5+ozYVdYmTkWRWZQE0zgfju37GY8H7zmVD+Hq7x4wnv24+JxYj5/dg88ZHJ0RDuWDX1DmujTLeHtgpOY7VVcfHmtr3uEEAM/OW9b9MwBGiCo5RSali7a9UeXA4blx4/rveT+0mkqorgbmtaeEuCk0gXVdTvJ2p34XBAWraV4PhrmvHXWglOVnojmxvPJlq6Cde4cYT277faj8UQjzVNnA+ew0MdvkgeAG6PzarghJsh3GBVXdonOIFKqNja9joaSryLahAbkgmOjsFRSimVCGMMT24s5yNzC8lpmQZ9FFT88U+UfOUrQN+6qGI+H1G7G4dTcHsdON12AjXB1grO8VO20BjL4WCFC+eYAiLl5QQ/+AAAe3p8qvaO53C7IgSbrUHCbq/DquA0xfe+bp/gNFTBcz+Cf51lJUAHN1nHsyce+UNIsiGZ4Og0caWUUomobghR0xBiXlHWUb1vpKqSaKW1o3essQFIbBZV1OcjanPhcNkQEdKy3QRqm/HXBklJd5LrtGZNNURzcGVYs6uq/vlPcDpxT7e6pGiowJPS9uvdneq2Kjgt3VHeXGsMDljHDm6C5nrY/gxsfBBc6TDplH54Csk1JAcZK6WUUonYkaQ9p2L+ANFAAGNMn8bgRH0+YnY3Trf16zk9x4O/pplwKEpatgdvzFqErzGWjctZB0DDq6+RdsYZ+L3xqdoNVXi8bQmOK80DB+usWVNgJTgpOfFzK9tWOV53N+x/C2afB86UI3sAg8CQrOAopZRSiUhWghP1+yAaxTQ19WkMjtVF5cLpsRKctBwP/tog/pog6TkePKFSbBKj0T4WpznQel3mso+1NdJQ1boWDoA73WtVaBqtihIpOda6NU6vNW080gSp+bDjOQj64JiLj/wBDAKa4CillBq2dlQESHXZGZ3pOar3jfmtxCrq92Mauh6DU/vf/1Lxpz9TffvtmKi19k3UZw0ydqZY44XSst00+UL4q5pIy3EjTdWkuIM0uidi972PLT0dW2oqaaef3tZwtBlPuvV5xSY40zLAxKDWmlLeOv7Gmwd7V1nfn/RN62ta4bDonoIh2kWle1EppZRKxM7KAFMK0pBEVuXtRzG/v/VrVysZRwMByv/fj1pfpyxciHfBAqK+eqL2ApxeK8FJz7ESlUg4Rlq2G7ZW4/VEaLQVIpVbSTvpSpxFE1pXMW7hzrAqVm6vA0nJsg7W7IzfLNv66s2BMmtMD/M+CR88DZNPA9vRnUY/UIZkBUcHGSullErEjooAU/OPbveUiUZbk5po+wSn3RicaG0tADmfuxqAcInV3RTz+Yk5PDjdVpKRltOWuKSnG4iF8aYaGmM5gGHsZ0+i4FvfPCQGT5b1+9Gd4oDWBGe3tU2DIz6brGWgsTfPSnaufBxOPrStoWpIJjhKKaVUbwLBCGX1zUw52gOMA4EO37eNwWnroorWWcuceGbPBiB8oMQ6Hp8m7nRZCU56jrv1mrQUa6q4N91BY5PDSky2P9NlDO4caxCx2+to2zSzZpeVyLRo6arKn3E4H3PQ0wRHKaXUsLQzaQOM2yU43XVRxddxcxYWYs/NJXzgQPxaH1GbE0dLBSerXQXHbXV7eTNcNPlDxKaeBTueh1j0kBg8eflAPMFpqeD4y9pmT4GVIAHkTT+CTzt4aYKjlFJqWEraFPGAv/X7qD/QTYJTB4A9MxNn0VhCJS0VnAAxcbR2UdmdNlIyXNjsgtdmXePN8mIMNBedBU21ULKmYwBix5NjJS+uFCd42g3naKnaQFs1Z5hWcIbkIGOllFKqM2MMf31hB2X1TQBsLvXhtAsTcrzdXlN7772knngirvHju3w/UllJ/RP/I+eqK3scqGyMoWbFCjLOPbd1gDFYC/4RiwEQCx1awbFnZuIaW0TTJmsF4ZC/CTLB4Wob6Jue7cbpsiFNFQB4czKAKhpzT8Ardnj2B1B4LLit8Tx483B5XYiAO7VdFxV0THBStYIz6OhWDUoppTrbURHgT89/wNOby3lpWwUV/mY+esxoHPauf9XFgkHKf/oz6h58qNs2fc88S8VNNxGpqOjx3tG6Oip+cxO+lU906KKKVFS2ft9+mnisXYLjHDuWcFkZsVCI5gprteGWCg7AlIUFTD1uVOtKxN68LAAag25YcBnUl8Ca22HfW9YFqbmITZh2/CjGzcwBdzpIvL32Y3DGL7H+jD2ux882VA3JCo4xZiWwsri4+Jpkx6KUUmpwWLfPmpn00BeXMiWBmVMtXUeRqqruz2loiH9t7LkxY1rbcuS1VUkiBw8CIG53xy6qunpsXi/icuEsKoJwmIZXXyUSttpxutqSsoVnT7C+ebEGxIY3z0pSGn0hOO//rPf+vhRqdwGTWiszZ149py0+T6a1F1X7BCd/Blz9dM+fawgbkhUcpZRSqrO1e2vJ8jqZnJea0PktSUukqrL7c1pmQDX2kuDERaqqWis44vUSrrASHHt29iGDjG3xqdzOsWMBqF/5BFGbNYXb4e5iLZrGakjJxhsfeNxY327hwHGLoKZlIb+8Q69tGWjcvotqmNMERyml1LCwdm8tx43PTnhRv5ZNMHus4LQmOA0JtRmpqmwdZOwsLCRy0OrasudkEwu1nyZehz0zCwBXkZXgBF56CSkYbV3r6ibB8ebi8jhwuO1WBafFuBMgEk/CUrtIcFrG4bSfRTXMaYKjlFJqyKtrDLGzsoGFE7ITvsa0LMZX2VOCE++iSrCCE62qIur3Iy4XjpwcotXWuBlHVjZEIphIxDqvvh57fLFax5gxIIIJhbBPm2Ud67KCU9OaoHgzXJ0SnEVt33vzD71WKzhKKaXU0PPuvjoAjutDgtM6BqempnUvqO7OMYl2UVVWEfMHrD2i0tNbj9uzrbhMvIrTPsGxuVw4Cgqs8yZZWxB1XcGpaU1QUjNcNPrabd6ZMxlc8XFHqV0kMS0VHE1wlFJKqaFj7d5a7DZhXlFWwte0VmWiUaJ1dT2ek3AFp66OaG0t9vR07BmHJjgtO4q3T3AAa6AxYBs3yXrd3Rgcb7sKTvsxOCJWkgPWzuCdtVZwRk4X1ZCcRaWUUmrk+cOz2/jHyzu7fC8SMxwzNpOUriof3WiftESqqnDktqtuNPvg1jMwNUUdzt175VVkXfQJMpct67bd0N697Mk/kYbQNKbxOCFnOs9UHMcc73OYUAhjjJXgZGVRVRLg6Vs2cqInhjgEyS0A/B3WwbECiHWYBeXNcLF/a23Hc3Ks5KjrQcY5gIyoMThDMsHR3cSVUmrkeXlbJeNyvJx7TGGX758+o6BP7XVIcCqrYEa7FX3r9kH1dmL17tZzTThM41tvkXLMXOglwfEvOo+qUBbTgAbvKAIhF/60IkwwaM3eikSwZ2ayf2sN9ZVNuOfmkG+vYkcwDIDT3amDxVcC0RBkWVPGM/JTCDVFaPKHSEmPb5458SRYvReyuli0sPhqGD2vbaPNEWBIJji6Do5SSo0ssZhhZ2WAS4rH8Z2zZ/ZPmw3tKzidpooHfR3OiTU0Em23iWZPTDCIOB1EYlYVJuJIASDqSLESnJZtGrIyqS2zBjG7vFHSxgQJ11lxHDLIuPID62t8W4XsQmsqfG15Q1uC47TuQ1ezyDLHWn9GEB2Do5RSatAr8zXTGIr2687g7Ss40c5TxZvjCU5zsPXcWIIJDoA4HESNjZjYiXqsZCRiTyEWDHXYpqG2PB5D2Go7Ul+NzS7YO6++XBVPcPJaEhxr+4massTGBo1EQ7KCo5RSamRp3TgzgRWKExVrbERSrKpHpPNU8ZYKTigK2KwEp90eU70RpxNCVvUm6raSkYgjBRMKEmtuBsCWkUFNeXx9naD1Neyvw+nOOLTBqm2Qkt26xk16jgeHy0ZteWLr84xEmuAopZQa9AZiZ/BYYyO21FRsKSmHLvbXXI8xEItI67nt95jqlcMJxBMcV0uC48EEg60VnJArnWBDvM2Q9TUcCHQ9g6ryA6t6E+9+EpuQXZjaVgFSh9AuKqWUUoPezsoAmSlO8tL6b5BsrLERm9eLIy/v0AQn6MNEAdOW4LSsUJwIcVr1g4jd0y7BSSHWLsHxBT1tF4Tiqyo3NR86gwqsCk5+x12/swu9rWN41KE0wVFKKTXo7agIMLUgLeFtGBLRIcGpPnQMTixq73Bu1NfHLiog4vASccYTHHsKJhgiWhdPcALtPkuoAcRGuDncYaNNABqqrTVw8mZ0OJxdmEqgNkioOZJwXCOJJjhKKaUGvZ0VgX4dfwPWNgw2rxdHft6h2zU01xNzZLc7t49jcBzxCo7DQzQ+i6plDE60vh5JSaGuqt1CfRgomE3EuHDYwh0bq9pmfc3vlOCMthKnuoPaTdUVTXCUUkoNarUNIaobQv06/gbaKjj2vDyi9fUdNsMk6CNms+4ndisZiibQRdVSuWmr4KQQsXtav28Zg2PNoOrUvVRUTNh4cNIpYansJsFpnSquCU5XdJCxUkqpAdMUirK5tB7TzfuT81LJTXP32MaOyiMbYByprcXm8WCLz5hqYRobCRVMwJtjzUyKVldjGz2aQEklztoAMVKBEHZPjFhDI7FOg4xjoRAxnw9HCrB/LUFXJt7cVKJlpYjDCUSJOjyE2yU4sfpKmuqaqM+bSXVpA063nXAwvg9W0fGETYT0UAUcWAujF4DNZk0Rd3oho6jD/TMLUrDZRMfhdEMTHKWUUgPmt89s5Y439nT7/gmTcrj/C0t6bGN3pfULfMphdlHtu+IKUk88iVE3fK/D8UhDMy+FP8SCOifpWNs1OEeP5rEfP0dWdD6nTqwGanG4I4QaGw4ZZHzgK18l8MorzPreZJq2bOKNpXcwufEdJlbcjXjcQDOxFA8Re8tCfx7MS79jjfsnVOUVQX2I0VMzKdthjckhfTRRqcFeuxFuvR4+eQ/M/ChU74DcKVay047dbiM9z0N9ZdNhPZfhbkgmOLpVg1JKDQ37axqZmOvlFxccc8h7t762i+0He+/2qfBb68aMyuy50tOdaF09oT17DjneHLYTwYk/4rESnPg4nFDUjj+WS8xYlRdHSpTm2uZDBhkHXnnF+iboozlzDvigKmMGH3ryf5S8EADq8U6CmHghaM2oigVDNLq85NmqOPFrZ9LkD7UlOJ5MTKoT2+gsqP0L1MZj9pdDRterENsdNmKx7upjI9uQHINjjFlpjLk2s91OrEoppQafSn+Q8bmpnDQt75A/s0ZnUBkIYkzPv6Ar/UEyU5y4HYlvpNnZIdPAgeaoI/41Pl6mqpJYQwMmFqPZlo4xVkLl8MTAGCKVlYe00cqV2vbthAlt97WnEIw4reVrxEYo5iFo95KVGqZoRjZ2R7tfw+4MsDmsLRXsLggctI4HKiCtb/tsqSGa4CillBoaKv1B8rsZY5Of7iYcNdQ3hbt8v7WNQJD89MOr3rTonOCYcJigWF1H8YWFiVRVEamuBiDoyCAWs9bccXhi1vvl5X2+b3MsnUjUQWq2FX9DNJeo3YM3o4v1fDzt/qc9bZSV2MSi0FBpvVZ9ogmOUkqpAWGM6TE5aTle6Q/22E5PSVKiItXVmFis9XWsqYmgy9oSodEfxp6ZSbSqqjURiji8hJqtCo/DYw0CDvdUwemGP9q2tQJAXXQMAKnZ3kNP9rTboiGtwKrgNNaAiWqCcxg0wVFKKTUg6pvChKOm+wQnrQ8JzhFWcAiHW1cQBmuKeKglwfGFsOXnEams6rAnlb/OBiLYW5KrcM+Vpq4EovlAW4JTTzzByU/veKLNAY52Kxu3VHBauqm0i6rPNMFRSik1IFoSl14rOIGjkODQccfw9glOJBRD8kZbXVRVbVUaf51gS0nBln744z2bjXWPtHiC47ePtl6Pye54oiu1dZ8p64R4Bac1wdEKTl9pgqOUUmpAtCY4PYzBaX9eVxqCERpC0X5JcFrG1wDEGtoSHIBIzhgiVVVE253T4BMk1YstM+eI791SwWlMsRKV9HF5HU9wdZoCnzYKGqrAVxp/rRWcvtIERyml1IBoqcx0l5xkeBy4HLYeE5yqQM9JUl+0735qqeC0FE0iGQVWBaeyErAONoed2LxebJl5XbTWi1i0w8u0+CDjRu8oMDFSx+Z3PL/dLCzrggLAQMX71utUTXD6ShMcpZRSA6K3LioRIT/N3WOC01sbfRHp0EXVQMiVQVa2NfU8nJqDaWoitHcfEp+OHnJlYPOmYss+jOQi1nG8TksFJ+xMwxX2Y3d2WobukAQn3iVVvtGq7rj7d5uKkUATHKWUUgOiMhDE5bCR4el+Tdn8dHePY3D6N8FpG1/TUsHJLbQSj5DbGmfTvHUrYrd+NYZc6VYFJ7uw7zeLdkxwvJkuxFhVHXe0Hjqv/ePuNOi4NcF5T7unDpMmOEoppQZEy/RuaT94tpP89F4qOL10c/VF+0HGQV8jUbubnNGpiE1otlkVlJjPBzYrXquC48WW2/Uqwj3frGOC40px4DTWZ/FE6yHUcV+rQ8fgxJOa5nodYHyYNMFRSik1IBKZ/ZSf7m4dZ9NdG3abkO3tYmG8Pmo/Bqep3to5PDXPizfdSZC2OCX+mzEYT3AkZyx0u11oN9olOA57BLvd1prgpFBnTQFvr3MXVfsxN1rBOSya4CillBoQCSU4aW6qG0JEorEu36/0B8lNdWG3dV8FSlT7MTiNfisBSc1Nw5vppjnc1o3WUnBqqeBI+ihsjj4mOLFQ67cuRwQAh1jHvFLXNv27ZfHBzhUcl9faugG0gnOYNMFRSik1IKoS2GIhP92NMVDTEOry/f5aAwc6JjhNDdZ4mNQcL94MF01NMbDH97pql+BIihfSCvqe4LSr4LidVoLjJJ7g2OraEpxIfCfwzhUcaKvcaAXnsGiCo5RSqt9FojGqG0K9Tu9uSV4quhmH0x/7ULWI1tZi4qsRNzZZlRNvhgtvhotGXxhHbi7Q1kUVs7uIedIgNR+bM57g2BPc8DMaxoaV2Lgc1j2d8QpOqrOmrYsq3Gh97WqWVEvlRis4h2XQJDgikioiK0TkVhG5LNnxKKWUOnw1DSGM6X1wcG+rGffHPlSA1e9kDJGaWgCamwUxMTxpTquC4wthz4uvdyMGsBKgkCsd7E7EZUOcdsTR/YywDmJhnGJVZ1zxCo7LFu8Wc9a1VXBC8QqOs6cKjiY4h2NAExwR+ZeIVIjIpk7HzxGRbSKyQ0RuiB++EHjQGHMNcN5AxqWUUmpgVSQ4vbun/ahiMZNQN1ci7NnW1ggtU8WbwnZcsUZsNiElw0UsZojlW7OlhBgem5V4BO1W4mFzO7G7+/ArMxrGZbO2KW+t4MQTnLTMcLsuqkQqONpFdTgSTEUP253AzcBdLQdExA78DTgTKAHeEZHHgSJgY/y0jktAdmNbuZ9TfvtSh2PzxmXxf97bIHcqnPSNI/4ASik1Ut11zb+oCod5dPb0Pl/bHLb+GTcPv8bDNwe58B+Xd3lefrqb+1w/57//O5ebXzy5w3sxYwhHDWP37OPOz20kho2xOc2c/buui/zRcIT/Xn8/jVE3rqifT/zqw6SMHWe1lT+W1VO/RNrOSsbNgeaIA7exEhBvhjVDK2KPIXYgGiTFaWgOpvLG9jze//1aFqZ4sTU3sWbqF5jmd1EAHMxfSOmYk5jFPV0Fg9icOGNNrWNwXPYwRCE9zwWbHoY9r0PtdOCLhw4yhrYER1cxPiwDmuAYY14VkYmdDi8CdhhjdgGIyH3A+VjJThGwnh4qSyJyLXAtQOaYyRw3oW3DsvdK6nh5awXIv60DmuAopdRh89sn4rbT4d/ZvsjwONj5VEWP53icdhbbtrDYbOEbEw4t3i+dIhTt2sUmZy7OSANlNV3PtgII1vqpto/GGQvQlDKB+lUvkHLRVQBUp0+j0VvIe+9FGHcexLBhj4+RcbqtcTXeqWmkB/zgTiNnXAb51TXUusdStqOetMWTcNXuoqZxBm8dhGJg85zPdf/BjAGEk3LvI2/CVADmHhfC/eK/8Z71JdjxnHWeeyyUY/1PeWfHXGR9zRjT0yNU3RjoCk5XxgL7270uAU4A/grcLCIfBVZ2d7ExZjmwHKC4uNj86dL5re/9bOX7/HfN/m6uVEopdTja/zvbV3976sUjvs+av+wFIJUA4QR+baVGqqlz9n1rA/eoNLJn26FxFLaMDM78xhlseqWEV+79AO/4NLx5btjQtzZnZ7wBWVYFJn+Si/xJD8Hsf8KxF1snrK+E9RvB4Tz04qzxcPI3+/w5lCUZCU5XixkYY0wD8NmjHYxSSimlhp9kzKIqAca1e10ElPalARFZJiLL6+vr+zUwpZRSSg0PyUhw3gGmicgkEXEBnwQe70sDxpiVxphrMzMzByRApZRSSg1tAz1N/F5gFTBDREpE5HPGmAjwZeAZYAvwgDFm80DGoZRSSh2JPq5j3Pf2B/oGI5CYIfhURWQZsAz4DKDJUf/LA6p6PUv1lT7XgaHPdWDocx0Y+lz73wRjTH7ng0MywWkhImuMMcXJjmO40ec6MPS5Dgx9rgNDn+vA0Od69AyarRqUUkoppfqLJjhKKaWUGnaGeoKzPNkBDFP6XAeGPteBoc91YOhzHRj6XI+SIT0GRymllFKqK0O9gqOUUkopdQhNcJRSSik17AzJBEdEzhGRbSKyQ0RuSHY8Q52I7BGRjSKyXkTWxI/liMhzIrI9/vXwthMeQUTkXyJSISKb2h3r9jmKyPfjP8PbROTs5EQ9+HXzXH8iIgfiP7PrReTcdu/pc+2FiIwTkZdEZIuIbBaRr8WP68/rEejhuerPaxIMuTE4ImIHPgDOxNrX6h3gU8aY95Ma2BAmInuAYmNMVbtjvwVqjDG/iSeR2caY7yUrxqFARE4BAsBdxpi58WNdPkcRmQ3cCywCxgDPA9ONMdEkhT9odfNcfwIEjDG/73SuPtcEiMhoYLQxZp2IpANrgQuAq9Cf18PWw3O9BP15PeqGYgVnEbDDGLPLGBMC7gPOT3JMw9H5wIr49yuw/iNVPTDGvArUdDrc3XM8H7jPGBM0xuwGdmD9bKtOunmu3dHnmgBjTJkxZl38ez/Wtjlj0Z/XI9LDc+2OPtcBNBQTnLHA/navS+j5B0j1zgDPishaEbk2fmyUMaYMrP9ogYKkRTe0dfcc9ef4yH1ZRN6Ld2G1dKXoc+0jEZkILADeQn9e+02n5wr683rUDcUER7o4NrT62QafE40xC4GPAF+KdwmogaU/x0fmH8AUYD5QBvwhflyfax+ISBrwEPB1Y4yvp1O7OKbPtRtdPFf9eU2CoZjglADj2r0uAkqTFMuwYIwpjX+tAB7BKpEejPcnt/QrVyQvwiGtu+eoP8dHwBhz0BgTNcbEgFtpK+vrc02QiDixfgn/xxjzcPyw/rweoa6eq/68JsdQTHDeAaaJyCQRcQGfBB5PckxDloikxgfDISKpwFnAJqxnemX8tCuBx5IT4ZDX3XN8HPikiLhFZBIwDXg7CfENSS2/hOM+jvUzC/pcEyIiAtwObDHG/LHdW/rzegS6e67685ocjmQH0FfGmIiIfBl4BrAD/zLGbE5yWEPZKOAR679LHMA9xpinReQd4AER+RywD7g4iTEOCSJyL3AakCciJcCPgd/QxXM0xmwWkQeA94EI8CWdOdG1bp7raSIyH6ucvwf4Auhz7YMTgc8AG0VkffzYjejP65Hq7rl+Sn9ej74hN01cKaWUUqo3Q7GLSimllFKqR5rgKKWUUmrY0QRHKaWUUsOOJjhKKaWUGnY0wVFKKaXUsKMJjlJqQIlIlohc3+71GBF58Cjde6KIfPpo3EspNbhogqOUGmhZQGuCY4wpNcZcdJTuPRHQBEepEUgTHKXUQPsNMEVE1ovI7+JVlU0AInKViDwqIitFZLeIfFlEviki74rIahHJiZ83RUSejm8I+5qIzOx8ExE5NX6P9fHr0+P3Pjl+7BsiYo/H8E5848MvxK89TUReFZFHROR9EfmniOi/j0oNYUNuJWOl1JBzAzDXGDMfWndZbm8u1q7LHmAH8D1jzAIR+RNwBfBnYDlwnTFmu4icAPwdOKNTO9/GWgn2jfhmh83xe3/bGPOx+L2vBeqNMceLiBt4Q0SejV+/CJgN7AWeBi4EjkpXmlKq/2mCo5RKtpeMMX7ALyL1wMr48Y3AsfFkZSnw3/iWIgDuLtp5A/ijiPwHeNgYU9Lu/BZnxdts6SLLxNr/JwS8bYzZBa3bQ5yEJjhKDVma4Cilki3Y7vtYu9cxrH+jbEBdSwWoO8aY34jI/4BzgdUi8uEuThPgK8aYZzocFDkNa5+gDk0mGL9SahDSPmal1EDzA+mHe7ExxgfsFpGLwdqxWUTmdT5PRKYYYzYaY24C1gAzu7j3M8AXRcQZv2a6iKTG31skIpPiY28uBV4/3JiVUsmnCY5SakAZY6qxxrpsEpHfHWYzlwGfE5ENwGbg/C7O+Xr8HhuAJuAp4D0gIiIbROQbwG1YOzeviw90voW2SvYqrEHJm4DdwCOHGatSahDQ3cSVUiNevIuqdTCyUmro0wqOUkoppYYdreAopZRSatjRCo5SSimlhh1NcJRSSik17GiCo5RSSqlhRxMcpZRSSg07muAopZRSatj5/whMop5DNinlAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 576x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(8,4))\n",
"for name, value in sorted(synth_data.items()):\n",
" if value.dim():\n",
" plt.plot(value, label=name)\n",
"plt.xlim(0, len(empty_data) - 1)\n",
"plt.ylim(0.8, None)\n",
"plt.xlabel(\"time step\")\n",
"plt.ylabel(\"individuals\")\n",
"plt.yscale(\"log\")\n",
"plt.legend(loc=\"best\")\n",
"plt.title(\"Synthetic time series\")\n",
"plt.tight_layout()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Inference"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:10:29.698870Z",
"start_time": "2021-01-13T20:10:29.693095Z"
}
},
"outputs": [],
"source": [
"# what if we only have obs? can we estimate using just that? \n",
"obs = synth_data[\"obs\"]\n",
"model = SimpleSIRModel(population, recovery_time, obs) \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:11:06.512000Z",
"start_time": "2021-01-13T20:10:29.702611Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO \t Failed to find feasible hypothesis after site obs_292. Retrying...\n",
"INFO \t Heuristic init: R0=3.2, rho=0.504\n",
"INFO \t Running inference...\n",
"INFO \t step 0 loss = 5.31\n",
"INFO \t step 200 loss = 2.894\n",
"INFO \t step 400 loss = 1.727\n",
"INFO \t step 600 loss = 1.572\n",
"INFO \t step 800 loss = 1.444\n",
"INFO \t step 1000 loss = 1.409\n",
"INFO \t step 1200 loss = 1.379\n",
"INFO \t step 1400 loss = 1.363\n",
"INFO \t step 1600 loss = 1.369\n",
"INFO \t step 1800 loss = 1.348\n",
"INFO \t step 2000 loss = 1.345\n",
"INFO \t SVI took 32.3 seconds, 61.9 step/sec\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 34.1 s, sys: 4.69 s, total: 38.8 s\n",
"Wall time: 36.8 s\n"
]
}
],
"source": [
"%%time\n",
"losses = model.fit_svi(num_steps=101 if smoke_test else 2001,\n",
" jit=True)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:11:06.701947Z",
"start_time": "2021-01-13T20:11:06.514484Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x216 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(8, 3))\n",
"plt.plot(losses)\n",
"plt.xlabel(\"SVI step\")\n",
"plt.ylabel(\"loss\")\n",
"plt.ylim(min(losses), max(losses[50:]));"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:11:06.711163Z",
"start_time": "2021-01-13T20:11:06.705526Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"R0.shape = (100, 1)\n",
"auxiliary.shape = (100, 1, 2, 300)\n",
"rho.shape = (100, 1)\n"
]
}
],
"source": [
"for key, value in sorted(model.samples.items()):\n",
" print(\"{}.shape = {}\".format(key, tuple(value.shape)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## MCMC"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:11:06.723132Z",
"start_time": "2021-01-13T20:11:06.714671Z"
}
},
"outputs": [],
"source": [
"#mcmc = model.fit_mcmc(num_samples=4 if smoke_test else 800, \n",
"# jit_compile=True,)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Prediction"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:11:07.405590Z",
"start_time": "2021-01-13T20:11:06.726035Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO \t Predicting latent variables for 300 time steps...\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 558 ms, sys: 15.6 ms, total: 574 ms\n",
"Wall time: 675 ms\n"
]
}
],
"source": [
"%%time\n",
"samples = model.predict()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:11:07.422326Z",
"start_time": "2021-01-13T20:11:07.409419Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"I.shape = (100, 300)\n",
"I2R.shape = (100, 300)\n",
"R0.shape = (100, 1)\n",
"S.shape = (100, 300)\n",
"S2I.shape = (100, 300)\n",
"auxiliary.shape = (100, 1, 2, 300)\n",
"obs.shape = (100, 300)\n",
"rho.shape = (100, 1)\n"
]
}
],
"source": [
"for key, value in sorted(samples.items()):\n",
" print(\"{}.shape = {}\".format(key, tuple(value.shape)))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:11:07.811252Z",
"start_time": "2021-01-13T20:11:07.425850Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/swappy/Documents/anaconda/anaconda/envs/pyprobenv/lib/python3.6/site-packages/seaborn/distributions.py:2551: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).\n",
" warnings.warn(msg, FutureWarning)\n",
"/Users/swappy/Documents/anaconda/anaconda/envs/pyprobenv/lib/python3.6/site-packages/seaborn/distributions.py:2551: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).\n",
" warnings.warn(msg, FutureWarning)\n"
]
},
{
"data": {
"image/png": "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QUSIi4tz268HLcBKdUNafE+eO987LcBKKWUTLcBKqU5XWlrKY4891u75nnvuOQ4cOHD8dmpqKsXFLg2Z7ZW0ACulOt2JCnBjY+snuWhegH2d7gWhlOp0ixcvJjc3l9GjRxMYGEhERAS9evUiMzOTDz74gDlz5pCVlQXAfffdR2VlJcOHD2fdunVceumlhIaGsnr1agD+/ve/8+6771JfX8+bb77J4MGD7Vy0dtECrFQ3dvPNN5OZmenW5xw9ejQPPfRQq4+59957ycrKIjMzk5UrVzJ79myysrJIS0tjz549Lc5z8cUX8+ijj3Lfffcxfvz44/fHx8ezYcMGHnvsMe677z6eeuopNy6NZ2kXhFLKdhMnTjzp/WovvPBCAMaNG3fC4u2ttAWsVDfWVku1s4SHhx+/HhAQgMPhOH67rX1ug4Od5/709/enocGVk2B7D20BK6U6XWRkJBUVFS1OS0xMpLCwkJKSEmpra3nvvfdcms8XaQtYKdXp4uLimDp1KsOHDyc0NJTExMTj0wIDA7nzzjuZNGkSaWlpP9iotmjRIq699tofbITzZR45J9z48eONDsiuQMeC6EyuDsi+bds2hgwZ4vlAXVhL76GIrDfGjD/BLC3SLgillLKJFmCllLKJFmCllLKJFmCllLKJFmCllLKJFmCllLKJ7gesVDfnzl0FofN2F1y2bBkZGRkMHTq0XfMtX76crVu3snjxYg8lc522gJVSPmnZsmVs3bq1XfM0NDQwd+7cdhVfTx7erC1gpVSn27NnD7NmzWLSpEls3LiRjIwMXnjhBVavXs1vf/tbGhoamDBhAo8//jjBwcEsXryY5cuXExAQwFlnncWFF17I8uXL+eKLL7j77rt56623ALj++uspKioiLCyMJ598ksGDB7No0SJiY2PZuHEjY8eOZcSIEaxbt45HH32UvXv3cuWVV1JUVERCQgLPPvssffv2/dE8999/v0feBy3ASilbbN++naeffpqpU6dy5ZVX8sADD/DEE0+wYsUKMjIyWLhwIY8//jgLFy7k7bffJjs7GxGhtLSUmJgY5s6dy5w5c7j44osBmDlzJv/85z9JT09nzZo1XHfddXz22WcA7Nixg08//RR/f3+ee+654xluuOEGFi5cyBVXXMEzzzzDTTfdxLJly340j6doF4RSyhZ9+vRh6tSpAFx22WWsWLGC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\n",
"text/plain": [
"<Figure size 360x360 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"names = [\"R0\", \"rho\"]\n",
"fig, axes = plt.subplots(2, 1, figsize=(5, 5))\n",
"axes[0].set_title(\"Posterior estimates of global parameters\")\n",
"for ax, name in zip(axes, names):\n",
" truth = synth_data[name]\n",
" sns.distplot(samples[name], ax=ax, label=\"posterior\")\n",
" ax.axvline(truth, color=\"k\", label=\"truth\")\n",
" ax.set_xlabel(name)\n",
" ax.set_yticks(())\n",
" ax.legend(loc=\"best\")\n",
"plt.tight_layout()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Forecasting"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:11:08.733955Z",
"start_time": "2021-01-13T20:11:07.814154Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO \t Predicting latent variables for 300 time steps...\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 3 µs, sys: 0 ns, total: 3 µs\n",
"Wall time: 5.72 µs\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO \t Forecasting 30 steps ahead...\n"
]
}
],
"source": [
"%time\n",
"samples = model.predict(forecast=30)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"ExecuteTime": {
"end_time": "2021-01-13T20:11:09.022235Z",
"start_time": "2021-01-13T20:11:08.736228Z"
}
},
"outputs": [
{
"data": {
"image/png": "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pvfaGGOMMftrzx56AhsALSx0S8U9GzZsIDoqik5AF29benl56OXgnTpB9+5uuMpfnbwVabIAR0TaAeOAxwFUtURVdwJnANO8w6YBZzZVG4wxxpiDwZ49exgyZAgvzJtHT2AvsLOgoFo24vXr19M9LY0IoLO3La2kJPQE4shIN0zVSldU1blMXEROA95V1Yq6jq3hECAHeFJEDgcWANcBnVQ1G0BVs0WkY4j3vQK4AqBnz551v9vrr8PWrfVsYi06dQKvhEIo//znP3nsscdQVS6//HKuv/56wM1knzRpEmvXrqV37968/PLLpKSk8Pnnn3P11Vfj8/l44YUX6NevHzt37mTSpEm89957SJCiZqWlpUyePJnXXnsNn89HfHw8d955JyeffDK9e/dm/vz5dOjQofE+tzHGmFYnLy+PpUuXUpCWRg9vgvD6/HxSAiYH/+1vfyNn6lT4859p722LKC6u++I+H+TmNkm7m1I4PTjnAitE5F4RGVCPa0cBRwD/VtXhuIAy7OEoVZ2qqiNVdWR6OKmit251XWmN9VNHsLR06VIee+wxvvrqK7755htmzJhROYHrnnvuYcKECaxYsYIJEyZwzz33APD3v/+d1157jbvvvpt///vfANx111386U9/ChrcAEyePJns7GyWLl3K0qVLefvtty0TsjHGmGq2ez0saUBPr7bUhr17q/XgdOvalWFeQHMMEBsRwfhwLu7zwY4drW6peJ0BjqqeDwwHVuF6Y+aKyBUiklTHqRuBjar6pff6VVzAs1VEugB4j9sa3PpmtGzZMsaMGUN8fDxRUVEcc8wxvPHGGwBMnz6diy66CICLLrqIN998E3AZjgsLCykoKCA6OppVq1axadMmjjnmmKDvUVBQwGOPPcZDDz1UWa+qU6dOnHPOOU3/AY0xxrRsFRWVk3/9Sf5Sy8vpHxfH0/37M7yionIOTnl5OX/7859ZvHIlAEcChUOGcHo47xMZ6d7LP59HtVWsqgprDo6q7gZeA17EzU36KfC1iFxbyzlbgA0icpi3aQLwHfAWcJG37SJgesOa3rwGDx7MrFmzyMvLo6CggHfffZcNGzYAsHXrVrp0cVO4unTpwrZtLoa7+eabueKKK3jggQf49a9/zS233MJdd90V8j1WrlxJz549adeuXdN/IGOMMa1LTg7Mnw8E9OCUlJAcF8cF7dvT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\n",
"text/plain": [
"<Figure size 576x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"\n",
"def plot_forecast(samples):\n",
" duration = len(empty_data)\n",
" forecast = samples[\"S\"].size(-1) - duration\n",
" num_samples = len(samples[\"R0\"])\n",
"\n",
" time = torch.arange(duration + forecast)\n",
" S2I = samples[\"S2I\"]\n",
" median = S2I.median(dim=0).values\n",
" p05 = S2I.kthvalue(int(round(0.5 + 0.05 * num_samples)), dim=0).values\n",
" p95 = S2I.kthvalue(int(round(0.5 + 0.95 * num_samples)), dim=0).values\n",
"\n",
" plt.figure(figsize=(8, 4))\n",
" plt.fill_between(time, p05, p95, color=\"red\", alpha=0.3, label=\"90% CI\")\n",
" plt.plot(time, median, \"r-\", label=\"median\")\n",
" plt.plot(time[:duration], obs, \"k.\", label=\"observed\")\n",
" plt.plot(time[:duration], synth_data[\"S2I\"], \"k--\", label=\"truth\")\n",
" plt.axvline(duration - 0.5, color=\"gray\", lw=1)\n",
" plt.xlim(0, len(time) - 1)\n",
" plt.ylim(0, None)\n",
" plt.xlabel(\"day after first infection\")\n",
" plt.ylabel(\"new infections per day\")\n",
" plt.title(\"New infections in population of {}\".format(population))\n",
" plt.legend(loc=\"upper left\")\n",
" plt.tight_layout()\n",
"\n",
"plot_forecast(samples)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A suggestion of the authors is to use MCMC rather than SVI to estimate, and this will produce better results with only a little longer compute time. I will avoid doing that for the moment, because I would consider it a higher priority to figure out how to run this model with actual data, rather than manufactured. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bigger picture:\n",
"\n",
"We don't really need to use MCMC do we? We are more interested in the generate data aspect, and seeing how intervention affects outcome. One way to apply MCMC I guess is we have our pandemic generate data function, leave R0 as the initial value, but implement countermeasures and generate data again. Using Inference we can determine what this new R0 is, and indicate how much better this would be. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"display_name": "pyprobenv",
"language": "python",
"name": "pyprobenv"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.12"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
"autoclose": true,
"autocomplete": true,
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 1,
"hotkeys": {
"equation": "Ctrl-E",
"itemize": "Ctrl-I"
},
"labels_anchors": false,
"latex_user_defs": false,
"report_style_numbering": false,
"user_envs_cfg": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}