From 39ccbf36b0fe83331bcda2fb31b5d28004a51bb3 Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Tue, 22 Sep 2015 15:28:17 +0200 Subject: [PATCH] Detailed documentation of the observers --- .gitignore | 4 +- doc/en/advanced.rst | 20 +- doc/en/images/eficas_observer_nodetype.png | Bin 0 -> 42235 bytes doc/en/ref_covariance_requirements.rst | 20 +- doc/en/ref_observers_requirements.rst | 340 +++++++++++++++++++++ doc/fr/advanced.rst | 24 +- doc/fr/images/eficas_observer_nodetype.png | Bin 0 -> 42235 bytes doc/fr/ref_covariance_requirements.rst | 43 ++- doc/fr/ref_observers_requirements.rst | 338 ++++++++++++++++++++ src/daComposant/daCore/BasicObjects.py | 34 +++ src/daSalome/adaoBuilder.py | 1 + 11 files changed, 770 insertions(+), 54 deletions(-) create mode 100644 doc/en/images/eficas_observer_nodetype.png create mode 100644 doc/fr/images/eficas_observer_nodetype.png diff --git a/.gitignore b/.gitignore index bc7f17e..73e8713 100644 --- a/.gitignore +++ b/.gitignore @@ -48,7 +48,7 @@ src/Makefile.in switch.log # YAMM specific -git_diff.log -git_fetch.log +diff.log +fetch.log update.log binary_archive.log diff --git a/doc/en/advanced.rst b/doc/en/advanced.rst index fca7105..5d2b0ed 100644 --- a/doc/en/advanced.rst +++ b/doc/en/advanced.rst @@ -191,29 +191,17 @@ Getting information on special variables during the ADAO calculation in YACS .. index:: single: Observer Template Some special internal optimization variables, used during calculations, can be -monitored during the ADAO calculation in YACS. These variables can be printed, +monitored during the ADAO calculation. These variables can be printed, plotted, saved, etc. This can be done using "*observer*", that are scripts, -each associated with one variable. In order to use this feature, the user has to -build scripts using as standard inputs (e.g. available in the namespace) the -variables ``var`` and ``info``. The variable ``var`` is to be used in the same -way as for the final ADD object, that is as a list/tuple object. +each associated with one variable. Some templates are available when editing the ADAO case in graphical editor. These simple scripts can be customized by the user, either at the embedded edition stage, or at the edition stage before execution, to improve the tuning of the ADAO calculation. -As an example, here is one very simple script (similar to the "*ValuePrinter*" -template) used to print the value of one monitored variable:: - - print " --->",info," Value =",var[-1] - -Stored in a Python file, this script can be associated to each variable -available in the "*SELECTION*" keyword of the "*Observers*" command: -"*Analysis*", "*CurrentState*", "*CostFunction*"... The current value of the -variable will be printed at each step of the optimization or assimilation -algorithm. The "*observer*" can embed plotting capabilities, storage, complex -printing, statistical treatment, etc. +To implement these "*observer*" efficiently, one can look to the +:ref:`ref_observers_requirements`. Getting more information when running a calculation --------------------------------------------------- diff --git a/doc/en/images/eficas_observer_nodetype.png b/doc/en/images/eficas_observer_nodetype.png new file mode 100644 index 0000000000000000000000000000000000000000..a604eb5270ebfa0879b7512fa6f92fa1e1dfc47a GIT binary patch literal 42235 zcma&N2RPO5|36-cW29qbWgN0YviCUlIJPoEWQOdO6^@w|A;;b$^B6@T*<_xOk&%_X z$^PHo@6YG^`~Ao7y8h~_=&aZMy6@-nv7V7y8cMebXb5iHxN%!WSzhPH4Q%flH*N|- zu)t5m^hbliUpO|h2-zDqs^bXH&2NG4<=qtw+;yF--M!3Rt!@}RhIv}Ky4g9sgz@t{ z;x*@f;o)fEq-f{;K;fk=%*h(Y$IC17i0_dQjNR^~yOpb*BO}KHMRiAWH+$}%Pik-6 zfZb4$m(}x5-^lPu*Bh0Pz4R8^h`oNwb3dpq&>f7fe%0W{Z=Q zjgzNBj>D$KI}j$~JNiNUH-BXF;taDz#rtO!G>F<%93vENV`-zk$o}6;gCh+?vi_f= zpPEnSb?fZ2{KqPmzsA*#e?4&6WP}96u79J8%)=*d;K)M3Z_6v3P}cwa_=!wT=U}vG;1Fz5e$l%yuJ(h{D?}WNNwWZOf_QMv8R~zv?}T z%Vn-#6=x#wZ;BEIU6!ju3)c-x&ef4G|M#WQc&$|Zfz=*UW69dwa*ntDdF$=~EP{T` zAS1GWKayq;yoUA%>Ob#~Lyppy`R}vOHqwV29PKVkHj&`9}ULs_5 z|6WJ;OEiYQzt9^)7AIXz$u&UbDYR| zL{B2CnOnags&I3oxit8{*PAk7mqQ(+NI6^WJ*HpdFvWBBC-d{RVU2bFcEHu=*^5iB z3vy=)j5&9KSzS#HU?+6KQaT5PiXk3#N9i|n?OtuEb>KHo`mYCie)=Ha== zs2SZ5jQpqpg28gE(Q! z0>|j5tCFQU-9p-czw_?SQ}vF|yJADf@o1gDj+KulQFqJ3m3gTIh_Fptj%R#7 z&bY2iU+%{FNohjnMPdi=lJNKKO=f=m^51yWHKJzVdB+A5V)j4#XKq44mKE}?>G+rL z=Cu7?g`AK)#hA6Vwczo4!Y>`{CL+mJQu(a|yw<#~_QqQrwr0-FSHdgSx86zSDaDx{ zj&XJ$g8hbRD)24hVIcAji~aY+=x#KwIDJFnQ<{3u-UKlGk{`m5j z*mkFn4fxUA6N~^iX=FEg8hk$R{$6A6-|#frZcR6=kCoRrey*u;>x`xr|NQOQe{T?< zx956<&*Xt!Q&ZEy=IHp-i-tk}twpDFzdd1%OkS678y{@$1e6qbaW@?%8%qmcy3LB7 ziJM)lJ@INya7sUjS;Z6vzC2&4XxuC19~7xs6EKo@iyswuAp4(F$EWPcLk+pfYxI-G9%nhfGd`arT(}KP920gYDMT{dtJ>#|@hQ zokFUZ)_qd_?vEOvEo_B+}0cf$KmCCk#5RNOznXwG(d!XQ|*f#hvx>LP4L%QbVPyEdvJItdA3mlPK5cYlBUFNJ7x1usI$n^ z^+)YpZo)x%`vU_S-r_!civ|LZ#e(ftA;Cn9;u^R{Xv-c2N)v&Lk=31}{qO)#4e62i z$yVHr{==1l7xwV(kIjeW>w$j$FenV^9=-W#DcLv~tgGWxJvOn(+}PC1&B-5!U$O5T z930TP56P+}^H2-FoSrLkoUYo972o>XXLk8pWB`{o3dv3ie<+n`D&*~(z?l)>z3=OMkP$+7Y5=~&GEOLCl? z=MH#``Q_y?PVN?+kj+IdHH7PgG#aEFK&j(p)OPPS>C@RK{@yQ)##z0WzmR< zt)?po|8n5SJq1;@8uJmLC>I0e2fc0nA-0jF>}kVZEk?ubgUfc)afM;c@{(E0`Cg^j zWz~KgXi#@L@ficp7Z|cm zPZ!;vy}Fov(%i5YljIalE9$zN+i|dWx3bdvNIL7{`q6(E;)?dSKW{hRW^nXA9DQPT zdDvIkbYwK)3C(Yv&>eg>TC~uL$ME!Utkfpc-@0S{!K+uVp6$FHkpKd zv@Y$7J&9e>)cd^;Dz)}6x7DtWhve=!GEAASaPatQAJr#2Mu_hicU%e}<81|uL}LR$ zK?%dbHJYuDelgMLxIV(7mcnDw2&&3p;N`x1CwRH5%j1@m4wIX@h3ba&4%F?qk^?R71|xG~kKgg<+0eio#CzU(u&$vU zhUt4{<~c#y#iV9IqUS}07yDUPPaEA=!x;h$*vTP`v|aj5=>xOP{=OypI3Zu-&AT)G zaaS?b;8=n$G+S;_(aOEqzqtN=Xs!$yN(RYS?yJ8G9(>vDyr)FxK_2aQ(r0FEc+@XE zEAczxKIoh=g@uJ7ccgxL{1Vf285LZe602vFnIJj2_h7d8df)RgZ-^-FN8FF|UP^kx z)3h)2J|7;nrS{>;~K?Uu9CvLdy3Ni&Ne@Sf)fvQ1^>wM>+Lzr zAWL$><425ph_d5h1@)&1&tBAg_VPaAC`w0r5C6VJNC|~ga2x4~-j=1wYC0gwye!8! z0eG55F-;z$n8I!Bxmh<(3U3xa{Jg(B`1!JNeX6t8ak6&xZ8(FWUzf$FC@Ix9l-yE> zKXlFCg4I4;A7gNyyNQg4=Tx~YbjnEuLYjV6chUQ9OCC3$@Adin`(FbKyc2TGOoROj^q_CZS zL6^Dm@Y7tdexOMxoQ&FYqrhe-n2={k!11(pwXwqN)kFcWh{u{9yjyVmDF%Ga%t-A= zr5;RH(q1OH4T_Gtq$f7JjC76Zef znLyyo`7J_a2Yd zi7N-SWZ*r+t63Syn1T$>&6|mym$x+O2M**;QF_o0xokD8Y~4$Y*Rj5OCWP3Um@qqj zcYEI1Ta#PRPn+Bdz>)Y)3uuo_R*Y01WTZ-KRB(28QXqEvSk-Ue0ry(kpD2U zK_2mqukrynC2g^ZK>$A;|NHPvKn7aX<&H?@{`BE+^>K1`NPb?f$}1+&I_95 z2dGQIHq&Fw@ET~$e3}s7{!&Bu*qL5_pxrd1b6$d#%EEOY5VlHzMewVwLNvR-5TtYfxwg1sO6Uwi?) z00>|Zp5wg7!8ZG9y?keT5j+VLo!X6+zH1m(U_)r)Id;d|B;aI;@~QJp$$GTo82}l9 z^Bt5z4nLjG96y3GI^yx`d93L20E-tZX(V5ws^BAk@ze^QTs!$>f0K^}$-G2uyhw9pChbDO zI?ekk38kg5VTr*SF12JU1V$ZWNu@~M0q#K`s77Jte;SDq;AZ}8^!UKl7YzGU@nQXy zni^r*wn*&uS-qopY@VGF3<|*wY2M}suS+DK_YJ~`G^Z*?su$`1`dnxiyYO`>%p4~~ zHglzwH`%Jh{KJzURep_H4 z0MG@)l+;nu6I0QP1C04%L5k_=Z^{;cA@DR(`K;!@g&zM3%(60kL;0|IvwkX>%aD&s zeEp|Zc<1>5i6sLj8=hFI-iKE0C@3xU7?ARt{U~GQ>9uY@KDpiU(A`tj#N_wUW|_Hn zf+Z>3V9eSO>x%3fGieZMx#8M?p1vSC!Cit|T`sg;929R_pAGFxATUuKOkFN$F7eps zC{{)sWL}|NFif6_qz~<#X+x!`udkr(+Ca9Q^B}V*|6d+U~kllM3hN}6oo1ti@6*?t2ADou4{^1 zB4sDdy24J0PK4uNavC872(8qHr#vZrQYn*(x|AD=jPfdkrEJGuX zR&<0nT90#ddK$|1rXr#V)ArEt@;a{WqE(wsUUrG4muy^P zxyEK)E)SkmNSyx3ds1dV64%x8x8orxd*azggYy##Cu&2s&C4?}s*tv~w=cLv43|wlOQFv=OC?Iv;GZZfW=~jogmlha;fU(o z&oAjwD~fSQenfPFdHV(lHB3%ROS3Z6U?v3`&1Ah}8do1}S88Eu-;xaF%c=TuE%x?> zU9gUgFL|k=J1pjg^Wj?K9vA__P%PVCWo8Q$>!EEh=dD2tu?%afuvY@uK{xKA^j`51 zC2ABoPVw}uG9oScs1>y5ToD+mupnt1!qDIqpB_unP8EgsKyPfzFwf!hN=6Tz4Cg6H zpJffk0tgq*ua+ukKNfOF!uw!Y=^C{^G4)^}8c2V%j}jd}|2=Oe&-B)!+Iwg*q_=`p zL3`XIqGNk=lP>yph`G1_6$EWF@rEVfh}_C0F{H8cxaZ{?&MD*<$&DIYy2p{lYIC#Hq6>BPJlPj!lZuVR9IX9G+ zHdeF|zAt1a@O#%|iJsu{!&%s&Nv|vjzmyS53$-$*>vH*W({n#f7Md^n(=cvXYf7A* zG_t+XWBt$6|Az(@Vz}6zs4)%x8<5=h{njl0 z#T@ix`wrX3OQnWSG6E)7L*X|I5ouB}Ruk8H+WBr5&_f=K26{ZBTJHT&@nw0gdcxiOe7DZ6vT1wfOsC{W(i4*tvzDueRI`Hj zda3rZu!4#3V;%_1`%%+|BcaMAkI4&KTBOMd^fO^(JF=!Pa4%F3c5JQR*AEnepz zu&%GF4RGjsc!|1P=AD1;OF&VyUBhK=ZM@G|)BE1!va66%K_lg5EY=!{zZqc!AZklK zrsE#UTiW`9G%;|vjtFg74Sk8Fcmnfko7v<&UbChLedH8Tlc%yBmlEmPi#BU!~#;kY3 zFPuKIX%f@EvUUF5UJBPuUee>dWsch1+`O+8yRp5UVkJsWAZw@jD(@LDgas)N&db{| zy^z1k#XdN7$Zzw!4#)+O*<-`x0;@Ec*J1D+uxpN)`uLhizPygwEzu*0dPNF{RYLrl zO7u8siJw@%VM|m|j$uQ-))k^9ZZoYi5)a;B5NPg|@BNx}YtJxGHq^RgoSU3r*i|A& zE28v!X{M-%7+WOHuEgwdJvR_Z80eF{gF4D5!fTzq83x@rQm zijD;RxQ8Ugn@~8Ti19;=PeIp3jutyj%(oZ-Q)*nN>T_60%BbIT{3(AB%F6W(&DF*` zC&_&m6;EPTLI>f|U0I*^x30;Np-w?;-v7c43l_W{+Lj^e^aaPz+R zMkRb@GvZIh$yp_{U`~VybUb>Vk5BfZL|v!+(fw{Tz+5(%=506HE|;e;=nZKmz5Bt0 zcAdhTMk=AKjO{Mz@SJBTR-7A)uA=ef)doa+)AO+a7P!!Q-!9s(qDhLjgay*7TEi^@ z3YLOlUkyd6+2`?b^8nGfz|~7_BR`LXWzo^-*(UouP; z7E*>CHaf`%iaq4Ome_2EE!a=d_Gylahvh_x`{?CzQWe*Oh+LZFBt2d>q>0jR?-_f7 z&TnW~R9)|8a9q^@I-bfjX(U;pw(`Eb+lZj-evmOqY~Q@2uCDH?KjT(SNl8g*sK@sY zV$@?C_JR%egiMeTEu!+?XypCkL{GdjAEbbY@8V4-tsFyw+XmAd5`+AXy5@E627^^m z=Jyg{6Ry0SFJ#5r(Hk0do<9vee~tq`>s1sTL8xu-2^58dbys0aqT1-ddfx8Kk4$`A zY1nkOetm>^R^l^$&CZ$~kw}VFdc4{?Yc{7gy#Kjldhb!q$@8t}F{74>FKwc;IckWe zz6;=WJX>1zv1@fhV7xQKYpg-@Ceq0qr6L`(oexxo0+?1aY)f zmdZk84r$|aNML5ERwd~lp#T+SqJEPI6d#zaYxoaRRD8DXM5P~t3?f(vK7`iM*Vjvi z@cGHc{qs%$T9oo}_XWEy@tU4Ca_U*V6cW0A2b-pG4o}ZVCN#sAOzX`9MqF}KVdhld zn3Z$Y?UQ}Zz|qpbtMf&2FoZxBRhU}X13FUF+_oiECohr7xGWA~aFxgUWA+{5RdH_a zEcyAN;LX?tTNLhuXuMiGFOjV*6(bU~4MQz=BYpGRj!|>2%G$ZH2LD0+VdMofGp1AZ zKp>1*9oZgpq5YF+=#wJ$xSEU5Y7w6?-cG(vrw>a``v+5Z=B^~RMyX2}zxa`_6 zlAgvl*G}t~YJXU_J+hCetGdt_8J^!33jFY=4VKBvMh z!^S;6K2~BP2{S)EJ%yb#m3c|j%CiYhS9_ENlO8zVZO=@uFl>YXOg>SQtwbgpk6R=g z%3A#W8Zs|6HZ}r8l719S8muT@Fe=bG+O;on7qwpIVc#=}2tqXJRMO~4wz@ffOxd)O zP^=1#ze~Vxp4!dF_9obXQvkCn;3zBVx~Oa`i?1-Opq)>lgMUl1AHX?f;a6P5f+KJK z2O-NPdF((qqjcEGsls;sr4vEB!%R;T*~85>;1SzruvHkZKw{6&dJ~_GOpT(u3ODbt zctg#_p+q!9xUw6;{G`Z0?^vot2jkZ-*&7z%E~ZvWxmvsuR$pQ8)%PI zT2|m7&w+EsjKsmZX%r*zR{1q96A}PYw5k~Ne%XJs0PzJwdHc~>DmANIiTd&#i4xzS zar@+&^McKh0tHR(W8E~-^L+sm1hu7BOmC?KU;F@vD4RRp4%P6K*nJ*+1Ne^wJz$Oi z=!CQyaN!ceIdMEpgb_7b?5_)><(UfYbmCZxb+md`-DytsgC7&(VCju$ulDe&i)GY1 zes*0*Raev||MV0iU?kA2#qOP%qRv{fLVEtTz*oIMCy`AvOdz|Wf@f#^@m-Wh*>4dZ znwT*HH3gto2hjuBoF={VE{c4oHYk=lAGI5~o#=Y2p@x@;41(jGx#D9A#W5Mr39>n}A^%a-7|of0QWM~e7@ZXhtW(bhaEAykO&aomqqLTQ`p>+7qlL5hpCU9B$l z0BcuJzEK!@OVs8}OGz9qIf$Lp<3ignCQO8F{jK2(dsMBpFCg5Hiq^#-_T9JRIxHjx z5Kl#Ja|+1H!$-h^?RwL8o}HZm5Kb5%D+~Q2qClXGFD(n%jaVTW ztdWTGZfDk-DgNb@<)A4g;QXh34xl}ZT_D#qPHNC2Dm()h0LkMt1I_1&2&3 zjKt2vYOrSr}5h#PLy> zTSpY=%sYSL%Mnjihrf_u#7RfbI~yb~0cf!!F*`FuT(mj2moK$o6glrv259+@zhd+j zU<-=;8I}j8mmO&0M!ckYG+)BbUrtgN@4-dHG~=eW zRDONFUcoc*CK5sHFJUk;lkp^Gm4tk62>{f&CtAoVYXPw}k3U)y4*ut5;;hy{^Qc&h*ca-)066=wXrnriWN8y#R= zh|fV7AA=ZGMZS0<92S1YM=c|+f8g?x*_kUrtwSqKV;c7O{YH-qbV^D`B}s55@IdF7 z;4m^a!e^8;_U$zt&uSP{haah3E_#EU&^R1;v zS?gH}EUj!=wODIJV)HB>K_P#eE7!$v9>ed@Yb9#Yk#)8zN30^>I*X`(ypc2_Ie71p z1#-P{*BjLBAqzS8xOwOI3nI$>jM$Ri%qqcBa&vJ%Jm^%VIu=}Bt@FXm@T6konW{7- z=pQ;R7&ab@!E2KBs~pN1g@HyuK--mDLGWG~_eGLv-MoQ18kt=^$A5z8kkA+W<(ZPiXJdc)D1+zJcXYR_b&k80L$AV7sOH`bp)- zk6x|8w}73q)px{g@adV;G?wfUOB+nq;IBZ)m)?DeDFH(T!lJ|W$1ImFJk|R6MIMib z9WZ6Ozl(^iGKRd&ZxPhK$p6uMSP^$>=h;OM9Mk*7e8E^$(O>=zFw8PjmI`qVw|KqFjzw<9%9vUq#^e-oKD+<|D zD=xWV$#|tZ2z>?_vBUN8O0$*#U`q{Q>uSIIMUD!Rxxq;-C@2UvE3nEyeB$b$fgAwS z;CJX6`u?1HN@{YeKuO7?KhLEvRyE_K=l^hD=~bKHtlf=xJX;c3cLiC(dh8-Bd@J#@LjX(fUc&b2S^Fs0pSF%8UGcK zdAVBE3^)aUr}W#scpcgb&gS^_<+aa@De9QtBLr5AKD1wUWHBqf>xY-BO^|NL>Dn+xb;a`qrhR>VN zDz1*E7B@d$e4G`U^&dB=>HM=Lbb9*zg%Me)#`6Bj<@HxUaUp)?{)xoF+yq??{^5*L zEUhTm{zpeg$;rupzH5`?rIt0}nUq3;H^9kuyUGK5^z!@!8SfN$HpROK0(c~F>w$ET zj;s9in*iROs40cdARE`H&7EhEEV7Nseuhi5 z@h{z$zeg(O@mmkTkP@fec}bW;%`6Rw;pJ~O_Y3@Nu8Ehv%7^SCwcdzWO!Y)u{E&u~y|4O{c&bTB&MHH0_ zu@h^o5RYv`bLmYi`pme{A~0Nid;VF4!@NWQQAa3rQ|J09G**zo0p~+tc!?%I>5wbT z9s{(ihhSqFjeyPLHuLaC6IrgwOlTDE5>Kcdm=+|B_NC`h8AQU`Zbc7IXT5%Ip-nzD zIT_&oE3V?po+{P$))p&LKvjfmVL?GJHuehB;FF{7Fk-<6^RvJjF$^|)utII zy8K>jAqfO}a7}CL>PX-Kq;sx(ozqsLQ&19mIc*^7xVP8?LNW&+_yAmsz|-aykN^ah zjrB;r3Nqen#>Zy&cL&4ye#lcEyp>Dik6Y7D9b!U60X5z6;1~k4;m;lUYqO!w^(92| z(e^rjbwtTgcBg7up{iToiAhch*FR%Vc!Ffu+1w`#!zq zbPLRVT&SUD-`9Ej9)GI3nwpwe1}id}UXn(taW0r}Ky)R2U|`_xgU4K^wccZ8hTF|& zFEe&kg`8$2UQUbf!E69@F&4G?QLN1X)Iss>W`2+#I5mC`LIOz-o;2_DQTqK(yve}E zXt^AnnkMWNuvfySDKd}Khn517J$-(bxrZXxF3B%|_+gGz=hkl-b7bQNWUT-*%*@OL z<;cs^v-#p^DkCEUl%{Qf;qE&`{6IcKI4>j-AnbpM1#V7$Ekx)zRhE^KOeO0J{+zn^ zv$n_V^O(^`V&b8`V8N31d>ahx?9ZoMb}g=79wvXV@i%FGeSP<_UmxU4sePjOlHXWi z!w2vh_6NWSUr|(+a>@tmsE)EV)w>f5rp*wJaS2AxyxIET?gg@1_PmPwHD5(_2N{tP zKm-qk&x5cJGxDkTeCW>bfgMH~1gb)a#r}L+h`rCU6=JlI#P!Lp^=NYnyd@=%fimO- zByP+^S4PwxvLLw(s%g-dln= zl=DNU?MR-RbfP)Njy3J>U4=b~Fz5iFd&AzD0)jrPwQu|R!WaX^)X8F7{AW{`RmeMH zV~OG2K=!2y%TW+m*cD07w?}pEOSJJu<-RZMad|3~#!d02&~CE+_GX|uM!g6FqN@86 zl?4U2jH2WgT(x{#pT%1l+P>Zr(SSkcL^QPDSyV$}2RElaQWAuEOVAVHf~{t^4E3n9 z=1YCb!`8>AA0G_ky|yPrW8Wy|@oKF1kimh0ZY(VdQ0Cn~!{=Pi9Z66AwqGqh3_Ljq zl(m$kXl10#IP(SiY*a>R6g4w@2ix7oCB}?pR+U+i zSnR@g{xvF@C65hh7lLWd|5NqQ;$8DS_E`|9+pVudlcP zVRg>496MAz5+_sby@O#g402#f+oghS99DK8pgX~Tc{2d0a2hS16l_YmMTDHKH9L9f zTKsb=R+!35CfUhJKZR=jQM4nVn6p>R)a*%UF|qfNWTCqY1@%I!m{b`gw41`qgc6II z(T+815aYSR)n}A^E4B@&+D*a5?ZA-euy~Z#?@HUnOGJCI-bk!UPMhdVSv+emr8Sua|)wEm;R!^4Av*DTjOTbrHyE3hIMTktIKVRZDhB8$wja-PZ_ zDN;=slLv-zFlD(Q`u>a8Xo9tF`kTHmLE>vl84pm}@F#Vu?d@$RN5@bUYRLcd0Vfm{ zz$6PYn*V3}fGoWb>`|p!J4?=_-y$013dvSrh$qt!8E*QnuK=w! zK4E>(apsFCX)Mw5c#aT739%}ZsdYKE(Tkg`7JDSG)pIRm%cIP@#60w{kmrEN_uf_gjdiuKyZMW7`ytkMaC=*lc68abj~bKh0#7+FS|Np?#boEJ5JCJmXy*!v0@kGzmasgV8Lbd^#}KX3-JMA|@ z&JjrHS=`q|?MMK~1bVuAKn$=hZ(hl=?YAUF7HUSkRSzB_?}~oQs$N_Gntm>Oa3u*7 zALA6R{5@~loR=ibIY3@qGeZ_5B7WfPQbKTSiC7qs%iSsXh#l4BHNq8_z`awMlTybAIcsXX$dFAyChTii&tt+1&wSab&aS;ZSq7p*fv5TJbQsG?S2}Z*D@bXPz(Cpj3z)|mVaUSV+Nw+ebTXi>~Y}}K1 zZEfelDB|-lDK3}YD7nLhw(JhVf6jBRDu0$Vx{WFRJ26S>&M@qAabDj)k^A^2S)iVm z#`nUB`hN4-x1!5nQ7;T0>$IjrJ?SDBd@4Dp2>XKB$JPo7D1*~@Q`M9G^GiAV(8IO@ zG%=59C?fUngMh)oIv%ug((9=-*HIQ|&hd<>+^<&m8I&!Dr>RyF{pUF`>Oi3W!-*fm4uqLLsa&O% zx`9xTGvc~$Z~5`Pv6Qt?;CKJBYSj1c&1ezX&%F@dR@K7I5s_0RGF0QUXcaEz%{(gXH7#WnuJwO%T(&42dR~Ys%Vb8^PWMfOl zH>Yajm06LEy0dryfzIxh~wem0Wg8{ zWe`y?(;_exWJy5D30)Sm|7C>s)P1H~`QrnwzUI!;sZA?i>NpYyM$6D|>IT;#oLpEk z0V4i=_Sb9*R%JPOL}{tkhwfwlagQ87F>0+`uD)c`TcPWJP?;;$Tz$OitcgKl@-TuN zLzZciaStt5n1EdxqI8rmmFS&m@JGE`?JIVODsR}piVwYz0`4n1D?VzBK&t`@M1WJ( z-Q4*9=oK#k69E+0;Gf4A=+9MLefttm^;65^KzKh*=J0n;J(g^I2IvAHhXaMYw&$fK zW+TOi%KQUd!)x>_!QrEpPPE1tvVMq&V)H>V(ywr2ezW%@vs3k5Eqg0S)s`ZC$VN#U zc-H(-C4oJPj*bo)k4O`0&2oWV{@xWy3IP<8D33kL4tV}nH4_%qwx~kKsfu+FszF(c zWz2wV&59408v&LF!2jd~pl8R24N3nx_MfT;JrD;A#J-}iI4Qow0b`mzuI;Utot^sH z3n1GAn*xWaSW*^B6$Y9CZI?oxHkAz(ZayPB&>XGV*Q9**EJcF1!GIM!M?aLcRyX`% z!}x+RlXbjK zCtI_o=aMFi2wu_XkNNkRg-pO>L=~?1%nj?2-#XxtHxFwwr$YWwiSWvQsi947PNJ{h znul-N3A6}({hXQxE5ih4kS22w`miq6muw*ZZ^j z`Tof{NHBYXIA6$+Jk+wqk_v)AZDUEgu4!6RDUufCXQ`)_kgF`6r#}}X_~0GfHRSujF(O0ws4EmZ_QtK$f%5W$U8eFpeN`n4Q zC_EG{t4(eT10#3dnQ@AF3Ctkp;$wOZ5t(+q{SN*NN9BI1Nb9!-aPzM{T^EVMBOu$( zOLFw1T;7$#3mO|=?L{w94|^#8(#+;3m_C&pLn)&2DY`9G+RvNC5A;o!bACA_;> zJC9j~W>QQG$oH(*^A2FPjo>Owvp`3;NFzhcgOfU9Ey&DnWZuNXMc!?CWPtVT$XTz!b(P~s-Z?SZ~A!^?Wbv)5CuH&Av0s0FgHM>=zSXpf3 z_x9aye}zi88T~oQBA{3kzd@~f&zk>hao?wy2fu4N9#YA!3RZPeM$ZD!YvA$pTQlyF z#$I}u;IRpR zIoB#Y1zWoFx8s(p3x@MKJhRi0l({(8ug4d?dHdsLf&O5&1K3bjZ_clIaa8GikksvmcDyAL2_)kY`_7W6DSa!+aW1dhuAFs z?+}={zt<--96AVK{fyM?agL$rfhOL#gPWThXHxDaiyf;-26lniJTINYjT1tXNAt1H z++8j^LaFNCV!CDSv%KK7tV{7%11TDEg1V0%+w9K3X;J&tSx4G7Z*#Nq!8Y7WuZ~Cx z01w8+hLucXFarj1t_{}xsIjrJngOx(uzN3y_0<+ZFuFu96&Zg$<^r@9WPF3$3Xf4O z1Q!gwPCPO7xwU+?VIwULq=(~4Rv^sdUjx#|7I+Q#l>oJK*1V|m{QqIe=mq9qm4?O3 z$Lr>36*n}bE{MeE)H|je4F|y#WTA5sCdpP1Pvi#}D<4Qv3(W-?%OoT&h*SfaDN?4$ zBX&V%ST%t>4n!{TnjqBh10!e(%oGH3)MT)9LeyF$3Et~*u-iEfluEx-%`rUWx$bQx z3Ia4HpPWI6mkAlAtw_-u9ifTnKb88Az~7#j2L>MwHQIqBp2$YGqOQ46Z`~SD^SSQr$qtG zUafRzA&@(n^KR6!{YHtkP(^+ysF*k0`;aq9RkooRy~{V%3lh@;)V91{V6L;|RvRxK zgWnDqWJHWwE-`eAA6A09ITmwISOX;x2}PT?g-KcgfcjY_grHx?$*Lrn1ShEUyHU(Q zk4%;Ih~}&2B74+^YM7&P@Q;n6$@cpEcUp09|xg{fM(r z1!1m{`$^`fXGB;+zGM41cAOFw3`4e=$1dRdP&QhZ$3byU%3QwTvpsd`xC&V_~Pix%L7KK<#!lDUxf<(UX82t2SE-y*JL+^OEUudi>I90Qiv z_MM(ULkX&cTZL4;0()>jiBa``!F+-DJ)d8*14K%^$Mf0eApn5V%l&CyR~N^F?;pvH z9|AER_y~uqMOk5S6)l&id9h-gDSewp^?$ENFn};3M=UB2MScLYq?&=J7<$3~?kA4V zo~-LWnU1Kk+)#{Inzln5lv$-d#6i6#gfZF5i;=%^xRJx+o(s?tD9x@;$FB!zo?O@t zq>C10cJno;%#P8dFxyR_!59_yedL#`%d zuD1h~;eYdJj(5At3Ll}r*WR<%vNlMzdr1+}T3WP{xk4S5v)))}S7=8HpCgi_BI1nV zs}1!%dZut7HU%bABDE;)L(oqemQnTD3!1Q{kXC+6zWm*D^MB3B3!LuJQ+ zFuENo*{T3zS1eh3EM%I+m$JqaE0y#A<|4_iJ6FwHms&!y=&^XEj5y9Wv4K6+!lu>&2i zqj7CDSQ%l^T-Qn8nX}r3j`?-A$rgdnAr+4yBf`zm17xJojwWpWtl7$ts4XJ*&sl(2MxminEjdXy;$Oy5 zhz%G=JrXbu%06_MxmJ>4JpzGI{fKY4S#|$~PdOb49N42g8ANUG3l00c;Sl$z%IEyl z#iBQ?iXe>&ppf+gq0MG6Q}V}S7-WwF)L%fmE`o|b>FL)!wljlkeg_jATQB`Ljm|EP zLkBcUKB!GMX9yB$CaA+9eUn^jbAj;p@=RK}f^|2uNkpepqV6Fu+57p0b{!TZ?rgP6 zHii_F3UGhbf8rQXX}lB1{*5FM$H*C-pFj>FKSGpN>;u zjT*q?1(&Salmik*$-7lBhx+f!Pw}h2LqiVUvQ~@yG|Fwi}v^Wvf2)eQ2UK5L_>o!@(j%>3;)Sevy=d z$++F2R%yk5S&21ZCCYOD!%Egh4v&xJ#1BiSHrCe{e5B~(K9m{(b!MwjJ)}D%#9{W>amtgH4GM9lEn+7q23Wq{Y1WjT{P!*hD1HZnmkJL`?(ik{fNZK^ zvN^~nz#v3z`4}*>15!KD{6yFmJZb%6v6zt&9gno350Zd$WfS3GRe?zq$gE5TxZzL7 z1rcNe%^w}79`|`W-$}gr&{aR}_}I`*ME2m0s}K8L%w5=ssfaB?h5qY*F{D=xK+P{3Sb2U=GNg^DnC ze`4?x-V*dbb|N|0mM_ ze{uE}U{!YA*6@~A1ZfbEmXem1?nYXqlopUix)ezPDQW2z5CQ2>O1cyT>5!C0TK>78 z=e*~8&w1Z-{_pzkOTC0^!@l>r*IIMVF~=AS@1|pMU_t-U1=5|P;%Vy501N${9m)5Q zQUISh=y?E4+r?cEW+KQ7VQWLpdcfAX@54);z|eiVZuv>iX( z5#+UhF|VMWDa`(>p5cgM>#Z`Qcb_VG%wDmMFvF_jY8&YX`9<$ z`6aE#Ch%!QpNYRqFJh;}zbw$yc@ao9e&pY9z z#c!TgHgBK(Vd|DBivKqJNhOW>6*XsdwPMBq8eNctef35?UjEhOJ10I=lj&{THGn_{ z0r{`E7+L|W+%9#76%T@Ptb!lUt(pL8kv;e0MT5k+vj$OIckZI#iO&pWtJ|~!!@^nf zqTqzx$G^n_Y!E-VUP)yk#!~XHo`~WpBRm%}J7}4%PGU=%)@pwkbriJIC$aAO zGB%4(3y-I@&eM0%XdFGy;G1PVd9e!GM26se5MlG>#rEYKrugwlVl$dQuLcRH@wxcr zzBr^98K66XM0f2N_zBHGh=8Q=x|D74rl8Xjv~Yjc}$s-0Dv;>+npP>g zUnPzH562{2{($qBWl4_mwQm*$JyKN|=jDR%9J@4M(3Ui9ZalTO4^~Unskuu0l4clF zr22p(`0=KreBP|ptwmr!G^7LqfuzcM(hmnwm0&SZ_G znz0dzJUigiN!G!(`8+J7$Pl`6(yZZ%ZOi!re0o$mWv>wF{rcrSW! z(153DV{iXc5ZAmA8qJjwosti-Xs{fI*m^%~)X#kl8d8M(d8n@H_%I4A)`bYl!ta$LsM(OQJQO~gzW`ymbzb8KuY#O6W+^Wn#+UA$~WIi?xhDcR?FM zsVP*sevN|PP7rKc=Fn^TH&h@|EJQxXpQUW2<}x~#=_HaFX<1Bh%_~ppfA+*aC40_r z($7*+s;b0@`c0ehCi4y4JuII%^VT&oAS+)=s?vSgyHbQ~lnkam;`-u5NlD^DiCM&s zl(S;rvZqOlvGi%X{dOgxM_z*n81n>4jwv^=pQo{3ym>@P5(vzG@8{7iJky=F zWKDQ3C;z@5TD$=_@fxlYN3CySJ(qO12Jz;7z9&2Uanq~yNOiyC|5ytd!MX)oD=(16 zE$$w}0#{ZaEOGAV8yETg-E3#!e19@u^iH|xxiAN)dq&+IGX&U3vA^;hcJ>G*yQ; z0ZmWmu#>`JYF<<8kGS{It?{ql#Bt9VUNP8VNhQ%)OO&1x77)qAODj-=eKfPwN{RB4n~#TU&wTvDluJLIC~7Obnq$& zMJrwU=tWPJI@LqETjZr3bEQ9iN{;YmY`1w*FPo}mpr#Hv?&BX$2nl!93^Cu+gEeRM zwKZh=g#0rS#|1i#D^71 z3)*ehiR`C5;Q!F8Vs7)?>Q_}&)!eVo_)?vnogVUg_Bi3&aaL%^ zcYd9p708Hhv0%{_Rx5w{fP=2*JmOLh-Y#orUaM!+S<{ok=B@;W$kk{zhPa(HXPFNY zBs>-QQ|ugJ?Z5U4@9Qpyo7ODN6KOSW#R?xt=4D|VVd0kyyS65f(h(jF* zJmy_RZeglVeY)$0h9YTTkSak#6QckSwOkG#KR*Z>0wn@aO)xPr(}cD}jKU`bofr5Asuz5PU}`dnyPD5I|+yhtJ7OQ;G-On0b?oO#e|^zP@y zm+J3|M8KR6d38{fFTPHcp>uO}olD@`9hf5sLvtVss?ll3#LDXIl*=aKNK}@21VBkg z1SxPOkDmp-uBhOialTc4TP9wXF^+Wa z($gc&@Y-EKH{SmMK3m{GBaR(~6=u}Cn=_BuHQMJXLglvukiG~8BI6d1dFa89=klKj zqOY>&BLc3_$JhmP5g~B0;8{oU2!W)!jfIob!P?r|*0zls$E(il^?^-F?F}P6y+kbD zh#=XQg*(ZADur!sC3X^Tgx!<5<+daoo0Q8ma+iplJm%H)*MWgiS7f8JO*1EkhFa$x z`}+DEWnSv_fE2fu7*E~}6zbbWZI+e0lcLAJ$HsK0!dYSz92-L$2JQ(9?`X}1;?V|K zu{hNkhRHmy!S1qH+t}#Uj>fuOXJ~J0YinkfBSZH|gKZ`!4HDbR)#W|sTD|n|Cy`(9 zI9tog%cH3as;hPAV&+OmpxrfL_sqqm^6gtHKg#nt89on@8PNJW9tvk5oh(~3^WZZ} zDS%^PP2|m+H}xMpnA4%cmx3L)c35r8NM>Bf;By(%xWH@jhb*P0#bhzBAIML!+JAdG z$|r4kxNwT$hnmrzNcJUIW<-)ej8W6kMCfoPy#cXo0~s= z)MX?2@%{UQhYvqY*hx!EPiYse-gL?hH4x|hmDObG|h>So&z}j)2*!m{g&fnV;`%k zl2V}?~{PVoRMEACntx7B+3*V=ZIzts0sIp|#p3lA2-XI>Q(R zb8~Z<_?LK}N%54m_dGMC+Vn`!l?iD_kCp zD1nR>O|-bZ@g^#CF@;2|MpD#tWISj%^9q8$p8wW$E_t91>oyWi&h_dvfj%znjf%`K z187oMFzXhFa4-|0zqh*FEaQQTGh+h7oZhvVoSI5OP7cFd_3`6E{Qs6IDm(=N!f@gT;a{Y9f*_W=1XM zq36t(FQLGP83nC+vjk1+SpmpWH(--{B7uX0W5_WMlcBvGE#ymWvBwyGf>Ot?MCfNj z@jl(XJEX#z5YB|yJ@Gl8V<5O%jtJP`-2aGYbp;`T&y!r`cd^tF(UqE_$!XMc6oaALjS8#NDF{64&R(VgKx=6AXleR5*wqwjif=(f@5 z>eg*FAY$C`JLUd&+H~8_XY$0u) zu=8!PbZXFt$$b750n3IG7gK$xv$FB3j3iWB59CK-3+n5;-j(TL=?*jbtwwHnIj0s0 z?j0wyB`6SjdwUHYK6LyjCnpCtD`Un~;YcteH}d5R)^?g&p60H7GCYRJ$jEQszCk(N zyZp@6wW_9OF>>5#HOz{Be%8{`5`Gja?|L3Vge>RTsYS6;8f-AKpFhte@%KMDJ&5Dr zQ1tRz0-rltwWc$U{nDD|iud17e$_<#{W-}2w&4E$y{Av=HVQJX#l>0SCxS6$Wy6`C zSr^qax4f=Swb<^Ok9eiUO2tedz z-yYBtg!T3JJ9&XG*-)1BZXX#W6m;nlF!Bm)cv7YeB=j(ONa(o;dJOmdWr3u}U~ zKT2U?Cax}1DG1(j2;k5n(I5=M+u~-*cZlmYCnSt}^M<7H>FH})>FY3luU?t|bccmQ za5vC#c~?^gKz3K*TU`?#81+$6Q86(wuvNX3;=X&AKCT-UogmShqE~r&x50F-xak4| zfxrmNQ=W!Q)K32Ux{~U}G8b%fS~*k5x+Dp>O;qBB95dHsoXO>Htth!w7fg;8Ig{9RIhCrs6@1?A zHUx76uF=t)`^CW-`zz%jw{9(SbC_WkrC2Z^EYQl zEP${_`GqdXkxa?(Re=g0FYlaF8l*}xY|IyIFslUfb2W<~Ac;^7e*H=$o*ol}Z@i8b zGT;$aS5{V*m6Zj*AKpd90$?9M&GV12@2^$DifPZi4f&hx>ix>|bG~-visKCbrA1~! z+OK1bQdslMge|$le@;?Mst&eG7nPJ!HaA~c>>cgApRU{Q-(7s#*I$H{6@`0Zc9fuv ziWpLcTxj8C*KqHbSh6q$wsdL6IN}a&!7*OK)LmI0+~l^`T*g&RnF`Eu4D`WQUPxMA zAHHRp?=U9RBZCE>uTe<|cu4ymj^zR~wjnBvu+25LGN`rx*q?iZe-wb+>FU>3S6%Cf z8DMiu)g;(|?PyEqCzt$T$5GwzsmSYi=I2UzFsMV;ydv2|UH(uZ=cCki>#D1(%gbXX zhFS^E4<{d+HtLEDTu~?f+)L%==jem|$JKlQlE5|ptF0cY2nj1<;(kBBf(+5c13^qH ztNq4CFQ0%^{=9Tiik*`cft7)a=DK7D8>Oe#$KDRE$@V2PdZ>uZ&|r)dkJ}1C_vPh7 zU~BfCe*{bsEZVh>)_b4{#vnrVy4NH-^jYG%-@TTXd%0dE*EFFHb3O_&p7_6`99-?dL+x$_BvIigNf3&yD4BKy_ zfo&Wl5{9stBhAD>T{<%}Fz;yILjcr;JX%UNf(E>KRkmGzaV%PFY-}H#VGXs$3PDpK zw+hPeb8)qrsqac?(mn5*r-!WBYByM7Bw=`bT!5RK)>N1BC83oCxt0ZN8AFWx{2%%F zzKPcE?#!RbM-Tkjto#}q%c!U4WjGbz+PXj86WHO!BzP?E^Ex*6j?384{qj87*5zv< zxO_jVH`wXY`+r7KJ~=sHX()$ZcV9*twSU0386O}2>eZ{oE15YtW{*uDKQ`sQqI&;= zqwzM}4ee>I1sMg!jhj5VF7>eH6A}{E(G?RzQ!yY*zL$|;@P+{Pc#o&b=LTgQ8&Ay4 z7MGR|E{ zBy$Z#NvD3;Q)K3qx~2K{pxnr)_SF5~Z|quVTB?9^W!k^6umDDeUG42Y7l-3mSups= zr>8S@E>_1o^P(P5ZhGV$3bvym0`&4X8Vzi0Y<{-))zxhtN zt)`|1YLm7wFc|{Z=(b>-%J=WFaB(}aUFd>fy{3_4u~lokAs~ZhTfHw7@QqWemyDrqWFneT4VBg)z0EPxp&XyfvLCRVHpa@HZ4)Vqe%p1-wF4)(uJ=^>qNJz^5kcgDDYu@n#T$Pnh3o}jL zcj4mUfhQ?LHw+4jP!;=`#*?${mWYmpfPesSXTe(oxtRX@M}c*9b*x9MtfUBpm-HbX zVYUh)fS_C=Q}I-Q?v{II?=QJ+ua}H@I6ij#Kfo|pxMOVWO}`}}XIyOT=3m$Et!eM| zuPkYW@F9$hpsrh4T~(-JqXKEf+@}{XI(G#G)D;v!I7pp)_mizvaBwh{uxnvc(=BAe z`UmN+8WK|CQJ(GGa1jh;lydP$)6djwh=4N4w)2-}LtRCDD)(vB?%cUEX8LCKruc!1 zWYqGPZ3A)mGCQw#&DBdsC&5+8&8_-?U<<&lc5N|G@>=`uQ_h+8pD>E>L~&lkpg(zvL2lF)1L^_YOV2Iwc!@z2^eOi@JJrRMbqZ6TOr*DAhp62~VIM9g0@4t)h!z=Hha^ zI6V~HZ91CSKRV*%hq^qKC37CS(SbYr;=W{IIy*;4Qb#a$han{t?7a& zZ{2d?{8`*U0)Uw%o+%0fBWX+xBX%q`@GX1?-DlQkAJzYogYyM5A!4WoLpCCR3TIR& zCNc47XI?t!byL#?SQ?*IX(9@3&VK&_Jt>TNc>SGhKiH|#cr27uR9@BJ*<-!Q{e0q3 z7Ww;6yE3tO>FMa|DQvI3{Cs?T+;HlCmn9jCcAP-(Qu`8soQB%k17+eX_XB#DKRkGM z&wZ<~fzCHThVIbW_{&>SZ}4;?ASW;OdC3!?uWwM|d=oiDf9^8Z4|oq{*D*Tx<8I%A zotc>=>w)(B+(#itQ7;=vp1b`RD@;pz2f|8>>O zc=e8t*VNV~)wX{AyZ{?kag+3;xpPqXf~Wm$W7boYgSYFmDu*co4l_WL{bq#SFGr`* zV6)rdea>d^(e9BA8iK3}LpF0_nxr3;h9s06uU!`8c`q*3dbay}dM2B^k3#Y3!HYfQ z`b{2(nMNob?GwrjeSCZr6uyAF8_YBoqVR%(f^eLNySuw3U^?6Ij2&VT7uo#$Jox@i zeXziG`jjOdf=em*I%D=QTYqRo=(V%6b7Ny;XrfXx0ws`!jqSRB^W(=z8$0+-1q}@i zqt?7kOa*XmLsnu&=3Zy-fa=?JNoVH|adCu^aE&hE>*0Q>AZ_ibZ=nNOeEzxKWB#UoT?s4YJ)=oP;uw&d6C@RoVDxtyYmZ?{Y3WlpzE>>q%d3Lg3HZtBA!d_Yc1y+pgZrA^M@xaUQgBTBpy5Wk zsQ1{nZ*Cw_At52*;NXBv62_x_!ag!6&f7^^`bBA}QbT9=qsobA&z_C2fSWdOB!n#{ ztDcC7iGh|>_iaM3d#TOMWOsvZQkvVhZ?mv;&mb>9aN}lSVG)F&SOb`KS=qqwFn*17 zPu{7({?2?G z4wGg>6O+qfd1`zsZ*e)0Hy*tc3Q;T2)6r2Z(ALv~O1#JLqua(9(l-tW!lKM52bd7i z*3=EVNi*x~CnqLuQs1B!OFORRG^&q}iQ)D;_h5{J@}szr=37hhbqrK$GBPqe_9Mu^ z+d^*W{Yoa%)zSFLbEG7&i|gFn?C{J}RYPMwN8b6_yMQtmL@R=fDA3Zq%bF*-?{V7W zLKIrlpXwA+#9xZ1dVJFw!joSsBtX~0$ zCp?LOtNFwKf#Bx7yC6Ggd-XIbB%}*wq8xHoy|1nYPJKsLM@NSY>c@tLGuTGKe?^~7 z*U^znZS%tf*mHgaByACpOOB1Txj7oq8Wm5L@Z#cdXn#LlXb&qkDX&&w`1&p6!O^*= ztZdz$ZRQ3gVyGOs;9vaNEmmM+u8#p*H@!u9t%#(% zR%);YA3vt`D_X*S4+K^?;>ODZd4W`1n1chi0C^-0cq2gD1J09SXpV%pfR(89r~h?Y zT3Skq&66io(+xf`QgJ7U^+(5VfY2MM$ z(2$&*98U_Q>RXTvU@nrx7rW8(x`2PnOQpQM6Q4i{FnK#h0g!fX|HN%@1H{2IJ6@=l zPonWo*Y?!0vY_#PC^*LOK~u)yQtir|j-Hmm=<;QYeVP3Ux>32u_vNM+rr1iMJfH5c z^YiOY>)fZvy6*vQJaDGLT;dDvNnQ4KFnBG{ER5eW7ddOGd>p`t$ZWw0FWV0^l!wG6 zPbKLO4-c=PepOmnxY~A#Kxi`% zU2}1EHunC-=cZ@gTEs)CMW?9VGSk5a*^w@Ug-xdjOJif>)|mkLtI;U2D0_Q*ryq48 z_YSe4%@4l|j9iH(4(zt+lub2i63=c=2`DnxmZnoZf@@2M!v?QX*$H$B6X$& zR73#d&}6rS(nD^YuzOGzexAmzZ2J&%M+%EpFaBmyo#WBx>$(_`a$0^4etv#1@DONh zZ8w194n$BL!*xyaFqzo5#VmvERseQz2_5z62KOVH zq0Q@bLWnBDDoEt2#xqxix8J0sqzG}l*l*RJlrs}n%IP#2V2^x`4jKRUty?tX?b|YI@g`_gi+b)cF#UA_vl`~JAhP^) za&iJm6jWgM?ol+^HO4D2h}w2EKKu31(vmT?|1HS2!-?-WF2G!Jn66KViP3*OB(-&LjXN3GKuXk0;bEuGSWFsZ1h2qpt?!MiFeDt=mn zkO?R#l)(T=*2-4)T4@-6g6MKjNa!XxxtxrQh{q0s>8+rX>E)jb2-|>bvXLlz;==aL z?1Bg=e$;sb@rY}9PeNwg*NWoBal_cWY1UlALrY(}p?G{`mg6|f zZ(=eFTZ7sbi-ExpU_$!9w6(Lc3W=Vco`&Yy0~3=$(~9RWUO1U1_P^0)tu8Iap@xPW zYYQ3e(%jsALqoQ>!a^8ebi@H3GS`>9ilQn6yo||i-oePX3SI&yK1+4OS|{-?LHB)p z&YOMDz%$3fB2R**)_t3bd)Wt^U;y!jhz%F~r~UrG$^Od9@-kr5L3qjMM@*(q0F7JI zx{VI!pwQCN2KFw$Nl0KfX>RNdfw=K6fdd6mUwRp0hAjNp`EY0tAYS`IY{trh^Up9Y zBLvv_e#v!4QmtG^AewUfdnpbrBV5QM-w-5xSo#{tI7^E6aP#Y;Mi+!S5 zq{lNedjwkwS_eV## zwzWoeY>K=MQMkE3nRKwS=BtB;Komx48)-#?Vgfu7#uykG7#SHqdqoC82A;Vnd89Xe zB)ID2+}#c5mlQR~rG&Q4!%g$@@un3L7rWtEKl=p6M@Ob*^|o1cFzP@)^ZXT=aML>Cj~#Nu zMGQ&6%V_E7q!OBjmy7=s!eqC{A-?uWs%c6xj~SGEu38J>GO(x|z1W6B|z zdP^7+fv66UsKgeH;`ys+M;HAIjC3^Jy-GGa!34nBt0R;YSyWw<5Qwz_ozIse>xU|f zHXxra87ysXITv%5JW8B4@wIn@og!mgHOIAXhY2w$*Y+_+d&W(S%MF_FH;1xWLR1`C zE;JJ`)Tp9sATVscw_6Iwllnqzfnmu3IOU6kEFT=Tp!@$CD8eiRb(lssnIKB&L}aS4 zhz@*opkT@BCcKX3cB3o)3gp~~Nc6ybA7@l0orePd2c8_$EV5_zR{m)6I%Dr}=6{J2 zrkse=;NX`@WUlF`2woD`^rO80DNt}25K~iA6A*lW!|MPfzV>oqZO!w~xu*{(=Yn3o z6II+7L4A!-U&%**um$|p92CA z!s&osu5WJ-T2?NPDQ#I8HPa%#6iob3kQx_4NT5n)PFTSSeq(-3{BC}%&YF%L_v1g( zu%CN)7#XcR{fdvA*+#>b(ZGW8-dj?H$OV_Z{T5UjPN&(j5s-ZeQmX0d>OOnM?=|58 z{0*blQ@{&_#DE)GiPTWUfx%sp&mPPSJXtD7TW(@oEaG!LMK(9?adw~ zkq%TxJ?Ub;!cZy>4B)QF<%;_p4|R2g$mKv)1>X8lx2SIYVl~E)#;(GQ!a92&_OMb~ zMXJMu_}JtjY{*G@5KfrHQfH_@bF@*VSDNAhyPQo!81GlK0ST0&=CP^Mo=w;(=4nDTyW{lqY3W`Bz7#GlE>w0rVc|*|+TY$*R94bE#~IVHa&hf|kr@jI zhdtmM*4BWwzBafcn|S5dS3R8M;*caf3lv0vCZ6?gZiqh5c=}y(m||zb#Hc;(546RW zDQSuRr8tvU5dzH14@gWFe_htr%-r!V5I;RV!QlvtR)+EN;t8ZYK>E{Glq6(SQBY8r zbFPEe_9k*}?_~kW017W9W#!bA6u@K?60-}7MJoZa+S%Db;T^Hy`39RVyD$V_#~Ocs+M5!M;yoMFvu&HVKA;A?nNSj5>yRt5Po zc~E~dw>Y(j;sfXnXbAaT%U5Ax-5};hK}Fpyg5!4J47m|NhTGcAK%5K-o#4ga0IUEX z-!#OCzW`W(CE?7m*f|yq;6>;pe#8_d%{mVy`>SNO*F z4U3i{SXK3@s;Lyz#B?gJRtaGwCA(g1mDg`O4J|Ik#=S?+Go-|Y$~`YDOLCg{O1W6w zLEiY_5o-Uby`5v?W%tQoT zcv{Z`QE3?gZ6->({xw=VL!5!0lXJTdu+xFGIxxUC(fJ7*uL>h!zTS&ZQW{BE$Xe+U zLNdZqeErigL)LvVYHEMIOMAxKgtSW!7uGY@fw5;wN}6b_%gD-V15g+!J|#K#uSmEt z5ImuoEY>++Aw*UH0aq~DQ!WbOA6vTd&7GN;n@M4&_~EkX%GaKGY(J>=ew=u=>N=qf ze589I1K%3Mw0{1txNkFN@)sZJrLFgq-aPt;f<2p06U=*jWk1HCArQY%1K}p^BN(H* zdcBffTGB54<_QB+;CQ3B{&`0){bV3;TzfgvtJ2zfhm|#j|7l81%@J(B!y_ZkbFF~@ zIs8@}D0WaO9*&oPjl_Tvg~VuZ%MI))0E4m#8q%z^M_Zqsjq3D)g~e?qCMX2JgN2i` z941{(;xB2L9|;mPSlHNL6LTGdo{dd~29LR?*x(TJf);=}1_tx#dSod9?h2!$an{4y z2SWM(4J%bMLDUHgcoJZyw`gExK`8<#GR`ewNZ3T6acj@g9*D%`8gH~xi9?}#1qwg; z^@q}1lhwA#$;o#7-r!yZwwn^1-dtfHOa4tUWmCj-UlyWu_EQmJ-zdOA!y_UV9R>CE z^(Q7K3P(vZ8-)FH@T36TZ-lu3^9nd?kh1S-#``QUS}>JFo;pLqnk(29=8*>U&_e7NNekJiArj>nq^>F<1Sv8CdR_Q>pzKCETOxsyR|rV_TCiW z*u1>FW5~F_4-AyuxQpovi2e~Aiy7ywG`s>@VL#9U0mF+Vf|!!>6=8$jN8rE!Kj63) zezG@QNKg=(r@aiUta&EQ&eOM~um80?1+jR~G;VZS8;iOhPU~#f|8kPn!>d(!?v)&fo4@es?FJvQdLB!V{#*;|8o_lp+aS<|vF4GG5Oz0>`JP8E_WrsyJ zV-c`5$bP|rMJiO~&)KDuvT|>MdIl?tHRSAY8FJLTduMmDw``=##>~vjz>o{MPEiqy zh=`#l3#;GqDK@V;M6VQRL`HjYk^IjjY(V@p6t0Ih|`*RT*0k%E*_5fRET4L?MjzOTE` z`9sM0AC-~k2{n@S0IbK1K~Pix=Yew$#8hG#CP$5B|5+9JYI;#yq9cZQ|AN3ynp#L7 z!ejCuyR3k+<&shErvGIGzu;ArL#^ zP>N8?%E&N>@hRrAH*tbLC8$!5OMP3sFQ+{$Ixc1}v$)OtBvvtH^$s5E30&>SX+9R$ zFe)oh*K{X_RPiRDJn~J}!*+73H>C#ginW~a@na6YIRq`7aS0qxHw>CeC^DpCHs6P; z_uM%r{BA zHTUu&Q)t_B)-Ta3ENJ1I5t5k98VDbig*t~t{T|Od>2l@UN%RN8QsdtXRlc6I#XcFf zvs)@P7Ts+P^cF33APp6i&N0RPMSro4=`jf7*f^58(MavqB6}C}sclSL;}zN$2Ls(a zzVCqbX;f*M4F^Q6++iU~Z}Psdv89JUzqbx^?z=kHH#ZM_dU2P6JR818N8c2-(QQ5w zjHA`lBSk@x10)7fY3Zf`PfH75aVB49I3P!bgE_{|xNan;idUQF`_A!hv0@zMi|2n#9zVv4CUrmBGF>ppS{H~g<0u%dB&?z_@~c&1Ooo%ypwt7EByAu$B!LU zQh)OLo+^?iGKh-qtz?|Ja)5KsJJr zMOS}9Q-5M_!m5bcmzSh~(@+r95T(WI=xR)5CiP!^57$d9EYk8B{bbrXU4Fh=H$1Jj zy^!QK6q|U?A_Y)~%?7qK-e&0fdKS#Z9!*hkIYCaD3r=KBD zjC}U2^Z5I~mdRTCAr!XDE9JDt;T?NFptIOJS+`%h-R#|H5iwY1)KXm?<|rIvrKm`# z@h038WqHGz)sw>3=Hc#@KQuu0^i<5b*!QoWQV*G%f85}*lDgRSBPmr2U+UJaJ#ofk zURV=_D9H7E!JX1s_!aA$OUxCiU^tu*4Xc_)TS3+|VnDAqQX%MbRJ3@r$DeZ%^}!q& zQ@2CxzgdDoLp$>%Iy(O4aIVFndVNHMkdv>hY-Psmn$@6SPl@-5^CwahmD!3#RZh;c z%uHn&;h2KTN}<1Rl|7}&pJLfhIH=MJRqXQo=TzOSfWW@0Y7q{OhM-aY38k1S3}SIW z*}mV`xIa#Rw2ACOaFa66u%_i#DT&d4WEF@xUn*uY({=ZjsH+W3wD>c|IRETh%w-Vw z_9pc9j>~0exobr=f8fyK+iu!qW@QD4WTSgIwbR9X+fg)Cx~Ow*9xUu6Ze6QEj4$j8 zbdo>dkC-E^PJdvy#=F*&V{8jY(kYd`%H+wY#UIe*N6 z<-T0hxz$_!?GhN#M_d6U$SpEG&=o%=++JM1#ujRuWH_OARr9v*yR)Oqw<-0nJ?h+S zK{(~Gyu>Drm45HY{KrQFLF77v&4)_#;cWsp28Jomebtr3npwh#+aMJdv`g}Q{J5<% z@@Dw@&@e3vtBr`~UY4urf8+C&Zv7Pc!s0NzdGUk!Xq1-C*vE75t@}WFs)5!%9ql|g zYS25KCYsDNyI55u-z2_~{Svu}1hD>VEn}xLqKEOQ+@-p~$Ma9}-ROZdPnF!(@aU$m z<=*LS1vwTFKpZ+rVCa+o5T z26RTs@f8!ln2*HX-cnPuob^4DF>)JHdSA&56QJ~p8SmLJ;$2QyYR0#{h8(j|J(FcL z%**e?w7Pn?s*VNVHJRv{vJe&=hPA~u^0Ko{q4v3>s0T1cLgMqb*uYCT7@hggAK#O; z_2LBni!COuX{FR$t1lCG0lwwMtbz@Os>T`+CG<@kkN6#C8WtKz#EN~ySlP&pj^RaIK18HM9gP73$ z*QCYMrvRsoztg8Dy5~|O;Q<4hfU(Al4!9gaD zxHH$Ff5GmCdxLdAG*R`QwfL{0_rgF?jl2)sgx?$0Mf+OB_Ncr>dF%?<;#9_ZdQ3;> zKsN*m21EKDoGl34gLID*7%F6cT0o!%7&pLy6mdq#v9PKp5fp{rzKT zCqY6ErvblkWrRurD{E+I2pVkQo<$!t`Qt~+>3Ye|jwA8*FO_a1_#rnZCvINe>)6;p zMCgD+W0wJ4Gnr{{S3eoWhi201;-YlUFqAuBX#rY=v1uFR9cN-fB}W?TPd~D|(?9S+ z5MYf55&C{s=RhQ#XPqBD^6Y39ue~;r?k9s@> zJKQI}fB&nK6@>TV6OA#F4yG>urMr9g@UZ&*dyqdu8$Dc(hPmkP`GP=ERefw`<^tHA zR(5{ofbXK4we!*vwuv!KcG-ZBudl_!JvgkJ!oW#r|%pjM(&+FD(u;fb+N$HB%{R#K9}0-PWJX%*|t9qDc()>xRopvYAhJIRHz z1=^dSC;VcPuhdlj*PY}_W)?~QQ?HBk>_2;5LonHZPxHmJ!Uptxwzm3gV*qsL%HIqQ z2?4$fTtGMV2Z^+x(?0=tDx>=Ux2#AWuV;z8b?Wi}@Imne1fJ#PWu(E<2tc;LshkY? zhJ3OCybopyxBr(Gms3{-0cb8jAUr%g3{(Xfa4O_oJ3ZV0tGe3O@$vELX(I*#bPS9# zlNKtb=D%4D@K#Xci1?oJs$IW&l{T&$m=1t4f(QZ*3B9jv{ouiO=xv3G9obLcDYbG} zL~aAX-`RaPr^JTCsXLa7w#|dE3Pr zhWEOZ^LQAl#9f#NSrD`S!PP|Ys)dl{vp(0uKuaNK{kv0jMRQba4VD_m0 zUOw&UoIdE?0rpK71b9A^`rE03gmq#vMIo*^Ukr&2$#Ef%mlE)+y`Y^$bPf0-+v~Ia zx#o01hRTK)S{J08#+wTZBb+*DF9^^+APR52+ru`d#k004q^hzm3o~>%D9y1Jl(NU7 z)xK}=p5Ce}a$11r!A+&Hx%h^t`iFE^Lm!zFk&u94WA(dtuaxqX3S0!!;8@P7Mo%~_ zt?@<#ee+e&jv+1R-ims!x_Yhj)}Ozcb3w~&k&IyUc-i{=7kP0*gwvi!#6DO>p>FumcANv2 zqi}k&Wj{G&K5_m)c#x1lq^m(#18*d&%86AA7xEb^Lr*?)=7|YS?Do#it%*wc`a>z` zYKnMp@$hJF{a{x8nXYjW2|fCIj&rTmw&S4`&{28u0(ItI_?M7>z=HFftuXC1+{NUR z?XDn-3Ee}hH$yy_OK5d_IES{V-TW(0(a-VAv%D&s?sNY7uOUlu+sqTXM<)Ik)fE*^ zKr01k7To4cA3h`pssn^0pgM&1`ho5M;I^foKS_v)HosR$GhPDKtIW8m9+}-`e;yd% z;O8f4+I*d0udbsR`Kb-M`V$k$-+QoVUBQ|T;x!O%>l|`ey>>cbY3>8-c6-VI5{Cb5 zdR;$9UmaU1WHvwqINLaQXzgif8}b6lh~GF>#fz}uNy=bVXTF>)yXSFcalO(Bdbl6i z_29`2I2?ZckL4lu_nQhX^CuGFe!Yg2L`1GUrwrsQOwp;>OQl{C7p z#g>%Zky?e;KTHm=4QnF>LLdl>X@Yv9VxIXy9F)>0d<}NHiT8 zL(J3Ua)kpIETE_0e{ra{f=#4j_P)EX?-gWfKr`?|(xLzyS4|VtI3`Qm{nF8|lD@;3(cBirt zB#KNh8QwQG`T#%7*}=)tvDN=M%g7nF@l_xLj5enSX3Aa6<_SMKF_2XfhLH$}a;ejeMkh@U8Q@7^LRK=~@ao1x!r@$#nxbTpjul8Tr&xU7mn_y2aZ~8qs>1JzE)qMZ#2amM@ zFYVCR`_s2_!2dYJDLCs|P-wFFQ!E{t66ZTdPFp}k7#^;GeJ6?R>kBtt=t_m5-n(}% zxiT;?FvDk05n4mwr!6gw8q?C3^m#^4+7=e#f@MHZP|)hCbz0%-Qw9(xO|^&O0ZH-p zNCJH9WtcsHVp8##W5vvr2EH%$kD3&1CJFdMKV}E56_CRmpR8nr#e*YL*D`(5KRM~Ol6Y?yyePk>?nDKA!IoxzXLlmn0a?!0nM^5FK@+dsc=v$&6 z?bdjlLXKgJeM=|`$1dRDT!%U3z5i3yl;Bn0C!nhWGsT*(y~if>8z8b_2OKV~;$ZF< zIZNqaWou<;PKngTrsV%VG9OaIcfXG>m_40-p@-;T{~ULqU-m8j59_ul!eAP#~o36a6`e z+DawqVzP5`#4ip;VUx#0erhRaXQbZ7ee?U{r%yrB=zFqfkv22yz~&Q$I1uRHHaql~ zexbrRTj$cXk2CnA#y&MAxtafGHLg<^Ol|k=$@C-M^1M29+T5HRX_1J&Przw?`pa&& zqUnWbOqmicRu=R~L7|fBp~x7=cd0t6%XL#hx~U#YYOiU;b+V-EyjassE~JAWzd8ce zi?lz4(@Gs3cM3B6!fRyw;6xVS)$=`_m-9iSqGc&q=6*UDFL&-@mXtD^I^?n|W{@-a$jrhgVDOj}yN=u0L;z*qUw;XyvI?=o22tfb&pXOn?4=b)9)Q z)cYRCf9FtyN}40xgeFUAk)@(+$yhSh&{#s&kbNT3P>t+Mi)4$=Q6fuGgb=BmbP%b7 ziIj+hPWC1DJv{e$&OP_J{u*P38T0*pzn|sxet%f3lizKPC7ol7{GFz?XSa3m?%%V= zA4|1m0jk|FL=)hypatXO=FV&#z*0eQ51~PyP4dye2zWI7m)H=#*>Zcq$jhMJnQR7t)5gXD{sE?-VhOFOQR0;MM|u*l+5BPTvR{oRol&FceS?~Fdi8oE83 z+9vZ}=KT?HkMBAP-`;98q!{oN2t~CBW`&8aE(F#R+_D(8SOnR!`_t4k#f!f?qC)ad zxJKICb)>5j9Z+0)$l}NskAp=$+U1M$7z+DJzrq)Y)8ypk+fPiu_{ltvcGjjO@%Y;E9@{k@O1U|E778WyLQUVlu9`}v zDuZ&;_>7QK5$-%}cO~p`(yFycalx@DAT(tfX=t3w&UUf4|8;B`AX4ZwPk+fTjkuDP zB@W!O(PE=&@Ut7poH(cy4W#kEggiK_mWuw6V+i!j!pRE)X&2WEPfG#H@J2Dd*7VMAu4NF+M;`@3;uslv@esiSrQ6s?B;F zizx*Mc3~vgqqB7~U(^LJt&m)TNDXX^6ut>Z$Hu;U;GPs8ZwS7GPDfVA$HxZn5lwoz zxplButiTJ3iHAJg-Q{=fQs-`a^G09*F9yLJ2&{Bo6OvZL{g2X8e)leYC{NshW{-eE zNZ@9I8}EO`5*#D-vVU^4d(ErzqruDT^iYxUx3*^G9L|Qn%KY4%H#wg)R3%&^OyFE4$PH#pFU? zyC_s~Vg;&|Y~Gm>>SlNiSG!L5fPe<=ay8BJl9JlmGO}sJt?TJQ%7coYKBjS+WQw+S z$jm@Cv@>D?Z09;yYGHUJsv4S_nmUF;wYU(_ZZ3Ctz6v-vNFeYyAIG33kV_sK8L>4t zf95DxJ@p}4MD2?8l28C^f+sR`bb%u)k-igwPOzRNistOey@FP`5oR zsJ}xz;0fKV_tU2yN(TV5rJQsIW0_id4?O;tjmpWg)04we8Nnu|rkq}@P+;(6Kk4;( zLH!#>4;k|_VCZE|mDtr3FVpkdd9<2w29RWk>FTlYt~{ZRPn7^?*#*<7Etkhy2o~Cc znQAy(!jRzpKW(6NM-0~{QyT5KgTs^l?@ldB!j0hRzd3812@^LI?d#4@xqXwh^W^$v z(m8=ilc<)VN?t70Hn@90|LgwCvra|~>^7liInUk_{2LT8+!mqA(>u zHu}_QLjuv;)ieacHp^gSR0WH^ZPELpxF}5`%Bm}eK{0gbtNZ(Ah z3j$IpSKxdymuYg*!@f|5LhsU->SQtRrr+B)DVr0#IqlFJlen z_!j;Tp^_Vjq95$>TBTPZd8Q)k3_6nJD0a zJ1YW4a0N3pdO!)-J2=FPsN^2HjurL?^ojNLyX56(hl-n^U%GPb+MoFi$ZMhdtdQ`2tfV9)@@eFC#U&#aKuHuRV$ zWrT~nsfdq->!|Px)N#bAOAN*PX4Y!(-oF=-SX^SEId+PA+4|d@kMi5{ubwWgeXQBA z`r*^v`_%%dr~JBSyS^p5-J|81yF;ds9ReB&Aik3tRQ)0I(JP=A;?%t^@dc`dh0xt90)WNPa) zWTpXp0TFWb43c!%JGXUH2Vv0x04xy6buo=bW1sXOkESPYxb9O^TfkDR^RnD4HF-B0 zx*?FHfaRD8lOx@COr^71w^pUHM~)~%IZ9?y4GjVG8c?YqJa$F%ELQp#t`<1_l zal!k+ca6-~m^wTiAH@p@N#l;_$c{Q(0LJ3 zMSbvl;f%PgpzJul>1rM@)rsNKkJZ{-Bu_C;?=#@kCuqk{Et8nDgJj+P$I*jb{I!j9 z$&$S*bwv$jc1o`*o5nd-Xj6HJ8}mwr#NaCH0lei&&**e8#L;{)ws@swmRj6_lfxT3 zucxQ0?Ai0IajK`mgIuxV)cnlu*-hKFMHgQ!WHhS8^(3t^$nh&5_p9n_aB+4n8V4@( z`0(>ruqNr~IK++L?UbFfB3Om#^4wvcQs!3Vl2_l!i z1zhN3_8n_Im`oM)?L_sr%(?*QJ|vu`W@fUn*bz|-gnA8?O$hZ?uyV7q>Kx@T=Ni6L z8&!g?c&IVvrVw6z^`A|WvDMPnM&<7O595pPI6sdEm3DshuNV))l2vipVLR_z#`0WX z$egX0tK|!7 zN%n`P|5_uQhEUrW86~8qo*rf?HCk59z&O(~-+8UsloQi7S10X7NJkj&x+{m!#$bOj z7(Ybw=Ig((ZiJH}*D!JLc=@%6mx!e6w{Wq0wG(YdWeXxN3!75BD873q)?dDhfWrSREd3wb?~{aH8Y()B!O zyLiEodTlLj9$ucwwxQpoTqT|2V&d$GjRct&e^D%I+V-w6 zW1qE&^{?i4xVX5&Ggf`H#0Mw5_}q`mrS)zPa!sZ0v_k-*K}7I44Hg;r zxn$iTi1*_Mn-!9&7jqZ8eOIqx!4!by2F(*ZEu!#CU=;TocDzOC#nj37MABEXZ{Ov7 zN-1aGAZRK4Y<7dNJ0Ny^@k!^VR%;546rUcKcE{aZbX|Q4SNDovNW!aZqszTVsbl`cFOWR?5%CbBM4oJfo6e*-MN1Qs?B@i literal 0 HcmV?d00001 diff --git a/doc/en/ref_covariance_requirements.rst b/doc/en/ref_covariance_requirements.rst index a6b33bc..8b83325 100644 --- a/doc/en/ref_covariance_requirements.rst +++ b/doc/en/ref_covariance_requirements.rst @@ -26,11 +26,25 @@ Requirements to describe covariance matrices -------------------------------------------- -Multiple covariance matrices are required to implement the data assimilation or +.. index:: single: covariance matrix +.. index:: single: background error covariances +.. index:: single: observation error covariances +.. index:: single: covariances + +In general, a covariance matrix (or a variance-covariance matrix) has to be +squared, symetric, semi-definite positive. Each of its terms describes the +covariance of the two random variables corresponding to its position in the +matrix. The normalized form of the covariance is the linear correlation. One can +express the following relation, between a covariance matrix :math:`\mathbf{M}` +and its corresponding correlation matrix :math:`\mathbf{C}` (full matrix) and +standard deviation matrix :math:`\mathbf{\Sigma}` (diagonal matrix): + +.. math:: \mathbf{M} = \mathbf{\Sigma} * \mathbf{C} * \mathbf{\Sigma} + +Various covariance matrices are required to implement the data assimilation or optimization procedures. The main ones are the background error covariance matrix, noted as :math:`\mathbf{B}`, and the observation error covariance matrix, -noted as :math:`\mathbf{R}`. Such a matrix is required to be a squared symmetric -semi-definite positive matrix. +noted as :math:`\mathbf{R}`. There are 3 practical methods for the user to provide a covariance matrix. The method is chosen by the "*INPUT_TYPE*" keyword of each defined covariance diff --git a/doc/en/ref_observers_requirements.rst b/doc/en/ref_observers_requirements.rst index 2bd7338..77ce681 100644 --- a/doc/en/ref_observers_requirements.rst +++ b/doc/en/ref_observers_requirements.rst @@ -25,3 +25,343 @@ Requirements for functions describing an "*observer*" ----------------------------------------------------- + +.. index:: single: Observer +.. index:: single: Observer Template + +Some special variables, internal to the optimization process, used inside +calculation, can be monitored during an ADAO calculation. These variables can be +printed, plotted, saved, etc. It can be done using some "*observer*", sometimes +also called "callback". They are Python scripts, each one associated to a given +variable. They are activated for each variable modification. + +There are 3 practical methods to provide an "*observer*" in an ADAO case. The +method is chosen with the "*NodeType*" keyword of each "*observer*" entry type, as +shown in the following figure: + + .. eficas_observer_nodetype: + .. image:: images/eficas_observer_nodetype.png + :align: center + :width: 100% + .. centered:: + **Choosing for an "*observer*" its entry type** + +The "*observer*" can be given as a explicit script (entry of type "*String*"), +as a script in an external file (entry of type "*Script*"), or by using a +template or pattern (entry of type"*Template*") available by default in ADAO +when using the graphical editor. These templates are simple scripts that can be +tuned by the user, either in the integrated edtition stage of the case, or in +the edition stage of the schema before execution, to improve the ADAO case +performance in the SALOME execution supervisor. + +General form of a script to define an *observer* +++++++++++++++++++++++++++++++++++++++++++++++++ + +To use this capability, the user must have or build scripts that have on +standard input (that is, in the naming space) the variables ``var`` and +``info``. The variable ``var`` is to be used as an object of list/tuple type, +that contains the variable of interest indexed by the updating step. + +As an example, here is a very simple script (similar to the model +"*ValuePrinter*"), that can be used to print the value of the monitored +variable:: + + print " --->",info," Value =",var[-1] + +Stored as a Python file or as an explicit string, these script lines can be +associated to each variable found in the keyword "*SELECTION*" of the +"*Observers*" command of the ADAO case: "*Analysis*", "*CurrentState*", +"*CostFunction*"... The current value of the variable will be printed at each +step of the optimization or data assimilation algorithm. The "*observer*" can +include graphical output, storage capacities, complex treatment, statistical +analysis, etc. + +Hereinafter we give the identifier and the contents of each model available. + +Inventory of available *observer* models ("*Template*") ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +.. index:: single: ValueGnuPlotter (Observer) + +Template **ValueGnuPlotter** : +.............................. + +:: + + import numpy, Gnuplot + v=numpy.array(var[-1], ndmin=1) + global ifig, gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValueMean (Observer) + +Template **ValueMean** : +........................ + +:: + + import numpy + print info, numpy.nanmean(var[-1]) + +.. index:: single: ValuePrinter (Observer) + +Template **ValuePrinter** : +........................... + +Print on standard output the current value of the variable. + +:: + + print info, var[-1] + +.. index:: single: ValuePrinterAndGnuPlotter (Observer) + +Template **ValuePrinterAndGnuPlotter** : +........................................ + +:: + + print info, var[-1] + import numpy, Gnuplot + v=numpy.array(var[-1], ndmin=1) + global ifig,gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValuePrinterAndSaver (Observer) + +Template **ValuePrinterAndSaver** : +................................... + +:: + + import numpy, re + v=numpy.array(var[-1], ndmin=1) + print info,v + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + +.. index:: single: ValuePrinterSaverAndGnuPlotter (Observer) + +Template **ValuePrinterSaverAndGnuPlotter** : +............................................. + +:: + + print info, var[-1] + import numpy, re + v=numpy.array(var[-1], ndmin=1) + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + import Gnuplot + global ifig,gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValueRMS (Observer) + +Template **ValueRMS** : +....................... + +:: + + import numpy + v = numpy.matrix( numpy.ravel( var[-1] ) ) + print info, float( numpy.sqrt((1./v.size)*(v*v.T)) ) + +.. index:: single: ValueSaver (Observer) + +Template **ValueSaver** : +......................... + +:: + + import numpy, re + v=numpy.array(var[-1], ndmin=1) + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + +.. index:: single: ValueSerieGnuPlotter (Observer) + +Template **ValueSerieGnuPlotter** : +................................... + +:: + + import numpy, Gnuplot + v=numpy.array(var[:], ndmin=1) + global ifig, gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValueSeriePrinter (Observer) + +Template **ValueSeriePrinter** : +................................ + +Print on standard output the value serie of the variable. + +:: + + print info, var[:] + +.. index:: single: ValueSeriePrinterAndGnuPlotter (Observer) + +Template **ValueSeriePrinterAndGnuPlotter** : +............................................. + +:: + + print info, var[:] + import numpy, Gnuplot + v=numpy.array(var[:], ndmin=1) + global ifig,gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValueSeriePrinterAndSaver (Observer) + +Template **ValueSeriePrinterAndSaver** : +........................................ + +:: + + import numpy, re + v=numpy.array(var[:], ndmin=1) + print info,v + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + +.. index:: single: ValueSeriePrinterSaverAndGnuPlotter (Observer) + +Template **ValueSeriePrinterSaverAndGnuPlotter** : +.................................................. + +:: + + print info, var[:] + import numpy, re + v=numpy.array(var[:], ndmin=1) + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + import Gnuplot + global ifig,gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValueSerieSaver (Observer) + +Template **ValueSerieSaver** : +.............................. + +:: + + import numpy, re + v=numpy.array(var[:], ndmin=1) + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + +.. index:: single: ValueStandardError (Observer) + +Template **ValueStandardError** : +................................. + +:: + + import numpy + print info, numpy.nanstd(var[-1]) + +.. index:: single: ValueVariance (Observer) + +Template **ValueVariance** : +............................ + +:: + + import numpy + print info, numpy.nanvar(var[-1]) diff --git a/doc/fr/advanced.rst b/doc/fr/advanced.rst index 085a8c3..b4f32ff 100644 --- a/doc/fr/advanced.rst +++ b/doc/fr/advanced.rst @@ -200,14 +200,9 @@ Obtenir des informations sur des variables sp .. index:: single: Observer Template Certaines variables spéciales internes à l'optimisation, utilisées au cours des -calculs, peuvent être surveillées durant un calcul ADAO en YACS. Ces variables -peuvent être affichées, tracées, enregistrées, etc. C'est réalisable en -utilisant des "*observer*", qui sont des scripts, chacun associé à une -variable. Pour pouvoir utiliser cette capacité, l'utilisateur doit construire -des scripts disposant en entrée standard (i.e. disponible dans l'espace de -nommage) des variables ``var`` et ``info``. La variable ``var`` est à utiliser -de la même manière que l'objet final ADD, c'est-à-dire comme un objet de type -liste/tuple. +calculs, peuvent être surveillées durant un calcul ADAO. Ces variables peuvent +être affichées, tracées, enregistrées, etc. C'est réalisable en utilisant des +"*observer*", qui sont des scripts, chacun associé à une variable. Des modèles ("templates") sont disponibles lors de l'édition le cas ADAO dans l'éditeur graphique. Ces scripts simples peuvent être adaptés par l'utilisateur, @@ -215,17 +210,8 @@ soit dans l' l'exécution, pour améliorer l'adaptation du calcul ADAO dans le superviseur d'exécution de SALOME. -A titre d'exemple, voici un script très simple (similaire au modèle -"*ValuePrinter*") utilisable pour afficher la valeur d'une variable surveillée:: - - print " --->",info," Value =",var[-1] - -Stocké comme un fichier Python, ce script peut être associé à chaque variable -présente dans le mot-clé "*SELECTION*" de la commande "*Observers*": -"*Analysis*", "*CurrentState*", "*CostFunction*"... La valeur courante de la -variable sera affichée à chaque étape de l'algorithme d'optimisation ou -d'assimilation. Les "*observer*" peuvent inclure des capacités d'affichage -graphique, de stockage, d'affichage complexe, de traitement statistique, etc. +Pour mettre en oeuvre ces "*observer*" de manière efficace, on se reportera aux +:ref:`ref_observers_requirements`. Obtenir plus d'information lors du déroulement d'un calcul ---------------------------------------------------------- diff --git a/doc/fr/images/eficas_observer_nodetype.png b/doc/fr/images/eficas_observer_nodetype.png new file mode 100644 index 0000000000000000000000000000000000000000..a604eb5270ebfa0879b7512fa6f92fa1e1dfc47a GIT binary patch literal 42235 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 literal 0 HcmV?d00001 diff --git a/doc/fr/ref_covariance_requirements.rst b/doc/fr/ref_covariance_requirements.rst index 639c061..372046a 100644 --- a/doc/fr/ref_covariance_requirements.rst +++ b/doc/fr/ref_covariance_requirements.rst @@ -26,11 +26,26 @@ Exigences pour décrire les matrices de covariance ------------------------------------------------- -De multiples matrices de covariance sont nécessaires pour mettre en oeuvre des +.. index:: single: matrice de covariance +.. index:: single: covariances d'erreurs d'ébauche +.. index:: single: covariances d'erreurs d'observation +.. index:: single: covariances + +De manière générale, une matrice de covariance (ou une matrice de +variance-covariance) doit être carrée, symétrique, semi-définie positive. Chacun +de ses termes décrit la covariance des deux variables aléatoires correspondantes +à sa position dans la matrice. La forme normalisée de la covariance est la +corrélation linéaire. On peut écrire la relation suivante, entre une matrice de +covariance :math:`\mathbf{M}` et ses matrices correspondantes de corrélation +:math:`\mathbf{C}` (matrice pleine) et d'écart-type :math:`\mathbf{\Sigma}` +(matrice diagonale): + +.. math:: \mathbf{M} = \mathbf{\Sigma} * \mathbf{C} * \mathbf{\Sigma} + +Diverses matrices de covariance sont nécessaires pour mettre en oeuvre des procédures d'assimilation de données ou d'optimisation. Les principales sont la matrice de covariance des erreurs d'ébauche, notée :math:`\mathbf{B}`, et la -matrice de covariance des erreurs d'observation, notée :math:`\mathbf{R}`. Une -telle matrice doit être une matrice carré symétrique semi-définie positive. +matrice de covariance des erreurs d'observation, notée :math:`\mathbf{R}`. Il y a 3 méthodes pratiques pour l'utilisateur pour fournir une matrice de covariance. La méthode est choisie à l'aide du mot-clé "*INPUT_TYPE*" de chaque @@ -51,10 +66,10 @@ Premi .. index:: single: EvolutionError .. index:: single: ObservationError -La première forme est le défaut et la plus générale. La matrice de covariance -:math:`\mathbf{M}` doit être entièrement spécifiée. Même si la matrice est -symétrique par nature, la totalité de la matrice :math:`\mathbf{M}` doit être -donnée. +La première forme est le défaut, et c'est la plus générale. La matrice de +covariance :math:`\mathbf{M}` doit être entièrement spécifiée. Même si la +matrice est symétrique par nature, la totalité de la matrice :math:`\mathbf{M}` +doit être donnée. .. math:: \mathbf{M} = \begin{pmatrix} m_{11} & m_{12} & \cdots & m_{1n} \\ @@ -83,9 +98,9 @@ Seconde forme matricielle : utiliser la repr .. index:: single: ObservationError Au contraire, la seconde forme matricielle est une méthode très simplifiée pour -définir une matrice. La matrice de covariance :math:`\mathbf{M}` est supposée -être un multiple positif de la matrice identité. Cette matrice peut alors être -spécifiée de manière unique par le multiplicateur :math:`m`: +définir une matrice. La matrice de covariance :math:`\mathbf{M}` est ici +supposée être un multiple positif de la matrice identité. Cette matrice peut +alors être spécifiée de manière unique par le multiplicateur :math:`m`: .. math:: \mathbf{M} = m \times \begin{pmatrix} 1 & 0 & \cdots & 0 \\ @@ -114,10 +129,10 @@ Troisi La troisième forme est aussi une méthode simplifiée pour fournir la matrice, mais un peu plus puissante que la seconde. La matrice de covariance -:math:`\mathbf{M}` est toujours considérée comme diagonale, mais l'utilisateur -doit spécifier toutes les valeurs positives situées sur la diagonale. La matrice -peut alors être définie uniquement par un vecteur :math:`\mathbf{V}` qui se -retrouve ensuite sur la diagonale: +:math:`\mathbf{M}` est ici toujours considérée comme diagonale, mais +l'utilisateur doit spécifier toutes les valeurs positives situées sur la +diagonale. La matrice peut alors être définie uniquement par un vecteur +:math:`\mathbf{V}` qui se retrouve ensuite sur la diagonale: .. math:: \mathbf{M} = \begin{pmatrix} v_{1} & 0 & \cdots & 0 \\ diff --git a/doc/fr/ref_observers_requirements.rst b/doc/fr/ref_observers_requirements.rst index df804f2..db0a9a3 100644 --- a/doc/fr/ref_observers_requirements.rst +++ b/doc/fr/ref_observers_requirements.rst @@ -26,3 +26,341 @@ Exigences pour les fonctions décrivant un "*observer*" ------------------------------------------------------ +.. index:: single: Observer +.. index:: single: Observer Template + +Certaines variables spéciales internes à l'optimisation, utilisées au cours des +calculs, peuvent être surveillées durant un calcul ADAO en YACS. Ces variables +peuvent être affichées, tracées, enregistrées, etc. C'est réalisable en +utilisant des "*observer*", qui sont des scripts, chacun associé à une +variable, qui sont activés à chaque modification de la variable. + +Il y a 3 méthodes pratiques pour intégrer un "*observer*" dans un cas ADAO. La +méthode est choisie à l'aide du mot-clé "*NodeType*" de chaque entrée de type +*observer*, comme montré dans la figure qui suit : + + .. eficas_observer_nodetype: + .. image:: images/eficas_observer_nodetype.png + :align: center + :width: 100% + .. centered:: + **Choisir le type d'entrée** + +L'"*observer*" peut être fourni sous la forme d'un script explicite (entrée de +type "*String*"), d'un script contenu dans un fichier externe (entrée de type +"*Script*"), ou en utilisant un modèle (entrée de type "*Template*") fourni par +défaut dans ADAO lors de l'édition dans l'éditeur graphique. Ces derniers sont +des scripts simples qui peuvent être adaptés par l'utilisateur, soit dans +l'étape d'édition intégrée, soit dans l'étape d'édition avant l'exécution, pour +améliorer l'adaptation du calcul ADAO dans le superviseur d'exécution de SALOME. + +Forme générale d'un script permettant de définir un *observer* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Pour pouvoir utiliser cette capacité, l'utilisateur doit disposer ou construire +des scripts utilisant en entrée standard (i.e. disponible dans l'espace de +nommage) des variables ``var`` et ``info``. La variable ``var`` est à utiliser +comme un objet de type liste/tuple, contenant la variable d'intérêt indicée par +l'étape de mise à jour. + +A titre d'exemple, voici un script très simple (similaire au modèle +"*ValuePrinter*") utilisable pour afficher la valeur d'une variable surveillée:: + + print " --->",info," Value =",var[-1] + +Stocké comme un fichier Python, ce script peut être associé à chaque variable +présente dans le mot-clé "*SELECTION*" de la commande "*Observers*": +"*Analysis*", "*CurrentState*", "*CostFunction*"... La valeur courante de la +variable sera affichée à chaque étape de l'algorithme d'optimisation ou +d'assimilation. Les "*observer*" peuvent inclure des capacités d'affichage +graphique, de stockage, d'affichage complexe, de traitement statistique, etc. + +On donne ci-aprés l'identifiant et le contenu de chaque modèle disponible. + +Inventaire des modèles d'*observer* disponibles ("*Template*") +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +.. index:: single: ValueGnuPlotter (Observer) + +Modèle **ValueGnuPlotter** : +............................ + +:: + + import numpy, Gnuplot + v=numpy.array(var[-1], ndmin=1) + global ifig, gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValueMean (Observer) + +Modèle **ValueMean** : +...................... + +:: + + import numpy + print info, numpy.nanmean(var[-1]) + +.. index:: single: ValuePrinter (Observer) + +Modèle **ValuePrinter** : +......................... + +Imprime sur la sortie standard la valeur courante de la variable. + +:: + + print info, var[-1] + +.. index:: single: ValuePrinterAndGnuPlotter (Observer) + +Modèle **ValuePrinterAndGnuPlotter** : +...................................... + +:: + + print info, var[-1] + import numpy, Gnuplot + v=numpy.array(var[-1], ndmin=1) + global ifig,gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValuePrinterAndSaver (Observer) + +Modèle **ValuePrinterAndSaver** : +................................. + +:: + + import numpy, re + v=numpy.array(var[-1], ndmin=1) + print info,v + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + +.. index:: single: ValuePrinterSaverAndGnuPlotter (Observer) + +Modèle **ValuePrinterSaverAndGnuPlotter** : +........................................... + +:: + + print info, var[-1] + import numpy, re + v=numpy.array(var[-1], ndmin=1) + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + import Gnuplot + global ifig,gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValueRMS (Observer) + +Modèle **ValueRMS** : +..................... + +:: + + import numpy + v = numpy.matrix( numpy.ravel( var[-1] ) ) + print info, float( numpy.sqrt((1./v.size)*(v*v.T)) ) + +.. index:: single: ValueSaver (Observer) + +Modèle **ValueSaver** : +....................... + +:: + + import numpy, re + v=numpy.array(var[-1], ndmin=1) + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + +.. index:: single: ValueSerieGnuPlotter (Observer) + +Modèle **ValueSerieGnuPlotter** : +................................. + +:: + + import numpy, Gnuplot + v=numpy.array(var[:], ndmin=1) + global ifig, gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValueSeriePrinter (Observer) + +Modèle **ValueSeriePrinter** : +.............................. + +Imprime sur la sortie standard la série des valeurs de la variable. + +:: + + print info, var[:] + +.. index:: single: ValueSeriePrinterAndGnuPlotter (Observer) + +Modèle **ValueSeriePrinterAndGnuPlotter** : +........................................... + +:: + + print info, var[:] + import numpy, Gnuplot + v=numpy.array(var[:], ndmin=1) + global ifig,gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValueSeriePrinterAndSaver (Observer) + +Modèle **ValueSeriePrinterAndSaver** : +...................................... + +:: + + import numpy, re + v=numpy.array(var[:], ndmin=1) + print info,v + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + +.. index:: single: ValueSeriePrinterSaverAndGnuPlotter (Observer) + +Modèle **ValueSeriePrinterSaverAndGnuPlotter** : +................................................ + +:: + + print info, var[:] + import numpy, re + v=numpy.array(var[:], ndmin=1) + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + import Gnuplot + global ifig,gp + try: + ifig += 1 + gp('set style data lines') + except: + ifig = 0 + gp = Gnuplot.Gnuplot(persist=1) + gp('set style data lines') + gp('set title "%s (Figure %i)"'%(info,ifig)) + gp.plot( Gnuplot.Data( v, with_='lines lw 2' ) ) + +.. index:: single: ValueSerieSaver (Observer) + +Modèle **ValueSerieSaver** : +............................ + +:: + + import numpy, re + v=numpy.array(var[:], ndmin=1) + global istep + try: + istep += 1 + except: + istep = 0 + f='/tmp/value_%s_%05i.txt'%(info,istep) + f=re.sub('\s','_',f) + print 'Value saved in "%s"'%f + numpy.savetxt(f,v) + +.. index:: single: ValueStandardError (Observer) + +Modèle **ValueStandardError** : +............................... + +:: + + import numpy + print info, numpy.nanstd(var[-1]) + +.. index:: single: ValueVariance (Observer) + +Modèle **ValueVariance** : +.......................... + +:: + + import numpy + print info, numpy.nanvar(var[-1]) diff --git a/src/daComposant/daCore/BasicObjects.py b/src/daComposant/daCore/BasicObjects.py index 57d4e41..25c49ec 100644 --- a/src/daComposant/daCore/BasicObjects.py +++ b/src/daComposant/daCore/BasicObjects.py @@ -772,6 +772,40 @@ class Covariance: def __len__(self): return self.shape[0] +# ============================================================================== +class TemplateStorage(object): + """ + Classe générale de stockage de type dictionnaire étendu + (Template) + """ + def __init__( self, language = "fr_FR" ): + self.__preferedLanguage = "fr" + self.__values = {} + + def store( self, name = None, content = None, fr_FR = "", en_EN = "" ): + if name is None or content is None: + raise ValueError("To be consistent, the storage of a template must provide a name and a content.") + self.__values[str(name)] = { + 'content': str(content), + 'fr_FR' : str(fr_FR), + 'en_EN' : str(en_EN), + } + + def keys(self): + __keys = self.__values.keys() + __keys.sort() + return __keys + + def __len__(self): + return len(self.__values) + + def __getitem__(self, name=None ): + return self.__values[name]['content'] + + def getdoc(self, name = None, lang = "fr_FR"): + if lang not in self.__values[name]: lang = "fr_FR" + return self.__values[name][lang] + # ============================================================================== def CostFunction3D( _x, diff --git a/src/daSalome/adaoBuilder.py b/src/daSalome/adaoBuilder.py index dd4699e..ffc48c7 100644 --- a/src/daSalome/adaoBuilder.py +++ b/src/daSalome/adaoBuilder.py @@ -498,6 +498,7 @@ class New(object): if String is not None: __FunctionText = String elif Template is not None: + __FunctionText = "" if Template == "ValuePrinter": __FunctionText = """print info, var[-1]""" if Template == "ValueSeriePrinter": -- 2.39.2