From adbfd579312b71c6e5c4a24f30c9d301dcd59c42 Mon Sep 17 00:00:00 2001 From: titusquah <46580668+titusquah@users.noreply.github.com> Date: Tue, 14 Jul 2020 09:09:51 -0600 Subject: [PATCH] updated to LLEPE --- .idea/dictionaries/Titus.xml | 2 + .idea/workspace.xml | 189 ++- data/xmls/twophase.xml | 2 +- docs/build/doctrees/environment.pickle | Bin 69863 -> 150345 bytes docs/build/doctrees/index.doctree | Bin 6307 -> 6297 bytes docs/build/doctrees/modules/reeps.doctree | Bin 167275 -> 191532 bytes docs/build/html/.buildinfo | 2 +- docs/build/html/_modules/index.html | 11 +- docs/build/html/_modules/reeps/reeps.html | 649 +++++++-- docs/build/html/_sources/index.rst.txt | 9 +- .../build/html/_sources/modules/reeps.rst.txt | 6 +- docs/build/html/genindex.html | 120 +- docs/build/html/guide/install.html | 12 +- docs/build/html/guide/quickstart.html | 12 +- docs/build/html/index.html | 21 +- docs/build/html/modules/reeps.html | 546 ++++---- docs/build/html/objects.inv | Bin 651 -> 688 bytes docs/build/html/py-modindex.html | 16 +- docs/build/html/search.html | 8 +- docs/build/html/searchindex.js | 2 +- docs/source/conf.py | 2 +- docs/source/index.rst | 9 +- docs/source/modules/reeps.rst | 6 +- reeps/__init__.py | 1 - reeps/reeps.py | 1172 ----------------- setup.py | 10 +- tests/multi_ree_settings.txt | 1 - tests/one_ree_settings.txt | 1 - tests/test_multi_reeps.py | 37 - tests/test_reeps.py | 214 +-- 30 files changed, 1138 insertions(+), 1922 deletions(-) delete mode 100644 reeps/__init__.py delete mode 100644 reeps/reeps.py delete mode 100644 tests/multi_ree_settings.txt delete mode 100644 tests/one_ree_settings.txt delete mode 100644 tests/test_multi_reeps.py diff --git a/.idea/dictionaries/Titus.xml b/.idea/dictionaries/Titus.xml index c7fc181..ff0cf04 100644 --- a/.idea/dictionaries/Titus.xml +++ b/.idea/dictionaries/Titus.xml @@ -12,6 +12,7 @@ extractant ftol kmol + llepe lmse matplotlib maxiter @@ -25,6 +26,7 @@ seaborn slsqp thermo + vals viridis xmls diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e28ee0d..d5984e8 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,11 +1,37 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + - + - + - - - - - + + + + + @@ -248,7 +275,14 @@ @@ -269,8 +303,8 @@ - - @@ -290,43 +324,48 @@ - + - - + + - + + + + + + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - + @@ -335,31 +374,39 @@ - + + + + + - - + + - - - + + + - + + + + + - - - + + + - - + + diff --git a/data/xmls/twophase.xml b/data/xmls/twophase.xml index c10d135..ea2a037 100644 --- a/data/xmls/twophase.xml +++ b/data/xmls/twophase.xml @@ -50,7 +50,7 @@ 298.14999999999998 - -4704703.645715787 + -4704699.156668724 1117.965 0.0 diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index 021b81764c973bb245af3c41ba08ec005212587d..176b86d15e6c0ffe1812192c6ba61e56481cc3f4 100644 GIT binary patch literal 150345 zcmeFadyJe}b{{rF4(Gwyc|Z0gt-kHq-L59Pi;vx%RVejpXJZ+Q0knG_wj+|(<0~ahgYQcbE#{wM7kYFQ;q8Nsw$dQl$4gw@b5;*xMK!OAT z@`qs?NMhItkoX&*^UZVDzB|f?qif?2&z?Pf?XCX$gosAhu6D+wY>WyvN7vrCcpqw7a|0W21aL5w_&F$9ZprR*ZJ9gImul zp2l$8YK+_YHtKK;zdf!uC*wYvxI2B-O2IrFO}4k2!<`r!>}hW`Z|_cD3ZOe1md5bu z%}#!6z2C}r^XZe_W^Z%S++_0xJL7i0w>y1eFzj#T>yY%Z3m48`I=?%8YP~<$8Fn_? zc=m;}r_Y{V%pkkTDEq}pv%Q#Iyw&+2&))6!^DW{5-R(XE|Cwr-Cx&@9Z;k+c>`eW1 z{q*ki*>S!-=r+gss4+lGz@O>yhI_W#oIao5Uhhs?IbTC1goV@N?eTWk@UH#J^eOq- z?QiyXr!O}~V`$9!sm}K1DL$$XdXU}o0-~>6O-~qDRP$^;n5;F{N2A6@rwjRkj%TGv z^ynFRv=sn7qgv7!O*S?DeR@SZh!p)l)unHXX~kzIZNTKh}#WqJ(S+T7V~zpp=^lAn!@?eXqKh5UT` zr}Wj+prqN&8|bmZ;3xF=Xt$~FKclT`Sltv+^k53m748iC{qf!U9sBO?9q{a~(lR~1 z-5fzT8q#Zyb$YG*wxRO%_BqA~TDEDN%vGlV`BlK(qdDeiy{LpNH|MI+D zYcD9kr&{?&bJ86*hJA2aTQ~hov(;*BOnM@6Xx0!Wt__1W+Wn!HdY%B={ni96XJg!p zpB@i8+Yokt-0P3?#xUQ2s`S?L#%R!l-TA~+I%@ZCHMDPy?89dVJDXxlp};#r%LPj5 z#WwnCm;Kf85TY|wn^wNyVfq7AQ`^ulx4+UBJkQw<*jR%#gORwX&!71q&j*cL&0&wW z+YiKjspvTRLL(n^&`&Ktxs)R+vR@rvQeUS~Y$tbeex`-uQOYkoI6o4r1I-*qkfxOQ91j+aa?M$g5! zMk^n{tiAWBplmO~?MG7vy>VA^2qNfT8ATTLQhrHvjmzJ8Gb7 zb~bkGqo?_39SSrYk8DGZPoU5ZG!MhL#Wn)l#ve|gd5)Pc2G1HzQRv<2(GTCs4M$%N z-y5^cZc>{*WxJ*H>myrDSkxzFux3Z%n0FKmhVc_imrs-j&xp-k!+0Q_y!{0gg*>(P z<~!edQe2WprjPNt7^C9?p(AJe58Ho80lw&;H3GescLpBL1zPe2g@0P$&5#9~CxA+j zZObm~mOR$60kwBKqjo;rwcuvVaARaUQ~2iuH{5{UxUs-uMyBxSuyUf8~r`1NR@4T49~{&K?gd5y8sT~4C_a4Z=i>wXITw@S?Jnsn&*vM zofbRDBU(yZBQ_5`kwaal*X{IxHV_5WxuI76hx+(=!3n=>eb^DBMjlE5eFJX@He?Ns z6{Kh0ydY(64LckaX`nI89EStb`3S(xu2$GS(SF6)L>c-;>8$^tFJ25@1e&MzP2Y*; zO+PDMRVI#425TnXusFBI8X6x3G>jYLeU?#AC>#aaC)z4$lnr#ZRvo3~6it0O#n}Zy#5aj;>G~vh}|80X>J+n{?q?qB~ zpxYT6_4q_d(HC@P8^)>sp}u%oh!Abl7pw|;E$Cj=mof|BbLZndRv*J(Qy?Xkq(Jw3 zI**|*6cEIYWy_j@R0#@^niq;r2=czSp~tDmEjy^07b<7!IQ>Y=U~OA}G9FAY#yYp> zn7BQLdevQw&G0zjGr&XSU?8-s_;e8C7-b#YBlXM_Hq4W$oA)>3hUm+*TWGb)tOl&c zkVf@=vHphX^b=cZI6#({i8hr(2FGd3XT>MuBRnX2+(SFgNrA65*v;|K=mSQ3nKY@E zPgmRH@nCfB)T#AWZ);Rv@AfAxcp1aI4$hovVs>?^+gTf(GNn$Pt$(Bb^;0rw8P~T) zzo2ui<*WHGExoaFWoc#QLgSsQD;N4hd^5a~;U0*>u}RqctR=;mIgXV_uGOIJ*A{kj z6@@F@>WnZ~+K~bE$hB1hUAI6Eky2y2`}DcZ9Mh)TV>)0I^6n3(PnbtCmOgLa(-&t) z-TmQK6Hx$hitM`yN2O2P^B3)N&Qu#R%-gZxbMBSz_v7XePw57ziT|{P5rYC_(;I=8 zoH>5>?eAW=kX?LZ<$U(@=U3i%_rkZ{c{AriZS;dp4kptl2b3_Ls0;U;zO_bKT$XkNZcR5Ipmq?T4FG&qCd_DHX#TSFf`2^B;RIlmdGArd6ud!{DTk#r91C9D>JLAl3;W)&v`DkJ zj)5BHQeJ$<*J56H>ZV7&|3#w_PeDV>IEao84Lc?phOj~48?d9yHQ#&Gs?jqnLuf_`!2qe*p05&%EEuGmxKWf&Y~C zH!>FvdS<0FTF<-ii@~IkQ|}jT6-9M^-o7g6h<#D2j*e*G+Ub*af~?|y#UkjTY5BO> z=|Tr5Mlo4_YI@o)c=Vc#J2lpt>mR`Oj@s5Ye+8n1QsvzN%zCe7A{Ll5 zO`mdaWY~Dg{j`7>AuewHBQtWm>|eL?n+R=eO6=%Z-dlnKIk3-oFjJkK_Dvr>%Ppx%&r`ny#xYPAT0#-S^ zTIK~;#=h{SGG7tA9ELC(=x~VlV&X9F_c0UnoPHiUr8??E2Mlw`Ls8EcXcuD;guFSJ z!yMAp#K0r&tH6{v=>8=QyLEnzZ~NSb7{u5`eD%iPH!md2CqX<@;#1~@4t~>PJxqvh zS~og;SMU#CppPX3Aglo#d@jTs(*aS9*2@Gys~X$6#FC&W2z>r|l>@10O|2#2>Im3M)U@Ggap0tIej&}w*qH=gO zeahodI$pKam@s1pp{pUBLlbQHoPFKtArym&9`GqO&QuE#X04=wm{&f8qvuTT7l`h<}N~ zGr;wUzRcXq4J;@i0$f0^gia=F(`VG>m&FX2*Y_Tsz7#!SPZ~B6BABKx75} zB4uzfSowL@EF!tF|A|XxQOGTF*)_NJQ*A`or%yrv8rJ?bE^SF@>ePo5giW#7GNiVO z;lS#dzUuVw9P!TSGa3^gox)PyV6^+|Xoy>7xJy)q6!jD^E!%zX$n-Pm!#38j5N#i` z)t^pZcDNFRDGlD)1vZBb3zoq5a#BQT1^j1|7hBDnO^q(Gm|az~*f@#f^H-8mW@!y? z()zgwRPuNZifi}1pPfu!Hsc~Y9Ym`kmEBLKFGkNX!9!H~6PUt2gW+_U zr%!@63~=!WcuE@q_lAoG2xWq8pG;rDe7E^QBS(>L1I`a4`EXT!IQ`TB!G78}84IVG zoh9G8b*ruo;~eW0?CvQ*j!t34j3wMU1~uzb!;SR-$4^-tV$$oKe7qqzXs%hF&{6qk zJH04;(O#cE3x$*6uW_3TW#j_qJfq24{PcLciKQBu6v2I;zA9E8TtQ$QI)RxW`&7IBzLEu4j(t*e8R3a_~zF~ z(J% z|J1u`ShUCg%B~dO`W?c=udv`Pi*&nNe*-TkYfX%m-a}_EIog3!1_gLR##vB>@5j`} z;oFl4efuADp=D}(9jmHOjGJ(+v0l0L*9EnRcI&tCU0WmMwBO(QT|7Yp{uVx_&wVGC z4w_w|xr9PSq!-?9{YNOY^+)&zlyCh$KB-WD8=pYc=1G#~;eaWa~e}r=^QZ zwg+ABeJ}4KW|U{+ekS@dKVr~&^u=r`gBz1w=)lOgmh>Y#&k;sejIv8Mdm}rq*&7(V zqc+`F%*v1d2JN{Qez2SE!4H!Y5w*lTQyTuKd!u18J>KnOw!pZ*?;xV1sz#K#ScfgP zR=V_-)QMF!$i*2J?H5n4O&~Rm>AK#O=$~|;rx^8ZAUe8T0alwnXGS#)4yKpBU_-{} zO3lq-bI`6Rti(L!Y;I{G@d!9jhD+_qGnZ(W z(Kkns=_u}b$vb6e_MjL#efBkkLjqa~{Qc#%mQ0RGq1XJa0~1gX&F>x-MJk&7;QsnQcB7O!5{E$H zsraWrb|`m-R7}>?4XyHI?)&&znEHe|xApfOWB!i=i>F-0I1R^CP?q(o9K!$oz;zY0 z>3=;e3NOe1`LHOA9A)-bCC6%yw02mR^uA8`A}#obP77Xs?4Y_`t_9@HURvb*))-wLVmI9>onPkBu2%R)F4{v(>yNI}D-;s>P>0_JSK0@5n$J?D2 zqFDI$j6vxhJgEz;2!y-`LFjb2-|HgXVR{^~AWyjbwAF0ANrq~SV+mgoJvF;G)*sl; zkZTew)^z^IxSYKE-t#)@oggu5TXlStPSoy)+#t3%fc^vI+@=EBS_KJ6#r2|jG!V^G zS0p`)`3((iul?Y<9XFTShU zK3TKZ%48mvOw7vwlrJ9(MF)xW?bEJJUwRGt%N(R7P_<;JGJ^6Ukevh9U$AvI4~rs| z%OON-Mm&k{RgHL+;y(0%R}w4S`rq78^*aaVN4ZGZsJ(`&-#&0%1@ZkgK~XtWRdVmJ z-okMgKu$VI_(D6!-#>8c_Q}cV)2}hIDVq?nT}rK&?-c*Vf$J@B^^XsW!gq?lcUTnO zWU6cr(XTuezjZHEOx7mT=iuaUBMesL)F+`w!xggk9+w%%dyh)g`@JI)@_z5gWcn;i z1Swi~xs4EyurWrR2L{8Z&l~3n%UQC3#fO3kK9BcXWQ5E|)91yfL8=MXA2p+uWYE3A zx|tOFb@6ljFAlBl*91-!TpN@(TT`(d_JZ|fqNms+%f(q)CPNj|N7os-pFYj~ZH>{+ z_F5mgG@I<&k6+PWb}dYF9!sjD4mP6nHs4r7(gK%Q&F^m`PH_vrk4df%zF=(-3s^{g z;1W0%`7u+LdCkS?bDh!UJbe4f^r=R$v^IUF(L{>Mn|`s4i}U?8?hX|;<`mB(6KoK5 z>+fvD6Xqv5Z9$$~x2y1Es6ItG^H3!9jQz#6Up|>kk0OzceA#;T7#xKyRJZjUzQwHA zdI^s%ZoSNZr%y?<-ygou9k6#jrE!Bxz zk|j1~CXK3FY@I<#&HiH z;St>mM$MUyOEiuvLKz9I0}x>r-3lMYg<2!c_`v9PnhM2Fc|QdB+3Us&%lFfAX`m>6k43qXzVqXe>sW% zMCQ<+Ok6~PN4$6xHM@sWGa`S1liRs&ei6+Vl@+Lvd9vVOtCdCT%wjz?LGZ97B zjILxdRo1Eg*1Jiu$W|rAXsfic3rVSHm}9AEbTozDPYOk&7YmgRex~r{q;NDkN#S5j zGiAP;l!=C)u#9imFC|4HC1MdXSyVQxCeQ_*2Ll9$9z)mnlVSy)2gN*T&7{b^ zD?zc}>6n(@OiD-QkG!$Q-86G6fsafG;fn^`l-y2A7HV>aRw)}K@R2Q*nymRX6^xPs z1u+|ospxMe&;@zLM$Xi+lawknzr=!SeIL&%Suq#Ul7A*CSvlcQ@IRY?M|_TE6AJ$; z34Fz*L4kjm0MD8aXo)|Ul!&?$$FXt~_UDsgk$93~zB~Peq*P?WSgOo~?IwjH6UIWb zOxRyc3P&bP3Kvb-UrNeECM+!D8}?U{B9U&hNMyo(D}gTXJg`N93HxhFu>#M7VxF|$ zPD({4Oi8PbJ*kfTPJ$vbVdW?!qNJt&W>Pv*c$Q8~*uS5^M}3&^l_u=>l9Gj*5)<|x zC-9L8lbR9}_IHv31u;h^>_17M3k|6>Mt_);+=r*8y#Ax4U_@Zxk16zj9z##I{!2W- zTE>5ekD7weRl*56?|*``C!KS3lp7PhcjcdRXCj_YpT^eEO)wjgQ2J}u+j|@bx8~TT zO^_$C=~i-McDFVjXC3b3RI{gj`aLY3MVO+(R(+*7!jG0Jbmes zoYk5|M52{XV8@^As?}{R?q{;~4Uor!t-0c4M^B2o(S8++aY%|p29}er2-QgT2fJHi zP@fWt$K;4%3x54u{Pl0+pZ5Fs^{f0vKY#0o_=X36jt}VaZ%yUF^q6i67Dcr`et?B| zv#N*#OijY?^l7s>Ne&^HKL0ij+oE0lZm;vL{DOkU@i}lM^SM%1k{xa&AKJymN z-u6Hl+4TFZ{Dd9@!Z7w=tp+HfE*n> zz<-05eTL=b!44nw2FC@n1O@Btn~Wz~{5HOL{I#sthn`?1gPk|Kv~wvR{OrXh-fvoz znE%yrNKT&D&+FknSMi-yoWE*8pz&+{VUG_-y^(#2c^&;59Fv7@qx>eMb{+krHsxcX zd9<05Z0NDHy2Ai0WZ%^=%%iS@0?#bF7NAg2xOd} zJEuQc^;K-Flmi@y^;WyH-j=i6W%~gqSBD_Viq}MOign|hiG_18txao>YmEC(Te2T%Cl;SOm+2;R|DLT%T-Izkn}6r* z`?U)T^9~Kc0(Xhj5Ulpj8w+P^*s-2~w%{e&^=`toKmz(;KJP1rSbB++&^WYE&gW82 zqZe6O1fZ+!MrSc=BgCKDGnH>{z2=vi|KC$(Ul-@b)-$E~jNojR9 z|MZ>@8Nuy+|av33NPLj?h}?;5nJ|*f*tYLGubShkH(JFPCc(fvDy6= zvkT3|EFZ52^+?_o?OIa?0-OaQ!AznG1Q8TCxuk#gQ+`E13_!)lNk`eo>ZWENL($(< zTa?KUYJTvyf^}Njr}Xb*hw0?9{@G9Y75y*(6(1o@r=^;YVf8w;LJ|tC#pw8EA19n6 z(a-V7g4j<_6I;bU`)Pi_f^qJV)sVn&>cWCNE&a!1vdp!g_rmcrh78(tQ|-sud3e?E zeTJRMHhSKS7J8a&tL&#i`(tk1SwjZKD$_Wy-^y-g%Lu+_>-@01hxj}uD>M6fFS7fp zYuy8p-H*9-Uo)+Pty9Cwu2U(y%je^6^k6vt^@JwyeUIK^>0&`olkFw;)1ZYjY`q@| z&s1ua$7J=$e%^~dy&krX;}tm`+Jeh8a~OKZxAGjMZuckH-i(1k%Q@?7TV+2DTCf7= z;%>_n!@6V`$!&`j3;(^}tus!LM!Z}C5l2Yt4`BkK(+_cl{0zr6i8CFZLgB1pv%Bt{ z%~MgB50o)Pvmw7w$taU^iQ)M`)SOwJ;zL&pD#7zNb;gV- z#~eZCFwN@X5IkR95De3B;w-0y5$EtTN{(HGGrdS} zdXet5PIctpvx^yA9r=3E6Tw+igiuQ?(K7)nu;zh#5XP7#v0oZ@#JC=CQ0aZ(!=nRv zRwq>T&!v-|ML3#1zjR;pMHnmTGj6%k=wxANjr@I59X(L`L;ccpO6V2C$_w5NQ{|(0 zt*-gDzm0w*8bJrkzRvIrI}Lwcxd8!Wo!0Ul`6YGS{bp2oB225;;@_i(T1lB~=!gz> zIX6#`0J}|TNwEYYLfDW1K`5fMw0T!mcQiXHGSIx%2!&-*px@_voKkq#nf(u5EKXxb zzf|wnG_q_CRje=Ysl`7F8|;+i0G09{98J2VX3VV5MrVT7y}Oa!xN))H%WvFRMDL1l zWw$!rE@LKT4Z}-h%TLDH{K+_^Ao^{ljZ5Femmol}|7HbhhjkpZY6CGy=skAB;=rCA z4h~l3YMXFxz0yZ5g71r1&`tXM`6*`du21;jR?f?RC`KF;-pV8@2+<4siyB)+K%lh` zh6bzjRRmbYe=xP%l_D^osWjj{{)Nio8X-FGI8$0COFTV0L#z|3Adxty!$vK`xE`mI zx&(v$oqddqn4cmf(&djCae^yQG>n7o=1uK~7&I}hW#|-ZDg9gZj1g=@*$4R!q$(y3 zvK>NUHn8Q`$L!n~EGE>(f8<9?g0;9ts;78y3@C1F!co4a--vmf_mL;_R!_wuU!p!@D8I%MUD zaL%2%JH&O#LMtBw&_4JhX8{Ra%&j6>}4if zK9fBHj^P;VaMm|Aed1y!`n(bp@^$RT2J{AXoaJ1r;S-geIbFk*L5PzsECml3JY87$ z{@GwGecLwMg-6F&%Tcu$1#!~-kl>o`x4*>sON%aii)~bk*#|h-dUF&IbK{0Sx^aU8 zw=S(WyPgk4VsXg;R+hZ;Ao^&<)ymf3Mp%(Kd3by-U`g*;4rLZ&Y|m(j9IpKT1aca z9G!Z|I2UvQa{yHOv1f+t&RLyjZMOIWrltxeCL*h9Wp$9K*#rBDq0U54=%=nNC;IDTAwA6*Acn zEm*Q)heu%Qsv4J&a1SkJy4@XZolZ6buReD2&|=sGTr=B*I}LY#1DDvs%jY#sxNr`W zEm&O|R7@UZp+h_c_}d`cugQ}tM0t1;C0;>~`Guv5bBe$jW+_T0Tyyu0=iB{^Q-lj$ z=5#If+(dUUAG+X(N8&+<^nsa%aAGVkomN};j*2kHxdvLqxZXzFxi582Q z25=U#_noD2Q}I#Ei6VvSUMWq+Bo-4#AwzM^xqp{a7((XN;8LwJzNv4OF~05Y)Wc?;wWH zqd**}$)j`Jwj_D}o8CeiB`s9i6@~5%M@nmZ<2V%@rwmm2jHD++3x!R@|`*2m|P6fkrMyh}pd;p88SeL6eCC46ZklR}&v&j4M~baPwEZca zCr=W1t6K&*{Fy*T{RcEhzZ2N9zJwxWkCT!?d!g&1E$CwS96gkzH^I|aGhT$M zLHiLWyo-{9x5lqQMVKeZBXW?DwH!%vT-I(5k;puUYfL*ENUW=OdUGbX7n7m!WFVOY z-t`y{cVgCS@;EMI9_%pXS;pbI*@W%9n2MoIhEV;diuGPNgbS@3c)JdA$i3#IVJnQX<*^$<^X6Tic5PlZD3pzK z7DL77aK2u@#(axwQ2o(0bOfjW1tKa?M2|}v6!aT{{;AOem?d1_!Yw^WB{Ujmhhb#g zBOy7~h(eDMZi$*mu?=X(patRMx-R4-Cm6l{vDp4}FsT4qz$(Ix86~P#suouNU`wq& zF}FU_C+(A#1Bq57r0ln?*sPXV_@EXd34Wq^VtufW#I+%K&D}t}sC$G`3=emhRxVLu zd?J&QKQ&D2N<+emAQ`{P$DVRfROa0_asi`{&gBrhHboGrN;h)Esw3Ppp|52r4Z%q~ zuZ9E&5I!HPhv#-ed7V2Dlpr3b_1T@lAW8g3*M5Bs60mL4zNAF?r|;Oh%9l_}-u#VAL2cm} zGkro^cWnbsN&{Im%V)gyXdQ7V+oDn`3>{|AZ47Bm#JBYLE)4(*1q>y`$98#tIEYj^ zFV%(-$(_L7BQzm_Z5uvu@Y4Nd8=E&$SV%J=&br$M=-3g)MTvz;^{^Md^p7IuSrPI) zvHyVQ+`;0VbEc_>4|g6q+Bshl?6iv^cFoo-hAc?D+|9ULWZDVPlruq2l=5LoEgP>z z)bys#EYNjZvyF%wohu8jA$Dk$gci!FlkF1cbWwVQvH>0UB|K`Yu=_Ik8w04*d_#5l z*ja!&L|h*ARp{x#Li5CPFl}X1?_Fbw<5dwSb-R8JrDWP8_A1-s#r!sA3fhz=Nnjp|VK(s=yyCZcMm}~&+T!rHN;X0Z zhBRlTf^&ASgeOGy1epDgj;o<5AXQKvum*H+odX;2^4h8)c9u_4H`y&DaK_($JhJOv zb|k%o9!EQCa?LY2CG=`5{HBnw15(1C;iC{rfu&767x-_7C_vLv~>Zi-RbRk>%CMT;-z5Lt&LJ#|1q-+k{ zyDw%$DroEZN+k`o%8;twpwj1QrV|;^j4h#Nzi@0<-qh3aWgG{D?;4I;pOQ!nnE1ND zOxyw432^N-dYj#Kj(z>iX2hy1j;p|~5gcEj$r)xNGu5Vi^SRB@!S-|e)oiO9|z68)R5ca7+TylJVB=fDN}O8w0|!E!Yjn1Q?lg7)sjf z35l1}4cOvSvhWF5&o$NvT%Mss%1zo%5kpZ1G9*~ZlE%Y;%TGYS#VUslwNMH87l`j+ zqy+(Y8^*9P3#aq@86CVetzxZ3|0g2SA_|h|$e;E=OT?4?g*&Q385Wfp41J)6!3+-E z8npKVw`|pN3K<&VaO9T7XG|!~#!c>ck__-5&)5&%1YXE0i=0vtO6!cqa04fR5{rq+ z$5cU1^N$yl^r0?4myPY!bTJ=LHV=$3a60OG`7NKFBMZwM*`;PXdRv~q(H-@(;RH^3 zC_|3=_?_gWkKcelGxLCUDlq|E$Xh9AmQ_=Uo^VIS^Y+E!)TBgKPUHep6wdnG;;sMb$ zRA;?1=?!=#vsG*-bESi*mc?(+W8k7iAswH?9Fom_V_k*Oc3aK_{ZLpniM2KAe)L%>;L>qRC66smaq=VKbws36REBsHw?|pt;fk)A#qI;Yy8Z=aOr*O1L+SCBSUfy10ZhScz0b-FRFO5i(r?E&KZ;WUY zU@zL_g)8UcREIs*Bh_FPYEm79nmlm?RCZRIlQ~ zO}TV7=tLLcMf;LDmwAm5G!UOp>8v!a5!zUQ(JLdt=vgd6)AbC5wnL}M&IO1{7X%o+ zy{8tc7$ba;WAuA(L6&7^A3&ZgZjPGd-ePv&vM@(kEycFS$S7k+Kl?bma0#2chn35o)v;;LsVj6G25Kpo5|OPq})~22hta)Pp!m zD@E#Ii7pmt{LY9pepoJ24-+@XOVdO6YB@9%UGqaWQUw`T13|_Q9D6DSY2CqnNznku zZ4NY5YdPn9%&MjtJdV0b;RV#ik_%oKu?0`cWo7_k;=RCv@LWIeY6<6{xM_#>!o4jmBsSq}$ib)qXi!-Lj*RCgjo6T7!Y$o|4 zJa3+hIHl*!`|>gMO)fi;ew;QpKrk&&uAKDcOoz1W@b)HLn?lfMyK@`I73EnCrx~&% z^Dop}v&O^iU68O!U7w|y0Foh)?9JFnfz0uV5>RmX0xL}q+|dzqdOmmX$#Vy9^)CVr zA38`&1~lJc4XD6l2O3lsLdTCCw5=@!4W2nTxE(UtaJBE@x28KQRS>E3;?P5?lIDi> zp%oQyEfA!aG}>I2tFI$^*(+)+N|^One9dy)bb}jlkkl8};AhcPC~l}RI7K!nCct$Q zNLF6NWmwLUhbmp$_=0~Hqc)%fAGR{$5~`YoW6i$hAjx1a-B5}XI&iSgdD)YRnPF}I zit%#hkPJ8{`ztr(oZI4#4W-Wi8%*{6j+THM*fHhW=BZj<&Q8Y+@f$17IQZf|DGznp zL8-DhX6l#ZtuJT3x%Yvl2do}pYs_G0)c{|QC22VCP>>k`nphIHdmIqCEvCp^Rp=5x zpI=QOtE+^IWN3S1Ve)5faZ(ykO=Ih9B@xqgJx3dM=u5$iJZFNTdH537<3w15$ zT9DLie;NwNB_+T%Ge~ZAR>70v>GE0z>wtV_m>w|`b)m7Q-0=(`5Tu(x8F_m!+q<@J zDI^fr-I2EqJ@R(6YN0?g&SrZp+vKshuEl|BI5eoJ1Wy1-R1SkxhCPZ~u&8WcoM^R6 z&4Hy~&ARf>a;y$#iib+kTWAisVF?CtwCZTH0*pT`M&ZaQXUx!m6F6@NXV;TS7a}CC z8{4vGkTJFdzZ^K)6tJqYSqY3N1clD)fmAmS)i$&=z-(F=Jh6>*~_e$$;N)9eMQ?P#&eN#HAJK>%^jQJndy@S$(N)hUl zW0@Jc^V`^^(Z3}_Hxqt0>O35Z*B{ja-BX0M1 za8pNX1&xbUE-njW4mDU!^}ydiA&i<;I|t*i`bav-j{jLMY(YApE2b50$;spqDvwm7 z==1K4mMlo|Hb0EeM&{S1Sx3Zq9_v_TOP~?qMu}QAT3+iY+sv2M^Rnpa!v?#01bylJ z9vhh1SpJm;R+#l`$?~D;kUBr7z%2iAuvyL)3pR4-9hYwZ7`N1g;SNWN55pj!kT-Fh zjA@u=sq%r}58?+r7xK1MBS;aFx)74WOZ~#ieeB1P5r!=ccVacHIIUmtaI?;P$RYbmSDd$N0sT`A3g;$b7hiAK5t_Gu8WSQTSE2zTMo zLyIq>P;V*R*l~QLHp$uF$l%huko0;4hN-;V!pl=xBIGvuJdbQ;V2X#h`n{&EAqyqP z6A*uqdclNYSw**oONydH)V%(Zh;*7BwMnQfslZ;!+VpJED`i>0{>@3C19@_o4}kj! z_2DE$rUzsU0NAq|3iYvg1?7RA1ixnSDsCfyIq13DcgwiTIS6bB9J$d#_Vd}<7z2sg zlT!qmJ1n=Pu%xRas@laC#c}pk99OW3nGg;-Jy&F}6v#GY!y^(qanJ)Z_hhS{+cyT^ z)SV4F=M5kDQ9>r-CGKFrxb0!05S#{3x9xg^dpOfv+8QdYqy?xlj^@lruS%q0&n_=#7wCb0KWdw32(Ge; zw!MK~uth~v=m77V1+*C5B|S5T2~sr|8@{uF;may4-$r7@7t^zl6MN@~qM6e}L1S4X zuUPJtAJU`d*<$fwHckzVO$(r1Ne5GH!ECX6He43b1MFn6VX_r^dqh{cxZ7q%%l@S} z;W;pu&iyWO0b+sAvmhr<(&iE(J=B_-&%e;HMLaK}^~~o2aPhqv6^btcGl1&U|Hhhc zfhtF^UL;gR6f|EJR&7omqrN|3XK@Flnzh_wa}FyfwE{(aFdoH+d)tN5BTh?tlEZX4 zn0J;Ic92ducu1oxNXNdJ{Apb%tO@=@rWmXYEd0l$7FHamPH7Nxm-D1_@pa!S2 zf?RIeirug>z&L9r+QIIcYU?mbA*E}Of;-6?37$Dzx{z!AK*YbflIPwc63XB1wfXJd z+t98u#?l@=b+AE1ncxm*^4!4(QEMy^B~2-N=}OuNp{v3^a1hCwfCEgPt97Pk7*UzT zrou+*5=ok*7p2?BBM{0(ZF^=Y#t82Xig9 zzq~Nj;qaxSL$acpot&I)lz5pL>A zr&SkordZ5I2+*ak*!3o?K{}FID`D)7>CAPSzl!^URJt-pkpFoDXN&*OdsXy!S8(_ zZ!O^#*{PdDj1_!$4K|kltWNW^M|gU2Yiuv{cCkP}@3PvpwLYS?*?!1&lR;OxP+2yy z*_)Ek#WU{2DIIZ6kczR5>CfyiB|*ukV^)aTuQa4ie5Y2Mz(w0NX} zgKwSSsz2j`-v*1t7;)Y)+{RTT!#>XU8+TYADnVU{5*0(@QkA3GAX8R3jBb@khBL7@f54h-nbi>4^-2svjIMHn{hd*-*(>^K1hRj(S3B3?#3GFo zb2~sI+omt8HyXzf8z_@&yo;J_5%9B|$km`J*RvDL8S5&=(aBCi4ZHy*PU$5km;yu0 ziC(wC^lt;7?2W zK_90V=^!5oz{6X)l>`*gv2;nU?42Fz!+Rv+9_5OMAaedPF6HV5aVLz6Z+Ea?ElSnl zaNKWUr!?*e<*~Xr@6Zg-+_dKCFZu#vlU&{P;K&l^YxXYtS4xXT8`82D3F&PPqC$4_WP*}b)|I)q=S`SF?V;$JPVu8jXJSyXxP-XaM z5+Ky>qpy!@ouJ{NgbZ8C$K!*J#p(SOV17fDTh3}z1MZc_T?ORXR~&;LG!0JF%DMgg zYtu^(QPgQzQ5|FN{7{+`xUz@PA*;->6JPL;V^h{*^pITM>hQ$otWRP%hjO?`3&!Rf zH^`D3HyG-`4GCtsk!Wspx?LVo>F!Qv`Z0m56^>BZ!>^S#S9q9jAjZX~^B#3-L~dt_jH?TEgLS^H~OHhnkXiu0F7#JgDJF z^9IvS0%7V)S>%wy=sVcTF~7{}*ix0Vc^0AuZTDR~z?O+kNjyoh5`hYdH-Z*aZ~rbw z7}=)PdFy`7`zeX7grBU)%s%hAD#cS#5n}(aZ$n0i?y*G{)69x+dJ4RR^~jhS09M(5^A0ekZnMwoEyEB*1$uT+M5%Vl{14cf_f; zR|nslUbE!N=KvcO#d`K;=2vbsY~9$J-`m7~2OEgAIJpbA78s=pDl9c2 zn)(>4PGCQV%-KOn7A|L3q}E=pwzlxIhb48GZmfbMzLD4QGZ1wMXun6KVtQ7aS0|-) z(0i@tRgL869wZH%yL0AlcIWKfr8{56|6jX1@6^iHJoD4;;XwoH?fzuQThnjxCQhuj zlzMYBvB^t8fa})UimTP!xd%i$xS1U}8?I5(xo!=iC-$V3^1cW?Eg7msNtqaKZUu?* zkYbH>(`ZFwRx(O(;ISLA{ zCHhng$#2c|^?Zc8xi^F5#X6#n!!rmqVE;Cjt4w!uTy^V^bckR$I~!Qdk}}BSH)SFi ztpgq)LTa0c`})nP#PrYfy*ui`Z&a&zC||cb=;%RYkkH&e9&}- zEOJN>wi-5b=ryf!s{++tX-T-DYH&43%iY(9D`Zxa`1$U`6*9w)Fn&-GF)OuwC3@+C z4JGfK_i4kf0FKi#Twn0k&MqARwp6M8ToIHz;L0U3TXkJ0lr>wzS4f`F(D;ce=hYUj zGL&xD89-r}?QhI@@IgzRF9^Z`pI zct2w`36ie0R8Gvzwy0Y?GqmdpF4zmd2d5OP*+s22|1F?dEv?x?R<)WR1ncPgmMjzh@~^ z`{7qH@8=q(ZR>qo!MsoFmqcS$FGFtU-PwIvmI}iH`u)e;i|=Pwx_{kBt->L?(EaK@ z2kScb)NSrpm$|RqQ&tL3WW* zumS4+DzfVi_rZ0#ADXm(LtAQOv-@E^@0;bkN0kUHrn7$kGNeUe?%Wyg;JOW@O>*hK zeEP>ta@eEKT-ojTt448bC;*mF zb4?aA9#XPM;_o(ilnM^o9MD}Cv9CY6o6LpB6X zl^hP6I}5rCSH_k;+LSeK2lTu0qWo5E`8ixN$D}({uhaz72j?HBwTQUh`gg1*M8CwghaUBREVY67TSv$R84vcd&Z(|$*GL^*si&29c zYs0+xL92hO2L!Nc8whgac!=8k>h~MhzIXj3cDKi5_$IjLCVLqOVvOOL1|eG=Jh;}L zkNGNhIpMH09W7m(=G%=9!)R3;kSI=(AXMN=K{(mgx6guYn@i1{zUIsFp6 z)4I5)^$ff8x~DEI_)SauH>?HR7!XS^+gW=ugom9vRawbkD2^^?;&mPHzyP9M%?}f^ zPpjred*E{4N2|#&ZLSH1^mSfqMyo)Rtc5JJ_)A|NegDpvTPN?9v9ux^!6M`5m$5XL zR4Yevs@vjOL|74wZ!j#o(+0lgUx7YK1TH4G2~OlxC^-nxjY|atM3NGeQjrR)vSK2_ zF|jjL;(+xVUzP)1cU&J$);MLtNox+x!N$%>uk+y~H&cBel|^JOsRd(La#}HGGddx{ zR5vPL6b43k?4{(;%*h1vZQM{zkIfF-SQzHqL-%jW*I3KRUWdw0=;tO~x)ZhuN%kr<605L!cW~NhyTwm3?{q^PfH6;Aa z2UbmOk1{M+RgZZa3%S|@ASwDbWxiD4OgrK1-{1^j0}g1zwY}@hwytIu-EjE~9Odoi zV0r##XV^g}LqjYYey%sxn!E-FN?S*`q(8*Z+5m;1Ls%kSp8s_$=sO6WeGWqM$AZfo)ddl~>6YljLSidk6Dt*}yR4ID z!_H=#T2K1<_ga$C6O{{iLA8W&x~=_ge#L|mF<;v;k1oO5$SrmOc5)CxH4cD@62uy% zh!w&{()5=nGIhK?&NAma!stOgIwsVQuxqyVvy0j5{xQw^nCw9(*y&Hg&HG~U+tDU( zG|dH`s{4x+L^ullu;#!Qv$eJUZEOQxZ|9@sd8spCnn^V_Uc%#ksPv)m zI2i1LRVH$)V=LpO>|`?{!3ys?!kgXxNFzqDAdFDqj!c+n`HHkHj2{R+srb?TM?uul zM)jCNMMZPkPKLa7Up7)lnq9B6XjqN!UP=)t&N@HtNy% zfjm0BD5xYrU}0l&gI`H}z@aLH1}sfzZCKoR(rL6c?jlhEzCxH%jH-{H_a@uGjFTQ} zHCNM;wa@Hn3phq6JL~%w4y7z9zyJdly&R5(v>5D-ltkPkwlKrSS>W@>DHfeRg{Ym$ zmNHU%iikWtW&i|`4nf~S;yO;v#MQp-zOEB;IFyn7t2)7{X}F_8$UEY4SG@da)=Txd zXDq~GmzKIe)vL(a&fXv&?G0kQY@sC{=KVNrMq6bDMp+5j%FL2y+RIFkbI9B9T#GAj z%BAX3JEf(RebuEtDlMgatu7^gd1*<*ZxrR$1T!6;)hH295xlB372s9Pr~ogcU$xrz z6gm*j4TrObE<ydINK}&bZOoogT$Vw7c^7qbsdPe|2~Ivc8V59p2sg z4iCA4eb|BsKZ{4>6P(bsSH&>9T?{Lz(1j(7-SNFa_J zS$UoipY=E}iyHO2xVcf+$_=U)kF0z;03@n%z|S68`I!Jvxe~3u8;oB(vhtMxP}x%k zSUa*(C*Z4|##X1xOeI;&H|S0uS@~K3MRX-luOC@iCe)`rF8FHhrZUUgUpTVzRscq1 zWnga~S-C*4FL-QaSBM!3FCJOB8bA~24CsIL$jbK#9Y`iwlQ3v+99h{200nJ)F_!^s zA6Xd?@H3v;K!n3~-@pxztlSFVh_DoH=g7*R3E&b*dwjoqWaS3|9PtI~JRa_cM^^qk z;a>6dSqXZeUq7<)n*k7!6@mWZk(IwfAk#AlWc_^8#=m-G<>*llLE00DV@Fq>CWNsB z#8Etr#bA5p=*pJ@SYoS${mRjmMZ&(MtrWcW>=uKrestx003zrTknbE_SxIUv9;9T@ zy?=D&mjYPUSPA>DA6;n?_Gbbal%2I?P;VSv=?36Lty@FcIk8gK+#X53j{)x;U6~O4 z^NQV^8s(=>j7%EPTSr%ZkD!6Fmcsr1(UreTIMYoaMTER?H-Q&`LHGwpSN<^ppVGQ< zTZVb@PmivA@iDwGX51fTW!}H`*vd7&H=Vqs202H-K!5+SmA^n}GX|lW@a=Crw(tdA+5A3key?Mk#o@BdKwcl)hXds4;{mghTlN{^cLM}duwXnmE|_KZ zQ->Vn)HsVD%b)W5c;VcnOZnhuFE;Uh)1t(YzIB|RjbpUWcXK4ekFVl8t2lqvf{b$9 z1~BaLAr_GBQ><)rOzL*l>VqAA6H>d5{!trwC|wK9BS@5Fb8(rab=2AHHF-CWh3vZ; z{IkIan+;rpfHRYk>aA$%#EwgTl%te9R~e5VmnCj2o-Vj=8`!$gK%xV7mYk_$3G(=H z87H#~7tUWguOXtLU0}L^JdsXoNk6jlw`C%OWwz`Ry`Y@ya7bi8jyZ0;1R@40>UA#P z=jYD(0Mk{h+VzJm03&zgR=b1baxUbV&WPk-n!X`Yzwn9Y z+uWFd%@}++VqUsphA{91$`F-?G&QN$UfK)=3buPV3fzsqXq!yG!ga*A5w^^4H#wie zk}p!$&1Mgf=1yYAA|!q;X6LUou!|E*UoC#c4z>|8^L_M}mAjx4IJJ%i%%wGCgnV!g z*{VB;G57p?ax<~jh{nyobN2mOn6^f+z^>8o5v=yk8w+P^xa>E`a3d(^6?PU(xE4r2 zhs)=E#aG*TFA*OahZgGI7h$-pdspjGm#mNm6+RoV9mq;Pb*)h10+u{SNBckFcY06|z~KPw*oU zHJ?55wP_L zTVH@DAL49!?2+n9=-=zsyV|YmwqNU-K5lzQ&&0MY9RIz6)UlrIJu*1rKC4Qo(CG0# zo!~>=<%KJ8gB$=AFH8^h73&ZzVKMabyalV#hc($#gn=OAkFRm1Y^E6dY&fRD*I{Bf)$u@Y-7HI(ZqOf7|3ml1xi7^ z9XDgfy|vCbN;+weuW(6j%u`QDqQ#si`4kx@4DhZ#XBC^>b?+a2uRrOwuw?_jplrqF zM3KHr6FXKBwCrriFU)I3xX=XI>X3Qp{Nd7&$i1}e%zFzc1 zVA|I>vqZ0F0WC+&ZbS!A)!ld>#?ye$N@oKfzBH(@DxjLqEoae+8?Js2Voir9$N1+; zlH;@?Epq%xWb{DE4Yfz7nJx{5(>8IkRJABP$Wy1juBx}uOGMsu)a+~Q#^BWY=e6-* zFRp)Fz9YY+j=SHCDo23z@~zhz|BBH&ci>oMQ0;s6r4*BrR>;RTYh< zNks;l*WhNrL-np>;*pMK)W6}T{Y7-9DYi=xEqp8|lAsQGR#^q}q4tB_919puV%`l8 z4R-W6;)&TE`A~fA+U97c963)zo_RKZay}Cc#$1y#!liHGi|&atO$ihRF;g^QquXze zaiBup8}U#LD2-K?+9o#C1wAvQTQ)jpH|dM#r|=_RpJ3;6b}MJrJ0}T~5qK<7JZN?a zFS+Y><@8 z0>u_$Aml)5A4&2mLwC)dqY9x#X06q6DmEs9r9SB#_#0c5Gniw6R3Zjr* zYC9HGP2TFidaTi1r>mu+4DYuBvdsx@1BYtogSt0BF}ic2njbVNCMcziDG$N_2->sK;N zVP+wb<#o=cTwZ|gHXHfE(e%(v8STfccRE>i0{EDRIO$E5stdutA7|ek<-za5S3muo z6=$6FPJ@&IHSL|&u#bb5=)6iC4!QteA60+snITC{t2loq{}7w9?O#BRWkkv6fp`9hz+V$6g~6 zTwHq8_8KTzF7dVr);e8Urzoz%%-NKO77W_3(_BMto4EK~4r+A}P8xS{{2>5~Q-Rns zM2pcKN8`K+9~?vNMrVlGW77SFq ztbJO8Vel0&Em)O8-&mB7uj7Ie0Q-3Z5wtotIobqB47Zd^oO&RU?Qm_HQ?hUd;%e0$AhqU=3&zYaQ}IR=^oXD zbYL#qy=s?*>}8ho5FEzj4FLZCG=jk8{Ts?R9O=_k#6t zYH<(VR}D_4IX@GJcSzJ{A$#Ab6;5%rIY7y2X+;XdJ^jWc7W2{|L)lg*hi9V45u%SQ zxE&Yi3~a^KHk8^$K=HkqwI(o7jEK|kW*5{*steLF?p4R1RuPZx3ey0o|v1Wuwjmo7@WbFT>TVC*_R{x zn%-y`33IG;?Y?ot*1{`J>bn!quULy(UDk5m$n?sinUub*4p>UGSWHJ+^YHpfCh}}j{ zs9|Qej#V9TZPR~B3|rEd=pI!;>B2_I+aQo!QQprB1W5@F8;7kxU_9qa5@tllODZcu zQ=C;hvV-O!N?ZjMG;s!$ZRQLR+c&E!Dq7*?`3wEcrIjn^%f@G8^zz|y^%!2X*;SQ0 zlM`;2sR9mmllC^ z=m0Kxnv}ER0I>ag^nL2(6*@x8vIJ&id_eEa8V$Jlf-^^Z?qj0 zN*px5ds=nO^|ey8b{k=^JZZGL$VI*=A*ULWUy@B=px@{{X|Io=72s`naueWV!(;Nzbz1!*uypfB1n0okxs;EJ|+W8ove= zVa_Oz$Uz2Mc_1ni7@9+5xzBAQyKn;;lQ?K|&g6GvVmzL}0Ypx_Uqv1dcf7YmI&`-H zj?WwH5K>0$y4fi0Jlcvukmb!^73;k^5HPfS;O#odm2Cv3zQa~-iLjr60rd470lkez zUhI!0!QniE=m|S;Cr4@XLGCpt4OdaPJ)&+mO1ND8+Pv&YDH{bXhKkSOe7$~+i8R-s z`lD;;2u}YCL{y-N9+wO&LBApBpBg=YSqe_KR*kenblE|Bg&rf^5;c)x=1_2)_}*$D z*WBo^#pv~q#rCIzNd?dXC||S_r$p6C)xzo@Y^l{J?yrdSDds?;6$vT(ZENwoil7!E z34Wq^Vtuf2$h9GOy@5@Dya+|^-jx&UF|(6}1AOv)dHG-{*p-HaEdmp=jWbwEhoG4y z;OBYtcGH6Y3EDd4#S5*Z^r~==p>9ZN0wYkm6Z5AT)b$^&yeS8bA?; z(}b`kJR#QTQTW(4(3QC_Y+DsRnFW)S!0V-BNl26yhlg6iqU$B&&02U zQc9NDLmER`+fshUT6~g?cdLVNr*m&@EShZyrjv+%$m)oV!8v%b6tdybTQ@Aqnm9QR zx7Q7$j_+Y`omjZd0?Q-5^p7HNUJ*AxvHz&~0fXjqrm2UInIAf2K3@?rw<~IP-ep$Q z79`^9CT=cL=mcoWnZ*T^^093#8!u?pn%!GXq^||KZfmwvDx-5{5n2TNtdh`fId!r< z)m%|DLfL?h`x0ZfRoET8{Ed;7q-mbi7tspjz9=^}qscR=rgxOQ3r#ot7!Nm1*C?&7{bEi&o@d)0s zYlJCHlE6F^OZL#(;+Tshn`Bi{kkFRqKUHwf?w)ak>MjwJ*x(2XO#!Kb@_;qWb-`j8 zwq)kDRYUA77bQLE)e@V09>7lv?u=mzO2~3eU?r}VCQXSaM^|`LAx(!Pi2cM9gy;CxStsf!=(=f-;(WuBR$gAH4*(uIY6ByIE#8@rh@~@cV-@nqmy0f zzzf;ZH=_;Pe*ORz2zz3rdT&8_W$(6kX1oH%x_iD-WkVe^q=ufer|iMu1CfY?wj+iUDxLyBS{A1k+d?1iq%na%Lj zp7L`HZ1$IK{g$nSW>+>;(X)?>a(bpltG|wgRfZk0^g5Rk%I#QKES(Hx(G+j(4(V|7 zhcPECOE$rt03*{`BhffDBJqqEN{dd(S~_5zjHO24iY*T}_B#xrC<7UyZs?~a!$Cic z+x!H?ZLCym#D+@1zd(F0WB?&D#Zw|Q4+Az5@R3zR8%nV;52xV=7(l$it>V6|k4K&2>1&6N;HoW(zR) z=*dNBL9V+W<_U}g&8v!>QW9L32n!sHTg_ zsNw^RF~mCRdigD%8Ybaj`T$b19p^32-{_9|*>D19K9nI{3;dS5IL(elK01?K@MFB4 zBNW@CBlLnNL9&Bg0+3(yBM~$%h0WlWy08vq4{)of)SqEukr2RqBA0q*i-%Iuk)VY8 z7!FFFI$j3l++x1K>n{iQaK+VdT^Uwf*Y=(~0Ry&jI`(kI)#_~e=~u`euDF5&ZjMuu zt(LMb_#O0EuZN<8q1mgB@E>~ULOe@m>wfTJHmi4&LK77ZUgi6nO>|5XbGg~sroK8e z~(?% z^|Mkp6WpE<-});MVh=cB2AvgB6YkmqD_FkXp8&Js~T{Xr#1Von_>;aU+0ku(-u9DBtwL;7{fP4hT)^x z0t_L&^unisvTCmkUmmt;Dzy+3L>B(sTV7E@vNx@qB9+=!JHa*O(%GOBU4$3yOXghW zHAc`td_IS?(zr%wV*y65j0B@+u?S7qGZ5MiohCaMASzuDVD$E$TBu@-@Ij8z@4W?S zdTNmJ?9#LjAXbOPc{adODP#xj($HL;1%|j5u$Q}nVKtF1IPgkUa5##U$BHon(5T4_ zh*G7ooxqg~n_*PRYLRP5)b1*p2^1UmGJzJDTV!Zdt>oGS9nHNAnHvoOWwrX@pzN)~ zSvfQ~Zn?&jkN2dU9A(O)aphI*gKaQJt|64g%!p8#j}Wkit=mfz9S69ISC-THlcawn z_I~rQO6yoxslo|YDH{G&>RRB8VylYRvFa&~oO@#W-WliQgHs6+bM~6lB=hqu$FJ=3SK-Rbi})Umv=;D(n~;gd9I`jH(o_ z=_%$kyS;_$;rEoQ2i?a(d5+Rbk;dp^k;d-I81v~P62iZDfs1hP%5D)ut`kFuEh4N1`?R#M!s#2%93r^CJPi- zr;KnOBGM=}hPcOCToCIMIXu3xvS-Y00Ay+<_W5^_(S&{74q;{2 z)E3NRSk9L-uAXJ9*H=EV>t+Z@ZFg?V!2&g$4XPtw9Dp+GPu%MU39HogS(?uvc@D`& zm5mfAyyny43#>HVE=Pwq6%rhA@X2!rZ}pEz9B}y1L0U4P`3^9k0*@VNP+15aKX%Zz zwh%OU=HN{6z^4<3(-BjA@8&-~+iL^(QnqEm z+}B$2idv1wW<42SvmAFp;m#-|Gln(zC;%0YJCK4qU|CFn>n0GcYnpKxmUHBxO4l~N z;Ge~)RF>ew-cQ^_QL}Iqf^RuUGT2MEKjC;AoJw_GPTzoZYV%i&Cp3rb$2r-Mx*=ym z7dJsFb^hOA2Icqn1l+(DGuJjx)$($7I%bI9UvkF57dMu9sM8Kgb;dDMza(#cIrGiE z4|+qu>Jc^y4R%%y@by@dhVu>unGv9gC1JbJ0g>Bcip*72(z$vqcRE3!qN~b={Zk%v zwzvUooum^KrecJXK2rK-prR5y0VGj53|3+HC~m=` zvVj5R=u>L4Ed4q>DgP|T>Tn8q*G&UWY7Xg(!Dx?G9c|Q+;-AGR9699-E*fwG2WsJ_ z2{P$Igv6N|ThOB38ca_zGIRqur#zn@H5!E`a3(%Tw>wBOS;CZaK zaabU)9w2#snB;52yTI04)Y!REVuo2}HE5yK$_)}URc^RY~-m?#QWG}O*Eu+;%gH~Vx7)KwK5L4?J3!XR&KS?_wgiv!wvxsyw=R6xkdNQx0P zrkq&a3K4V9do1Fh5DXpK89Y#Fx@H)2ekueBZ4?`0JA&eJvR(?y;9W$wEn}6({w9tS z4kN9?DfespR)oSXxA1h2O&a@SEG@cv$+2RsLNMn;@8)6g~IG_}(saE*QY6QhBA~^7eR7A2$>YnA& z7lZ`5Vp`z>olG8~@<>sNbAY|kk_9Q==7$m5$kf~H`G`2*=XG4PCD4d)i%jf|S|Axg zctxxnLa?k}o<&c;IoQu7=u2ZF*vQVt@~<=)#Vl@HqmTH8)cH9UB6^pDO_R1*u!To& z&~@7oxkV}r5jj$P=n6rYyovLOOvBWi^MT(9P~2OQx5WzI=7<76|p zcHp=(XM}X*E`dB~i2_JC8)s~f*AC;Cc= zpAi2E{C?F{)h|y!V|&+|i_ndfcxSr0y1Kf$y1Kf$TCR-6Wd42!JbEhID3U0&erFt; z-8FZLLPQ(WBr|CySMY>=!SUH{ivBV98j(TO@MRQ+=Sz3aoo|#Tc~1ZldEu3`@IXsQ zYgOFf@>(gkG3S~8na(_BgpPNPy(3GNtQExHrd}|?5DIgwm7y=nuS|l%ZQ<0hke|g$ z1NN|UlIC- zahH1n=nxoI*AL){p5k)q2~xCrO4HRgd!<5ur}e-? z)DzgeC67ETM#TqyR0b9PBTw9z_r3-k#z=409&G5V8XNhm8etr()!RQhKRfkuyH3#1 zk=jHfJFrjPWa5V=Rx51y?5DnVw~JSW%C(dhrfKbaUBOzZ^B_^MR(2`9YQUFKrv@8Y zX}@G-Sbl{#2rdDXZ9Aj!ALpt|YoSw18bFtF)P$r_lt{ycQ(kgd?BfUunM3rk`_D=z zD#2Yk(fXUn1$)$1g${Ua8qhFajwPh3P<$(i;_G*4zMVpe-_&$5o>;xmcTN=5T*x?^ zk2T`NL;g)#)J#s7CpB_0)OngfdrgPw)?ilcsTG$YdWMrMS4`Gm)JHUx+qb9Y^z8pd zy7)w0y7}Ga0)_=P&k~Y}!|KM7F(Jwf`ILNqQpJ|>yp1+8pNHn{a$ObL1&JC!bHV;b z%7zwIPH@QA&_dZC&lw=$C)(|gIjvs&39 zT}Z27=>MDxJdT87np_Cd8(Gn0M!X4AD8f0GK3w3{J0;w!rOC&0A+Lg{oL9?oQFj_7 zih~>QY9$9#NvQ(OXI9D}M|Zgw9vnPnR1mQ$A&|1_?~bRs0M-2=Y~~_&o1Pq|w;H=L z#8XoI6a0qan-TbYX!39#dc^R;U&tfl354<+*T{o}2ObbQAp3Z0hJ(6;;Drj6@i7O_ z0X6I2-Mfd^)e>KfvyE=N=oWz)a1ySq2d}i{KxDfrCY2^tqgX(1cyKDt6mN@I)#&hnb=4{%g5d2#_QVe!jm9NBUX~wd zum|x&W*RJcX#buiPi7HD4`ofhG&Nn$Ta2+s1IbAWs6ss_nXMAWvTrbSZ16tbE|Uap z)5*QbbnR9Y8G^T1zyN>^IgSPLIVZC%TGrEFa5|3ou#7Oa#*eB69#HHbO($m}k4tw% z$EQD$S?TxLg(t93N6(V*pzZ1=K%0%GZ?tFK0Bt5!XPV(F*|6<>ZZ{E!(vM*iZD;Jt z2(U+0?F>I1R1vw#Fe_vFgSTHF6esOU6YX7z!N|q8f-55?6PJieB_;#q6cVAU+}jb= z<*}4)Hpu~RKGWE8t^jI@vNH-;g`XDwr8}kyF9*+cROEPFI#h@~o2XG%XvfPnb!F0A zqOL?+rgX1LnF@Hd!IBZ-nO|dfCd;|nD=UTIE|OdeNj+n5du4ZQn_@?dNC`Rf$F_4APJzbHk54 zbc>9*sPKYbWdr6czc)EvLH@D>L}gFqJ_S5hIHKLgZYVsA&ASbeE2BOtEcfxm9%BNH zt&YtBX@%RXjZz1WU9FSBgf_5)LyoY!hiQJWlilOP)4TAX-9PN>W5LM8eTw%Q@JJ92 zKc|QHC-D*Yca#b7M8QuHMtsN{j|ElFbGaPzad{D2?*=wL+#|Yo7x4nvsxde8J-pG2 zXr%|dI^j?F?%@^7*&#P<=ymJxf^WL>t_dD(#PIL6uV$PR55BzA^tEY0;c4J}61}SV8Ifm-B4=-&u?Ks;- zv6f~g0xb6vqwUG$i2o1?A8lBIm#A;x8!_XyR-x)TiM6@ka7}iWhuTZ}{?TlAd^B0= z<0N4@UtZ6$=w_&b7@$3l?!a7Y9{*n2a00ZiMQ9gGj^_Avp^xZ2&p z)&gK)fy2Y0c+vc|HEk)XXI2&A zRVNtKJYQTBF{zurtiexP*yqDnrEASZG7%>tPf5xbj$ymqD59*IgJZA-S7n{dtIcV# zpbY~Q^hn*ALK^%27uo2M>)$^AHsV*Hzu~;%zZl8V8bpXGh>gN(sM}8 zf_miIXFx{s5^Y9M>_?b%W@_R0NI5u}&gFdml^DPr*FI%gMA>FU37auF5Vw9S?&#I5 zC~HNN0$Id@3DMDC8@Gxh7!xZTrPj)91y0|A$!C;TPeCMOI$q+((~bDzV7Cueah$EY@OU z*pfF*TFv(GDjB=q+364H38t%qAwl#=J0vrUBNT6ZIz|3dyBe#GSjS=%*^qP+0%HS9 z!M@o$`9sy5>{VI}ZA!~UB$ThQkmrZY?_Ss`hP&05LWIzzaE8@J&2QhiNvaI&s#v2Z}I&g4;=gz0e%iZ|dfSiET z`hv=EQeB9sh`G>GB61}nTAfG2?Mg+Q1X&%)W;4d-%V0Oy^tDo_pJAci{_w0Y6taCx zWxIlnidR+%Nfx9?r5U0Ai??qKh32c7eO4TMuOTBrQs)V(Iu~3*tjVV|V@)_N zFe~#B5^FZfg)OOOR#KkB_{CKLbYo|)a-@dY3bzrnj`t5q4EyM~$fkFS<5oZ5B%1qs(<#%enj1sB4s;8c z2Fp-c0{1|hS3aKXz-_P_w(zXXwC8FsdVTFyb;O*@i9ajLI>D8@y<*P~KJYPg5{d<= z!r{7}s{xvtu9SIuU_*VM?xaP{W*aD|!YYfRh+@DUxO2g@rbj{YhgKstNYS8DiTg~7 zx54SUkgvk50zr}W8g$k#`WuE^)0j05gbY$@U0U>A3Z~QV7h2* z&fre%abHr%58wlwco66ZS$D)f-~n{*|0BC)Ti+%kZea{hd(pF!Hc|C4A-q$2AqB1O zuo+Be>9h$J*M@{4rH`V8!${^|UCWZ{6ulf_k_y18Vpu7C7j4=J?o<|?O}!{M*iu;@ zS_kvlK}6lWzg!dDk~g_<8NM$bd-e$uS;zTI;{{J|moGo^=H3-E*`@;NwFW z*a+f7oe`WV{F+=Dd%6Gnl4!>lN*_m#860FBC@~mXDM zLbpwBfDRf=a=W0{usiw_!O_^(*F4r(sh~f#RiFw7YJXMOV zuuXaw@EB-1Iz;MbNkxQ9ReDS$f)3i>wtGEHIs~l z#wU9&xy&TT8qrgVz1rT%Ig&MD1J>y(mE$u6)yV$)bkgkz?Qco?khuUjuSOs-SA@ES zM^ZLU_D-hr+L?{-Aq^{T{mny!WC$l4$98FcO#(scZSn|nLkOGAK{%Ztcx!u&5hBS3 zD0S!E7H;<0g_xs4Umuq}p@$O`ERB~zeoK!Ud16VH2M;DUoOo+_V_BbAj(#|GXc~C% zgqw@@_f8Qzi}AH1PzFXt5@6oCEK`eR2fSp-h;L=mFFQUs2f@q;gFl{zcX9H`A~$&& zjkGtK#BLBD<0)_U860_&#D~Yp5n+3>72(Xy?1LUi=RxP@A?^u{ag3G``Oc0=Fm~pF zQ3!LnO?HdKxGy+F*dq#)*1+z1JB=o%r*td_dC7(X#4Rdq}nX)EwODJ?BiY3OP zg<*?4TI_@+z4LQh+cdFT;$Qiz2m)tLStPE9s|0+34F#*mR1J zcZhAkJwaxtTngv&vbG$ePyO*(LciA+;Wx37FJV#Ztl~4!D)9%nad8osZ3Vp|B$vb< zzZK9j?SJ2jY3t@amJi*__GsgSlsl#hO zlX;a_?}XE{gYodzl3x39()Y3S09hEk%U7e&Z)_e<#(%thc>e$h zpa^&1oJOqKaIpU2#s`0R=XHe2%%V;Ufpa@XO(yxl?0UPe%crD(q( zgb8avVxO=rVBSR9N93z#uJ}y29u6pSgH^E$>edl4l%D}*3$^&?3bjP%qFSQHu24H; zEwE(YA4Lh2QBT+ttkT-K+UJEafkM7`h?we~_3-tM&gW;sp>iAhdEvw$8`R1m`$Wnq zPQI-V(=P?WJN>UBw`_9JOqFC-MTFbf?+vPM&LCy-IHZHZ6K<(^VT$3~aGj7hWxgcp zet&$H!i~?m;CK}#gB9a$h&ynhAz;>GV0SVut6kNW4%;qhh`}qcXJ3IqI}(d_)E`3i ze(l|*ct&t}#oEG+b+LlkHu}XnpHAvhWMu;kYKzrnIX?;l4-^pn8h=u#ed@I?D*>px ziaJtsx5255YgzYGeF}k+t)4xkmI$YTwV3$ItFsRuzPkPTquMBS#6%b}{(Th(ghjKJ zyN{ZdI1U1<%FsuaV(oBwV=+H1ayjO(dwGO@m(uCUXm+~EeH<=rIGU@i&Zh@^c-Bk(4?rp>+dSt>R>|T(i(9O)OT+#< ztKS|B*bq2=<>JpBj=V%^#sFgtO1lGGG%9gpP;)Zmn5c<0+=$+A>V>{qfP- z;NITx9wr$&VrckxYh!bK3~UfuJPZU60KN{7Pzf@GbL+LitD}{jq7J&Y737hd9Xs~P zyYIM1jEENY5494L#Ggo@+}g^o-C|HZr0Hn9y|$9%4`^G?vxAupIVaRG>oh4}TRdKz zZw!S&4X(b(1~4)pOjc1WnAtaB&D!GTqLRC|h}3q@NHC;yTX-26ffg7RFide`n^Pw? z16syKs{XCfH|wB-SKj+@<(0LEw^lJoF@1#WUEQ-8HMzJ%mI__*vS_JP+~x4Lf4p~h zmr_sq`FXhrGs@~Eyr5V@Ih}=hH)zzqi5=m&{&XAKMy?Pi*vUb6^3}J{0dX)w%)J-B zMIuYnKH{vI_Zh|r8qra7XSiZI{Kn1x*W=Gr>nCInuIXjlY}43ZZN64eOpS zQV~8f%)_CB-|TO09-iS|@z(BSwl|cER5~y>MeegV1e;RLoG(@=rvCO{Q>~ zDHdFTm?f@Ib2XaPA+l=D!_Tdw+DsXatN5^yUSX0aWY01SejZ(C)aDu2>(j4*fwla@ z_h7j|Ztx{Mzp=-k<7~xygr~^DObFXQXWgCSM#;AhK=3117mTgCH?h57XIu5ieP2<+ zy7IKHuEa(~8{N*UkhJ2GabxDcGTEswzt#c!iyP1(NnOP+VK6zl$+yBS;iy_338M+U zO{=SUT{?O5DUwxS5#ka>(?(A}a@hbgl1dDR-qIVUw6RUVkaWi_ZBso8ok?|5Sc_~QFMZNUlHBy%QH^Z)H7`!YUgM2P_ct_!bd4<6cpL1l~KMR)eJdpE?K^|NTqNaCc?T?GM zF2R8rSbD`%EZa?{%aH9MHqS|35kEfTuXcnV!GkL?0>Y*+O%kfD?7N*UFK_0o!;# z1An;C{29T2F<=i@s&Ioo&3>qu|9qkOSAr(OT7~f4+Hx1*+neD1;Sj`PZIr{*vWC9V&(>JBi*^fWLaa`Q;Y?@KXW6 z9fex_(hJR7ELLGm_ecuy-4~jBgm^&^;O`bv;>;fZ&X?uqQ!aN}^znA@x#zMj$Pe>0 zy8t9yET^)RcdJS%zE~OrtW$YQY1g!t!piz8zb8FYtxL%YOM(C-Jxc&YUr707)wTd% zLh}k-vKmLNAtkCUx->vpJFe7HqB^0N@KTg8$P5JeJ?VcrKcqY%s5a?Sm@Y#|U~1AY z1y!+@lJo)$}3?|Cdf&Hoq{@l-4L1-eX7Oz`{}1IAYk}t^7!QO>FMU^{{R<+nn(Zu delta 13944 zcmcgT3v?7!mb^;m3n7I3|CJDuP6(awmH$r!5i5WGkaH%*NOPR!Kvng- z-*@kQ_uY4^_|<{b4<9!rZZqwFF7esKWFgTl%YB|urqGhgAMwGVMfl#K*(%`R&`pV% z49DV?HwFVL(n6smG%s_akj_BCz)*I__hrc{-TAC{Ro?hq?w{4c7xJo+`uLap%Yx9; zgfA5>sY$duyD0DUZlAqNuD3fqUaP|q422y&RaIy;~W;RBw>{;Jr7Aw%e|W6e7sn2rCrY^vWp2!q`)Wv(7P85GNBOYRCPdqEW?h|S{YO7^%9 zeg{llcAGbdgFAw)!9bGN?sdqX;Fh3S3E=hOob)3Mr(NDiaq#xaywYds$goA+dRDL9 z>x@>AFQOFVe+Ni?%X#cb5N_E&h-cGw$?u8IDgbB{7 zoHThb8n?VohLE$#SJQwn7Ft^?3ujPLy|sV>H}d@vzZPIuehb zcv$>D8t!0ifzEITYYVyI4#lIcYPf_kHAcfd5)Yff4M*Z(psK za8)1~%5$$<#*d5}dUKRP<5=dAgWoRv(Ksnd0?A4fo<9D*>?KqQc9PH}L8*Rr{DzK9 z9{e-7l5^lTXgz!VCqKOshbK%zPW;;m_xinI`O0c|R66Np4ZT?5vN&I_MT~58tz<-l zmb2j2HnQ+5-+fk%B(xGx2~MrwW8y(4@Ultb?QEYKxyT8JeAy#fon0a;NVRQhHhvk-@b%|QnzokiF+nJ9GuU`W^y$T#!Bs@q=Z@g3u6&8 zo9ONGtl-xr<{Qn+Y0X;C#c&?g1Nhqey>WWQ+#J+MSI-Y@G!~~%%`h72EhCp}F&W%Q z{}~U9sPGlShJG_19(pzY4nMd(xUV8BKo>JQb1dWY`%=#%qDJV3)xhhg73T(k>*6F< zVl76jF|=4vZ1{<3^Rnm;Pq%WuOMn=~iNBgwJevN7?j}RtqclbRa%#Wu)ah+`>wrTb zsclp5T9+fz_<0dOF})vk;juF+;MzPR2d?X8G*p%+f(UxfQYzpn+*_ij#zv(Ih8mS> z{KAZh{u=gN%dTVK+OO2X6)a|9H^|JiEZq`Ry5P2Wh)?U)(#|9w3M51O({0yUr+^03 zv_A$nK5f<+gV~z{rar6P4PD+|SC`KrPZ!;O+8YlBhVg;1yw}~+)aZqdZxTIzIOJd; zm$mFfv&~`kctpFC_bh9)p16f~^f;B$26_hy*V(=18qv)7akvPr%pO-4P-W;w(=C7* z)JX9+Gm9&9&TrowL>e+PTjs*p% z4Ii6T=+})$gqG+=EmR8aojK%dcs=M30G5am)+sBf(8^EQ-xw9Q%Xe+E=Q?& z>%wGE=jGY?qjWeCb&7POmTr7zVQwQcKsl8yZ|v*rS{GAlZWL`8KWYxOWY2h%QyRl- zss{*KfpYNi#>C;8)9CbTy79JKbM#Y-sIA(Z5*AF=6OE#J+nt@gF6jHm)I6VSPRduH ztQ3tLH_R&=T$&m_f}3xn2Hi6+XK??jtXcRn|GN696XBhNCWp?glBx+1d$0X& z*&S2Q0;7e)B*4v27ZhI_%v*gu(0z+N=c~NM@uSpYVc+MLslIX-Q#+<^rAew0o0g&i zd}(oVDhr%?m>JGIkt4<=tW@bza(uGrZrPwz(^K@=y^ z-RW8HgBMR-F(;iv`ILEh^0S2TquA6Q2%+qn#-m!9jf&7*UHWM^oCC@ z%wNQl8zqk?xkd29rpDr}#eDM{Pa)M$K;ihyq&fis|8~Y)2K)D54aoR3X=w?HrNm=+m7p+fjD$ zWV;A{lv?#LPE%D)%;~AADy$I2o*TuZmhz4_XYK4jh3WeBFqRx%g090w$2w5Sx+p@A z!?V6G_D%xt|GjowWZ%@U2aAC=YF>4C+}^xVF}Ce;T{^>`oXy1-7pF|(E6dl{W%bIP z8+#owjjG>>aNX@CRSgiNTY`aPUN6#Dtl`4c)NA$juovwO*mZk>pH}1jtPt&Ib!a~; zL;HPU0s+1fpk*xQX;weH;9ndlEp#;`aWTOM45cQ2)w_hEB(kEEV(80Cs47j+^|j%a z#_V);k@Lu)wc}`2#wsp@)uog}bahD1wV|vQb}(OUK>UuvkgI1k5UCl6>|BoW{fupw z0VB%ebc5B>E~HIW}` zBU-YPwP`|Cq)zi*0|#CGBl2nPFkomq2-G%39OFR)hGqz;VM;5QxgQ=JLk&0<-UH%}&-dhmt|noEYde`_Q6-yxWEnkqy5Ol)74>fY14m zfl`ZgCS^lt20h`uD8UVH2_u^k zjN|;JWvC%EW$7*iU*i07SsmJmKU;RsWV)>>4<-#6a(_^H7;gNHUVsfmZDHDv`-8CM z;U6vk@ksR>LJQlHgXZNa$3oT>OA#4ZjmCt&U72MXX7k+Dxz6s8X$Jx4be<2Tt$8~w zRaF0^k!Mb!Ts-sWMC`gVnPj-obNItMeI^PHbvPy`2x)1gWgDs^NBwA6YK3|@8;9TT zE5my{$$6XU35b7FHm+itSkdj1J)UtD_}TrVb0eVfVbFLAsv`9pP%$3y(6GD+PGcCS zv0@9(+?pSjHeQvMdJSpSv87dO($cRbjUp9=MK-D;Q?4PhDz?b$nqXDv-#ss(6wMW( zJ-$WBe)_Au$K~tp5qZPQEqi@#C%o+tJzlrZ20vsGKKOJ(VP|#Ful=+t30djM1J67RA)z&Ula+h&7afwddt@q@C6q34W3>m@Zmu;)NnI z!asbnWZ-;1nt(#xJ0=OCx1S6p;D??XNp?SphU4Z#xlwC~oIZjk<2}0!E9;p<6Y)of zEKH$uN1-J$;^9QVO2X2if@u1=`%xYlfzkBPdyl0Gp*4FFQ6fucg5p_BV&qHHx%ritcg%i+1lbMWtiH{;U%^YO`j z&*L!%HiwQM=t)R-tyRDbfbH@1n#rug&=gqt$cNGDS|3Ln@k|nI0`-<46kH{#4QTX4rJSuo`^s(QI=1Ni+itn<)(B{TRK2^6A&Z zc33FT5wtp>Q$yo$oY-9-I`zcSjPTmSj?isL#FtM@!52cGA(4Fi5^BKRJ0{{Q&lQH& zoY*LYQOOH0qxpcl_rEHLcnY0`$GOLg$k`AYN=}`Hz$-Y7P6CH>r_l!tRz(iIfl5fj zX$Xpj7w=I?pZPgD#!2ztcT`Yl&cHLTpdd1J*WX@4T{f`lU(qrY`pv1e`NN~PyU^^n zR+r0^a=TUiQs2&iw2nvhf{gvn>6*o<58qhp(U!_~Xy#kjyV3VlO8H z+cjT|tkl>+4A4eljV=#pAPau!i~NkJY+&_}Z6Bc0&=+6y33&b2o8Vs=ZaIc|Bz~jeCgj>dISJ zkEyIC+b5z4betSLfy(eBUymf+)6fsdd;ft_vcjmNJ*zj5?i#ZN@SCQiW(G|FD0zB1 z>W#+T+^_|*IeR-mER(=%z8R?2)HhC?Nm?wz{8G_jT`N0gR!}^7y#;WcHj8M6K!*UT zAek9LEn{e+!pZvW5R>_HP;QFH>9IKMPMM6GgC>)nImj&ZjUyTL!Xv~o7gZ7XF9st? z!#Kf|;*h&#C$uBUrFvmDxqBY+;`g2&K5%6oQV^M0ETj%RI3FdU?=s*`LLTu<6sD4& z-Xv@w9aDrFQ*eLzP_nTZmDeOAX%&Kla*o<%iH`K3@+?$A(j7?JNX|4Pv*~Um?I!1& zQE~EKBpm=kvV9fGPGwj>K+*si+k%Qs&m-v+k?7MIB)vy^TTp4@pOExdME10xl8ld$ z^fi@P5IMh-U$>y-Amve- zhnJ&54l59(60*4!RhY^Isfs+_ibf@y1!*i`9ax2m$f;J8XsQ>aN#tTHc=RSgnn_C9 zP;K&TL0U*zU0Q)khB5Jr1gVKJht3aY-XcgV$e}h=nY>Dn)==1cD^W3rtresmavor* ziXgcF7RV>sIV8=rUXV7BneAZnO@g$QLN%Kkk4jARHbJ_dJOIa$9aWpY5TtbSWjiugXCz2D3BWZ=^&~%{Xh#l4mzN+}$bu!PEV&^;nheM! zb0re_RHr0JbLq&D4kYsF+?*guq--e&X-beDBDXC?mBRxG(mpDLyN;CKBINoR>tKR( zh5}N#bovUA$IdGW(gg|_!2$a6o)KP3kVcvSp2^|*_B>~hZIYTPLIy{OwB0$lb-qbj zN8#H4LKq9x{Nfxo=7aJ-JWfwFQR=Y)T?{7i0|zFprC*jf|+4J4Gb@%OSog z8ky6M3i#8dW|W=8`Gx~lg#c3ls7h9#d_MBGb|mtrz7~{Q!l+c=shtzecR;oWe9w`k zrJT{LD^Mk6cmdwy(0j&8R56S(Ddt+!mn9SVlm;~}!@b(5!0M%yoaG-^qEgEGTUd@< z_*Q7DmodUvu?y(_Rhq8#t*C^XBeD<@OBwx0uA~P{t2>HQYrX+?VJ(P&4oBPBnB^Nf zGouKgWc_n&s4ifB!ZnGKNN=s@L^=#vhVn?==vck%or2M0;tTFd_d Dk*a;J diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree index 2378fff1e94a8835e92abe064c68956afbcca2e5..9a0fc6aead7248f63ecd5e18fee826c6c1b3294e 100644 GIT binary patch delta 575 zcmZ2%IMa}&fn{pnMwT$iZlg_Qi{VnqdAg_4X^1)t2q z(##ZH2&Ld!QBstcT#}ierx1`>l$e`Zl3JwTT3nKun^=-xG$n&Qc1ngo4+&-}WTxOZ zbnaxnWrM!wCW9081s0+Z7?Z!?NdcH(lW_b7*im~KhFE;z(= zi*-RErV9)%T@w>(a3l3pjXb9`VLs%Cc!igDDz#x{1 zozmk1H4ImbVFnMjK<4FM!>GJ@7k4Eit7?X5#{J0``Ls7D^QJMfs%3~~iBEpOFF*MM zI}eyA4CS#*-Yy`t*_dC4kx_kef`C4doFI_Hs5<$tKnja;X;SKBLsrSnb%N6D0F@fl AZ~y=R diff --git a/docs/build/doctrees/modules/reeps.doctree b/docs/build/doctrees/modules/reeps.doctree index fc7c101c9f9e7d513f26977999b2302eaa4bba05..55a0dd7329a1305c47a8d22b04f50e66e4f161c7 100644 GIT binary patch literal 191532 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�OLKq=!ru6w9nlNfDwa{rQy% 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 Sh$mA-6wd%JPBz=4!~Y-rmLw - Overview: module code — reeps 1.0.0 documentation + Overview: module code — LLEPE 1.0.0 documentation @@ -48,7 +48,7 @@ - reeps + LLEPE @@ -88,7 +88,7 @@

Searchers

@@ -103,7 +103,7 @@ @@ -150,7 +150,8 @@

All modules for which code is available

-
diff --git a/docs/build/html/_modules/reeps/reeps.html b/docs/build/html/_modules/reeps/reeps.html index 810545e..bb9a06e 100644 --- a/docs/build/html/_modules/reeps/reeps.html +++ b/docs/build/html/_modules/reeps/reeps.html @@ -8,7 +8,7 @@ - reeps.reeps — reeps 1.0.0 documentation + reeps.reeps — LLEPE 1.0.0 documentation @@ -48,7 +48,7 @@ - reeps + LLEPE @@ -88,7 +88,7 @@

Searchers

@@ -103,7 +103,7 @@ @@ -167,6 +167,7 @@ import os import re import pkg_resources +from .utils import set_size sns.set() sns.set(font_scale=1.6) @@ -211,14 +212,15 @@ rare_earth_ion_names = ['Nd+++', 'Pr+++'] - :param exp_csv_filename: (str) csv file name with experimental data + :param exp_data: (str) csv file name with experimental data In the .csv file, the rows are different experiments and columns are the measured quantities. The ordering of the columns needs to be: - [h_i, h_eq, z_i, z_eq, {RE_1}_aq_i, {RE_1}_aq_eq, {RE_1}_d_eq, + [h_i, h_eq, z_i, z_eq, + {RE_1}_aq_i, {RE_1}_aq_eq, {RE_1}_d_eq, {RE_2}_aq_i, {RE_2}_aq_eq, {RE_2}_d_eq,... {RE_N}_aq_i, {RE_N}_aq_eq, {RE_N}_d_eq] @@ -272,7 +274,7 @@ :param phase_names: (list) names of phases in xml file Found in the xml file under <phase ... id={phase_name}> - + :param aq_solvent_name: (str) name of aqueous solvent in xml file :param extractant_name: (str) name of extractant in xml file :param diluant_name: (str) name of diluant in xml file @@ -280,7 +282,7 @@ Ensure the ordering is correct :param rare_earth_ion_names: (list) names of rare earth ions in xml file - + Ensure the ordering is correct :param re_species_list: (list) names of rare earth elements. @@ -300,27 +302,26 @@ :param opt_dict: (dict) dictionary containing info about which species parameters are updated to fit model to experimental data - Should have the format as below + Should have the format as below. Dictionary keys under user defined + parameter name must be named as shown below ('upper_element_name', + 'upper_attrib_name', etc.). 'attrib_name's and 'attrib_value's can + be None. {} denotes areas for user to fill in. .. code-block:: python - opt_dict = {"species1": - {"parameter1": "guess1", - "parameter2": "guess2", - ... - "parameterN": "guessN"} - "species2": - {"parameter1": "guess1", - "parameter2": "guess2", - ... - "parameterN": "guessN"} - ... - "speciesN": - {"parameter1": "guess1", - "parameter2": "guess2", - ... - "parameterN": "guessN"} - } + opt_dict = {"{user_defined_name_for_parameter_1}": + {'upper_element_name': {param_upper_element}, + 'upper_attrib_name': {param_upper_attrib_name}, + 'upper_attrib_value': {param_upper_attrib_value}, + 'lower_element_name': {param_lower_element}, + 'lower_attrib_name': {param_lower_attrib_name}, + 'lower_attrib_value': {param_lower_attrib_value}, + 'input_format': {str format to input input_value} + 'input_value': {guess_value}}, + "{user_defined_name_for_parameter_2}": + ... + ... + } :param objective_function: (function or str) function to compute objective By default, the objective function is log mean squared error @@ -337,7 +338,7 @@ objective_function(predicted_dict, measured_df, kwargs) ``kwargs`` is optional - + Function needs to return: (float) value computed by objective function Below is the guide for referencing predicted values @@ -381,14 +382,8 @@ "bounds": [(1e-1, 1e1)] - Though fit() returns a structure identical to opt_dict with correct - scaled values, in case bounds and constraints are used, you must - note the optimized x's are first multiplied by the initial guess - before written to the xml. - - By default, the optimizer is scipy's optimize function with - + .. code-block:: python default_kwargs= {"method": 'SLSQP', @@ -403,7 +398,8 @@ ``kwargs`` is optional - Function needs to return: (np.ndarray) Optimized parameters + Function needs to return: ((np.ndarray, float)) Optimized parameters, + objective_function value :param temp_xml_file_path: (str) path to temporary xml file. @@ -412,10 +408,13 @@ xml file default is local temp folder + + :param dependant_params_dict: (dict) dictionary containing information + about parameters dependant on opt_dict """ def __init__(self, - exp_csv_filename, + exp_data, phases_xml_filename, phase_names, aq_solvent_name, @@ -430,11 +429,12 @@ opt_dict=None, objective_function='Log-MSE', optimizer='SLSQP', - temp_xml_file_path=None + temp_xml_file_path=None, + dependant_params_dict=None, ): self._built_in_obj_list = ['Log-MSE'] self._built_in_opt_list = ['SLSQP'] - self._exp_csv_filename = exp_csv_filename + self._exp_data = exp_data self._phases_xml_filename = phases_xml_filename self._opt_dict = opt_dict self._phase_names = phase_names @@ -454,6 +454,7 @@ if temp_xml_file_path is None: temp_xml_file_path = r'{0}/temp.xml'.format(os.getenv('TEMP')) self._temp_xml_file_path = temp_xml_file_path + self._dependant_params_dict = dependant_params_dict # Try and except for adding package data to path. # This only works for sdist, not bdist # If bdist is needed, research "manifest.in" python setup files @@ -471,12 +472,15 @@ self._temp_xml_file_path) self._phases = ct.import_phases(self._phases_xml_filename, phase_names) - try: - self._exp_df = pd.read_csv(self._exp_csv_filename) - except FileNotFoundError: - self._exp_csv_filename = pkg_resources.resource_filename( - 'reeps', r'..\data\csvs\{0}'.format(self._exp_csv_filename)) - self._exp_df = pd.read_csv(self._exp_csv_filename) + if isinstance(self._exp_data, str): + try: + self._exp_df = pd.read_csv(self._exp_data) + except FileNotFoundError: + self._exp_data = pkg_resources.resource_filename( + 'reeps', r'..\data\csvs\{0}'.format(self._exp_data)) + self._exp_df = pd.read_csv(self._exp_data) + else: + self._exp_df = self._exp_data.copy() self._exp_df_columns = ['h_i', 'h_eq', 'z_i', 'z_eq'] if self._re_species_list is None: @@ -488,7 +492,12 @@ self._exp_df_columns.append('{0}_aq_i'.format(species)) self._exp_df_columns.append('{0}_aq_eq'.format(species)) self._exp_df_columns.append('{0}_d_eq'.format(species)) + self._exp_df.columns = self._exp_df_columns + for species in self._re_species_list: + self._exp_df['{0}_org_eq'.format(species)] = \ + self._exp_df['{0}_aq_eq'.format(species)] \ + * self._exp_df['{0}_d_eq'.format(species)] self._in_moles = None @@ -500,16 +509,18 @@ self._predicted_dict = None self.update_predicted_dict() -
[docs] @staticmethod - def slsqp_optimizer(objective, x_guess): +
[docs] @staticmethod + def scipy_minimize(objective, x_guess, optimizer_kwargs=None): """ The default optimizer for REEPS - Uses scipy.minimize with options + Uses scipy.minimize + + By default, options are .. code-block:: python default_kwargs= {"method": 'SLSQP', - "bounds": [(1e-1, 1e1)*len(x_guess)], + "bounds": [(1e-1, 1e1)]*len(x_guess), "constraints": (), "options": {'disp': True, 'maxiter': 1000, @@ -517,17 +528,20 @@ :param objective: (func) the objective function :param x_guess: (np.ndarray) the initial guess (always 1) - :returns: (np.ndarray) Optimized parameters + :param optimizer_kwargs: (dict) dictionary of options for minimize + :returns: ((np.ndarray, float)) Optimized parameters, + objective_function value """ - optimizer_kwargs = {"method": 'SLSQP', - "bounds": [(1e-1, 1e1)] * len(x_guess), - "constraints": (), - "options": {'disp': True, - 'maxiter': 1000, - 'ftol': 1e-6}} + if optimizer_kwargs is None: + optimizer_kwargs = {"method": 'SLSQP', + "bounds": [(1e-1, 1e1)] * len(x_guess), + "constraints": (), + "options": {'disp': True, + 'maxiter': 1000, + 'ftol': 1e-6}} res = minimize(objective, x_guess, **optimizer_kwargs) est_parameters = res.x - return est_parameters
+ return est_parameters, res.fun
[docs] def log_mean_squared_error(self, predicted_dict, meas_df): """Default objective function for REEPS @@ -549,7 +563,8 @@ for species in self._re_species_list]) log_pred = np.log10(pred) log_meas = np.log10(meas) - obj = np.sum((log_pred - log_meas) ** 2) + log_diff = (log_pred - log_meas) ** 2 + obj = np.sum(log_diff) return obj
[docs] def get_exp_df(self) -> pd.DataFrame: @@ -559,7 +574,7 @@ """ return self._exp_df
-
[docs] def set_exp_df(self, exp_csv_filename): +
[docs] def set_exp_df(self, exp_data): """Changes the experimental DataFrame to input exp_csv_filename data and renames columns to internal REEPS names @@ -568,15 +583,19 @@ See class docstring on "exp_csv_filename" for further explanations. - :param exp_csv_filename: (str) file name/path for experimental data csv + :param exp_data: (str or pd.DataFrame) + file name/path or DataFrame for experimental data csv """ - self._exp_csv_filename = exp_csv_filename - try: - self._exp_df = pd.read_csv(self._exp_csv_filename) - except FileNotFoundError: - self._exp_csv_filename = pkg_resources.resource_filename( - 'reeps', r'..\data\csvs\{0}'.format(self._exp_csv_filename)) - self._exp_df = pd.read_csv(self._exp_csv_filename) + self._exp_data = exp_data + if isinstance(self._exp_data, str): + try: + self._exp_df = pd.read_csv(self._exp_data) + except FileNotFoundError: + self._exp_data = pkg_resources.resource_filename( + 'reeps', r'..\data\csvs\{0}'.format(self._exp_data)) + self._exp_df = pd.read_csv(self._exp_data) + else: + self._exp_df = exp_data.copy() self._exp_df_columns = ['h_i', 'h_eq', 'z_i', 'z_eq'] if self._re_species_list is None: self._re_species_list = [] @@ -588,6 +607,10 @@ self._exp_df_columns.append('{0}_aq_eq'.format(species)) self._exp_df_columns.append('{0}_d_eq'.format(species)) self._exp_df.columns = self._exp_df_columns + for species in self._re_species_list: + self._exp_df['{0}_org_eq'.format(species)] = \ + self._exp_df['{0}_aq_eq'.format(species)] \ + * self._exp_df['{0}_d_eq'.format(species)] self.set_in_moles(feed_vol=1) self.update_predicted_dict() return None
@@ -604,7 +627,7 @@ """Change list of Cantera solutions by inputting new xml file name and phase names - Also runs set_in_moles to set initial molality to 1 g/L + Also runs set_in_moles to set feed volume to 1 L :param phases_xml_filename: (str) xml file with parameters for equilibrium calc @@ -720,8 +743,8 @@
[docs] def get_rare_earth_ion_names(self) -> list: """Returns list of rare earth ion names - - :return: rare_earth_ion_names: (list) names of rare earth ions in + + :return: rare_earth_ion_names: (list) names of rare earth ions in xml file """ return self._rare_earth_ion_names
@@ -730,7 +753,7 @@ """Change list of rare earth ion names to input rare_earth_ion_names - :param rare_earth_ion_names: (list) names of rare earth ions in + :param rare_earth_ion_names: (list) names of rare earth ions in xml file """ self._rare_earth_ion_names = rare_earth_ion_names @@ -756,15 +779,15 @@
[docs] def get_aq_solvent_rho(self) -> str: """Returns aqueous solvent density (g/L) - - :return: aq_solvent_rho: (float) density of aqueous solvent + + :return: aq_solvent_rho: (float) density of aqueous solvent """ return self._aq_solvent_rho
[docs] def set_aq_solvent_rho(self, aq_solvent_rho): """Changes aqueous solvent density (g/L) to input aq_solvent_rho - :param aq_solvent_rho: (float) density of aqueous solvent + :param aq_solvent_rho: (float) density of aqueous solvent """ self._aq_solvent_rho = aq_solvent_rho return None
@@ -772,14 +795,14 @@
[docs] def get_extractant_rho(self) -> str: """Returns extractant density (g/L) - :return: extractant_rho: (float) density of extractant + :return: extractant_rho: (float) density of extractant """ return self._extractant_rho
[docs] def set_extractant_rho(self, extractant_rho): """Changes extractant density (g/L) to input extractant_rho - :param extractant_rho: (float) density of extractant + :param extractant_rho: (float) density of extractant """ self._extractant_rho = extractant_rho return None
@@ -787,14 +810,14 @@
[docs] def get_diluant_rho(self) -> str: """Returns diluant density (g/L) - :return: diluant_rho: (float) density of diluant + :return: diluant_rho: (float) density of diluant """ return self._diluant_rho
[docs] def set_diluant_rho(self, diluant_rho): """Changes diluant density (g/L) to input diluant_rho - :param diluant_rho: (float) density of diluant + :param diluant_rho: (float) density of diluant """ self._diluant_rho = diluant_rho return None
@@ -810,7 +833,7 @@ This function also calls update_predicted_dict - :param feed_vol: (float) feed volume of mixture (g/L) + :param feed_vol: (float) feed volume of mixture (L) """ phases_copy = self._phases.copy() exp_df = self._exp_df.copy() @@ -963,7 +986,7 @@ "with at least 2 arguments: " "f(objective_func,x_guess, kwargs)") if optimizer == 'SLSQP': - optimizer = self.slsqp_optimizer + optimizer = self.scipy_minimize self._optimizer = optimizer return None
@@ -998,6 +1021,23 @@ self._temp_xml_file_path = temp_xml_file_path return None +
[docs] def get_dependant_params_dict(self): + """ + Returns the dependant_params_dict + :return: dependant_params_dict: (dict) dictionary containing + information about parameters dependant on opt_dict + """ + return self._dependant_params_dict
+ +
[docs] def set_dependant_params_dict(self, dependant_params_dict): + """ + Sets the dependant_params_dict + :param dependant_params_dict: (dict) dictionary containing information + about parameters dependant on opt_dict + """ + self._dependant_params_dict = dependant_params_dict + return None
+
[docs] def update_predicted_dict(self, phases_xml_filename=None, phase_names=None): @@ -1080,6 +1120,7 @@ exp_df = self._exp_df objective_function = self._objective_function opt_dict = copy.deepcopy(self._opt_dict) + dep_dict = copy.deepcopy(self._dependant_params_dict) x = np.array(x) if len(x.shape) == 1: @@ -1093,9 +1134,14 @@ i = 0 for species_name in opt_dict.keys(): for thermo_prop in opt_dict[species_name].keys(): - opt_dict[species_name][thermo_prop] *= x[i] + if not np.isnan( + x[i]): # if nan, do not update xml with nan + opt_dict[species_name][thermo_prop] *= x[i] i += 1 - self.update_xml(opt_dict, temp_xml_file_path) + + self.update_xml(opt_dict, + temp_xml_file_path, + dependant_params_dict=dep_dict) self.update_predicted_dict(temp_xml_file_path) predicted_dict = self.get_predicted_dict() @@ -1118,16 +1164,19 @@ objective_function=None, optimizer=None, objective_kwargs=None, - optimizer_kwargs=None) -> dict: + optimizer_kwargs=None) -> tuple: """Fits experimental to modeled data by minimizing objective function with optimizer. Returns dictionary with opt_dict structure :param objective_function: (function) function to compute objective + If 'None', last set objective or default function is used :param optimizer: (function) function to perform optimization - :param optimizer_kwargs: (dict) arguments for optimizer - :param objective_kwargs: (dict) arguments for objective function - :returns opt_dict: (dict) optimized opt_dict. Has identical structure - as opt_dict + If 'None', last set optimizer or default is used + :param optimizer_kwargs: (dict) optional arguments for optimizer + :param objective_kwargs: (dict) optional arguments + for objective function + :returns tuple: (opt_dict (dict), opt_value (float)) + optimized opt_dict: Has identical structure as opt_dict """ if objective_function is not None: self.set_objective_function(objective_function) @@ -1147,21 +1196,24 @@ if optimizer_kwargs is None: # noinspection PyCallingNonCallable - est_parameters = optimizer(objective, x_guess) + est_parameters, obj_value = optimizer(objective, x_guess) else: # noinspection PyCallingNonCallable - est_parameters = optimizer(objective, x_guess, **optimizer_kwargs) + est_parameters, obj_value = optimizer(objective, + x_guess, + optimizer_kwargs) i = 0 for species_name in opt_dict.keys(): for thermo_prop in opt_dict[species_name].keys(): opt_dict[species_name][thermo_prop] *= est_parameters[i] i += 1 - return opt_dict
+ return opt_dict, obj_value
[docs] def update_xml(self, info_dict, - phases_xml_filename=None): + phases_xml_filename=None, + dependant_params_dict=None): """updates xml file with info_dict :param info_dict: (dict) info in {species_names:{thermo_prop:val}} @@ -1169,20 +1221,42 @@ :param phases_xml_filename: (str) xml filename if editing other xml If ``None``, the current xml will be modified and the internal Cantera phases will be refreshed to the new values. + :param dependant_params_dict: (dict) dictionary containing information + about parameters dependant on info_dict """ if phases_xml_filename is None: phases_xml_filename = self._phases_xml_filename + new_dict = copy.deepcopy(info_dict) + dep_dict = dependant_params_dict + if dep_dict is not None: + for species_name in dep_dict.keys(): + for thermo_prop in dep_dict[species_name]: + mod_func = \ + dep_dict[species_name][thermo_prop]['function'] + mod_kwargs = \ + dep_dict[species_name][thermo_prop]['kwargs'] + ind_vars = \ + dep_dict[species_name][thermo_prop]['ind_vars'] + ind_vals = [new_dict[ind_var[0]][ind_var[1]] + for ind_var in ind_vars] + + new_dict[species_name] = {} + new_dict[species_name][thermo_prop] = {} + new_dict[species_name][thermo_prop] = \ + mod_func(ind_vals, **mod_kwargs) + # print(mod_func(ind_vals, **mod_kwargs)) + # print(new_dict) tree = ET.parse(phases_xml_filename) root = tree.getroot() # Update xml file - for species_name in info_dict.keys(): - for thermo_prop in info_dict[species_name].keys(): + for species_name in new_dict.keys(): + for thermo_prop in new_dict[species_name].keys(): for species in root.iter('species'): if species.attrib['name'] == species_name: for changed_prop in species.iter(thermo_prop): changed_prop.text = str( - info_dict[species_name][thermo_prop]) + new_dict[species_name][thermo_prop]) now = datetime.now() changed_prop.set('updated', 'Updated at {0}:{1} {2}-{3}-{4}' @@ -1195,10 +1269,213 @@ self.set_phases(self._phases_xml_filename, self._phase_names) return None
+ def _internal_objective_ver2(self, x, kwargs=None): + """ + ver2 generalizes to handle accessing parameters. ver1 assumes species + parameter is modified. ver2 assumes parameter is accessed by going + through two levels: upper and lower + Internal objective function. Uses objective function to compute value + If the optimizer requires vectorized variables ie pso, this function + takes care of it + + :param x: (list) thermo properties varied to minimize objective func + :param kwargs: (list) arguments for objective_function + """ + temp_xml_file_path = self._temp_xml_file_path + exp_df = self._exp_df + objective_function = self._objective_function + opt_dict = copy.deepcopy(self._opt_dict) + dep_dict = copy.deepcopy(self._dependant_params_dict) + x = np.array(x) + + if len(x.shape) == 1: + xs = np.array([x]) + vectorized_x = False + else: + vectorized_x = True + xs = x + objective_values = [] + for x in xs: + for ind, param_name in enumerate(opt_dict.keys()): + if not np.isnan( + x[ind]): # if nan, do not update xml with nan + opt_dict[param_name]['input_value'] *= x[ind] + + self.update_xml_ver2(opt_dict, + temp_xml_file_path, + dependant_params_dict=dep_dict) + + self.update_predicted_dict(temp_xml_file_path) + predicted_dict = self.get_predicted_dict() + self.update_predicted_dict() + + if kwargs is None: + # noinspection PyCallingNonCallable + obj = objective_function(predicted_dict, exp_df) + else: + # noinspection PyCallingNonCallable + obj = objective_function(predicted_dict, exp_df, **kwargs) + objective_values.append(obj) + if vectorized_x: + objective_values = np.array(objective_values) + else: + objective_values = objective_values[0] + return objective_values + +
[docs] def fit_ver2(self, + objective_function=None, + optimizer=None, + objective_kwargs=None, + optimizer_kwargs=None) -> tuple: + """Fits experimental to modeled data by minimizing objective function + with optimizer. Returns dictionary with opt_dict structure + + :param objective_function: (function) function to compute objective + If 'None', last set objective or default function is used + :param optimizer: (function) function to perform optimization + If 'None', last set optimizer or default is used + :param optimizer_kwargs: (dict) optional arguments for optimizer + :param objective_kwargs: (dict) optional arguments + for objective function + :returns tuple: (opt_dict (dict), opt_value (float)) + optimized opt_dict: Has identical structure as opt_dict + """ + if objective_function is not None: + self.set_objective_function(objective_function) + if optimizer is not None: + self.set_optimizer(optimizer) + + def objective(x): + return self._internal_objective_ver2(x, objective_kwargs) + + optimizer = self._optimizer + opt_dict = copy.deepcopy(self._opt_dict) + x_guess = np.ones(len(list(opt_dict.keys()))) + + if optimizer_kwargs is None: + # noinspection PyCallingNonCallable + est_parameters, obj_value = optimizer(objective, x_guess) + else: + # noinspection PyCallingNonCallable + est_parameters, obj_value = optimizer(objective, + x_guess, + optimizer_kwargs) + for ind, param_name in enumerate(opt_dict.keys()): + opt_dict[param_name]['input_value'] *= est_parameters[ind] + + return opt_dict, obj_value
+ +
[docs] def update_xml_ver2(self, + info_dict, + phases_xml_filename=None, + dependant_params_dict=None): + """updates xml file with info_dict + + :param info_dict: (dict) info in {species_names:{thermo_prop:val}} + Requires an identical structure to opt_dict + :param phases_xml_filename: (str) xml filename if editing other xml + If ``None``, the current xml will be modified and the internal + Cantera phases will be refreshed to the new values. + :param dependant_params_dict: (dict) dictionary containing information + about parameters dependant on info_dict + """ + if phases_xml_filename is None: + phases_xml_filename = self._phases_xml_filename + new_dict = copy.deepcopy(info_dict) + dep_dict = dependant_params_dict + + if dep_dict is not None: + new_dict.update(dep_dict) + for param_name in dep_dict.keys(): + mod_func = \ + dep_dict[param_name]['function'] + mod_kwargs = \ + dep_dict[param_name]['kwargs'] + if isinstance(dep_dict[param_name]['independent_params'], str): + ind_param_names = [dep_dict[ + param_name]['independent_params']] + else: + ind_param_names = \ + dep_dict[param_name]['independent_params'] + ind_vals = [new_dict[ind_param_name]['input_value'] + for ind_param_name in ind_param_names] + if mod_kwargs is None: + new_dict[param_name]['input_value'] = mod_func(ind_vals) + else: + new_dict[param_name]['input_value'] = \ + mod_func(ind_vals, + **mod_kwargs) + tree = ET.parse(phases_xml_filename) + root = tree.getroot() + # Update xml file + for key in list(new_dict.keys()): + d = new_dict[key] + now = datetime.now() + if (d['upper_attrib_name'] is not None + and d['lower_attrib_name'] is not None): + for child1 in root.iter(d['upper_element_name']): + if (child1.attrib[d['upper_attrib_name']] + == d['upper_attrib_value']): + for child2 in child1.iter(d['lower_element_name']): + if (child1.attrib[d['lower_attrib_name']] + == d['lower_attrib_value']): + child2.text = d['input_format'].format( + d['input_value']) + child2.set('updated', + 'Updated at {0}:{1} {2}-{3}-{4}' + .format(now.hour, now.minute, + now.month, now.day, + now.year)) + elif (d['upper_attrib_name'] is None + and d['lower_attrib_name'] is not None): + for child1 in root.iter(d['upper_element_name']): + for child2 in child1.iter(d['lower_element_name']): + if (child1.attrib[d['lower_attrib_name']] + == d['lower_attrib_value']): + child2.text = d['input_format'].format( + d['input_value']) + child2.set('updated', + 'Updated at {0}:{1} {2}-{3}-{4}' + .format(now.hour, now.minute, + now.month, now.day, + now.year)) + elif (d['upper_attrib_name'] is not None + and d['lower_attrib_name'] is None): + for child1 in root.iter(d['upper_element_name']): + if (child1.attrib[d['upper_attrib_name']] + == d['upper_attrib_value']): + for child2 in child1.iter(d['lower_element_name']): + child2.text = d['input_format'].format( + d['input_value']) + child2.set('updated', + 'Updated at {0}:{1} {2}-{3}-{4}' + .format(now.hour, now.minute, + now.month, now.day, + now.year)) + else: + for child1 in root.iter(d['upper_element_name']): + for child2 in child1.iter(d['lower_element_name']): + child2.text = d['input_format'].format( + d['input_value']) + child2.set('updated', 'Updated at {0}:{1} {2}-{3}-{4}' + .format(now.hour, now.minute, + now.month, now.day, + now.year)) + + tree.write(phases_xml_filename) + if phases_xml_filename == self._phases_xml_filename: + self.set_phases(self._phases_xml_filename, self._phase_names) + return None
+
[docs] def parity_plot(self, compared_value=None, + c_data=None, + c_label=None, + plot_title=None, save_path=None, - print_r_squared=False): + print_r_squared=False, + data_labels=None, + legend=True): """ Parity plot between measured and predicted compared_value. Default compared value is {RE_1}_aq_eq @@ -1206,9 +1483,25 @@ :param compared_value: (str) Quantity to compare predicted and experimental data. Can be any column containing "eq" in exp_df i.e. h_eq, z_eq, {RE}_d_eq, etc. + :param plot_title: (str or boolean) + + If None (default): Plot title will be generated from compared_value + Recommend to just explore. If h_eq, plot_title is + "H^+ eq conc". + + If str: Plot title will be plot_title string + + If "False": No plot title + :param c_data: (list or np.ndarray) data for color axis + :param c_label: (str) label for color axis :param save_path: (str) save path for parity plot :param print_r_squared: (boolean) To plot or not to plot r-squared value. Prints 2 places past decimal + :param data_labels: labels for the data such as paper's name where + experiment is pulled from. + :param legend: whether to display legend for data_labels. Has no + effect if data_labels is None + :return fig, ax: returns the figure and axes objects """ exp_df = self.get_exp_df() predicted_dict = self.get_predicted_dict() @@ -1217,45 +1510,98 @@ re_charges = self._re_charges if compared_value is None: compared_value = '{0}_aq_eq'.format(re_species_list[0]) - pred = predicted_dict[compared_value] - meas = exp_df[compared_value].values + pred = pd.DataFrame(predicted_dict)[compared_value].fillna(0).values + meas = exp_df[compared_value].fillna(0).values + name_breakdown = re.findall('[^_\W]+', compared_value) + compared_species = name_breakdown[0] + if compared_species == 'h': + feed_molarity = exp_df['h_i'].fillna(0).values + elif compared_species == 'z': + feed_molarity = exp_df['z_i'].fillna(0).values + else: + feed_molarity = exp_df[ + '{0}_aq_i'.format(compared_species)].fillna(0).values + if isinstance(data_labels, list): + combined_df = pd.DataFrame({'pred': pred, + 'meas': meas, + 'label': data_labels, + 'feed_molarity': feed_molarity}) + elif isinstance(c_data, str): + combined_df = pd.DataFrame({'pred': pred, + 'meas': meas, + c_data: exp_df[c_data].values, + 'feed_molarity': feed_molarity}) + else: + combined_df = pd.DataFrame({'pred': pred, + 'meas': meas, + 'feed_molarity': feed_molarity}) + + combined_df = combined_df[(combined_df['feed_molarity'] != 0)] + meas = combined_df['meas'].values + pred = combined_df['pred'].values + min_data = np.min([pred, meas]) max_data = np.max([pred, meas]) min_max_data = np.array([min_data, max_data]) - name_breakdown = re.findall('[^_\W]+', compared_value) - compared_species = name_breakdown[0] + if compared_species == 'h': - species_name = '$H^+$' + default_title = '$H^+$ eq. conc. (mol/L)' elif compared_species == 'z': - species_name = extractant_name + default_title = '{0} eq. conc. (mol/L)'.format(extractant_name) else: phase = name_breakdown[1] if phase == 'aq': re_charge = re_charges[re_species_list.index(compared_species)] - species_name = '$%s^{%d+}$' % (compared_species, re_charge) + default_title = '$%s^{%d+}$ eq. conc. (mol/L)' \ + % (compared_species, re_charge) elif phase == 'd': - species_name = '{0} distribution ratio'.format( + default_title = '{0} distribution ratio'.format( compared_species) else: - species_name = '{0} complex'.format(compared_species) + default_title = '{0} complex eq. conc. (mol/L)'.format( + compared_species) fig, ax = plt.subplots() - p1 = sns.scatterplot(meas, pred, color="r", - label="{0} eq. conc. (mol/L)".format( - species_name), - legend=False) - sns.lineplot(min_max_data, min_max_data, color="b", label="") + if isinstance(data_labels, list): + unique_labels = list(set(data_labels)) + for label in unique_labels: + filtered_data = combined_df[combined_df['label'] == label] + filtered_meas = filtered_data['meas'] + filtered_pred = filtered_data['pred'] + ax.scatter(filtered_meas, filtered_pred, label=label) + if legend: + ax.legend(loc='best') + + elif c_data is not None: + if isinstance(c_data, str): + c_data = combined_df[c_data].values + p1 = ax.scatter(meas, pred, c=c_data, alpha=1, cmap='viridis') + c_bar = fig.colorbar(p1, format='%.2f') + if c_label is not None: + c_bar.set_label(c_label, rotation=270, labelpad=20) + else: + sns.scatterplot(meas, pred, color="r", + legend=False) + ax.plot(min_max_data, min_max_data, color="b", label="") + if print_r_squared: - p1.text(min_max_data[0], + ax.text(min_max_data[0], min_max_data[1] * 0.9, '$R^2$={0:.2f}'.format(self.r_squared(compared_value))) - plt.legend(loc='lower right') - else: - plt.legend() + # plt.legend(loc='lower right') + # else: + # plt.legend() + ax.set(xlabel='Measured', ylabel='Predicted') + if plot_title is None: + ax.set_title(default_title) + elif isinstance(plot_title, str): + ax.set_title(plot_title) + set_size(8, 6) + plt.tight_layout() plt.show() if save_path is not None: plt.savefig(save_path, bbox_inches='tight') - return None
+ return fig, ax
[docs] def r_squared(self, compared_value=None): """r-squared value comparing measured and predicted compared value @@ -1264,20 +1610,87 @@ :param compared_value: (str) Quantity to compare predicted and experimental data. Can be any column containing "eq" in exp_df i.e. - h_eq, z_eq, {RE}_d_eq, etc. + h_eq, z_eq, {RE}_d_eq, etc. default is {RE}_aq_eq """ exp_df = self.get_exp_df() predicted_dict = self.get_predicted_dict() re_species_list = self._re_species_list if compared_value is None: compared_value = '{0}_aq_eq'.format(re_species_list[0]) - pred = predicted_dict[compared_value] + pred = pd.DataFrame(predicted_dict)[compared_value].fillna(0).values predicted_y = np.array(pred) - actual_y = exp_df[compared_value].values + actual_y = exp_df[compared_value].fillna(0).values + name_breakdown = re.findall('[^_\W]+', compared_value) + compared_species = name_breakdown[0] + if compared_species == 'h': + feed_molarity = exp_df['h_i'].fillna(0).values + elif compared_species == 'z': + feed_molarity = exp_df['z_i'].fillna(0).values + else: + feed_molarity = exp_df[ + '{0}_aq_i'.format(compared_species)].fillna(0).values + combined_df = pd.DataFrame({'pred': predicted_y, + 'meas': actual_y, + 'in_moles': feed_molarity}) + combined_df = combined_df[(combined_df['in_moles'] != 0)] + actual_y = combined_df['meas'].values + predicted_y = combined_df['pred'].values num = sum((actual_y - predicted_y) ** 2) den = sum((actual_y - np.mean(actual_y)) ** 2) - r_2 = (1 - num / den) - return r_2
+ if den == 0: + r_2 = 0 + else: + r_2 = (1 - num / den) + return r_2 + +
[docs] @staticmethod + def plot_3d_data(x_data, + y_data, + z_data, + c_data=None, + x_label=None, + y_label=None, + z_label=None, + c_label=None): + """ + + :param x_data: (list) list of data for x axis + :param y_data: (list) list of data for y axis + :param z_data: (list) list of data for z axis + :param c_data: (list) list of data for color axis + :param x_label: (str) label for x axis + :param y_label: (str) label for y axis + :param z_label: (str) label for z axis + :param c_label: (str) label for color axis + :return: + """ + + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + if c_data is None: + ax.plot(x_data, y_data, z_data, 'o') + else: + p1 = ax.scatter(x_data, + y_data, + z_data, 'o', c=c_data, + cmap='viridis', alpha=1) + c_bar = fig.colorbar(p1) + if c_label is not None: + c_bar.set_label(c_label, rotation=270, labelpad=20) + if x_label is None: + ax.set_xlabel('x', labelpad=15) + else: + ax.set_xlabel(x_label, labelpad=15) + if y_label is None: + ax.set_ylabel('y', labelpad=15) + else: + ax.set_ylabel(y_label, labelpad=15) + if z_label is None: + ax.set_zlabel('z', labelpad=15) + else: + ax.set_zlabel(z_label, labelpad=15) + plt.show() + return fig, ax
diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt index 0cef716..9a973a9 100644 --- a/docs/build/html/_sources/index.rst.txt +++ b/docs/build/html/_sources/index.rst.txt @@ -3,12 +3,11 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to reeps's docs! - the Rare earth element parameter searcher -==================================================================== -REEPS is a package for thermodynamic parameter estimation specifically -for rare earth element extraction modeling. +Welcome to llepe's docs! - the Liquid-Liquid Extraction Parameter Estimator +=========================================================================== +LLEPE is a package for thermodynamic parameter estimation for liquid-liquid extraction modeling -REEPS takes experimental data in a csv and system data in a xml. +LLEPE takes experimental data in a csv and system data in a xml. The package then uses Cantera, another python package, to simulate equilibrium. diff --git a/docs/build/html/_sources/modules/reeps.rst.txt b/docs/build/html/_sources/modules/reeps.rst.txt index 9be4450..bba5c13 100644 --- a/docs/build/html/_sources/modules/reeps.rst.txt +++ b/docs/build/html/_sources/modules/reeps.rst.txt @@ -1,8 +1,8 @@ .. _reeps: -.. automodule:: reeps +.. automodule:: llepe -REEPS +LLEPE ===== @@ -10,6 +10,6 @@ REEPS Parameters ---------- -.. autoclass:: REEPS +.. autoclass:: LLEPE :members: :inherited-members: \ No newline at end of file diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index 195d0e4..d1e1f7b 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -9,7 +9,7 @@ - Index — reeps 1.0.0 documentation + Index — LLEPE 1.0.0 documentation @@ -49,7 +49,7 @@ - reeps + LLEPE @@ -89,7 +89,7 @@

Searchers

@@ -104,7 +104,7 @@ @@ -169,7 +169,7 @@

F

@@ -177,41 +177,43 @@

G

@@ -219,7 +221,18 @@

L

+
@@ -231,7 +244,7 @@ module @@ -240,7 +253,11 @@

P

+
@@ -248,18 +265,7 @@

R

-
@@ -267,41 +273,43 @@

S

@@ -309,11 +317,11 @@

U

diff --git a/docs/build/html/guide/install.html b/docs/build/html/guide/install.html index 36945cc..0eed037 100644 --- a/docs/build/html/guide/install.html +++ b/docs/build/html/guide/install.html @@ -8,7 +8,7 @@ - Installation — reeps 1.0.0 documentation + Installation — LLEPE 1.0.0 documentation @@ -36,7 +36,7 @@ - + @@ -50,7 +50,7 @@ - reeps + LLEPE @@ -97,7 +97,7 @@

Searchers

@@ -112,7 +112,7 @@ @@ -204,7 +204,7 @@ pip install -e .[docs,tests] - + diff --git a/docs/build/html/guide/quickstart.html b/docs/build/html/guide/quickstart.html index 69b4264..ed14293 100644 --- a/docs/build/html/guide/quickstart.html +++ b/docs/build/html/guide/quickstart.html @@ -8,7 +8,7 @@ - Getting Started — reeps 1.0.0 documentation + Getting Started — LLEPE 1.0.0 documentation @@ -35,7 +35,7 @@ - + @@ -50,7 +50,7 @@ - reeps + LLEPE @@ -90,7 +90,7 @@

Searchers

@@ -105,7 +105,7 @@ @@ -193,7 +193,7 @@ aqueous phase.