From 503dd050e8038f1e07c4a1edf1df1716623e452b Mon Sep 17 00:00:00 2001 From: Cristian Date: Tue, 24 Sep 2024 14:54:01 +0200 Subject: [PATCH 1/9] Formatted code --- velo_rent.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/velo_rent.py b/velo_rent.py index d06d3be6..46207d37 100644 --- a/velo_rent.py +++ b/velo_rent.py @@ -2,51 +2,60 @@ from os.path import basename, exists +import matplotlib.pyplot as plt + + def download(url): filename = basename(url) if not exists(filename): from urllib.request import urlretrieve + local, _ = urlretrieve(url, filename) - print('Downloaded ' + local) - -download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py') + print("Downloaded " + local) + + +download("https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py") # import functions from modsim -from modsim import * -import matplotlib.pyplot as plt +from modsim import State, TimeSeries, flip bikeshare = State(mailly=10, moulin=2) -def velo_a_mailly(): + +def velo_a_moulin(): # print('Moving a bike to moulin') bikeshare.mailly -= 1 bikeshare.moulin += 1 -def velo_a_moulin(): + +def velo_a_mailly(): # print('Moving a bike to mailly') bikeshare.moulin -= 1 bikeshare.mailly += 1 + def step(p1, p2): if flip(p1): velo_a_mailly() - + if flip(p2): velo_a_moulin() + results = TimeSeries() results[0] = bikeshare.mailly -for i in range(60*14*30): +for i in range(60 * 14 * 30): # print(f"step {i}") step(0.5, 0.4) - results[i+1] = bikeshare.mailly + results[i + 1] = bikeshare.mailly fig, ax = plt.subplots() ax.plot(results) ax.set_title("Velos à Mailly") ax.set_xlabel("Temps") ax.set_ylabel("nombre") -plt.show() \ No newline at end of file +plt.show() + From 420880508b456a0d97456030104b45661a5a4e6d Mon Sep 17 00:00:00 2001 From: Cristian Date: Thu, 26 Sep 2024 11:05:42 +0200 Subject: [PATCH 2/9] Serial verion --- velo_rent.py | 62 ++++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/velo_rent.py b/velo_rent.py index 46207d37..8328ba7e 100644 --- a/velo_rent.py +++ b/velo_rent.py @@ -1,23 +1,6 @@ -# download modsim.py if necessary - -from os.path import basename, exists import matplotlib.pyplot as plt - -def download(url): - filename = basename(url) - if not exists(filename): - from urllib.request import urlretrieve - - local, _ = urlretrieve(url, filename) - print("Downloaded " + local) - - -download("https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py") - -# import functions from modsim - from modsim import State, TimeSeries, flip bikeshare = State(mailly=10, moulin=2) @@ -42,20 +25,41 @@ def step(p1, p2): if flip(p2): velo_a_moulin() +def run_simulation(num_steps, p1, p2): + results = TimeSeries() + results[0] = bikeshare.mailly + for i in range(num_steps): + step(p1, p2) + results[i + 1] = bikeshare.mailly + return results + +num_steps, p1, p2 = 10000, 0.5, 0.4 +result1 = run_simulation(num_steps, p1, p2) + +num_steps, p1, p2 = 10000, 0.5, 0.33 +result2 = run_simulation(num_steps, p1, p2) + +num_steps, p1, p2 = 10000, 0.6 , 0.4 +result3 = run_simulation(num_steps, p1, p2) + + +fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(8, 8)) + +ax1.plot(result1) +ax1.set_title("Velos à Mailly") +ax1.set_xlabel("Temps") +ax1.set_ylabel("nombre") -results = TimeSeries() +ax2.plot(result2) +ax2.set_title("Velos à Mailly") +ax2.set_xlabel("Temps") +ax2.set_ylabel("nombre") -results[0] = bikeshare.mailly +ax3.plot(result3) +ax3.set_title("Velos à Mailly") +ax3.set_xlabel("Temps") +ax3.set_ylabel("nombre") -for i in range(60 * 14 * 30): - # print(f"step {i}") - step(0.5, 0.4) - results[i + 1] = bikeshare.mailly +plt.savefig("velo_rent_parallel.png", dpi=300) -fig, ax = plt.subplots() -ax.plot(results) -ax.set_title("Velos à Mailly") -ax.set_xlabel("Temps") -ax.set_ylabel("nombre") -plt.show() From d4934b69f0c3a617fcd4b4b6d761c428dfd7c87a Mon Sep 17 00:00:00 2001 From: Cristian Date: Thu, 26 Sep 2024 12:18:05 +0200 Subject: [PATCH 3/9] Parallel implementation with ProcessPool Executor --- velo_rent.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/velo_rent.py b/velo_rent.py index 8328ba7e..1307c80c 100644 --- a/velo_rent.py +++ b/velo_rent.py @@ -2,6 +2,7 @@ import matplotlib.pyplot as plt from modsim import State, TimeSeries, flip +import concurrent.futures bikeshare = State(mailly=10, moulin=2) @@ -33,15 +34,14 @@ def run_simulation(num_steps, p1, p2): results[i + 1] = bikeshare.mailly return results -num_steps, p1, p2 = 10000, 0.5, 0.4 -result1 = run_simulation(num_steps, p1, p2) -num_steps, p1, p2 = 10000, 0.5, 0.33 -result2 = run_simulation(num_steps, p1, p2) - -num_steps, p1, p2 = 10000, 0.6 , 0.4 -result3 = run_simulation(num_steps, p1, p2) +def run_simulations_in_parallel(params_list): + with concurrent.futures.ProcessPoolExecutor() as executor: + futures = [executor.submit(run_simulation, *params) for params in params_list] + return [future.result() for future in futures] +params_list = [(10000, 0.5, 0.47), (10000, 0.5, 0.33), (10000, 0.6, 0.47)] +result1, result2, result3 = run_simulations_in_parallel(params_list) fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(8, 8)) From 90027450a5ca68b0253355176e50751541de780a Mon Sep 17 00:00:00 2001 From: Cristian Date: Fri, 27 Sep 2024 10:18:19 +0200 Subject: [PATCH 4/9] Eliminated the download of simpy --- velo_a_mailly.png | Bin 0 -> 26062 bytes velo_rent.py | 16 +--------------- 2 files changed, 1 insertion(+), 15 deletions(-) create mode 100644 velo_a_mailly.png diff --git a/velo_a_mailly.png b/velo_a_mailly.png new file mode 100644 index 0000000000000000000000000000000000000000..5c9d6467bee4139b63664229b873ee5b3a9e0089 GIT binary patch literal 26062 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 literal 0 HcmV?d00001 diff --git a/velo_rent.py b/velo_rent.py index 46207d37..491f6906 100644 --- a/velo_rent.py +++ b/velo_rent.py @@ -4,20 +4,6 @@ import matplotlib.pyplot as plt - -def download(url): - filename = basename(url) - if not exists(filename): - from urllib.request import urlretrieve - - local, _ = urlretrieve(url, filename) - print("Downloaded " + local) - - -download("https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py") - -# import functions from modsim - from modsim import State, TimeSeries, flip bikeshare = State(mailly=10, moulin=2) @@ -49,7 +35,7 @@ def step(p1, p2): for i in range(60 * 14 * 30): # print(f"step {i}") - step(0.5, 0.4) + step(0.5, 0.5) results[i + 1] = bikeshare.mailly fig, ax = plt.subplots() From 3d1d2a696b812fb7c4177c0dc744199f159fef33 Mon Sep 17 00:00:00 2001 From: Cristian Date: Fri, 27 Sep 2024 10:25:15 +0200 Subject: [PATCH 5/9] Save figure to file --- velo_rent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/velo_rent.py b/velo_rent.py index 491f6906..1b7d3733 100644 --- a/velo_rent.py +++ b/velo_rent.py @@ -43,5 +43,5 @@ def step(p1, p2): ax.set_title("Velos à Mailly") ax.set_xlabel("Temps") ax.set_ylabel("nombre") -plt.show() +plt.savefig("velos_a_mailly.png") From b6f8cf18780b54a4faecbbc7da20c2dc6d95df33 Mon Sep 17 00:00:00 2001 From: Cristian Date: Fri, 27 Sep 2024 10:54:37 +0200 Subject: [PATCH 6/9] Ignore png files and save to file --- .gitignore | 3 ++- velo_rent.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ba0430d2..979f738d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -__pycache__/ \ No newline at end of file +__pycache__/ +*.png \ No newline at end of file diff --git a/velo_rent.py b/velo_rent.py index 1b7d3733..39124d1d 100644 --- a/velo_rent.py +++ b/velo_rent.py @@ -43,5 +43,5 @@ def step(p1, p2): ax.set_title("Velos à Mailly") ax.set_xlabel("Temps") ax.set_ylabel("nombre") -plt.savefig("velos_a_mailly.png") +plt.savefig("mailly.png") From dfde399fcd467237277f9a9779b9f40eb29bfd4c Mon Sep 17 00:00:00 2001 From: Cristian Date: Fri, 27 Sep 2024 11:29:55 +0200 Subject: [PATCH 7/9] Added run_simulation with numsteps and probs --- velo_a_mailly.png | Bin 26062 -> 0 bytes velo_rent.py | 52 +++++++++++++++++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 12 deletions(-) delete mode 100644 velo_a_mailly.png diff --git a/velo_a_mailly.png b/velo_a_mailly.png deleted file mode 100644 index 5c9d6467bee4139b63664229b873ee5b3a9e0089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26062 zcmeFZWmHvN8!o(PP$VU!OH`z#q)RZ6?(UNA4ylc_w3L8Kw{&+&iF9s|5Tv`$+&u5| zo^!@HKhBSDeB=A^IdtrSti58+d*1W9uj{&3sJyK7y*p%gAPBnm>ZPP21R?uD5Yi$h zI`|*%k=ftit;t&^37A&rZPgQJD5%`?{Lteng==1xv_ zj{IzF*8e?#)z-m`jaC+A3Y-MX?xlt!1mPMW{vqXx`(thB zyRN(@qdY0|FKI=Q1Bc(_BEP>cCV7QQZrJ@E=7+gKr0`|EQP+w_z2(Cs5gP5wM@S66 zye3mTJ)7ST2F)vVt@!iG-m^KAU zOxn+*fA9zhkZZL+SsP&c-HVQo4=OD!{Z@<)rg6^i@X#qRIGD$o`x7dPKFZ_x*HB`! zXnK13TWxYWI=cM3MXF(?rR)dZ+8;;_fxKE z5y@>ZO$Fg0&&aMVY1?2m%%$2hWRouZl`AOoI$>v%Jg=Q83;x*(y#&D+@l9DTD9Rs1^r_3WjsoazLLAFHsg<*2N<@MKiv>Q5rL0ZtNbbEY4f`H~DvO&zi4lpNu3h z^qcnD7zam(Nj%|Oo1tfND<)*;5N+U;NYlVxM^C*|g?D>mV^s?-1L@aP#I}M#zb=1T z_B-8GfvX3jj|Nw@x1-SGe{m>tWXa1Ug+gI423bu1G_(EPt5$3);g|@fSa#ck13RfT zeYwDknoL_Q>cg-@F<9a|!tn$vf23#_?4{xUo5R!PB(gP!H@hoMZ{+Lv#MKl`RJLpJ z72Iqj?+e&{7r(uWqEtL&Gl$ouYudu|r&nLbj-SHW)K}hLEVu1VM!WoN8R@%C8I|JV zm|j&UhL!%f5Z%@62!}kD?^opN4%95yK;BuRa5Tl%W(yD}s#&?e{7z$^pW1al*JgTL zF-=ACCqRty((a864L>^5nYmiq?E`6+et8q5Ub`$K}tGd*2((?*?o4 z&Z++i&Ng#`8fEzpZ_rFmuad|xScz#GOB<%kt4}an=>zDVceAR5A)Yli`2swsmfVWI zQaKq>{5Q*fNi?^`ul8vi%+u7I52&{kw{EZbDVZr7E2qNwrJ$Z)l&hX-v8V*RG#{+L2QOB7m{_|%HIf*xfBK;f!C15)7sjU-6}ADZZOZ(wF;w;3{3(hlVn9 zfe74`k7MiizjQ1<_MIIUBE2JxAuyJ@-i6p=6bcek^I8*PpJOW2eokw~;CWb31~(_B z^O~bgMDo>RE}veD5sQKCI!nBc#KFb23aj$j21`aOo_ziZG!zkD-rY@8{s0jamhrET zR8FtdiG2h<1vReS$!CexGc47tUaTUO`9qD=ZP`Yp@XlZqI$cTBTgr|S7PquyA|NCL z>CJzoKarl3lc0LRr=CUbg`{L4rvwpaSf4#lHR|>qX_>3PP+f?7s{(8LSp&iS3C_Xv zifjs>?ZI{Y?I1WM3VWtBCiUD$<4I>r0JZ=bTBoPcfpHLDjOeKTv-VM7kCC9 zcI4i(PpE^d8|&mKZ<&_4P^qe#(O#8 zvyR(y5P!+~347aX$&k(_YGCn@^>;iXWI&j@)$ze)B8#W(PqI*i*ln#INuoW*-`MIK z7osDt(15&7;UNktDnYf5YgvVb*e7$Y)YIQB0$dloNls=Rql#oDBqawXrzj}zyuNqp z;Y${XH|d($VwoF%_iU`0`0%pFe3pO^#!jvFSSR(bf(~78`75X}Kfi54&o^Smrv6@( z$Ti>o!GQs1G9DhDepovpzQVJ3741lo$h;U;^9fq5LISw3&8`{~ z1PN~sk`k;$flcl>pA)}T3Tb#`1Yb_*=)PSwvQ|4xZ=}0AJK?+VcGWadko`;u#TV^7I1;S+ zBd+p-#uBjhomz*@eSeS3~upKtVRpPQRA^sKg- z+i*(Nsds^IRWC>>DiZv%8)?wN^bfjAVtBMM_LzxDTw9w$_;Odm>Cewj zZK;w8qrueYh?(o_@8>Y=z${cRL(a^+!A90pRt|jd%ybc~G89NAi5+RD`9`>*p~2>o z4iCT5E^%SzX~)IP;L;b(yRK%^Ahl}6JGw+?7iEyIE=)gY7ua{E&PwPqMG@;?8Aq}1 zGv>skrHSqR@hm`l=-bY9nLmLmNCVLg77f0uv&j4KigXhV?(Z)ohBhAg_-n&-1*&N z*qm$kG?gMb1MqA48#|fF2O}M@ch;lUMISm5 zsepvq-gwmpU+Qpo$a7u<%RkC*Yj0Z*nCdEH;QJ8-nOsr6#?#((9!mf=(SvD%BMCz`w%K5&VIG}__*((<%-ob z%hQJs(Gc;0SP988!QcZvWtLIo7&d)mY^IlfD!|S@Z0N18|G5^8Q$T=xaBy(<__&J6 z(d6du-@le2xmcK(?1_1UA0NIcwS%{zd!y6QX+2X;E(KdllR%QL(W8iWl?Sfflan-V zk5h+fTTt2s&f7=)9ajln1%XtAD{|@QxzkAEeSX;LhlB!Y`xKIqlZV+houPxIQC%c! z!cBJ>e}eta(K>mfPj83sU~QrNrkU-&=X!jnbIw~F-tk$Q!JX%>pX1tK=jGYK-uY&UR-s<0K9a82-is8}md~GQ zphT_R_W=O|n~si-14Zw}#KhQ1vB9bW5a_$9j=g;%}Uam1_Cn{?~9)a&j+s3gNHFHiHzN zQLuco3SUYv{d?-1nv9#RHsFrWhnqD>pwkZavOg)8{L?k}_h7;cMTNo~1Yk$r~mrtI8)?&~e zY;dwYw?3R1(0MN8d92?PP3tTy`|1_eV48rLuI$^loiX&%i_6OaySsKjQlArsk+4ZA zE8ow`$|`l+Gpwntg*RPnqd>XJOoHd@*-1j4JYL@3aB%!{$JNj8CW=X)J1{_>!Bmhw zGsULzy|gdXti02*VxZp@MQvMgLKF(Kqze>X3PSd3*hB_PsAojwb7_a4qQq9aiF@sH zgO_n4JQM?MS)pY$1!|AA)25y!!Zu38kaqiM`dU`}3eexu{NWeUY#sV z6fAeN24HY_o!TAj$GdKSlTG_j`EJ5+d$#s58(a6NoQO3QrbmAQ%PI%pAewKk*eEC| zIV^rM9Ec8sJLZl;!i4mEueeQrBpGb82pY7ZdhNDi@Vd~#V8sd+Tw<7uUo^v0hW& z#Htx6q+u|KMorCM$86u8qxpU$4(I(i(%l32kIi5qwMQ7tpGd>xZPoY$`ejBfwJVA1du9$i^PwU}V;tEa9yr7LIhYvnd|soSOS)xi<&uC( z15R^e=9c$7`z)OUpIayey#)lCes?5g&%i*XC8gI|nyZyN6CGVW0{5R6v=LHsncyGUTwI{NE#I#UDtKk1pMMPrvDBu*s!uS z033i+)Pxq|`~7l)E4xc0k=BW}tw-vlC4VUb*arfu{`7Cf(C)AV?$ky!sAQ!u{ZaCQ z)_+Q&@jk-vs=1;751^oH(GeLZXx{g9z+~pEHe0%eM9S$-2gpG^56)q^K>(=4^{*EwN zBz$vuaJt)$Tjq7(ZdF=)afN&Ckf<7=XQ1exr9c2Tz`75F82SurFWwl!02bh--%JF7`IE}bQpIA&_k zPebX~tdUTsQU~*J2*ha3HBa)u=z$fn0gCUVJ(*ZJ&JEoSR2dLHv81hAEQIAvmyUCj~ zI+9aA@^29qI{1TXVCzaq-iCc?yjYBs5{&Ib0Si2ZtG#RMcH)+kc~9K6p$ut#eHs8H z-i=}X9?q0NjBF*%^oQ4}15aAhE6yfe_%WoPajBY2yVcUYQL@>iT4)cLURu!-Xph<1 z#K)gX1%ulWN@(r;n9ee@@19iQtCyYU&7-s^^6Hj;RayDd<@5p=G{0u<>4*#N`8G0P5=!xyORf zf8W99#-DGtoq?7m4!q=$c}M#pn#=mcIpecWy<{Vc{Q4|7Iof0*qjMlz@@ znOUnJyOMSi_k&qnyuOCZzhk0FM2fm+)BR@@2K$5$^7rhl_N?QO5P&Ke0QAuW`blNC z0-(AF;APvw!h&iJU6z#Hih*dtH{=4>^lre>Pz-(d(%TWW%vBaYzYj_`fTkpXz_P%Y!bgS6Ud1E&YR;?8_JT#C{nR4*LTq- z?U?U|jDCpum>m!xW6Is78(2clN)(3#Np+&OjZGn4(Rs5M8bM$JcwUSF*zIq1jPv>R z*S7H@t&wV5y|5z;9Ez4)g=~3kZL6?RuBTohewrUap@@@1w0tdh46;kDW2qSRd-Os(o{Qfdl{m$3q;#$k#o6Mb{!mp zK^TGH2FX>XU|%hyd0iA2FgWm$)~&@`?h91}*9^cTI?GNgVhA7+Q$bL>Ab_^GxHtqQ zCnvjIpRFMfH==H{JM(TFc;ryJV$1{Brnb%-p{$|;5-C^75C|80W3k%;ObbJg>CL_` z*f46Yj%P-ythEAzg2WhO;Xl8=SsyPVZ@S!n15WkQA)FDB%TBlT`9T&3tV^(>HxVe5 zR87(-f3uU`SlHv9*h{3#M)i8P?+&+AVIDg97gPiY707|2DtZ7}UtOIPhmt?ANUM73 zSDq4{I1NZK^wN>v$DY6#vTJ_$&6ypP?bVQ_e5`oKa`9vLxaLV8^;~$7DYiq%AG3U z`b3l1`1Pm_hB^++<@PImS74x@7e3#;CTdj zW`6z!S-U^<61opNbhLdh2MSk3!wTqh(kKd^V%yZ(e0{`*xS^@%i3RQDB1(9^oH^55 zoWJp*oGZxgpQpLbmyPAY z{=QaH4VC!wV$z5Vfie) z41Ks!*dIDdBd@uy6_Zeds$!kf;pDoZ!mV|GG1R2|JI}-r4omNy(Haij3nfWgFjzcmwYor6;zK{?d z-A6uf3mk*1>!n*xtT?(%Z83+2zyBPLB^=nhN`V+wom~i92AcuCN&r&yr^+}h%K3{; zW*lwiLXO?Jd3w|l|JSGPd`9}7B7tW$Q?&_T6j|<~&~QHmNW$uQasaQ7h=%oI7}hZ$ z;zR=7>$CK}u(f&5E^hoCM&*787_?eaDDM^6tVOkS(H>zuh%_;e{#ew09`I)@VT&ri z4Xmb->LOh62JJ0vCBW#8hag4&rF*Cql4j;$&m|E6=#COC-8{Pv%Esx%RwU~Y+Lm@4 zZa_eOM2ziy#@H5cs-&CIz0Cv_zP`*7P6NptXm&w_B7px?4BpdShtL3mkfLp1c*xWH zOvd*U;nnmSfS=B4Y{oF=d;qw?z0H_H%aeKlu)8|YGvyEjbL6nvgG?v;a>p&ehJT4b zir)BPP5{QZGe3=FcV=V*Mb~*XVk_`ssSU32cG%J7caj&l&T$v?vXV0y^*DW~8?X*= zQA>k}l}o`?+QeRcE-WX^UD0ZJqI61p73+0+@TlK9p_h2#qKvTy2ccF#3TYddLVCnm zdAcW$o-dO%?S1~@T)*?Gaq)3t>n&Z(2)+}n55*+`Uilp%>k{BV-T8%n-sz9l(Ds?T zn!c!SZ|}sS78<_W%7oJ?4)lqS9MEgO%)Y=KoNx4CNbhx*%WJD@7)@;(=<=m2gtO8z zVMiQ?G%Nbgcm|fnM*((+D8>uYE;B@%_qnjn9kT@d3tE37TX!_A#HTt z5_*0&*wF$a3RWx@ZN6{69`e%C(r|$qTcLLC&xT@9TqW_@(*aJ;VeYC@lSP?{h>Pr= zppcNYZnM=}G%!4NoNrKcUJ!lgW3uN_3jw9Y7m@^{q1sE!6Gw;W*3Moez?lJXu{#TU zEJHa-Om*kgnm4!{6ybYggT;`7iH(l(@#9B!+j+sTqim@Nur-Pkj%}1LM47 zQ5K0flTF;}I2m=F5j-Z~%y>M~Y_^?h1EfmqY@P0@aG!%L411}`FhkffG=z(TgQHsH zU0YkLTJ&D+M}`PBSwz=mYK_PrVbowuvJ#|zM){cydJvGBNrm?= z{|v@IAJRs;X0)hI{0QJellbPqn(tLL#1p5@Ds66Vo}C`BLpJ@NBmesa9kaZuOC8#Q zNwCLAGW?_HNfNX}lQK{4-(glSh3*7pa zfB!>-DgF*;@(;tgVx9WodRN<;nwrmmLRGJ^qs`CH|8dc8%!wcsmb;@uQc}qIUAMzK zIwVsCTyffi?*-J?3jo5z4=_n7C+=I76No(&aWtTl>>M52=Uf*emX-`1lPLvU5Oj*2 zt7}MNA_@9EvcNZqtWyU+@$hdoFU`t<6y9Zj462s!2hZ%lszsawkOiFp9#|-BNAS+K z1mFt8008@}lp|ZS({#aZJ?P7}B-^4+xz-=&@ydbibN zGYC>qQ9-QWU>wR1M%|IL931!vg4CEZ*;|+oU%?s`U*TyvsF)C(V828#Ha;L>svaKz z#pT1|qW%FVwAc5vBq@=QkPr>p1GMv}34jV^!7wEyk}#{&P*6}vdU({i&jCU=P@9#+ zvQqQ@{ri}ZA*kxBF5M(0d0G);JqDKeF5t@A!5>ieE=Nfesb&`z{?IPgslUGeg)t4$Ws>W~|+SCcrYU z!a!&F8mM-^@S`T3`{zkzE2`Q_2-P(~Dj*ahLFWT|eAsp)l| z?k(d3Rv63D6%!L)cldeffCF3R$N{lPfrP8c`|{PR*5qeqyMX4KUXKMX0Y3B=boPJE1;#_dS*BSH4HV*-2lXB(=-4gi zN1J6>({S;Y`%W;1_=WEC%7$-Mk>G= zk_xymcZEL)$jYJ%C*!^Y!ZZk|R3qjch&u*Ra-W!(?(t(xgnF{wc%mD2KoE0<^}qNT zY}cpGAl2QkkDKfePUcGS}9W8>xX{*dNgu!LyX1uKyDlZ zmw2JBo^&S6`U1Ei>{iN3a&jIa^h|}j^eYq9U(Oa&5Gl895*cARcnj3?o-=YJh%I~@ z28a$0Gbic8$X%PIPnEKNQGX&H2drtb2tbbmbYaPUxV43-fO0}AyFXB_jSMbOrkKs6 zJ__-rl9bhrhXIvE^@4G*`9Uj_TFQ9Hi7gmdI0?93u8RouV9UW~)OgL+-xQ;fiwHOK zr}_DF+W_4gl|)ooq`BR!3fvkMUgCTq9w)noXf{^f62o@@O-nqp&|IRH{p;<zvomZIVT>-FS)n>e5P*3#e9yV0ju@g4S~binzvhQN{x#5Q;U!b; zi-0bhBm$KMN`lohwxPO*WTPQkgHr>$6K=N}c+WSF1}fWY$Azl-)9YS;Rg?EB#Wgif z6b{ZrnDTX#6&|QfD2O5BiOVi3RWD|})QNzXSlrr#V%{RG2Q{6($%)PG%*9ymBr0!( zXS$T6W0Q}a`z<&=ZgvX=L=dmC*{uL z@}8(Dy^M}Cn0NU-rnR`TYBiLv zD0J&ah>16P(3!N`IrVW70bad+MQ2?U_1^$Mq^0Ca z{Ytf?K$w73yNn4`;XCp6X%DV@!dVdUStRLU@W3Twp!Qh8ot$~6e(?8lZ^_5Ps;v|eWHF{h##|z9vwwa)3^a7X@?%?I0Vya82cjsl5RpqE zQRV&HUmwu~=Gwc2cO7rW$OxWn;rAG~95Fgv{caUrC(gGluTwk#xLs1xDZ@F0U#pH}G_e)=J_X*aBV*-^fj7PWF&AJ_n;w4Li zrPjd37?&&C$e6LX_KquNKGvgHMmoy}vZfYgPc$N)T+!n#YFu2{y-K_TCRFmE91t_X zOiB?e^j>qN2Wb8FN2)vgQJv&+C=e?vrP}71@U%PC3lsDoWq>DqS`s%#j$hw4N*_DU+`)H<3w&UkfiKx9$g?r^x66BdjxF1vt0vm zm5XJar$vfBV^=p-lS6i|i`pM4UHnpa0VrOu;n=p|U}AOJbvF=ib=TFzSGpG4q1L2e z_QE%<(|2hoDbZJ^ucKP7!{E0-z2%K)jiCMkZ&Y`t((uYI0U_N0o&;|si{HJL1sVY0 z5_=hjx4%Y=+0>Vws)oC}k_`Tiqv;t%3q7!{@;IzDUVc(I?c8cOHyv`3Wme-_iL^ic zWOQSB>8CwlaU6V(j?#Fm2-7Kmljq^sa(}4(@zYQcjTtsd{bM=FYl82EzhDZnNBz90Xg)~X{5=A3V+XXL*e!%Ws z0RHP8YxxVLKj{gPg|sU8teQx~V~vzpmAj5vIy*L`=UZH>nIJCTm{=UOmz z1yzGOjKo(k*g|5)NHL?-vLE4vqE<7K_tZP}uycw0*74sbRCMY7(8!mn>NV$35*Y<7 zV)RJRqjE0NllgSZ{;$krqmNOT2zA0vY(KwA%NESYv1%(}e+@#!=_W`;ZFq!w*WNA1U6gUOYZTDosmma{U>RE@oPW)-LKM<}0 zpja%=*fw{j3wg>bD!vCmtKFQ7r?VT7JNUx&-w0m-rjEkR9Tg<55I`yL^_aL_CzyMk znNuj+j2mtB8gp8u2;DE11@er2d*|0>zADO?w8{_CE$;5_n3$L?Kx?%heakC`=^q`9 zhfrDBnojBb`is2%{r%N}=>hwUteFZvz5doL3d7w=IPVBpoW>Ov8R`cqVk?Q zD91{MeUU7B((U(f22@%aTnVF53Sn&*u6M1G8WNH6|@BLLpl!x&QI~ zJJ^)`_krmE@&h&vWmQ$pIPim*l~rLaHa`B>C4sr4;pQ4{z!OKE}G?@^|m@vPR3xn>&DVFnDq7h5QOZ-cb9N4rVQfc`ML=PfeDQ*oiRlig_<})k zyIsE{>^LP&?R~$(Y$&*-gw4y#i`{IH!f9)o2-KcdeNobqP7*SV{_TG{F%@eOyAIBN z-H@e%373JdWv2Vtb&VZ^nT0)9BPmpR^A#Vc3T4jmp}C>od!QPJ6=32iHE3rZFVUz# z#}zungY^HWW*!0R4PcQm0J^z6Q~c`w&DD-Ce0?1T{0W($tf7|*ZvoUje6gkVWoWKR zs7P`^cQc>4ZbH9bY>CzoZ%RQ?i+@;<`th0tAfG1O8hCfs??A(GYFR(zJ9njj^?m=VXF!Efm2^+kc*6r(llV)mBbHBf-lrIiZb!zm5dCYp?!B#rgzWp;Y?qX77O2RlNr^8xPcdtd zfZ!)-y>?|#xeaz|9-;24(dTZ)TPr6QKyGgNfZ>t3{L~lNls#Toz0Sr`V6)9Xc54<9 zAk|~g?MPLiLN<6d_ExnYKF+B!iH_wh4oQK(Ok~WfC9V?>{3l8Fp8#a(}F2NQTG9s9`1|E878I(b}S@bv!){n z)ZOcQ><|xTv#8|HgPnmVr}`Jq!<<{0NEimG{dsTrLZe)Bc&2M}a9}NKp@~2G5wb!- zbtl*K8BFu(eDf4mAS_q6_?|CRdJqJM{A!K(#{{73we4-Uy>6pi&avxyw||NNJGo}N zOD{e`M=58n<{fECWxdOZ09bD1{G7+Q;aSiKrTyXx{wmGtZ<_9P)^W$sh5K7k*>|Nh ziWd0aJ>K4+{NNa73re}Nn#x;!Jt$i{ST5(7BQZs|0mZnyzrw=_=eXldwTtN~eHJ>L zei2=tkTZrWZlhq>q}4RcnfvIFg^63gt2$&vppE>Qw3L>W=St%8sihtnMB@%OcYAE< zi)qA#)dTfxa(pGn*P;G*tQ8JavP#}#`&~GTj~^-XruG5EXQ>GR!@Y(Sz3CADT>Aa>@;<~yzm+6Xk0>1{&w;xk! zT<~7=$2+>$ze;MShW-ktgj|Q+v?Z<71F2b4$p-%#(!V0SBG;A!%l7>a!~-qR($sP2 zZPf>=`Mly`qt;=+!=#o&&X4fv3+YBR`?TJ;d#HOB&O2w08>kV_5(fm4%YI6%9-#W* za!tjZ@F*)G=)@M#im%4&P%O+r71rRRGF*lRLUVfX0tKu;|8|QP5UXpCdJP;^_YzJD z{=1#-5=rzVNUQXE=etM78%+O@iR*h1=8;P$*lSCV;Z3Vspu#h%90KG*iNNao7<}hI z`kdnu*rb7z0DaLG?^h}&t(|bm{TN__&NZ2grjF&@-6-jO%uQNU1%M1nP_{(C2FK-s zK(xo$Y-RtWlNMkN-}t`s2~6ne4Zr$&L3q#D2L9@@sS0ajDYnG?v`tyDXA+5zx2b$( zx3$1dl;yl+@iA?!>j8=DNw1RGf$b8HGz8>7a5^GDVz@hXH@OJI4|P^inZESZ8@z6>#|Fw@h!)1Je5}Q8H3VLkkm$iI}i-_wsz$gGIahOD$w~E%Yyc8ZZ>yxgnzts26$tefoIXn#0Xpo?+j~ zpUpUm3lYg;SpR?E+|va53uw>)ub5*O)&1sTO71XE7sg$E!F=`%^w~ z>k;ZFZWObrERPQJw$qy54&4)5Tdebz?#EV%?l)G=WC7~hNWW`x;#%Y%SWbv@?kGnn z>=WU?gZl@Ff<7X}Qr)5t`O%+jR_=5yTMAws(S|vbf5VlU818R$A+h08*eYdsL>w7h zpXF1*o8Hd?I&8vJUNX>qo0Y_?099o>vmfZZu~QuG@4Mm@f@Fd|f_oHHbv# zjOw}G{8^wV*L0o1NL+}2_DQl5zSHuCeuEMe1rmN3?bP`A8t^p#T&iMkX&mUAmq*Lx z8mM_Yo4dLfBNo_jhxV^xQ2;N{8MsZ$mp8toD3&}XSgH0s?F55(VPwp3E=TD?Uvf=! z#s?E|2+AUlXvULu!SH2VpgS*pN5T1gzS@P|#q);7=ba5+ z=Mfx;NNrm%3ZUmG4cKuG(a9UE;MLm}jf4&N&aw)xj=Dh}5{BYk{FyF7qlLM9Ixpfok7w#a5VpYshvt{mUcAXWWQ9+Gc*k5qIYTKf$z(PU|L z^|GOuM#Kezm*JpIM>LFl^L4D5Uu)oL(8(N+OIa(qnm8pDeEWP`qY+m{%KuSF zRXebJwWYha<9~K4oA#YZ7X14>F-jPJo^oGI+Uux4Ih6GD zjq(`t2d*pXTj=r$2269%X9wr}O3=^cy)gUXl0c#{QpDHlQGvzKxbQ5=Z4RDGRT!zM zRifd?c$&#l@;$!(z(@Sid-D`5ApEg#Mxk8b6s2gprj~}wDG6^o#~jhyz&s558}b6!0v~xQB0(Y| zLU_O`lf?7Aac&ccmJCD)HNh+NK07d>JB?a||E199_}iD!JLR@tz;NKObeV!*nD0$B z{}e?KVMbvDbBFwrR}|A z?Xm;~_|S%J_w;($Mkd^Ej<2_2zCO8~ErSSgq^NSCdGkGsA3?0DeDJFR0yumL_JBTX zad|boRUvU#1ZH?kqHlHtsVnzY!8 z>V;r4;$||x&Nh=1f+p7QacuHBtD{9FxZ9hddvoH<<2qRW6*i$=;rI$XLSX7+ioVBP zxEd|dFRB**G%wdUJy2sR{ZmT|3}DLjSBRSEIW7ngZdUXb)iz^-(}|MaQ;(aK`C8XQ zs{l}Hxuo}2Fx9)Sz6G73fxxAwmoMGSd&6lvbJoV5tDW|FT=_FFq~Lrd%9Ktb(N3lK zd#r)bD(v_0?NGQ(3HL`14FQ3sE67#K($$6DDwpSnhm4fYy6aSXX`@ry3PWpt*xs$< z4?0~-M(sl+&*1&i%T}6dU~Uouqx>E~2s z4Dy!lwEFU~Mzv(NuYjJ6X1w~EQMnT6_8l?7_Va7VdpaC9UZNKT1imGpyLQ3bLpY3k z@WLqth%GF}11M%jrRyzi2Rt8L%S6C!LD@>&FOhX=w>?mX?F)w4nDGyBOHBKi?S1GWba?LjO?=d{GD5YPCO&MeE{4P3&Fduta0sb49WevTcS55hA{6Ht$f1(x zUgottB60Pidc)q24}n6TDU`30o!H$8L8g)6Ha|TO-PQdMr(|h-e0=Qe>`E=S05?-< zNz`C?eR&32byhP#Yqh6xJec{OZ{Un+X=x)s^6%*G)+&sOis}YpaKW5(rhLoj=;%@i zB0j#x9MUgpRG1p{#XUio4iReqSb-Wnkb^;on{nE4^H2Xejs-M?EHzW-u#m7T`uHb~ zU+g0}DKRl5UEeEb;PUC{>M~sJia?xi^qM~n2LdfZ<4I%SJ6Teo6a2H{E5{nHS5YXF z@{F-qKxGCD2)7GGt-?QjDKF*Z*0NWnIySAS8wQVC|M?h6n$W;RN|Ox%lwQxuPcL%W zpI~c#nAnd`MmC+hwpbth?~(t0L486apT$@0<+J14R|b$Gt0+XYfBS^3PWz!fs_f7z5}w1ha{-a3CZ_298_t=l{_kmnVM_nfJ;t5`s3W&&o_d zqWe_G53Z$*A&$B3#1HzE0Gv0~A_WNr*j8x&H+7j3m<8VIL@>5OlMrBmTUOYjL02W= z1n7r^ZHO0)(J?ds@S;wn1L|(g{^Z2yXzXooa8S(trq)ld-M5HGGWe%E-ZWEEFKE<~ zWt>5~gSz|IIv{Tl1yylo{U$2I_jr_FIy`;TimLvOpk<%3>OH#^^CZV!1K(`O z%n&@}3wD7uKxhGT1o)HrQBXbT>D7Etw5M)0|I=61PwCN;!Tc5YZez*XjgzPo;NLz20rW?&w$V5#*r1 zs_KWBwwH9EfpoT#6R9_OdNaWpbXl)l0s?u@*jy=;n_#9k+VFiC|i$Gs!Z6#Tl9~jS_dZH*O;`EN{Ji5dkHR!bwBaJ z?%wv@Nq5E}LFWFRL8M6!rs^(l(*=TvCn$6XxxFkM9<_1XVc*lm`Jr$3a3W-P_jA?b zXQX=)is;{f&c|yeJ$td&M0Qe7aLteE_8Ii>n1;jNhs9C=2Onr~pDs9OK;ongG~amr zUHM;^1v=uz6grf2bmiGQxZjpRVtGh9 zGr8b)0)ZjD$%8pk$eA2}XJMce&2FMt$L(UPIwmd-wNf)8!}t0D;UiftTM}`7cw3Nq zqX+kg4cdbfSRwBQBc4~bQ2)x zdWaq9I}JD27rXoWj5My0i z)+%o{C4t_&c{9@J=_+`++g`I-Twhq#d^E1*26~iAUA8n4j-ipP7d0yhTG1arB7arH zf|8y)GV)kW`q?&L5jQn8A==eIA6nFHk18JoA?S4=G%XH^+@L~&dmV&HoF;d`@%qiU zV4EEH(93}E5K~<&=?6qPuj^H}bYJb)dx&Eizk9m)n3fV~JE`X^mtlk?hifL3(- zjbBeXIy&@$;|UfPh64Sasm4W^hW?D^i~uJ%|5()99)JVd5giy_bQpk$k&Mqfo-sU; zC!(SlCQf@F4{~B)Q(s^l1*PJ_YYs*p%3QhNflX6bOc^oMRxGhBuE^O^Q@Kji>{G(5?eK z6S`O24-l2bICX=v^0KgXgZ3UMA4WJ{PEC%{TPm_JLAv%^Zqm*Vpo3}7vH0eB`~P@G z$1AFUKUiLEUX?#X?E?_10Sg=$RsYPiP#}Eki96}&Lri|}uP=7ANFF_BV!E+d*_;^1 z0I$TL;~z!=@9+4rxf6D``}P$ozw6x@D8Yq*zJydW`<{e?!b&$ICFPwB5%!%s?_2dn z6%=A#Jk__cVMWKGFlPl`HzViEh6cfc@y>z);1H}Z9pGepckArr{wo0hQUvf9lQw!y zIQL(ySk}j)@CQwvL;W?tYY|1%gv(grb@t~pfR-Om12M_@EC;F<0JF+D1R=K|-betN?2|n2$^ow*wb!nH8tA`{`5wPfAg`?(+FL*n zqoAy7oop6d-3=5M%)Rn-hO*yJUmVynwyzRh=NoSc19N;h6n58fCDB_frTNzM!GJ1-YPA@k1tr34Q&#x_}$otlnFDZGX z2q@!#j4f#g(}4hZy?_7>V+Y}Keb8d@eCF=rp}FM1otr3dQvTb_m$TZAN2%2WuEc}hr1B~mh#AxR>Xsbroal&SJGC=oK0DMXnvW^5t}n+zGZWKJj< z&h@M3J?A;=tn>bJ{yVK&tyY`8f7ADS-}iNWE(J*oZRKc)20pyJ`C#q6wAH;UkI>3I zdZ-==5BwWO!y>B#fvxV$R|L^Um-=~lXn)~trcn?gEcz(1o}G$3Lv$|s=bm^4gc{em z)l~-x^zrBTG3W@`l@oP`&_QGUF#q#90Gk9E4t*zPZt8c3RQz<9I^ zIbL`h3|)P;yw~ifLZ38-ffuWjpFU?J`q3MESKd9T>D6r6Nt87C78v+k(tcA3vBYjH z&PVb-qo=zk9UzKT%e)M)eoFD(93<>s`DzusuWMXB^QOD}RMTA@UzDyo@uhbXGzY8$uS094iS~M8=$R0n$5l*C66;$12aTVc0MbY#L!(zB^bhD7Wn!)uGjkyV!}hXsGs+Ewu`W zvpb}20B%OTMXmS+!a}||Rj2GuG;udpWWQ%9pnN!p$PyBmHi(OK!@Vi&%KUP( zYUhQ=>p+|mwW;DmP(WJrzWy@QIg7U(%vZW!GWvSRB~f3cy)8^|_K z+;}wgr`NW2m3yHvs>ErwgCDL|yh6xozQY&jLJ3X({l3jjk}a?vXaHd(j)>IE@J7$X zMhzB@(s}anCwroqFhVEwQpN&?H8rdZKFcr_X{%?g!V%>k+DA_c&^B7q6XSE*6H=&{ zYBsL~S4aDNGrdl(hI$qQ@ggypD+w;Bc#p|k^Q^10dQlF~E&2Sv-jZ&oEh){N$RIoqqtj?wUYVt z)5m0dpntF_Z5DPsCfqA&2SgQ5(L2e%-qKQQIv7_6Lw`Q!&2jhBfH_m&GVy zl{j5Z>xmyA&p4uCy2hGZ&t7ODR>E8 z2AHAkq?tex?b+OwK)8xF!auIJjUA<4b$@NdhwPIoDUTmx1j7T`M(&>BHg?XPuG`qy z*a)bANIS^OYfjQWc#z)G$_jOxo)xL(U$xO(ozofhtd6>YuXe+4%kEa`GcB#qn)0@N z;43y&t@1VN8<@Bjo3!YBSo`5m)!pa`vfy(Wz-2^*%D;0bx3aP_k?Vp=B^1Sd^k-^D zM#ksuB7ds0Rirbvw$&XSTs=KKM%LM5r{XZbGAZ*pDC7p)0SD3mMjdv$rwq33EH_6n z$bOe=3MM;em(&1mx^u!PDq3+%0efojpZJt7PE2aR#t#tZ7?yl0lgMT1;G&5Jinlf4 z*2hfe{ypGKRaI3^gMuvip4i)e?CKLRntY)*KDP#~xawApOS}wEd>?Wk>5S_KhVx-K zn4F;rOae}p^do?Vu$jR}<@@sGONtx_Ad1mTqQ6uW!xG0I9#cxvJ&_=shPidCVJ3Y5 z?)p@nxGL~rEL>b+`0kihB?CGjk^Z&^b>vz9%O135dU`r~`#Cm}T9%QZvN9KLY@^$L zOaea5#$3}M6ScRU+>|S-%(Fjvk+pC1>W-dlrCa9LxJH>ys5bifcPeKN0PL)Vi9i6X zWh(GW{r&l`NJ{Yk5U>S3GqWaY%#D(!G>9KWnS&UR)0B7jO-emw5!b=8VZ)W$2#)H8 zhIK?z6G`onLEi^WJ|d>4Z*+7mA0HncBRX(33iAxYcGuDSg4w0*S(w>=M@r|F^v~3z zA2Df}-PyJ_S*1TcaeT}0opYER>fm|h;^Ha-kAE{Eff*LH?~|YTe$9=8p{4n!f9T(4 zZVYh-w0wmX5a+;QS9Tq8c4RoE=Sy2pZCEBDU4fp6F0vPYHwsqwbjQhV7RmsvEuAt3 z73jz7nvfS!1*ReYdq?so5E{rLL3Qit?Y+az?O@d{d4={nPwEQknh~@`;D?RFcOSM` zJaJ9{xLre}^$binsvdH1d8V_?IslvSjHliIXv~$nJn34xkm>fm)4rC*M*!v3i||93kXV`f|2EVc zxe(OjIhgqEY=D2m{WUVWUguC>P0BD=s6!$b?-IhoZaR#Gx^Boj%S9|w8yvtk&p+twj&)lYs)9%wb3lAcp`19Po=BDX%6px zbwda1FDdq3^}7W+^*=^NE~9nxTMEPwP7wp1FSH2J_%U*UwsGigFE-xxOFKDM!uA{; zUNY|aywsD8^f*VgLF1>MUDy?u5*;l9RGk9kTOA zpZh!T=rTG?hS*;9cqdYL0EG6X^tcql`ix5rVh4I9BY4eIL zj^qiMojF;1&o{C_G!OcnvSlWJD>eE$_H-VWl!X>z-pWL z&Hreovhu4f!B0JX-@-tn-oQGk(~=SQ`a@z`3+WW|YJ?S3wf_9}R1{i{MC6_z-MN&u zQBOK^?#m=yjtDp7_YYor%wy-+YC%ddO6{_!X+cwxoW^*3*3-c!A5*aY)=o?CuCD@2 zQ+05~?ao0$I)JbyVCJ`3F5G!L4Q~k&78e#&mft^QDkso<=K`)V$%&qd;!kZbYf#jgsvYMSzdt-putIcO$laEdeqiee4cs0 z!AUFMn$}~gI^N|c#;seVnmI-eSbJVjJ3&Z}PK}GE_~wxM&ZX}SW+B$Fz%nyXw0tnn zSW*@Qp{E#~SRPKLgZI8L&Rz>Qw6PT_#asS9jnQOz017KKTQ5cP3+nPvKbObuAc5%} zH`x#QfH=n1Fd*kSi!s-*HXut8>6hGZ#jtEoOfLi3&$C)bXd#%>zSah}jtqt-S-r3g zDvd+|I(V;THzhtHWR;7iM=3lw=*WqKh3UZRRN+=%Il0Fp0o3QV?_hPbYlm$Bz6x5kFjV{1AdU&I)qG)G*+i2#scCD?dSPd; zr$fYu659Ok2O`AuwAPB`Fyy)+D*9Kotiz$ka;FYWI!(*Dw6kBtkEF@1`60f6+)ZdH zro52u20gFRB2G*_y`11pFlS%wcp%D9`MjbCvFce_1+lKTTq=*};UO4XQ-#-bl^ev3 zdXYDB70y@qf1e^NhmlJzB|Xzn1X-w%Wko@X_;lw*GKZ;?^`yTu&g_eh#Pk#oo_a%6 z3Ux0)I9V5pHW6tTM7ypk!!T3Eeaz&+E-xsfeMd|SaY>fTlvl&mLWHe&pZ1EIkAwD# za^TA+jVsgLf$-(UeoQ08lKV(tj(Nd$WUG`EQJ6cltw-QgEz9jePa`&x+1*@C>r^0ruB=S!VTal-! zV}rcK_8R|!6cdTUS+{C{;BbCa^*y&F1-xlp!`DS#kC8FYBPJYai?`Me5@mQ8#&Lna zQ`Y$No@GwTmcSPeDDvrt(YX(IdZ1V6@A7e>L($K(L=g2tlHVR@s~s(wb53VTs?$sZ z$Qq)NEW47DnyPpx?!l%(VpaRCF+%_AT=ivmm=3=(+scs)lWFu)94=&bh8x$3lPwv0 zhWg>NXY$_j6W1{o>T<5%OqoSRLIjnJx?U4svgIBgt9Vocon%{QP%?_g8$pREN~p zxyt`lLyP4t+c2I=@MgVYmt4i3dRO^3UfQ9_fxipg;d8T7S=jg2s`XD`){g@r2AZ>rwk z)eH=7d8y<)b3A5f*cWANzW2--A+wVwiOzvYUjcSXkt=PREwm>~{jLqytho$NIfl)a zx!v*P?GQ%`yWM%fR`d-IhhVf-X(6+{uHNZBjev%yUS#9*U(8kV`j+B3Q9K-6 zQc_anI%06tIO{mKs`qn~XExUl>ga3)$;%4ebUhx_q?D8zGn3TL5~#ooWPv=Ane;M;6@5_Nw~sn<+Q znug?IC#P%@zxza&XfR9F89Aa4$i?|`xgQ?R0BpMkmVF^mw?#!JO3KP%kRRI2gyrRr zz8bnX4HBGTOE7V!N&IMsY^82TM{gsAeoWQv97tAJyE9G)3_uu8nyl*=Jr~lTTfudX zQ@;9)yt|6(#&M|fPF+gVuLL7ao|J%LsikJ##UI?8UvR~q`k`vh2m;8ifcZv{5k(Fs zXg$M~eP_4FX#6adT*pVHC`cPbrKP1s=m50~U_$USGIMc6K&mK0A#WYacogQb4k1q$U2h2ucps zl&K=EkNL-%8g(f20zyK#!w}jD6<}k|v4i&!-yX0`bREebLMtoPB4&ZhylQN8N;1s{ zX8lh}B|7JX8~HmTm?(1pE!5J1hK9x@PM)7%P0n8tH@+khsZ_DD+-b*yXUnYU0u|gE zHHe^`YCbI82lGL+tQ9SmR9@eyz2>$&-qW=li6723r5_bhQc|isyS=|b@pDbte9zi| z&m(mf@9ksa;vC(0&!0c9q@r?o;srUF>M7T)*Jn1q-AAA4cE)kx`-qbJ80Q?om;7;! z?2&xy3~}kGidc9ch#0E&JnOY)W@dI0^`l)fFdh)OnHUdHkr32~XfBbbAU1XZTB2Mm zZCqCfM&5U})%XV`_B=5^*`$1tM&7nj9a91XAlgaQ+dKNqy?9(Ykv|~VYg6-gE=EP% zAcbPOB)tD_yx-jMMFdl}m;0&g+rPhIG$=5T^svpIo1L8ooh&*?)3<|zgC=o`($czY z{))J5kQ;S?kQu&wp~uX8tgCqaWZ66~!W0|G0p#M-h<{>TzuqdB2q-yt_%LS7WGUnuucg(~v;d=uEg2#v= zccQ@I^1ehuh~b%aDd2RUaNS3Cw&sl1-LrHI)r|o_ucJjJB@tkIcDS|1JW7rCK7`&C z@*Wc+LK^m1TU%4)Fj?Cm7Ilco4eUoqL4S|WWR`pT<)$XRT(?mpVjXp!X;3s)8B;^H zu)3vX5+W1W(ZxIF?^kZAZ7mD9f_?G|VoZojG>v;B9OO_qcq3Ef?}Z^%`;FOEa>owb zB4P;3wc@3vq$XTqgFA(@$ zn$@eBWe!^WqQZh=Duz?nPjwC1w$QU%!e$nU!vCZkE8d$R7G@vf>m{h7*s8 z)gt0k8cOrnlxS?KJvBcbREPGbd$B-ZZQHWb?W+*tSR8ZXa8%DtvxwbG-P5xOyEiLj zpY_C=PpF8$cSo>*b}L8Xce-V;RF(f;ABa%Is@7IRuyVwrAA$F&Tl^szPSll;$8Vxy y2#s0wnfM6}NI&@v-V22Nf%5+!{xf=oZucA&1J$S3pYgL*NLmMU)U)?l1pWuKxAJHJ diff --git a/velo_rent.py b/velo_rent.py index 39124d1d..60d0f9f9 100644 --- a/velo_rent.py +++ b/velo_rent.py @@ -1,10 +1,35 @@ -# download modsim.py if necessary +import matplotlib.pyplot as plt +import pandas as pd +import numpy as np -from os.path import basename, exists -import matplotlib.pyplot as plt +def State(**variables): + """Contains the values of state variables.""" + return pd.Series(variables, name='state') + +def flip(p=0.5): + """Flips a coin with the given probability. + + p: float 0-1 + + returns: boolean (True or False) + """ + return np.random.random() < p -from modsim import State, TimeSeries, flip + +def TimeSeries(*args, **kwargs): + """Make a pd.Series object to represent a time series. + """ + if args or kwargs: + #underride(kwargs, dtype=float) + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=float) + + series.index.name = 'Time' + if 'name' not in kwargs: + series.name = 'Quantity' + return series bikeshare = State(mailly=10, moulin=2) @@ -29,19 +54,22 @@ def step(p1, p2): velo_a_moulin() -results = TimeSeries() -results[0] = bikeshare.mailly -for i in range(60 * 14 * 30): - # print(f"step {i}") - step(0.5, 0.5) - results[i + 1] = bikeshare.mailly +def run_simulation(numstep, p1, p2): + results = TimeSeries() + results[0] = bikeshare.mailly + for i in range(numstep): + step(p1, p2) + results[i + 1] = bikeshare.mailly + return results + +numstep, p1, p2 = 100, 0.5, 0.47 +res = run_simulation(numstep, p1, p2) fig, ax = plt.subplots() -ax.plot(results) +ax.plot(res) ax.set_title("Velos à Mailly") ax.set_xlabel("Temps") ax.set_ylabel("nombre") plt.savefig("mailly.png") - From 2157491b0d4a09466fc93b98d59ea48de240f73c Mon Sep 17 00:00:00 2001 From: Cristian Date: Fri, 27 Sep 2024 11:36:04 +0200 Subject: [PATCH 8/9] run 3 simulations and graph output --- velo_rent.py | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/velo_rent.py b/velo_rent.py index 60d0f9f9..0688100c 100644 --- a/velo_rent.py +++ b/velo_rent.py @@ -64,12 +64,29 @@ def run_simulation(numstep, p1, p2): results[i + 1] = bikeshare.mailly return results -numstep, p1, p2 = 100, 0.5, 0.47 -res = run_simulation(numstep, p1, p2) - -fig, ax = plt.subplots() -ax.plot(res) -ax.set_title("Velos à Mailly") -ax.set_xlabel("Temps") -ax.set_ylabel("nombre") +numstep, p1, p2 = 10000, 0.5, 0.47 +res1 = run_simulation(numstep, p1, p2) + +numstep, p1, p2 = 10000, 0.5, 0.33 +res2 = run_simulation(numstep, p1, p2) + +numstep, p1, p2 = 10000, 0.6, 0.47 +res3 = run_simulation(numstep, p1, p2) + +fig, (ax1, ax2, ax3) = plt.subplots(3, 1) +ax1.plot(res1) +ax1.set_title("Velos à Mailly") +ax1.set_xlabel("Temps") +ax1.set_ylabel("nombre") + +ax2.plot(res2) +ax2.set_title("Velos à Mailly") +ax2.set_xlabel("Temps") +ax2.set_ylabel("nombre") + +ax3.plot(res3) +ax3.set_title("Velos à Mailly") +ax3.set_xlabel("Temps") +ax3.set_ylabel("nombre") + plt.savefig("mailly.png") From 965e97464591cef2062600b0f9117fed5dec1e15 Mon Sep 17 00:00:00 2001 From: Cristian Date: Thu, 3 Oct 2024 15:55:40 +0200 Subject: [PATCH 9/9] Use multiprocessing instead of concurrent.futures --- velo_rent.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/velo_rent.py b/velo_rent.py index 4803169f..364a779c 100644 --- a/velo_rent.py +++ b/velo_rent.py @@ -1,4 +1,7 @@ -import concurrent.futures +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from multiprocessing import Pool import matplotlib.pyplot as plt import numpy as np @@ -67,12 +70,12 @@ def run_simulation(num_steps, p1, p2): def run_simulations_in_parallel(params_list): - with concurrent.futures.ProcessPoolExecutor() as executor: - futures = [executor.submit(run_simulation, *params) for params in params_list] - return [future.result() for future in futures] + with Pool(3) as p: + result = p.starmap_async(run_simulation, params_list) + return result.get() -params_list = [(10000, 0.5, 0.47), (10000, 0.5, 0.33), (10000, 0.6, 0.47)] +params_list = [(10000, 0.5, 0.47), (10000, 0.5, 0.33), (10000, 0.47, 0.6)] res1, res2, res3 = run_simulations_in_parallel(params_list)