From 0844174c38a4d76b08001da3ad1949df840c9bc1 Mon Sep 17 00:00:00 2001 From: madlabunimib Date: Wed, 21 Jul 2021 06:55:39 +0000 Subject: [PATCH] Update documentation --- .../PyCTBN.PyCTBN.structure_graph.doctree | Bin 201462 -> 256188 bytes .../doctrees/PyCTBN.PyCTBN.utility.doctree | Bin 157217 -> 189574 bytes docs-out/_build/doctrees/PyCTBN.doctree | Bin 3734 -> 4323 bytes .../PyCTBN.tests.structure_graph.doctree | Bin 96380 -> 112918 bytes docs-out/_build/doctrees/environment.pickle | Bin 148546 -> 162647 bytes docs-out/_build/doctrees/example.doctree | Bin 0 -> 2337 bytes docs-out/_build/doctrees/modules.doctree | Bin 2657 -> 2662 bytes docs-out/_build/html/PyCTBN.PyCTBN.html | 4 + .../html/PyCTBN.PyCTBN.structure_graph.html | 152 +- .../_build/html/PyCTBN.PyCTBN.utility.html | 88 +- docs-out/_build/html/PyCTBN.html | 54 + docs-out/_build/html/PyCTBN.tests.html | 2 + .../html/PyCTBN.tests.structure_graph.html | 54 + .../PyCTBN.PyCTBN.structure_graph.rst.txt | 16 + .../_sources/PyCTBN.PyCTBN.utility.rst.txt | 16 + docs-out/_build/html/_sources/PyCTBN.rst.txt | 17 + .../PyCTBN.tests.structure_graph.rst.txt | 16 + docs-out/_build/html/_sources/example.rst.txt | 7 + docs-out/_build/html/_sources/modules.rst.txt | 5 +- docs-out/_build/html/example.html | 179 ++ docs-out/_build/html/genindex.html | 131 +- docs-out/_build/html/index.html | 4 + docs-out/_build/html/modules.html | 59 +- docs-out/_build/html/objects.inv | Bin 2983 -> 3216 bytes docs-out/_build/html/py-modindex.html | 30 + docs-out/_build/html/searchindex.js | 2 +- docs/PyCTBN.PyCTBN.estimators.html | 138 +- docs/PyCTBN.PyCTBN.html | 10 +- docs/PyCTBN.PyCTBN.optimizers.html | 42 +- docs/PyCTBN.PyCTBN.structure_graph.html | 441 ++-- docs/PyCTBN.PyCTBN.utility.html | 232 +- docs/PyCTBN.html | 30 +- docs/PyCTBN.tests.estimators.html | 81 +- docs/PyCTBN.tests.html | 22 +- docs/PyCTBN.tests.optimizers.html | 10 +- docs/PyCTBN.tests.structure_graph.html | 295 ++- docs/PyCTBN.tests.utility.html | 134 +- docs/_static/basic.css | 108 +- docs/_static/doctools.js | 9 +- docs/_static/language_data.js | 6 +- docs/_static/pygments.css | 10 +- docs/_static/searchtools.js | 30 +- docs/_static/underscore-1.13.1.js | 2042 ----------------- docs/_static/underscore.js | 37 +- docs/basic_main.html | 10 +- docs/example.html | 23 +- docs/examples.html | 10 +- docs/genindex.html | 209 +- docs/index.html | 10 +- docs/modules.html | 10 +- docs/objects.inv | Bin 3055 -> 3216 bytes docs/py-modindex.html | 49 +- docs/search.html | 10 +- docs/searchindex.js | 2 +- docs/setup.html | 10 +- 55 files changed, 1871 insertions(+), 2985 deletions(-) create mode 100644 docs-out/_build/doctrees/example.doctree create mode 100644 docs-out/_build/html/_sources/example.rst.txt create mode 100644 docs-out/_build/html/example.html delete mode 100644 docs/_static/underscore-1.13.1.js diff --git a/docs-out/_build/doctrees/PyCTBN.PyCTBN.structure_graph.doctree b/docs-out/_build/doctrees/PyCTBN.PyCTBN.structure_graph.doctree index 0b4705779bbbf17523f71dcc5c479a419757005f..ff37c2f4eb77606310a7777d34838e7d2279fe07 100644 GIT binary patch literal 256188 zcmdpf37lj_dH4c*&hD~+upkVx%{{>GaEOSDpn!_Y!XmKB;W5)Q)3e==neMT>XW2!G zn3$;X8IKGo8Ue-oKBJ=XK4PMYMvX@ON25{Wk(ijnBOd?n`|7S&Rj=Ob?#>ez?>1 z>iFur>#MJ-ZeMlB?^YbN0{@q8>de<0&3$9l>FH)`y4G1t*G{*l7UpWr?&6;=p8l-G z+ZIRDb?xdcoz_Bos1&TW4!&EPHn2&Xf;XDhxx2OxA@jCdVYU0iMVdo>mA8dGQo4G+3X|(D)(=nDjZ19Q4@p;ZBlN zNY`|$d+^g@eN%n7zM+16{gC=ddc|4w)?DqZ_Cm8+YoB#Xt9|oX3{~PE0I;*Iwb13i zGl*pP7;AT6LR)qoyf9f`&&Vq1Qa?=mPKT~rn4D`(FU$h4gz(Kqk;G;FApqey48mRY zEr^GD1twoV5r}j${C6t+Hwyoq0TZilr3sC(>h)~^#VWl)I@D34Rz-8GRO@U=VMlak zPia(})1$)-Ha692PB)NYtFuoYZ#28LW~b5J|K#zxDv)(wg`q=W!`B(-I=!!FYO>RsK%DstY9z$|>S=|}TK$rLQ9iWt;q zg`ggr-@hFN5iru+Q)$igfPk^f6hrP1?06M1BMR_AK&_jEz!sv>>JGpL$~T?xk5CyU ztyO6>dziuLi|G@}6E8S_7hRbG0v28g_G>D`!K3iyQ2a99X@Gu3+oIJ;pYKP;Xs284 z*2delPGh>(oT`m?8=%FvSDFiR^ZUoD?RIs4<)X^2RmpSTJL!-`TNBs&Pb#r=9#p>##dRO&N3GbqB&x^4txRbHKyCks})qp`?s^vcA=2}8{qFpy5mf)@)y0-b>W$aez+uhYrfX5 zc3W)?jp;!bNs3=&k|{X?7L9%krU$h$L{ARGCXCxW@T^N$H=4AZ(xiSRT2%oD`(aQr zIV}tdh}%qcVYWNIw>rB}Gr>w9)LEFHZ?(JQow;he`?Q4?F5R97C{9k1(AK<;uh6+4 zhH2do`22|E)-ww@0W`N!jn$9#G!{tkemC)QNf0k}C$}UQK_i&S-^-c!r9QbjJivD{ z>f&Dit&;TwgCuc+o~*>GS%FQeP#!0< zIY?TVOb&;>1O`H4`uk8%$Em64lH=jCO(ia;`7oTS!;mYbi(yF4wIRtBO%7lg={(xw zb!Q~;5U41mj{Y_!?5)8$c_i$O&?r{IJ{TUrEn$2BhlJr5og4ZmVPCX*Hu+3W4rZS7)b>r?B9Yj4@y`r488PwCxkE$pnJm6I`WiPS^17%8yb-U>47`h*y^eF5Tqn z65v=f+kizh@c8C*HG@EnhtYs!yETrY(OrBVRk)?v zZo;3Mo1L79jg|GSzs0cH0x8Ui9(h27GmwFae-p*o;uRhghX7}_g8My{YNt}&v!`9#Ln}v& zd}3SjWh*jpR-wRIWiQA^t36b0PV)*XTqZikZ`c7qu~40@T(;vX{$)&9sNyxyT|+aC+U)eW72#1jb`^csG@JUwo7%CHp~s7`k=n1) ziX<^e3*J_U5>IF3+lT)!lYtJLoWx{ndVdB|_`H4+>`krfpX556{x~S{xlD6Y94~Xm zg({<3NaXa&wrxRK(x%9qt7tAkPHQhlJ{G~ znby)aihs_)e>Z{euc~{%%+NY48%3BhtIp(p=sS5E{2$^A!$65d)blPt*wU1smGzy`;IVB!^ul?5QwaD2h@T7UqV%rJK-N;yci>x0(7}2 zq9R17IeiIk;gAra%~95AfnqlB4N;`cyVDg~G8R%&b*vg1!0>a{xcvBh|Qs90HAkZle}-O+F70 zlCH3PKaYg0g}x<*NJ1ofG7^%(jz>Zq^@f9NB5{<4>j4MbeMd>ikBH)7TpJP+?)62; zCBw-JB6@v3tBSTT&)wY1s&=Sqatr)pis)$a46Q6(Ij#j;*bj+DGTK)bVl{5GcVMHD zWFBGJvJ+rVQhiV&5BD%(c;U37KRYx;0$?hVV>OS|sxQPPR7FlGnLxOPlcyG%6L;YG zWY$9ao1lG2l2GV4$q*A!B$L>}0g!sAK=N8X4eJfd1%+^N%jGB3_og#|-O~Cipxs;U_Da~-5<&N z>%@dAf(x}0$#f(|e;UnkVs`_!|C1NWR_P~~d+H3sAZDu7-zYJd6X|`moPVBm7FdG~ zZVhY6tFQwcQ)%MlkD)9R^GZ$tN$P2{kj1;+lAMGc<#7_akq`)bz)+QfAt|R8X!}zD z34+MXT~~8Yi=I$P|>E2Pqk_@u*PaYK(jMAoyukj z8nrnfjp~`vqLJaJsoC@&mcOR*&Y9F#z=B*9vLK#bfj72YOi65HMMgFCc#MyqguU@s zFwM_DbI}wIg5QVL73sHSs|P+&KOodqdhjSq1N3Svfg;#eNfe5bpCPu0K}42Yy9T+A zO(PPbZP?l|l+CFt&Ek-i%oEI~oF3rNH__8WKqs2%GHjr503VejMml~6(+c^z92?1R zaQbe9XvX*JP;1b}_aP;OkTNd8B6BK|J^Oz+BNnF5+B0*3@@JPZ;ik~JuK2~$hKKFZ zFjOY@R~9f6m@3b-W@lTs;IG=#AmEN6{-=%a+jkn|wO;k4eOoL0PJ2q_tjg{u?R(1D z&~Av4u-wzR+T3KVU747`4ksomw=`yFA!O3*Lc$b>feg`fg*;;NTQ{e-_8ZFY+gTrC1~j#|Q$JY4fr(zODeLc6+_!{=CC_%$gyHhjYl$EDEfNDif> z)=u+kI%cE9OdR15JGux8U&VeCnVM}wox-OQl5T9ty)z*WQb-K9+U=bspM~L)>tLYd zui!7(S!PaI@;NNO9?L%ue>ps{gaL}ng;L4(u$bNFjNcE=6%(sLaK>&Pj5Fq(kk=FA zY54(n*m< zj!uiS>Q!ywRku&e<7sc}0s#HA`~@ECBMziDYhAp90DjisJ_0;DBu3@B#n*v2AG5wr>}k@04NWR+||_X!+UdeJwNK8(>b?*KeUg2KUKdOmBJ zbLu_Y& zeQQN|4H~sCu|a1^f@D-X`nZ~XWe}?KyGAjbPT;jnaGPOp-A8#6XcUSZiXaZ0(oANk zt_JN&6e}B6tq}G?sD=sWAC-ag_Y1?Rd<)?d2y-sxggZYjYN?jVxiGB9%g(tcD5K~W z`B555El6&{`LLJ=XA^QN&*QjpI+dg5ZbgrWX5Pey682qXH@Xka7*Y1*z1SKSq29AH z@3Xo$-G|ZS(cmz~o|Jhv^c7;#RGgGauEAdQ1jvs;(;~-VlIziteI2w)Zot2gPRWhf zt9|-qdH4mu;z(#cb;cG4+#KNB3SWY%d|To5_^0D^%e{|pxAww4F6?j%+X#TaTNUny z!kLo_=lu%1c}$!|fkP-AILk5%cfr8nlvbtD9ohlu`yIR_XIyASJZKI_Vc_@*S4+i0t9y>m27oBu$yI zGv*o1mW6vkx=rJ#HVBmPHdta&eu`_MGb%qVgh`(6`V(w4BGfU+jFIlj;e2rh^wHc5 z`kkD;E2CG!p%qG$$3Jjad2hAds7}H?aTO*3z|7Sy+g_Zk!KHm|s)dQOT&S4KU}n*; z;r$ENm%k;4ktaK}nu&Bid&wMdktM$xnu3eyI#q(7DEmsJU0E3siIFA05+^R;WIs$G zw^-eUWq{|z4-m2tVn)DtC-4 zo?>D&XLaWX5(&h`C?W9tRdq2+&V$MYj+V5by2J;GkwivDj54_Jh>@e-4ML3i&McA% z(!q@ZLTJw^N(isXAzX1GJcGMmSt%r2gjd{xaKTNN{D#v}Q;b%#=0c9dPl-bkq}Kw} zI?MYRPcn`Wq*u{|oq~j)^j>=ur2DPz{6K1g^gaU5U$qxO`VjOj@j-$lk&zLk3@$u^ z}CkDCSeO1;&V#`R?)CR0{Ab9Iud}NMe~*< zxDbGUBQ!Y$06!HF07Q#`awYvRfn2l3?9R{CngFbXM!^-kzD7R}04`uj)i+v+|{AMU|jL*V+W_F{OR2z^WZklab+WaKV`8;{&M>OG<-7Lhnid+P^e z$%ZXTmM+L4K*oH9d*z3Ve*=+;kUGU)`AJm_V&p~p_~GIoM)b;$ri$2&2pyEp=Dike zaen?6U&yJA-OM(jehl?7MfaGF@sDaLLQ;-;KJO!86ez)GfiBb4=Zn}_Wi z&>>O}Z-B^B!t1i36UA`f%(3s>pYk5HLiNOtABYYh&gvip#+kB*Ls^E=Kf}ot;r< zM$e;jjV4C+x58ai`|uBu45luz*l08mD>SRr6y_^R3G-uRtMqM4Ufo$pA*H91nGUnj z%9iL_iqINfgW*$UG@0da!>g!gVz?@C<@EO4IZaQ2MxoV`usxX5bR*R@0A>u51z0af zfcb9|;QeI)UMLK(f7K`^hsjNf(~=tyF3W6O0%e0T8<|whF_V+H@!)WgTE2{<&Z(C1 z?qGP$2X^(?vp}=BjjSFzfTaPN-E}EE#9`F2Z-~5M6I?m{SP}EZtE#rD%oPmzPPN)_ z-|9T(n!{;s8TK8kU|531ej9shl?KasX}1>UDLzceEkmR1HmuqGvd?KeCqCb9?1ikC z3e%gFaj~qW8%9otOIl%28V<5zV9Ot`8mY{;I-Le32GAiY+V8CGt+n^leX)3o96;b5 z&Mjav!Q|dXYoP;UL*fAJ%fM@bumM_~foqNlLY9mJmpa1tT2lcy#;)o@1h0g;`gNM= z4THjzP_KguUjeNY{W{R+Ttpq{Yl8 zeDAX4UBO4o6ne#^A7f1VkwQ$$v-UoKjo?X2ApD1j@cu;wviALKD8?gxLxNTB!>S_* z9{@S)-iQJ2W&^we|Dj7cc?XbWo(w$m>w9ukr^le(uZ|PsnP1<*MkB%)f#~!r^J@op zYbv8Nv#l!Ie!L27*xbS#o=I4MY)QO01Qa#yLo)lL?wbtpPlw2X?Z_bgSsjMyz~y9u0Q6VY-+ zDi_$0uR(Q*5t0*$j*OgSu;GytN4@i}D#sAIoRsSU|Tl5O>iz}I2)Z7kW*7ORW^Cf{UN62^0%=l>eYNTBmC06X7VZjrEF99PWkYC( znrIW&-Y%8`N#4od02y`t=+{vqw1E-vzml!ew=bU{8mE^PMH>!bnfZNsfQr{<*wrFx zMmYqi#BUSb-;;=QI)m~ke4MWgAuj=M|CxTALQU2J}U)1yjcPaCOC%wG9mv> z8OVRhpow~tas5z`6WtHS@c|qU#^D#8v9$-|R-zoS$y%o+z=dER&AFct22ESl=!RUs zKQi+i1|P?`KJs;t5u&~SBu^>g4U)$L2pJx5vr8B!u)2zUf$`$tw1e-%<-%aR54Vam znq)ur%Ot_$!?2WiA&!CQx1L$4%CC!IU!@z9Zz2y`Vc$REmyu?Y)oh^|7? zAx3Ahxd0#Y6?wFG2!gWh8qZFoN==s3$m6ETn{;T#2Mmp1(SeU6nLl|ZGX8LKTaf?l z!-+h8x(sbI#nJY|WPu+)sF9X!F_=NqV|=_J$mFk}@cUwh-xn6bFAx1a9~-gIUrHeR zy(e63@X#NdonM(?RUZ1&2G|=h01y3jVy;qLvbZs;vi4)|ZzjtAy5w0jR zZ=7(VmpSzLXs&JakOrKco~%wb=zd^)`>#p*3N~cAx8R-(TnR+GJG8e{+b2#++EG8@ z*omm0_$^tA{OT`6V?(apMKt4c(9{$4!%v1&WBD)UY0rqL-}kHz!wk%$8Q&oQ{Z(}* zsA$yh2hg{~2t_j_Ix^9W3^qK`3`f0lit~b`Z(5=;XmA^fuma$*zR%{MT8m+PnyTi; z`kqRzeq|JWU^)|U9ec+P?Dj2nxLBC)SGM6M?M7Q!ZQOF51H+AXW$lNf{&0W5X`M=f zTc1@-1{Q)vs@D>kh}Ff&dXusJ%q5vah|96i)FUqVDPCN(Wr2Gc@DQszKafZkE-Ysg zc>b!ouq3|%8WsrsJrw$u_#k1C$jAsw1{WS-anyT!X%>O|%$-c4WNBCFzCG+WoY*sn z611ap$dnPZaIZXA_=yPd<-tOCTFkL^85h>MsWf`gmIVo08n;Nh$C`N4Ms6?ApzS4v{-i>Df1 zE?cFqTl%p+hII<@spP^{3Uv_S;lHE~B7g0za+Z1CtH2G$K^1P2w_pd>TK^6x8`N6g z#~+}m=w!q4p%sN8Udr+B3`4{mZ4e!R(sGa@lok917}}+@zKrFAQCio_do%j7xuGep zD|%L360{za*RdJprS)1~f&GXxNq!QU5K>fN-AV1 zQVTn_d_P&-ln8*yOFzwqbVH59Ma1g{n6@>ps@~>=i>{x|-d3HQggYhYhcB$=apG-! zSG3j6-crqb@ZD0)dl31;u;}IYTnDeF#*3E&S5u$oQPA02p(zT^N94gKU*qhx)Ous7 z98zEVoWX~ahXZ-yTt^gFypH;O*@CX4J_fK-?jYby`jCRxQIijto?GlHYUVf^XOPtt z(#1X*4jiTI71Y#L7*+-@yg^kOuY1$W^v;T3JB=W~mD9d!&h0Cw9pHPg&5Tw(aN_$a z9r97~?(wAP!c=#A#Uo!F9C@9^*mdG!3z11t@Mh{+$>6a@7M+p0Y_(*03Re5tZPZ)C z_>?-5$SXEpiZzn@iB@7yml%r0E8aq_@S5C;9azqjdDREkre>iD#q$b7f$Kph6zag% zBYWgjhTe~e{n)fG{f%mw5gT*>1u@M+6HWJo(d150cm*^99*fEfd24t8cUA}=z>yV# zUvxXB&HbD(qdOD_Ly)xv0|AB-J(*bjgaxHPP@_kW!}%s9fYOsw(lf*8G4ueu7d^j! zJH4{GxC((}HJqFjlrLR6K+W*0{( zNxDztzU+at(LUcrenBDh@wAkOVxtkEuR*|EC(;bbsp_6nWmJj?ZLuTo%Mx+t-b}kS z2V3q9xcrjIS#`3tz^>B=V=6Bpuk9m&ywJfV|Il+{Xz}e^uRQDw>`$4Sh?@ zkXs|slG$<3V8yfJ?x?pCIYyBVj)voJPzH8g<5`e&wXJQf~tupy2wqzckU0KqLRT@q{UI;?&h;YzW z1G+v8?L!WqMg*K!6cOayaR8(T_jGR2JRLwUZbK!{(8|)2$E$nxv}=3ti4?d&d!{u` zDtR35spyRJt09C`#Z{IFBYOU0A#8DaeghlHIROd`Ta?~aRn8IkQt*5QywupOLTWW0 zZnnHDGBiWX(6H+)#Dy2&m7$KosiKF*?2_m}x?$*(DG#k9B5060)_}3#<_j2`mDZ-m zvaGe#fdyT*gwZK^Dft<)#BlQOh1kgyzBSPPC(u4p_>c*U2_FtnMEJIhgCAcT?@U!^ zt8Ki$9x`y7dw5iLpDa3iQ_&ue!!Si#u1h)9gt{6|wiKGJ$r0;-V8=oGNRB`p72^mTpa@5t zGOoQ5oy!-IwI#}kJ1#7QFU}noU?V?woD<*ltk1r}ZwR z^;BziVGhi#1V~c}3mp|U(I_sS&oQ+HyJf^=g#8ErV}yPWCef47Aj8Si3t`CQlJ!8u zTcCX;mmpq?aS0AkgiDUnwTC2);1$nTi4x+NmlnbY=a@xoh$zD9r`Vh$C^n5;TI`FF3F_@HW}rc1k|4d z#L8ODOf`^I@(?|%WK8xrinm>kw`SNxw^#6KCJ5_ZT-gQ6mpE^VqL*+j_$bm_QC6&|Qt)u5DY&1F&h_*^i zWS=b2=0vu8Bf0{OVlx%a4G-YXRNww4AmaaLdcMX(+l z59brGar6{{1UFN)o&Q8^edF%`qY0DNz#*jj6`9!4$KC&7SGS(seg4@2PbcIS|o^or}Xj@*9|_p*<85 z6snVz&|BY9Acz6z!Sz(0Rd1YPj73WtSu2Ul~P#$-l3?viPE%o^5U?BWS;8q;8h9}XxL1AF&- zMwWrGB=&y^M;5Suc5^&`U#ZYL-Crz37`{^Y8*C&c7P!vXk6`N3bn&k+q)mH<8-e?zbW$gRW6PKI4VjKKB(A2XHj-L#ZZCPh? z8(g#EZma#jR(D}Vz&F2tLE!nT>IS~(=J#))Z;21u{FcbbY<_2O;o1Cl)H}BXTS)Sz zWm5DU35)cov@FtAdHv&Xv+I}F_b z&D5|*ps?6=Qt~lao;g%RORruZfua>AZNM&t6(#}F*A*t4noyARD{6(wAz`j5tuR@M z6a-pfJ_!h;Yb3v35Kc9&Ft3-bmax&}2%tQF#|l%!B=b=mD@?nNbA`#rVThJSg_WAf zZcDTkSYbAyQS1uy_V57i6(%3RvBJbJI&<{0!o1V!%g<=K0qW}t^Cg5yYhd>Zli|d# zEQK)O3Nvwat7%427xT-N;3N%1NFP?1AL$*jy{<4n7>5C|!gL`)p*p!1dOI*HOeUjZ zg~tQ{}l9#DF++~ScVuBmX8mJ``{f4#X5Ik$6l5_ak{RU$9&D{lRq@@LD&A)%&aiDxH@gAW)=<70z`)(PaNtu(_p)4mGwSk_5#Q!yJrK+9Er**1I4mZ7`8|w{M!0>+q<6ZO-{%_M zrM3KKItKTSF_PA*@H|vpMEjQ69A6P0(RtAml*>x7%sv~MdY0Mv$?#ixTW0UDx(ic* zFS8#@;Q6cSUQW?v_D<+q;)9mi5*e9gb_N%oWwxWmbOes>55#YKRBXSzDyTNrO+~6cqvlYv&;0S0tk*}Iu^T@>94}_ z!7S5fCl?yC(>!ZIB`u6YO5}Kz5~zDxzGIR>V@mB4-&A^^I2XUM%P92>$-k-w$!CkN$yKy6)3`jwSf!r=V` z@0P97KVOo&%eiRfyUuDy{)C7o%$P;gG;#cCi7n@nUvqQ?jxoNXaGZP!JFsFHN4ogJ z4r2H#=~0YB&8`H;*v00gz8RjBdrAE@XcQaA_)&NOcN~Kc;D}@37oE|2iDRrd!tBd0 zG`fZFYaHX(gh^}Q5YqiNP%s_FF~02T*1@0{$8a&Ixl_I|tD+oR=2k6}%}yTxs;vQ| zH_=Z4SV9R}9FZc#;lhuiLh?31^&mnVX2w&#R^y?MWvs|4T=Nbt-!b8u?xpC5uz-z7 zNo=(n5Hpd7l~|aCZ!VfOA$gHr`V}dO%rG0_2-wCqb*i2`P#yT_nty%(1_M>F%aT&l z**_wSjW`=~z16Ly?lirmMTig|)a{JwJM$a*-~A z7SDmEo}dMOGMtp&f)@8$-G$|c2Q6Mn;Q6cSE=|#(#jBxji4O`|NMvM!78zW4f)_qosTRN3;~b=uEFgOAi5IWAn8ZC*Ww( zH*@CiwR-Y9N4o6}$4Y6K=&;>8360jcA&mQttdMXFl|GNU)!1dDp@1^nvW9;aydr;_ z`1)EHUv9X+%wUPSEBE{10oZ1HtGkrE!fY}L z=o>^_{k$?xig-(T**gIgNvv_sbjH|?(>yo4;Gh*Nv^aOOCa!MPBJ3@G8488x;PNzj zNmAUC0*+l{3h!8}OzwxHc+%9uaXq|W3_{Ax-J6&g;y25}tCQ7EtvfcfyAID#@^RqG z3vugMv0GNghPFeDu{uY|FWk+Ff)Wm4!V>o?p&D}-n}i@HF909#Vuv0(+!1pY@^ zTVSlO=pTKw4TpaA3Rdx4wyr`m?Y5FJdA>wEC$)zSJ`EDbUEbGK}j zesZZt?qZOhNtQdSAdd^HSGb*2(zIjoPKj4%6h&LK2x?#=ouWqa4(z}R3Y|0`5Pc;)fP3A~2XL(W@r!5OUob-S zW2+~>R~EnOFBT#C0in?vH-vH10O?1d1><3a=p)pv#xzH0SqofMW!PqeUPthaS!goO zp+}j7h?>R_G>T=M;qU-%#^D1v7ze+27^iT+=v=EWYwnsth-aOG0i!X(q&2XccNk8J z@J@bR3>di-T;BsmPZ|KK%La_Dci~(kwiPgP;YVRMxeLT}5CNk{^y25pz|jN6fuI1= zE4Zq629T`xtghkViE7h#i#BEXs0)%YC_`o(FV@BbvQu!~DaA%uh990La=?eLC5=;o>9llt5`vII#I`MdC zrpyR_rl)JJUjZaTbzd}_W82{O3iv|W%(pd}+w^2PcbkP0Kg5W?1yFTH^fQDcs9^73(JVpXXW1J+ z>Al(+X(oGXeyRHst_N*4yYmC7G5BH7C=>+K89ezq034somK+6rOMDQ6OJrmiJcA1l zgFEV-PA0etIh^c<36m4_aIR7>>1n}6Dwv6P_}ODd3Bu2b?qM1jf)MWYMNDSyi|Cc7 z^`T*jOzV3gRqb0!?~R2Rk=wy1Vxv4eXuM;09PUS?=!88oLgbQ_1s)Jd(v>vEi^+;vp>W}g=i)hTjld`Ul|Q)54tOy zhkF;1D=gcb3GR%j%9#MMS%?Y38iVKI3JZ!?E9i#jgF1FTvz| z`yD)5f0KAD92gQ0Iah959Ic-Se^?LWrE4J4-iAXpi*WHreQ!F?0jmGT)c29ssmd3Av|4$)K>xk+n?=^-GDlBKs~1-^nkq18d*qY+5Ay z^0yuQ!^8p+|bo`=AK>7UKhgd!NWl6W` z{mjoji_mC|8^XBX_zH2y-Iq1gt;R0>$yX^2XJ!=AHcyW_{GC1 z+OpP)?!cOveKhsJtyW(a&9pd9Jg*eoZrMwiv<40#y(F_7j@rpEUtImD4c-lU6`^0v zLKA(j45QCIi@RvT^(fYPb9ewZ>+k^_tb<=XtfK;cSen6yp@z;{6Lk zqcv^_<3;!;zbvts_nLsVX}-&SJLi_1v8{2#&z49|H{?AR%IQ|GA$BT!D^TQTYd$DOB@b+JH$>NY zez`I<2t~Kmg{x@T$_Y0$$<6?5EKi8A7gc9nGa2sVL*{zK8X;}rdl9hJPc)leDO1TfshVq1oOq0i=^p0 z4eo;!%S6_sT-@;dyrlHyLL0TAv#crO&@IY2vE!tu4k!vel6;3kA7pAbaAD2cnc$i4 z!ZJf7SjJDxA$^(eSHVE8NbogS?#p~N1RIU-w8pvLvdoOc?Yw|lMsTxb*< z!hLyo0C#kS58#Nd;FtbHSKeXu2Lbt${?xI{9&BYGx`a-VyZ_B^>9Wo0;dOti?T1=j=2y(CIs%JFbO zQt59hgmj*cc0D#4;jUvpQ|VcjfZ=!+&!~4fk328W^-1y}`O^#0_>c*=A_4hn(A1M( zkDm-9ZtbI)3CL=@&6!{S$5v;4(}Hrs^Xs2O!1=4{2ES;2eF}X`Y*6~KL`5e3ID-jK z`mv*4>HK=TFJ;WUk(}YAnS(IIEl(@HnW`>}{Q6G-s5&G18A1|Nu=hu3md^Zo{G|8V zV}AYDtnU0kY7G7r0?%JnXYk}6s9Yew{_9X(;)57mA|u1#8C-Z6+);1f`StdgQG)QH z9K>b>A>1p^udhe+%F}hx+C--7?xw1J%da0f*5qqHcOeqEaXbziCU{arRn7#6%|c8N)*(FOUO38yGVaAXN)k7laeohJ5l6;7 z7Q6OYUIvr%?X&claldD3wpMN9eRQ>baD%>-4mvGFR)?Thpg6rcW-tl@bA> zcjF{||B~Dth?-JflKplgo)OU{5OUkam0hhSyUu^KuCl&QifAsD=}~p1m7qn>+ku01 z|IIJ{Vv`4N+Ih2Vwd~3G0dXQGJ$RHoo9#UmBQSuGM1_ImFAy2X5@sZEr6i~A6JydX zeKbk&If>M~{T$r{7zx_FzU}^(07A&PTj4?%5|sK*UJJbqB3yWOQSlPNK~5?PwY-62 z+Zj|d(&5r`b~NFsb$D3))>=ip1t#z4JWFV3by;UeUO-WzrR0g^X9(eN^6wl_Ve0%6 zimn$=MtD6oV%PBftDI=KB~L~WcmX3R8C%g5SIxd;gf+*xjpTYP_a!4RKzm6>*jbz2 zQ|rwX&bM3hHMmO^jN!$ljUj>IHFx=W0!J8J&3mJaJoVP=Iss`#sC=zNat69DVQ z6g%$TA1_;_FJF@Ond5~luriXX6uLmU@?R!C&XzOF)2>3zqoGsyNY26za9kw~$uUqi z2o2}r1(5FgGwUNuoGzqWkL9>_>Q=9LMfJs%kmvxEkOS=@C3GDO?ef&G$8wJn>d{lb zYNp!hf}`H(_QxN;w6qG6fb^h-wi;?k_Q(%`PH#su=l53E$p%tEsS;Bl=Qxw(+cjMv z8?se;_mWglYPxo64V@SoZ!i=x^n64*pV^Q4!_8|bU#2lFkSc$hD1Ej>j#J0E_u6lV zMzNVOF9{FePH^A@I1(K2i*BRz!;QdZY_`^Z3F!Aj@S8dFH&{LST^+CQjF+a<$8NQ~ zr`BC$!$iMr@ESs+HEsyw%8b}s5rW_GaN{#v-D)WWqAspUlx!qVM||{QP4dOw@!IQ} zS=9##r-@^eJaaPr?ANBPD4l=tD}m>iU0RlW;>EUmBHT)pmP*MF^y=#}q6 z2uT)NDhxGW+X(e9CCpe-B4Ei50Ku^ffyJ)1&F^9PVAeL*fG0H0j03#C*q`;yV@t1Z z3}AX#lacmPk2$8R*M3q@d+N|q-jya@EsRg7QAg*S(xhZo6K>8qFI zO2>T025ma9t^%yM|jTDT-8F5fJ%QecVmdT108)~=(&eP3iKS%+KYb6I8umodm*=IlNjo}Ff{b#q{B0c4jkI85|1=2LOg7v8oD14;`f&xhUy z;cXx57hvgeGm4PM^#YDor^g)=j}je#&X$B$(?p%^3yS{_4DHg{zrymt={a{-46a72d-k+zd+2ph;M#?$?gHGV(5+Xy zm3nJ-T7}da&6!pQo|BlZb{l)~Viu@WNGZ` z1k|*GscM^FoDEm1o-We^mI0)a>64cu35JuGaY~3auO-=<2+EcE$a1z%#C~@u_REIs zM*AGIdut&K^O)V6u+a$DZ&5M3Q_*Uc3)tlv+>b|3L58J7sP4ni)Dx=1Plj2v)>I`z zbzil*40AIN)qR;j^jFnQY0*&KKS19SClsoa2+4%%GWhU>>KyevkvJ*sfl!^@o3bFT zpc+pY{$LKuv``&#a%8CP^;9)q{MN8L**n5Vl)vSCDNb|5h{<1m3M05&@HSziLV|Z@ zwbI2kMrEqi>{cOfpt(nG?J$c%7KcodfVfZ_Ijgi#Gf?g)6~X|gZ3P;IqAMD05m|kv zZNU=(mlT>Ir}4$us1S`yIFwI}hD_Hl$xlEA;?Fas957SGTuWpLvpXmD)e%*B%pI{- zh}dCG!ej2j6bt_&+=$2Ah5IOpn2ot39vv}vEOy0jQkdL;;x|vgP=jzSF@7`MpK#3; zJ%wuwfO?3|WLE=5&qnQWcVde>D(IcOd*6FP4w=tgLL6 zzHZ6JSqvm*!YVSD-rr#S2P9?+#8uu4jY8%^pdN$q?~JUAtNgnqFv&ac&+IC{@TDnV zm0ddLr>%8#l^hPo7rZp(OK}(wOMDj+l!i?1g5CzP#2?8l@lAdN7XWitIbmo?^$L#L zm=*max&KzFR%SsZ;9{IDxy7=ak0yT7%4TAM?;uS~a2>KaJ+DkhYLBL5dtlE0wK&PV ztrYG7HDQI_At|z^3R}4)R)wM4#cwLb(eo@ZJ2bL%NGsZ=ri34F0|iWXoj4A@4!Zd=vUaM`^#v! zbX}1=6`B=TW;3u%ZShIyBINiYA9G57ETSr>G@`5!rNb(Mud;<*EwsuOE}f)cc9o52 zbgZ(m*tN?3EtU@^OXA72jBK&j?5eZ3SJX;QM7Xlc@q)Q=JHoRowHPN5qPN>06E}Ua7I$GlDc@v0^frjK_$g7sE;rd3 zacD8Mkz?4oB#%jx6CHp7kTh2_4yDQMg`r&r;8rXji~*o9t8w4pQV6pe0QI2q$1+@C z^qi~fDVAz95lY_i#nkRE;%p>*2fxEAbPHm_CisP+4xQLI|OC$cW8bw#G+ZiK66wf?E_><)lh|5)7gg<5xEKqGS`=^1ASn%m;Af7vmQ_ zwx;D5ucFixHd!mZ3U5|nU(MNHZuRE3_j*Jnyi3LhigwK}BV<}5yB9nREv6dtWf>pm z>Q*yJ!hu1{s01T97BP~wj4P$Q+Tn3PE&FIub-pfgwjgu3(wVPK!BP6D zimo0CwUN|L?nJPLlSK|)zUwT5g(FK}4HM#DtPp?C+7&Cr#U~IC!aJ^#*Jx$wLmn@W zxNjd~T3h7IQSLTSV!mDLz*PnvB8?=#X!0h#pY>WlLVp`&iU4n61b9;+0=y9h1K;S? z*l5enLx6ytY(gI_G$FPLEGD!PCiH%qkfm5P z4TyYrKcYd*T}iuZ2kO2I#_nSnGw8pOZ_{rdk{Z*Z>{?MnkX02Z6nulB;2#R1z@+Ia znAcYrgn2a8w0lOICqH4J{HPEpCN)+AC_f-jqNu^3EPC+@~Bfg1)1j2>1M=B;wPxAHd( zZUc<#UZkHbg`0#o44y7qEzz6oI9_P+pxrR2(1m_5`z2Kk?P@$i&dj+A(3GaY2gbb= zK9UQu0~}XLLUJ;c4Z>q`@d9_3mN;F=n>dx@+Udr{gsMdcpnx1`4}~_yVQ5!qV+zX$ zqkyg>c4K#e_fHX(zlXyBrw4^(9^k684mVVXBYaXzaCRMLaRg5gZg@~5p^&-Ew8;k#W|yx_WGD? zmA-08hGk9kSjvlTKkbY&{t!z#v(QvsUzXD?qPi54k}qKgmg@Qtlnp|41^7g0u4O?p z^1MFGF<)A7i4H(#F(jsn*TZZxS&UQ-G_g_B0L2oL(2&2#x)u(XQiFdUyVsoQxwM1Pl zW5%ROv?QemIZ(=QrFO%;b@W~FjYdZT-BziI@2^}MLhX-))lk))_ z`{ejVk8o=HGb|Tex6sfX@VDk^;>9@!8v!i;E#3pTW{HhQt`LV8_W1|tlUARG>cLsL5 zVO%PsR|3b-rSiMsa3nbc$YP9#D>LoZoJ!FkOJv2~YjLaF?3@$upWF7TRj9>#v&NQYrXbF29rIKyyC$$7*edQn%tMZe2Cs-HyID?h0xgkR{kFw}heT_|@cl*Xnb0+u`+CgwP)hsCZXPZP@rv*fv& zn<|VT_9wUZ(WRp>8YtccPkQf?3~LymQ)uJqRuWeIc2SU;$49iL;^2t7FIhfws$bHx zUTY$j21c2bPSRt42;8HqML*{Y#}gM~&yuZ{4a(JFk?ezCb+rJ?e$-c9=6MqDRUv;S z(Nkcx^)hG_yV`nFcmVfmix1#fZQ&Q43AEJ~z4%2|+p?Fi#p!qr?4wpsesU@_~^q@>xaGLwb!NA_u?=h zmRc?(C{!m;hu#LU)H=o$(L(zrk6kj7ko*379IMWimYFx&xK=H+u)B(OaS(HZ#rwol zv(-+gGFO|MgxA2vhSW1+@~X**7mP!UD=C}8(!a= z?(R0`YU7e)d-4Ls6Uy+|^W~-eKocIXE65CQJ>X~^XJ`t$+wyyJ*K&>!%L2df2%CX9 zP`hNS^u8tO#M%fVKUQUF9%_GQJ9T!klx1>0t8&s#KS|Rw0#)dIDpVyC*a1SKWGLAI zWrMIRL4E-drzfJ93GK-G?c~^ZT0gIX(3F|z0F;@75U5#v%Iw)Nv`d*i7t1}$j7xM` zMK(nY+L@}(R@*F}6K;PVr>6jhpytd2twAKP_+7o!qxW}nW-6xj zUM^du?^?QA&rcOg2_B!1UhwO3YMCnXtr9~;RHVXd@)qpCQjvE+*&tM85ndA-b9vI8 z6zEGiZAvRp(E%t>2bn?&^b0VwOM!kF%Lk)CZ|b(IO?GKl|NX(M%Ii%BR6VH66HKqr z*?D>2@JF0uifPI3%U0*+sKt81( ziqH#X4~p>|pJEIQR$ft_59HJ%(s7IEb7iaa14~^|2GC|H&XZ&KPbkv3%BEs{j6_=z z#j222u zIJF+*t=X>%Z(XgA0!Gew3T;jd)radFn9{3ngYfb(5Vl=!hHXddhlzspT#u!AG9R#0 zor9;Yo(%8Vbn9X~o_^zNy25C>!e}a0M!A89lRxCVE70#(=_s$8Akg>wvIXIzQaX%1 zlb*v6eqqIfG-Kj4@5S_N)@ECLlltmi-Nh<`f1?3@`X{|vBSuOB3)pM>bZZK@3m-3o z=QyIF8@rAe;_<)^a4qi6gGys_Z~92pRb`azcR_w(G$auJKQFqn0k#LfOrAr*{#^>< z(Z<|-tKF@&w_6Y|bQ`mc?*6grBw)8X)g2cV$1dR|J9x{}Gm)~@3=6^vi=R?xDBS&i z$#&Ho~o?yQE4wBc7@PQ$?DX*!+ydODr~DW?(bU>TKd(co(Z#7fGNU>mi;|PMvVfgo`D%5HXwQ zyTo69G>N*H&Et|+HA?b!=*qLsDKPhB#X&&A)yYW*gX{WLgpO?}auq?&|2sKnI-P&( zT)^f_s~tSH#qha(qBWV+rn>4mt~LC-lBHA@!JHpyF_gMBG2P_q(#SMPuE5r8|93ST zSPesl@Jg$DlMtiHqX7#n{~1_f8)J!@?)d|DMB2&YTpXe;64KS}+6;J1i^(pJ>1 z2amrlCQpQ>=^7~L?w_wMrhNI}dTZpCYP-4kyySYM&V|q_xk1n=xeDA%#^6_T_T=%H(zsa&%smfttJ#swidc{JOKPD zdsUt9^HX3 zfSZA*ACTKrm!cpS&W#2~2{6}5E>m3+l+W)8%2OjbRyqf1YzxOcm5K9fiKVLNG>w%# zmNnYvb6IaLL{ok)>kZgwL|AuV!rXINRpD?~Ml;LN%C>E!y2SdFtH8=F^~RKTaV{!H z-pe#GJS5~z)jA!n>WF)-<6FwB=LTIBNG>DJ{%AB7Z2nZsNe9C;3N zIqF@C9ML1wNKB^v=nWK+4QGTR8csftLk#q6_+c;b>)*8o`Ho7q|;y$Z=`8cv}Jq^l#Y(U!^R;QCBeyR|0# zH(kk0!|?c$3XV^kdT=Nb2UFt8e*^tav}V?$VL!v_E{rIii;ggmO1ZEX1W1adJ$2*2 zNd!+zGOvO5BQ&4z)H!=2k3_MzF#vKp_wjFm1&xTi0IMRolV@mU=@84B#9eQ}>UxpH z8u9tHg~-SG{Az3@;mh#(HH^=tlLfB))wI4<{!xa_#Zm)S9gXHpOJAJ8VuR*k^7E5uRTQ?I&nvVI**#M}8^B z^Ef~ep5Hv)ZFS+TO1U6~%gGj+jBjB5;QNdyy<-!`cHn<_;$jsE#bO~!bD?-KHu4L_ z$tV=f1w3_xD`E+#xcLFNd}t`k=jn<0?Sz!aRFzDWyaC~byXgzfl}8`AgZ0TdgAIh3FJegxN)V%=K$WX;u+3ys-nrAzZOh_qm-wkrll&ARp0 zG;FHn9IkdZAG5%)QiRlW)4P|}CT13J+RF)?_&NDHxdUo92IOzMxZ*rey(xnr7TU~| zOV%eD|7JAbi(oTu4t-6wS|;dL8&?O9vTafC$q_M6463VnCO^U{Bk6j)jp&yWb$R=N z`pV2WdK_~^7Q?@(+NqGidfct}ZvY{rt2hS45m^@!lnzS%4tnd;&H_P6n+xf&ej$)Y zWEn{)Wc(G5Rp+LI;W4FGUWy8h1!j$~nBjw0-9cl^AyZ-3^;)mma>FPF)E|F3a1jKl zg<9^(6Fb%FEbN4EPYfX-Pwc!>^Of2oE!W>X9jc`DFIm>!2)8zUhw|AqPbCNY^bahDlcDKhH ziggJ3kvzmrrwMzW={+r@b@cWD>w83&X2KnHeUef{Hh79Nv``9uITp4FZSc5k)$2`U z2M+Zm&9Itk@-&=vAI$LW5_|t=X80KZLP&>MX4r)UrN@#Rp|}2<;p2k>AuTbZ3R&VO zbHqki;@dQvxm)gm8fFQ%Ju^WPT_(qdE}N}Y+iGifp}8P-3TE2XxmpKTmJ<^)OHM{% zNIr4Lv~j?|&>VvUI4J0f*I3-1aXU2h2)(sVmMO4FUA@)n%&)G{3UjvuAt1M74G#dR zPE%RrfK+jKz&UslLd2YdS8?D%f~7eJf?L5kkebCD(&rrfEezyx4!(rtKIeb|+KY2= z;`!v;P}YA#a6o|4J(%VTBm(t3QH?7Rn+t4{EDb3g_Y!wu>(s*b)c;OD$30f zLMbg}>W~^*;FvD0hC~OTh8#!_siC*Q&@MIfE-W968oJ)OVP1M+rKzMVN~t6#I6bJR zil&}CeV12Nf5};;n5z1uY?Z!diK!|NhAg#pl&2a~VVW1Iq|)tu-6)SQDDAvO0a7}}-gev9RUQFFWWm}x(>Te-lI z4n+@2O%EoRU6$8nN1j<`4SASswd4XuCSoiVw!!?$G?!UuDy);_M2jdag`VU@?7&i3 z>!Gaw3d_qKLQgHV(4I*P7RTPm@m*Ryi4H(LIZz)`PmhJ6UFzuyEDx$D6-C7U?bA$r zKVF;<1;FIdcC%sfBS>CxT%m%+3^3ygmFt~w(XAYgD^%`<6{s;7^I#632u z@|YaT@(UDlnc)d-C_PJdV!T4LwK89A!*SUT1lQsGNN1eoAG6m&w^s0-1p7;)*@af@ zY3J>juROnhtT|n6x2yZNR*-9~!pcRIm09w}l{+Q>#~N1*`MgB7T6%1UTby@^;~8n* z?I{`?h~4KRO{B`A?djJ_w8SD4FI-W`OkRT>SpL#F$yowGt;8Jv-G#@;V7haBwZXTS zn6xoXuPPlle&#t6>W-GaygT&SFoxXsW_$`70aHcYwer>Q0Pee1_yCT(R`83yy` zQt;iOf3ckQ4`Jmax(bk0kD2Q+rE)H#GjYfv{!F?^I{siQr% zJi|^$WGf0@a(yxx>4q>e-SgT_D2UTvGvNW;jKl|UFcN<8Fw!C5=&*@r`G~%mGk=EF zlSR=|Y(&FEanU|Pp*3a*+aZ6fWSFw)!;cm>Thj$Pgw9>C2m zd;kZ#;1>_OY&1M!ALCfHOl*9@>fIt|DHgH@jAEvb5Q44IL$oN#Ovn0H3mJx5N$XL* zdS^dO%7~FJ#QrPt7NBYIEAnoFR_uyAq?7xKyd@aW15QS&>PfqvbK{?c ze>!f+dyM1CxXX52b)C5G4t?cHV;V1zxeCELU`l1INXbk;1&l|RM{(hAkGF#A$hTO z-3lujP43K;nWt|b%-KcU1xCC@oW#7Lz=iN(6&i@@eJ^@T}clSsSm!4kzy;kW5Xg2UXBg-T_#G{@+7YbCLciXYiyl zdS#>2g&PIft!(P*O1S+}h(2%VqKzl!!p()}tHc(CYX8MTuYb-Ny8ScF9O#z4jSW8; zM6;H*=51_RD8(H*`Hj_`A4nt&zjf_b1fIXD9%U(d>)P+2Z;21Obxk58bL(0L7am4; z)FT}qWC}^lG`}t|t35`PF#J;vB8v;d1*CzDouJAngh6ycXiPVnRlH?i$N{!-34tqE z#3jJ>Nn(uH|NJqNQT^;9$t~2@xzLot5%Ae*b>;_AWB$hxaQ><~ z^Cw3@W!GKCblEXE(|WW!xeBUFY!LHHRAiVxg9#7wJL(OimIvl{GlC>z8mZOAHaC z{{hTLXGuS6NYV;MeAsps*N-m6;LFlWTn^D;(66Q{{QuU4rE_RFjR{9tR$e+L2V zui6Xqza09O7$WAE=*cjD20I?+chox#nLmajB)Zb*CLj{_h*2W(j2yIPL?YbliHi_zPSed5?X-dA3QQ~1afWHl=i-U`B7*-KZZcPcZjHdT_g((wF~ zf5TB(ETJzWNJOxnhm(IVgbThr=15o%eEAb-ABsO9i*aT^3`Q}7#4-+me1QrJ!aljT zS00IXwTgFai6C$VvS1DOM~M*Pj16b8!Qz(7oHN#8BMCE1(YWt9-R|cM1#Lw@o5v8t zI2dDyUOJZ3PN+k;g|yJjO+MHFWI7hwNAdyUs~8{P07dvRSV5p+o@D zeS4wVbGkna8~N$JnYPETW7ilrqxhL#{5m=H!&y`M&TvP}V)Oa)SMLwGOFqgl*J|O!56ZXDMMm{7Xxr z*-(5xD_iw^9$dqG!HfB{mM$DadOGF_t1Q<`dq+Cqb5zSR90~Wy>#Ib=O;&wDpiH?* zrGJ+Ab}CtSHo&)`QEYPI&%y(^Gc))Aj&uY3VgyeV24qZx(%sqotq{5%IbpR-Y^*)o z?A_0^dN{96D=qJkED9P8yzO=+z>;wXL-g=Fbwa=}o%NfHb}BXc z#C(mAVYUZ3+6aboelyX0W*E)xNuEadh)V~0cz6Ie)A0cuOov|v$8=X)z5ib_-A+QX z1wn`&MVKzXE@rzZ3y^#Rg&lQmk9Sw^>m9=}cUOm`x$8o#mL$SORNP(dLV`kH@<~8U z|Gn5FoyLwkv78v>Eq$zCpZ}}Q?r6fRI33ukx{9K9 zaJ{8?Sa45cZ>{MK+rf>Q7~q#)3>+TB4j{?|S8BHA<`=p(Y75R4L;`CwGmWVRo}n7s zjXNW=)ebbM(K8Nkxu&)t0RW6kJ88|&`kSVcQ|iv_AvGnH-InU5z{Y=O@tk>e_C=v=`y}u_K zRC4)G8qqYru49Hue|VEPMwYbGO}ghUj%3h1*&L+&`1H`@t9ZLEyiYHq(t43ZF$vYz z3K5jYB)@`H^vJ1hui1^HzHGrQ6Di}|+1_%?03&wQ>u)nG< z7|HQaxj@Ry4NzTThy+8TCnFdc?05vjQSWH<^jw@FshWDLfEd_4Mv1}p9JHa2W{5$! zSDqE{{RrXW8^LI#qBf9*lfR4TmG2k{+blwUVW|1NDq=AqZKiRpGrB6oIL4`vlRzx|)S!7n9Fn`J1tPFp=XLi-2POKxZ5lBHC^@-qO%sfK5+`z4jbczNyR} zR~&5K?XUDbOKU4Bb~+S{4Q$$Nx0kgM)bqVoc4{n8YPmfc77cAS6B6Z^(q2; z7&-s2Y_+TjsiNwIUOZE?PriVN=tI=#TN0tp(74C_GlIdrMvcA!AcXu*D{ACIg3`gs z`=Ph~M~%)dDqiyHd`2i*)qRlT+8I$Y^0Cs!jwXbVAj|nyNcXRHS+J+oZbLR#Wg7G{ z1eID%_Dou6CB(u=GB?cO0LYU;2XI8G2$EIj0v8V_hu}Zj!)tzBfIb6HD!CuA$?juY z!P|$p2wQSvEa(8nSc;M2pwKq%u`rO!7>{7N#~3FJP~1!_cW>6-boWeS78diAW;A|F zqg#hXK?v3FA+`DOf0LN|`e$iE$b}f;$S4wMcD*%+Y zh1;@v_bW_&ZE9HUzHQ;&Oh~pM2+_k-wff;XAvd^%dl_}B@zju#_Y51Y#BYLy*bkF^ zUJ^!_8{9u(AVl42b#Hh8H~a7b9PEQ%JnW;LiOX`0>w2L-xB9Y3731P%n8k6uP-tWD zU4%(%;1JS_@JN1L+;LTUIJp!NlJ%YYAeY}70IDspqEjor;ljB_Y|E{7;YVRMITL#8 zzgxW}$M{PxnvsmW=xrRwPA}Tpm+d^394E0?+7ZVl;G8@>Jcuzd@)qz3LUWf?ZO=}& zTJWe_6Jn{Io1vbtSFn>xTeQ$cqd8sMH#9MUI%r}-?Vz3(Ik*;+j&6cZ^FvG(VeY+_ z+S}V;b!iE##yr~oD#Ahg9LH2VSkorxuai5Y4Lb6LuJ^eMTY8$wCX2S(1Tvp;;a)2^ zL%{5^Pv`ao??Gba;rmZ2GyadXO|Q|89tEZ?wGrz>)HBGt^UA=Hp)zppJjC( zR&{(M==TU%e^uStF1kbd2hg{~4s8TU)MPe-GMMpf1Uc$mfJUzrgGl_P<@*4=WWyAp zmxhyC4&t?~q)DopyQBJWwAOC%p@7<1@;DV+CWFTixNakN{c%4)rSr0%ha?XO3HfuH zkaN2fKk2=O4_O=1z$Mx!lN6?K$KP6=`$0zRa|!tz0qd`-OGt7jR4%Yp`bDTNu|pCf zQInC73}!qM;;45LN=P0LNK~a!)q(Hrk)rti-8tyY@O`*fzJ)p-(JS9VMH3deg}Rff z=G)yh*VbVBuqiW>nV!xx#GkM$3Q-}m^agV@8c^3B!{Su=yFTtx8@aUvJ3sK|^ zG8+k!xK1`wewSVd%i~n9n%*YY|mB`4NwW$RFlEp0Xj93WZWOM4UmAHJh?=C#XC}$_5s@c8OjM zlk@Eo@r{zQJ4CzSwt2Qa1a9zTt=;q9&}C)zhAbd@*cCcX1%|9n9q-R?vZ{!McBb4E zq4xthbnnT}%OWm~83^x@tBTz*{#Uk2?^s&WD^WsHt6q_pw{~&QMgBIG*`W_D zqs$aKl8xAbCFTDE*y_KOJNN)xc)CMi$ zyR9{|4X+a@{_LMR>n>j53qJdYZ`=i*{X5H}KjqtdB1KjV#zoiHPCof(x052C`kMNO z98PwjM8{@T(NljrWea-h?`%LrIfry6J&V0|cwxnZD{+sFnDSye##(HPZD2n0r$A4i z*P~(=AQgS&Pqw>G{MG9de~*wo#Xs>U#)b#}&WS|jm>kBk?h2{-d0a1%ozU}sopHK> z8UBH5jP=L-I^(ooikan(oG!e(sx!W~I_v&io8AMT^)Bt#zS;6;JM4ILOTPE_EGY!e zOe1X*R4fbVvLe}PY4IPX9jdqfMq@cbETQ5XNL@uilov^K#3B*j`MXWFN?wS6TCUJK z$zlRLt;8JvZrM}p_;jt3Y^9B_a0&jer58GN?Wt9>ASJ#RqU?P~jKd`e_Mxg)^wWX7%M?Yv{qYaJpSK zgDO2OQaYUv1AduMZ9x{Iis|3^((v9w-D+ugbiH6miTjvNQ~MUv>0eBy`*j%c?&_{GCi>OBi9l?!&B9q(KGx7CwH-BK(?!$euR{~#1v zV}`I@groB7V$Qm2J)~MD`@lYX!n4t?r12u&z34gd7xCBvjN+cRa<9f2_p~yuH(y%q z)ZjwS?Q{#(_6c_1)dUxf&FLEcT}zyhMKI%&A7(L+WR!H1t4kxTA~_3NvqQ=57xB)q zx;Lp?>_xn7&{xI_(s|PVBHo42wD^m76==m?#6vo{U&LEtu`f=lDSU8G32-exkmM{A2 zF*PV8Bfphp^4B^na0EK(0F5T~eey({_HeSB&pv-|3v-_s_Lf%IiS&j>#DU*p)hL8A zp0zWBjo>b4)Ng%#NbixEIE(e3TW9~=WNWrDRcXRKT{6{lFT80~ot))wNsOA=*p3Jd z*L99BlBFmb_v~oo$Q&P$eR?}Ig$R!8DL4FN7<#FzVNksP>wS8no#s%wpK`m)>dw^7 zdVB(zp68q1N#Oab>I>nb8QHIZz9l{=-&7(alW&^Ag(u(CQI92%=J120C(k#{sSY~C z9!dEPUJVQmM-Dm>^Zd%5Td8Vpp7ljc60{JHNV;xLQx>H>wZNm0-t zmjP}K#IBZ40Mv7i$|8{TFz4B{26j}7n*zI7B8vEb%LOK<`nf|=SMdLF(9~lG@Y6u~ z|2%5|KiC@opF;rqtMpg5T>jcc;F`Px1Vo>-Rj% z>dw!y8h8I5f#i-HROIm3N_V|C`|ZcPyWnt=0H?L`p20DVhrkRV7@WCS6D36CH+>TN|e zAI%_=tZA`!ATajWQ3CU>90X?sCfqAOf_6)Ulf{pO;37RQfV7vr7&;ZvD?btObax&jW^%N9r$XY-&gnpRlyG$aYK)TH%p;2tQ%{Acx+`B$}0LQKmelaY8 zN;+Cati&d3g^0kY@UQ0V_gKC8nMc>};e;DLkg@ku0fnJuI3!{N1fM3FB4k=4yZ3(> zTKtMna5&y;b)l84as)Ih?Smy5|s62|A*$C&?A3GWEFxud&6L$(C#S+ z4vWv9qDA>Y@=+^PZiAO1PlP|Bn9g@1W*h3^ET2kn1?BDS+@$633hoE3#8^L#ah`+m+l z!t`1q=8y%n41X?LrS~iy%izHVC9bN((LyKh)I^iN#5r3+|4u0Dx6o@|fO|sVt# z8;|yAOz9OfYLHF*6<1rOZKCJ^Y@#HxnqSB!z622IvWa(M`Cx3~qtRxR^n$h1=npII z2h+ekSiwz-ro1b#WF_CWe@nCwiIp857kh(jmA-K47&wj$@?KTQXO+ScuGiTwQ_Md)4dPM`Yp{F%5%?lDN=z{%4<1hORE&o0jLxQl0z!xA7N;h zO8E|!4@RXt4(~9*J@4_xbdT}Wi;AliZSWqHi{@f$9a0t|9(~=%&Zbu2@tsbWU%OdX z!nR&(BUaT$nJIX`;OtRsE&X4zRnNCz$hAtr*XLzBrHYN2lMYfVXv%9)=wp~su~ye- zJ>0sE@f2WR;8ZIyF}mqO(|L_@`qo3ESZDkA@BnUSn-Ab{w(*O{*;e~)*|4i4-Tom~ zPu9#eB_8i+XVdLNA=k4Ajn=qsH=7~E^o{gTqcFA@a$V!cj{^=I}qb=5m@t z>nOt6m&-S{CnkgfsO^KB+uQ60O4@kG4=g!c-P}H;T59JM^itrI+bzNxM-kFP%^`)_ z8B%blo@u}Ac~*Cp6lm;w2US z=(q78Ub&596nG_@e%|j3!rxekd_4dBb=YWxD;nPg;l_2PCkX!8XXcj>7gMSvahjDf zs~J0D8<~}HA64z!#lVL?!sI1CO%Yr!Y3s33AxTp>rTadF0=J7@MBojElP!fn z<+r5{L!;2SGK~m0t3DH<;AOcN6`CO@#&&E}h#0HE;b}DYFd|sG17Z^5vm^$ovTLJZ z(}h3z7hu=;TzEOQsQ`8nWx}k<>Af?eDi=CLTp@agrJkok2|Fp)kl{vr|6Vv^l8%|( zJ3^#m{~qz{3M)JpCO4q4!WC+12}{5p0}CZ~?~LL59a_K{F|S~HJBAc!`wp(ZVvc|o zTG(iT!FTV>Qd5NP2Ab%0+t1Kq4TW*Nm&;a5Y4^^YCoSyiD!{NoMWs0SC; z@TS5<$loR|-z%}=jFGyRx$lHVv4Mq8ga>d37We>;zyf~JX|H9k6TlzwF9HiL3@AJ&cR+9b4lHP!cc%D*6GaIvj1;t7d?`}Jm(q4% zLkp)`r0p@ZaF*4bpHtAc6puqdqyB^z?Aa)q2SN)=DDA`K9DYH;NgSsKB)D*OAp&wQ z`$}vy!j(-_aN$I5$SR}E-Ihmlv7E)om{VaMMU?iA#}?#oQ(sL-PeQuVBC;?6O+AqX z{A5@uYjt2o7Q{k1|OdI zf}>ucrLEmQLa2w6r{o|>TiPP`MlN-BP}RQ07v2Ni=^W*!DT2#|?VZ@DkgzFitFRp` zW$j|gnwc-)Q+%orsC>QoaY9#kR(!pQv+6Su3dR?{TWE%y7~jT5g@~adj+XiWia2)4 zei03oF80ZvK(hjo1sd3t`~QL-@?t}r%>NNlm6I9qRfx=CVdr55VId2J6@(Ke$(Ic) zAQl~A1uS-j6~-V~N1TlO%!) z1SYPBMzMj3MtA^sV1f_e2u$D?oejzdCZ1{ax*tRS7Nk7xF+m}iNn>8H0_UtL$~%m7#hXe z%Ok@Bxa}n$z+o@(OMmR;8CFl$%r)*Al)XHa&}fYt!nmp2^gJeE1JPdo78pFVt`c?8 zUMgWoeuHw+v%S1-5Lhi_FRylCRih@KzOa`r3@AJ&-v_Mp+g=_QP@U3HGIEfi{1>jV zoQBd0=3lC^{Zyc{!t(d5WI=Tq7d;s*5^_}L;8D)L)Xq)nsQ`R+i^T?J(0{FfC#0Ef zx4N+8M5Cw{=*Mv>xO$3_L+G8VREB9}1IOGHw*8 zjYhbtirNO)LQ+s{4(he(B%H)C~K{-E?7fOy?j`?*%Ew(y|zi)E{&luKwKg~AT%4ChAcGf%WM zOQkxet&P{nX*y%@n&&Q%gK-&!oa8?20O3$#m84MC?}eC`Gr&yH6W&WGamPeBPu%$v zj%nx0FeZd5IsldAKzb;I`WYD7rIP-CdDk8;S5@61?|bvQ5D01>jJ&*&+?#+wARy*N zLJV9aM0qG3=FXg(nZw+f>CBlVS4E}P0`(}M6F=Ib7tmZ^7W6b+}US8*IsMwwbx#2?=MsO?3hsZa2)U_ zOZ%2c7iB+~)Z6bvAgv7c|7MN7%cCa+A;|S8ojm%ED&@cX$T5YQI0=a(c1S2+hm|^} znP>{5pQ)K+@DYdAz}0c(grPz;;2H(q9b>PnDOA70?$2*B3S`Mkp<;RqG-id zyC^z|(q~l^;T44T0B()xSrqa12PukVjlGMaFag zG+;R@rZ4(Jq`6l0aEtdxL$$?g*t%IP*}W?3E#4nu$PBfdg!f?o96p+oJ8wELzQtCp zWtUC|#sNdPHxouet5E}KgIC)T6klr!?DPSpfvUWpqh`|Ho+B zCis6w>9Z^NX}{FlZdkq7(7WKL#$yHl5hycxf0@iocuC^SV23V9jv<);{@@BPvydFOf=VC)mXUZ!y;q%z>c{{1&lFR8Z zAl;d4NC;5vKKq=k&rI^k^_kBFTc3{==(KLkT;p!2`}eY4O>nE3yn?I*FQ%zxeOkSl z&E95*TkQ0t(`=0o@1ti1tA$oeB*FJ7Z-3Mb6}2k0B3|Y6;4CzS(s;OvHJJAOs=!rh zB-~xiODg&e#Cm&(vP=i5#oB14N*)u5dRM5T5DRL&f(eoF(9}BfLK)A7OKntHOLiUe zs)UJ>I5;V0DuaHp1E|053nyFqCkrJ-`~g&E!Cb)6VZELvnH`d^b&nw|aEr*>1wy*H zMu>xI$)`|*l_WKrjC;@Kt7yok27jH>W7J^LQAq2a-z|HUox^+6inUYgOR}F4*?SVJ zB6CfpoS=*50$nt&?%s{HKN5tI-YP=p*gsIE{Ckg_bE7!yFl9eD(2jdzQbZlZeO4^Z zB+M@r2CS;4CUxaTo0RqdZ|*Osg3#vqyGR@K=D9odh;{m?m`SEZJSlK*)gsdD@?`}O zZ7MdVFm@ zSdNLf5t-m`j1kPQ6^(h#g6kB$dUHm$CfGZ!;4!fU7325P=xX;|Oo6`1OVrQG%ONE; zsS*qm=k>fUPWc--sxQdJper)yj=zBy8B1NFykNrX6iA9(V|3p4`&$}I)P*rY}?=SG!aoUdHNz|95&1-Zz2Dja{h6{uK zj#euzFJGU^7wgsbbgi{HcPSFq=jzSM{tAWqBVEQM^85Umx~)GUvVf0Rs^RjdVhy$? zx{7You8E{eOsP^w9Kn!AdY2M8>rzjkL{o+mCMIVTPSRrXP6LzfA*vvx_Y4OVAv>ri znLW5Ua}P+r3FcDkL0|#gn3WI(9R_B?6RkCfY{4U~%R|}Zcq8fNpx>K3XuCD*E))Wt zJg(^E*v+yz{AD)qf#e44_CwKt#ePU%^rb~R;F?D)&ifIHBEcmv{G-{m&xY!XU#8Mq z5P3VgrOO{p%S0XRCEE#FT<8_szhSrzbuDRH0_{d>DN^T6gE z3p&NQ-#~wDv@{>BN6aBf*v>*r-Sd*c+9oc8l5PP#kJ%2UXCwERV}a!b>^)@nR@5lA zdqP074OLN0sdYmYiZ5Nctu-Pa5}!&lG&nT4i=iV&aLiMsKMQYQts9C z7tND<4b>`#$tB?0BThwP^h1-X`|5{fEjll4k_BWHHpz47PkvZ$SpNTV>m)S&LeYac z9=7~SZK~eN6(;L#FIUJF>(h;@<2kvOsvU9XtsKi-EEj5c zACMCHEe-3q?H{Y@QPW?w?zk?YezjW`GazjNCbxvyf?Ji3ObXO!Y4%@7xiJ&kMA+Wz zsL)y|b-^yK5B`=)BR6okcSMp#-FHXQ%!9JaL%MEmlvF=;+bMko*Rc1VY4t1|TeKp7$BK;8RR`_6QuR=y7L^^_tm=I}8zH^8YvQvke zVZX-;Aa}yO33Q&=l>^~nT~JPo%wg~f>VF5z+Ld!IvZ?OcOGI_AP^BdS=gK7a$x4D1 zfpJi&;1z6)VpsSDx7a@_gff$^DEZ5_^dj^xSvC2o3g~TDW=e}?82eK{SC4!Y%qpVsE9C3 z1QRg~W61~SfGz}~@Z@*T3o;G2k%|qz+XaykHb}1ZcFr+xOHr$cr>2Fho3eL+*Lsj; z?S7lV@p))_Z5SezHm7b6uzgZ!W*oEiVw1MxX^c=KR^yAP&|3EZItXnvyc+u#vQ<*5 zmNWYLS*W(Sk4UNAs8)&vsG1vE<;oPPoH7alI}~G$cCVo3_`apTs@2eWmAD%*)98g` zfEe~7(BS1LAK3+Kn;gQKn0Ufjs)<*4r3Q!wgqD9$6Ea-xjJj{o()SKK9Aope8uFyL<#fMmuTAX-*%z z(%LAs^5d4SgnT|C!%pz|Si4UNAA8O0IP{O?_5lX3X1(Dwy_uY(H7!LE6yu*qQd5&O zkklhBIfZX zIM?wXCY#OK$u$MJEW|5vQZNylJu4`ryw<pjMpU3ttL_*l+{MqDYKr^BE}Dx@(7~D2OeJmSS?~?#vuYs>8*q zl>g2nibDlHLdwGY08Ox^h+ifiu2v(;q7VdlaIc~YLhQT+X#;2H==4h!;K-Z`CSSG* z^!6-YWCf5f7EC9}m)E0dn|yf_rO%Fh+2biye*i+J%S|FdTl(H5NbN%fI8m20YDhv2 z=xL{NSkOUwg@DA(9ja8ncdP|y8H5Akcu<{C3j&w)Vf`D|kn|)|`n*pKFpKmF(Bj@l z6@;XZkFF|M$DNjMOAhW?+{LDWGa~|)Q;b;DYwO`DU+2Uuu7w!%IhGakUV0OoZyLjMe zE{euEng>Ot?{}i7Irc$!}jqqapo&5`2NoMyqRH)X>@ql&8|>U55ja2<;K{kUq< zbp_!kf}pz#RANzbMSoJ2V6Ny}fU0Yy(TSUIV>jXcLik}c;g-?44qKfme{)t>^Z*kb z|NM+j=~`LSJv|tZ|G=P>(V(%O1(8<8KDBo4l9bS|@A?&%I(u+p4>}2V_MI_o5s4@W zN@*&GHZ)^v6HE_Z+mhnq{=qV;(aLnA-t?U2=8$WC+pAP7-pqJG_!i}5#&PLwv|E(S zy(~w8;OlXk)2tN8U1)Qz0WXO{3%16lGd|TUOgrN{Z~(lM{!-aXGc~-egND;)E>@;d zb*WPHL>=5TpzqD3pS=(x@~4sr%%FSHuB>(wQj=DwQb!jfm_GTbgDNyClos-y%9^M@ zLm@G(Dn@?#0qWh;se;f3bcKbkWuL9z%sy?(+$S=lS^E^&tv)T;gsgL8UO z%W)KP--6Ml_X-Lht$rd}-8HDj*f~I%bVtYweYKlRU+BXbdLQ^rDPr-nUC(k)a!<|< z_rzb(YBxwh$hW2oP4D;Hbr1UKt<=HO^$wbQA>9#H+UF^3WE;c17B(`LNo9!0jv-ZC zqFzfer{Lp>125YN;9=h1RMO+I?OK}1sv5bkSZ-rV8v5MyE zl3oTRHm|d}`)0Im3qJWLq(@vb5@#(2sTtVzSBaQNWZUG4&CIsLmzdOG&WYOt+wu`A=^58Ah{CBe{XUFcIFffSeTQ(#4zVPvM2EIM)hj`(H#53p}ImO-qZTX z+ex($KE$vXYShkG$@s{?S6@pUaw1=K?L#)c`hIdxdf+SG!7O~$Jums9tWe5BV6zBH zy36o6=J=?WosJQ-`cl%BxZ|2=o1M;#h#q0$PuHA?xm9|wL8}XQhxkpgR+^yIP#FTw7M2Wvj?rtMJXP%O7mn7T0P1v?I3rW@os+5 z!qIvovWke-dGx0xqV=_}Y}OA{@R}Nn9paZRv%4n6Sr2^AgFx1q+++dQQsSN)9%@u` zyo2@T4RAuAs??m)u!umCb|w{uI=hW1ignMYLE>5?G1gRPNh139=(033DWgqkG_bUL zWXtd?3v@_;0|^z?peHG;GDH5QnNTVs8+KEnwNfyGXa^NnI;oCGa--oh5*1y#TOOM5 zX#Cv4a-~?7;W8qAn`c3Ib*)5R_C=@FLaa<&1l^EoR%&fpiixlNsqv+v!(^;n5k;}H zvW1t@CqubX!k#ZJW_amH7&Wrj(GOsZ#V0jaz52WpTOxN<;+aMK^`o&#V_nFn+H1w5=K1ur-0RO=Mi&7;!9YQd;*)C}TY zC~B7!s(veUGAZ;i^i`+-cxqGBBDw0rY?xNAqEC9Q$q}esgSNjEsxH2h8uxsGbuT`v z&OPoO$ebYt^()A(@WHr8AtS;)5nRM@k0sx^z0!l4W54Grz$f7zrQ(wZyP!QgpE&tO zp$YF2Fv<>WciC#RTitSidqAe(f#Vdg5=oZf9K)~jxWSoOx1MQYEczXh-A$)Tahy20 z=e2V7vhmO&*|KD!AVFc6anYPtnDib`b&6^v7d^}HW#uCJl!1!~IkKbk*blRlC#CMB z#ziNfP~r|lzX<0JbT|VSJs))|d@wFj$cS)J1Q#(}WXZR87KlY*)}M{q!F%Cxq~g72 z2F`nv%<$GH<6Y@^mrren|4UBjjgkYgid8tth8C~+tXWCS;+MiXW4X&yQ?nv5$#Q!b zOa_vgRz`KMug=exQJmnOTM0%q6?X*>FRjz1k9o*}*+Et}8I)|Jh{4rokz%sXe z-?oYTl?A#$YrVNg!`)g9T(9LR*F)RdccQf$k|krlsySjT`X{NWUy-C_(K{Jhtt?8P z(zEDD7;SO{(GOq8f3KTW?mF`sO(HptGHKT9asz<%NQ!Bk} z?5y>;A?*+(F#eRTxLUoeTG7s)k)WW*mw#GWjIpYl-Ne%k)mkH zI5?a;CWeajj{R+pXj^h?JscbIPQ;5jNrdF~ww9qro1S6G7MA&0z`w}}l0VJyye4rx zG3W1Bv2LVxTC60tkvK!5r7SaaFuAoJW{7tp%M5kTO9#7wNO9Ltr$cdp3y?PGgI$-M z6tW9TPVORm)%63sZ|q2Bk-%-t!SA0g3cOe$Y9Wc;_i0J~Z}ycd^fsJVu9tE+MXNf~ z%#=iSX>lGW^kw}}Zhg$DoOGc%)9+rsyV4 zy5_dxRSH#H!%@l|taxO)s>=kZ+g}6v%pwkyhC2_0gFmA3ofELkt zTw90-@bIWz{UDaCl9OvUDDT)=wS!{UC{th$$L{Ya1U?bZZ#HB0phOQSw8{) zwrbU?s%d^KG(d3z{?AlstysMxcR30+=;dbRT}-#kjZRhT1#!qQCEYOi0YZz6DI|Zf zL1^Ld+o{oC{AO`1GEF*za7v7(!}iSXdh0J!BSRShq_O1ZC>nFTO`nWSV&d`kd^UE; zl;W2ne72KWa;aHiGX08!>>(6Ndx((rAbT0=Rv2Ms5rvM3StNpu7_*2a-%EG*Mhpsj zey=rvlf(TcfRjhOI zSq+=x3z0d)3EgXvU15VUmqJB^xgwZ|VJ=I)13ePb_uqV1U!DGAWy&>+CTH#BT7^aP=@bG(STt!7PHEA6JVmX-q8Vr*Tpvj8wYc0w?hlnt0M*4T z=)Mr>GC~yHFU|#BQ?l*Wm4_%ja_h=GGPm}7<>TZuPHQUKvCeGRTdx|By*1p|K8&uH z+cy5;`nly5mn1Mp4S6pEm*r+^)E+w$u1qR1(GQC0*{bjuCR>-^@p4oe#mF-ISyjsa z{vIcA~X5d0x;5!;afE#C$_?PkONA z@(!9SlJ4&-#R}Ql|B+L1aCOBAHt8pLFJP;MBA4VV_1h$_OA^NxV|U+yLTMT6)yWOm z8A~)^AtL%RD8{OW>I%`fW@?x<#ws&Rh8ngrRx(a9FxIV!!%k$Zu6@YHSno;hNe_(0 zJD7#By62@Ml3;Cjzd@osbVTxLq|M?H$!TdcC3Q~1JIKyS9;LqWXr!(IayN?$xttt= zj-(e5ZNRZ#hgWQ&T6L=H$-sqE2W;ZQ8}o|iz?TnshxvNGK3CC^I)aL_wrZ@kC^@_f$9Do(JP1{k!*E2PJ1qH`0-3Q7G~gY zP@%PgLkDRFzJk+qjyeQMts+cAo-W!A!cz5> z7Av6`EBa%5lb@wVjIz;4i`9=&G{z)MpNwTSq?(!$Ph5Kx-L$E!3nt9!LJOR>vJ!^~ zo7G$tnk|FyBGj$$!Bkp>jEK!Df{PfNl_lSnzR5yOw%>nU5LMwm#;)wT*UB@CEr%bL%mamnr(jom4S=G zy-dYL=XIG1VmO0~l4}+A*dL_eO<|9v)i7-K3@axGaBTtx__Y+Z3VZCM$f{F$a<7Fw zR_dW@agN$!R{>oXdn_f}?6D6}`s~u-hKv?rPEBje3FI_vZsDZmGVDy^w?7+K0;R1RS8%X zwwu7hqkFUl79Bkm;*?bwIxBo!p)7-$^y?^;q<6_VA!F26SzgV=Yn-wMeKnF-`tqkq z7XQ&pZ=dd`w@Y+l=9aOb&z6rXeKXPQ|ANaC$=YtlnS(;vupKX9<;;+UBH$MH?+LFV z3&kTyn?(!73*zO8vP9-H4$G1}+CQm`cx zW`(8TWmIUb;FLjH3Vz29W3Ne#45i7-oy}D!8e<)xPx|_ud~-tzhp|Se!gz&1vky$O z4#sEI_cmD_#+s;GVTA2%6gnb%n+P^y_BNJ$y}ElTang^&Shzp&>xyOz*w+Q=+Aih_ zmbI%b;OKT3djNyfSs|Vr6*)-;yPx65YC51#dacO}*2Q7$(NJaaUDTNCQ>=6GS#{=e z--^r`3&;o^mL=EBME3nR0+)YafUE%%%=bkKwV7rVjSRL+IX&rDR3lWjzQfg$UB7EkYr zUM2VbC&QMNd+C#2YcltCHJ&eirCD8kCpG?EghEN%ihlTaDe6}EVEn6)5#iqmE@JrC zl5fXA$V5%JKbZQUyNCOlio1T2mAjH_73RN*6txQTAE~%0&3~Iy)GEw>QnQy{kIB6j z=0CaJQyO>F{P$LL!D9ZSWSjZ#dLqe0^Ixit$qQuBG4%|OS&&@^Q$T1wpY26C@laeq#iQ=KfH{A;7>k;!;4MY*DVW7Xk^tg^%Kg)m zskc!m-cZ=@bd>2y7Kou#c$&xpqj(wp#n&b?O#hsDo!vx;9!y?QY}i80bwG&djp zYR+{0?53=-X^Fyex zKSE<@0a0b3sERRl{H4`GZGRgS42+lXdyZ4<_$!(Yo&hZ7OHKpMA83YNxSa48fVHMD zOkku^$~T(0toaaxgTJiM_Uic{$)8gJQ7tXCryF@ict9*mK>Ux>MD#XQxSXW`yR{Zg ze~{E@IqgzCe`uOWYQ#CzsJ9#li=ZTA_)3uW)=J0c6&ug?cZ`g3~;6aE71n1Yr z>&^WeO3r}|$l2P^@lT`@tRpCqhsPPF$-}fPLi*V08#e*3%bHWgP&1SgG_zVZf8tsW~8!9Y$+MFO{pJr^L(YmvM;1W{`aVRAK2EtmlpUP<*n|V`S|tQc>ph20D?zafEsLlp~_Yk-fpzRM)tKLilBfhc2 z+np%ym|#s#u;wOMQxmM23D(2}tA2u2J;AD-U{y}E%coE!tlvw@Tg&6D)8$>|a(T#K zz!4TK8uPIOr9;vj%9KyRA7!;Dmc?4<&#$zwOm}Xfjop$ffR45P{rxEs;Pw&=mn>A7 zgrMNbnf!DCbbTnBVu7bmdiGAgxG)EEAZw9AJpR-VuPS2t0Tkz{3P4R{)d=+;sxLJp{hD65uHUzxO_VNz}*C%B=8i0F_MC36JS#C z59qIZ2_#KEWk@yoZ|QIH*>wnXIkT5_>a~(`;%R7N;vb>`ew4u1M**H7aLqb^Jb~{K z_#uH8y%=CUffj*71U^IH^8^;32{1x{EgRR*(`!)mo6@i}+_%8y7F9f)ozy%ipY$5Ozfqx_5ZvnW2z!L<% zL*TTn0P6@e2($@2OJLqMfbSCc0Rg7aY}$^$_7X@!K4nOS{G0kieqf@{i2b0TL_ZBo zpua%Fn~sP$H7ZSd=qWrOwl>(#O;6UVYRAX2o)Ah@ zxrdAzhh(d)(D6q7FsC#4`1IqCQdw~O?5 zVb}83&R*aK59b$$ET^y23u zvt8dh-~C>_s=8(6oy(T(w+#Q6Zfq`8s_Ksm{$b%C)8ImeLJay;YrSj`8-Zo8{?NwO*6WD=RCj zDyy$sDpuB}D_hmpTv_{+9{;R8=UugZ#~A<9Y&90ATZ@hIwG%rVrG-jip)`GcX=ix} zdw>pBTvgtUGxN4vX0`jhC0averMHDWQo3rP1dD4eRSrtmPDp4}_D@%FAnZt2%vEdU zr5%e?rF5v&YBj1;i!A^i0&D;3OcMdKdU~$ZY(gRYdu6RO&;GS$W^qCNn1aPM%ClH! zFhtAojm286+}L(wy>b0E1}gCfCfFRUFShva z3?Lai#u`mn&{3BzU!1C}V`vq4sT?SNr$bjRPR-Y67Uy8H1n|v9k%VRCG??KjY=%23 zMq(eqTq28d#)JC8{o_D;7%C z#!|YSLF>$d2j-j>HIOSHaTqP7=dw;lyXd2`YDa6Sgp_wR5DQ;y`d~X&G8s#XA~x%7 zp;?bD>={Q!1c=mj7V5KI0ATDqMUWQ@a=e^~5gB+tz}7W_VRPYVRTJh0!Z)4tk5DL* z)GAbKU94csQu>_Ekr!OQ3$IK70ST`F{WYDT;39n4fL|t>RgkZ!TeLdqj2{@qW~P)#dU7l!FL5hzTYK!v=d&WwQMrqI10;|(%lu&Gd6yaoS)Y?Mg11GYPCQ_=^ z>d>{RB-2$4^g`5#pHf%=vWF|LisSQi?e6)x@g^uw!1tO3SVFn6t4y-^_n?=Tv0fe* z90AG)0DAxfELbt9L51Z4TK~*0C{duIt3FKpy)h1dl{+hcgyQS<3R#uANYTPt*V0<; zg&yuFWU-D=6?2;J&Nt0>x~92_rU|wbV5C)U%vHex(GYV{ueeJx7vpj{pg!2q?FWdj*tgar^yQ+LnXrgqTCKcH{fGHQsU|ZF8PV5FFS3?I^Tbs>B z=9GV-kK?y4!8a+-&eZ2i)!I_Jd|?mR-B8flvjB2$B?;6es?sVoc9vU9=7{N9P}|(V zOUFAG6ewc%jI+^pAlv>7;P+$Q#wDxv?|s-Ud#x-X2R;QIJ^*C!X$kLRV-ydkX@#Xj zJ*@=gc)uISNj8J`7{HHnp~)s_1WR~CF2PT*$+6)9zL$X{P^=grOSJSwpKp+Ee=a5% zL8i%gc%qsgq*H3;w~9;?bj9OnG+BXFv$U3+4&`y=#(@+~aqTO93`mpP6I?}UZFWn4 zPPl{Vs$MW00j;tsT{F8lH^-dj`;qZpS{cDfT)H1j>cxn0%{Z8@qcyGTAckO!ORPn$ zK>-I%Or@K*m%xD^FEG{~pR7+M5ZjpKT(vn}&A%%VsfvIe>lSTPBxR)=U0uRFR?k&I zRhH(oStK`MHyHicoUURsP~)LZn7qUq$CQ@foRRot(h-PflnJV`rD~EFV>iReZupa- zC7q5}k;I)|N{#2OSe*m8%vEE{8JOn$t*Tj zWM8@8U>5-tCU{347e*}-FwxKAl*Ucj$VxJgNE=D+#Xm&$NrL|*%1>(WPa(|GH=jEN z?rCYd)hx6s<$`7{7SPSaphtnnJivb~6)>DvC^ZYEojV)lon&pGV~cG`i4>$?R3N{o zunTyj-WV#?W_ShV6p4=U8+HJ*SS-yI&b#<>{$)%kpaGwyRD;Po5zNEMJ2{-qg0Yhn^*z2NjOgiX<{f3VtRRCO*y3 z_euQ2R0i56auHMYnLU}A!sm5Upl`}8|037o@+Uxu&u5yO?0BBjmnal9GkQy5bTr6o zToFNhgR6}R;P85Fr#5uz@k+Qt@q9HQ`-5o6rYO&w3+3tRY;}6+)gY0R?=e7s2mSzn zH>b-BMN56*C&M_CYLXEMc)SOS^_AxrDy3$%sjo2Wd4wE`+HXrcSZz*M7QT1O9hR3yJs2?EoDPSi zwi>2QJw7|V?+67ooP4Vd0FhL_33Z_VN2qG@DEtx1ixGm!Ko@#k8NouenR78hM@)n| zM`@#GVY%9&Ta6@WN#?3GMdFpR{#vo1f}ldJ zL=qiw(buCXPQ(*o6DawrY?Xd?U*8#J5X3};%DW^4_a}t0$O--1gxU|~`rEl~0&1|$ zp+PPAC+q;nRFXLP5|m|PUP&1^sjC1pi+A0h?8J`RQ4)ws41_&yuu8#@FLP{xw66jX z1d^G_Xaw!cC;xxCrGDf{w-Kp6UAh0;CzCPMw&pmuJDpszN}s**}@eRtXZd z)+dSTS<#Y_z@drR^qc#>r1Gwr#8*IroE6d_o?d}AM$azns6)0I`YuIHJRatwC!ufr z6-+@|1j3Iq;&efJtZeo8N9xCgxJs87Su%)MVhIqzwo0Nvl$?&xA_5V)4vjLTveb-7 z$O?&P+b4v;3;Sqd?m~%!b}CSJ-}K$9bbpYE<`yd(C>+2?;fRrr^I!rYTbDy4ITt7D z28gD7N1#@}mG5aCFd^mLfJWw6Bz^WI4tl3PGaZySoyVA)Lg%{R7p@Ht+oNJAOzkNw zVxkvSo~_T#)o;XKS5=@)zvhTG)NUb%kw(t6s4Cy0M|FAV$J6 zkmk$tQ{_fsauPe7oGjc}otuM@Nv#E&?0gQSh-M1Hz$yZL-PG$@e(#ny$a%uQ12fg4 zSG#&Wi#S*<0ddZ8j0!&~xmmMQ(lr8{Lb|%#;YF*9ush5*>~LHP6^*pPl;r)iT}{Vo z6q|_*U9qE!HWv3{3pjta4OQh!330b(oe6f3Ok$YTZtE;r4`U>E;eR&3e_&^s8D+_V zSadi3=OFlx!xBr_MA2R7D3=nP+1<|geg8}`;SGW@c71=0G3SE3mKe{v445k?2PCCu ztj=BF4*;U`*&yfwzel!8AKB*(OAkyfr`WUOlV?BZK?${XR)a8R&~a9s)~UhLfPMp8Ted5Gp9Z|4X(?zwtN` z;0~x-BHX+Cm~VITfE9UFCW>(d@nju#V2SZx0YdsM#yg=*A;=%kR6?Ts-#JHgEXqX( zAj%yG4vF$@Ko2faej1hsMS0k{U;$i~&&iT?GR^_*C>x<$<{TUZQDZhGo(#@>gQvS@ z1n0zfh*nLfSgEAvF6^0ZP1Q#EA9*Znl=4MK!7&!+2S?@c!BOUtkMdmCvhbNiXK-E& z`y7*wKqv81l&;?IX?`*2*nBVk(Zr^67KA;%h7pKk~-n z1TJr^yiQ;HHiHi*m!Y7c%>pVN3`Yp zQc2+LSVA|KUL;!$EKOld<_$7jzBLbeMPw~sBNMK-O9;in6^`g73a-g**nwrR9iS78 zn59{0&f-nEXMv`fa~5jr;hZihl}%ioK8BrH^^IYtyMoD%- zS02wP*XsGvC`uJc?!o!77#5dIDw&8FmNRiKhoYTl$&t& ziJipeWV&xJLNZr!1|n%VIi2H5xW*=b*{3DgHsD~>tVVqw0frN%CQBqMw$EwKbtvi5 zT;SvR%@<*#5h1UE!HoQ7Hc?YXv!kor2`LmMi^#(dvZTOHkQQbe_4&e$mFjc_$Q=2s zGzE7^adv32jpV6v0WRCZBZK7`vNnq5DT&9t%wPU90&q=fAxJ0uPG@qlYIGkMFhD=a%@^cv|4%#VMelFtzs@h(Lt>R%SVOsH@5+FqW59LA-mt7BHqmkr% z{Np&AvB6Z%#Daz>OTLONnZ;*UmeXUEhLeYL&5-A)@TuX!`M-zuA%jmt0X(s&_` z!APTn{^TMP>Ss8a%(YIFE?|E%xfa?-(gi{%A6?)8dFWyzlN3@93CWNtmtY`Vzc?2R zIIj0#BR{TpAg-tDbBpse2u#S(g;b1?2(H2=8pegXHKhf!Elfg4aRQ7GdOer~PeOwX zC%5NaezF;yJ=zp&KJ&4HM91Q>yrcqk?l8gL4uR*BiP7Kw$Bi*z(T#*tWM39 zrQ<*%41>h;Q&qUz7jD$02rZJia3(M(2P~qN^X&imz35r6b#FS8;7opsP#I2sk_)0H zZEb+|KZ5p=w1s%cM_V|6qOEY~gWo400a-0=~N%i+<2iSo?Oa>NN(V~5a41S!Zv zuG@2LG8$dr>j`WkR#r)7se$7Xr|C%os>dQ-C{>?j{f`$egZriYXFAtvGhupLE0L5% zj9OR?)D`8wiA_w*F&LJu(t8FmD@g$k@{=%^MCCs`!2wCex+%qdUv%QoG8I-J1+qn3fp*Zo?4!B%7g&Ay zU4A__t{*bZ<`b}S^b`TwOw}%llw03;%=CE#No(K`(EWl;Faz%XZ*z6)+5K0HlZ+ui zkT{d=kgO{6 zAph*8^&Tzlg`$b}g0Df}Zg8sQ=|bN3e*HemIb&gUftw-t)0zU00*F(hYG%=Ewu zZWkBe`6EHdScqIrEKc-hZGv00$D<`ysmWvi6}@n|*(S~oMa)< zn|9I~M2bC+2$3?JJVvw-#tYv)`Iuh+erPCxnG?h{Vd@-S%ww*A@A{(G1-k)C>(Y-vJ3(yu5Flg~u+Fj2oK=)F!=xu4->!W#L2@>g4@WDQD?YHMj$m4eQc! zziII()k+vis~5DiRG*v8;T2&KT^PMU=~fCi`#fmsakKH0VYhVWW?yS{7iMJcW?xOy z^H3Pbz1EcU(@kEaoc%z;oU#S*yLzCQjzCg zPwXnqE#f10mx+yK@n8r&aLhuU6?HqoY7PxyrpVt?`ICY2MZmT$CjG)nxG;E~)8}QY z^dkegyWAG6eAiiBLjR&6$Q7}%vfgM;ejDuZtVFxk% zmGmga2D2+cF?O-JsGo-y<#wrm0*zwh7{3V*;ErSP0UU7*{Gt~WCY(z?8 zy-|giE>%vpc}NPaU{Mp27n`^NDPl8BF&p6s*v2ig)LeZCh415r@2xYRWE zH)Wv_r(+VUTfbb=B1AYB@(J~nfaDR}bxnfxI%?IF<^?h0>Hj1AYp|pY&(ai2H3@>Ub-iGozh7cL5nv+ zQ%}$WKN&_!cR`Ckv$_lO4-Z;Xd!`-30h=e;R#we>Wz@N zmT~V45lB>~?P`L^u=|e?8NMXvM6*FI8rm?2#L1swulBDUIDOs9Jab!u=PzpdLAKtDUflTmK4DejF7%a zwt8G3PsK@3h-5vXz@zJ%BL8*?zdSKh1@+`M?7)hd9vLJVnsKqBQouHt)%o|&$%7zk z<#(}It;Af;pM;m=4&1#38pTFSKNuds9WCVpIHINaMJIYKTDm_l8(VKyi_>v`<1NVa152ciMrLuWxXMQGSsq~e-^YNf1B|7Nf=)4 zdH;ybCF-u+{|XP_rW8JagHrH|hf=iM^(?8lPM~c(!0gMynPzUq(@M@0XzO4K89Ofo z^gP7UzAoKADKo(uQZ@{%8h$vJ2)KvN_j@xVlToE665`0KR_2)t}sn zks^++?ej(eMG|*&%5=uqjnh2OzYVVJ)Z*Og>Q*hnUgwvgPM6fp;St;5PrzID0&H zyl@qaEFB!Nwg!~JWm0G<>o?p&E1c0di@J=}W|ZTNXBRK&9a^+~hF}Ojjvg&GrwBVwh?d!6s28B^rkJ97qp$_I*mrf96d^ZPd77sei3+WUuFV$ zGlX6e*E~EP&E*alAfG7 zB<(#o!clj_K(27qy;$zaYvU7zkXOf-oZO`O#olY^`W2e0^ddABGiz^%ih1dkK#-^D zv!7zdWx*bHi;xKSu$xvfFRte?pASdNW8o2E%;y8LRr=XM57@;3J(DB1Ehmi&t(Uu< z6wi1iy~=Gq<&ug&dw zJ_3zm14I8D9>DGH^8p<0K7R4I`#A$czqNYuTV?Uie!jrauL+FSxFLv}3P^ucL5Kki z41I;V)dEACv}6S?sxoAAfL=$?jag_C&Xd-gh=^Lok$Pzr*&iJ$avA?#ekr=(R;b5cgBsZXRMyh!xN<%3$+;U`p8QoAyq`& zi;S@tQsa1^HlB-}F7uEGOUz`qHbLN{4?RnfoZN|gGMwBI%`P%wVB~RQEE29?$04v+ zvJKyv3*0<|>FwBPgd2svY{Q2gPYykrDKlc8=@!lO!vops`XcROGfu{Hkt20Ym zYLXk7fu|onOq26h)irwF^utG?ZwU=bKa`-zq#tG=;YmMq)RSi-4U|jRs56tscaR=- zUrJkfV=Qo`aT|akY`+PV3;lnbswVB|_-x%4&8F5?`E>%mNVbc(O-q(jw^=CRL$q_y z29pr|1R)VB$a_6B^^iAyiYIT)E_L6%b-dM`f07!3A4AjgSJeqT`6*y5K7}nQLf;Y| zMBow_83ND1!b9MWdRusYt(y|`aIO+B=?TF`Dwv5^_t|4cF~U$Az-AaB-0RmE&wM0; zy?8bsDwfD>zPBAfAmbdkX_;Q+xrP!exZrH&57V$5mh-6AT)CkL0Dq&^jl#8=Ssg7E|NrUHvJZL zfn&b|i(UI2KZM2k_B(jA{u+_W1_X&`n+rED6)Q)>KaPd}Yvx(H8g3hEz%h!Y>!8A} zbb-f#8>Je%ZK(grw=e8=ha)^!@4iO*z#vER+bybH;_adL=1TzZq1TMfg@J?}D`OH^9!jo|^@ zl)?vaPzrwWP>SZ(TG1T{lCqDc9JtNu%fgv%D6DOiXJ_j3rD|;{Oe;CJTW%#tS_6lG z-XXCZgwn}SUtIjC4c-IvDnh=Rg(mpk9|oU$75CGED^aBLsqg@9(%}O*NC&@oNJj0J7-=i79@=>w#t=a@5{`@dW; z*KloZ)4AZIAe;Ofm~Z{qraLvi=_@zq_HCblwrT#ITgA>TIb&Pn`Hw*eh;Pba2=D(a zl^fEXZ>+*&)l=oT2Q$?ph|L1u3KVJCnhlCe+PgX3Dy>{88k|L|-hvxwnCFC>nxto7 zZY({XCAVwI=BhE}n@44eOV{r4mM?zvfu_#tDqs90t20Y|Xrc_mPW;YEoB{1R1oFkh zv&@k%es(uAq_Y{peDQsS)AXGN_xXu^gx93O`261oVf(nijoQ%Jr!fNtoXxe$II-iT zG73GC{6EyMEc5*+&a9D{??N*}Bv{5z%prZ5?~^c)D-t||<-W{!HqmY}-*3r8qGFPZ zdwSDrt#{Gkn7MnS#qG1;ZwZ^7F{A6b@Oq#XZb0Z`O8iaHDn~?PF!;Jlwo1RaZv@g~ zFpx=%e@aIzAc6-Sww6kRwi9oakj|4Nuke$+8auFpwI`9G%#!5Wky<8Bd#I;zCZe(_ zTTy_<^~qfKz2SAcef_(kQEUkJJ>db|(G@;`Bf5fLdJ|oF$m+>&ruHj@`)LBBHEsyv zrXJI`7=_Tl5bj;ntro)VO9K55!{Bo-<9lpsQDM1Xg$HmG4j;flIQYdwIJqObLkF3C zSt!&zoOsg78PQz@Q^;6EA)x1>o%VGxGUpP0J&(+t)(22`8kyVXg1LrlD>CPTkAiG+ z0}y0CB6HijH<4td?(t=GP~@)3<$yDCXC>2L&f|6+B-1;hXF@6WxL2vqlWUMyhLh(< zvy5`M9%tqyVfr~74tph)em)n_c{*BxjYhcX*vnLUmL*^qp7}HCUB)BN%X58_bV&B} ztE1r|6K+KU@++XJCjl8h8A{yRN6VF8|7NQ*zZOS6;raD%q{;cK>Iy$^e*L}Bw}b|z zA4^bV(vLHc@T4C*>UEr7Z}+8?nKzO%oV=_Jz!0`Pzy2jub)U$ue*~tg6QZ9WBtivw ze}z^FxdPeaBlt=0)y_0E$y+m9-H8W3vAXk5QX}wxrs?^s>I9yA5Gv=$um34jm+&A0 zm%zvncm@_80(aEwdw#t=W)vg*T^qn=7$Mv%&#!+`M6Wzu7qv}fy6#S@+OwOoPuXPB zwV%2W2wXXiVWW1+(a5iV66M#+O**zOX&itQCRjvGsm{`f%3yVE&$ULLY<&(i%6M^_ zM}gqr*h6si7<)N0?k97tkYn*WY?KR&(mU%s<9;!Erd>$0aK`-&gsw25b0VlkROLi~ z(9A^yVHv_R?uDV8E8|}HQ4+b?jQbCQ6mewSW3g+WN8uG(rY{3N{N`FcjF}e*g)Pjs^PS0Ne1?%>kpZ!I=7Bjv-C0p(DX#BW15tA-2ve&Y` zhhhW-Fp{VskbD_|fh1u@5?4rc+BPvJ-O@)B75^ZC+HOBbR{=)SZMRRle+#A%Qtno` z&;C zxPX$BgspIjUb8P5;cytpr6fnN+?R~NCfZFh!lmVzo#pOS;XuWbI}6uXyv7qkpagG$<|R0 zYo~1Ws#i@2i4H&rIlvwgLbEWmO9&-c?h!&=TI!e2mYOXv)T^!D*yGzf7C~|%U5KHr zh8U7P@Knf^TVlw0{oJiX1HJu?}EL)}b45WZk%e7N$=)}-Om4T3f zN4-3f{iwg!yqfZ5sxtzp^0x`nyCiU&GS0o%eg`y)&5U__cmQ{T10TSV;DBFr(?&ns z2xP`qYweeSeBU3xnJfQ<)sx>y^4iYJAP<*5wn~ki<<=4#Ci>jbM+uD9xFLuuHDYf? z2ztlNnAf_x)xvF}F8U;jHSX9(py1(T4gSgL{pD1gRe*~{PNT275#i`=;rJDFq9)U#2KpL9yIqc-MF<|?*6 z0eJD#oalvCmzH+W#5mf%e7pX9nxem|uE6qc*Ix{MOPJ7ZrUXc4H!}kd&u*rp-XT(+ z7#NqpNj(*S-|gO%=(e>af{brRoYV$nSe0)_AW7>koU7LdfEi&bheq_uw<8263tKik zYaVG4dO&iR;alRwl51fKj_n96b~!nJfaU#ha-Iz)(F9Wt@cv?N9Gz!$?C2Pi>B8AL z(a_pPufpLWUq?KESFEU*!+N8-5Cm4KBzY3T_W^!%5#wiaVb);`;%%~3`qqJTc`QIs zY(|CEr4T2ft~?&IT-~-{mTykwZxfcEl2FOv>pTFBLUB+5cC@@d5?L25Z-t`d!#J<3 z<(=~$g>Q#fr)dsd9TQA-{q+ zO14TrIpjej{|~G)-E_GXeWn5Z~ai#+j7cd zslgetNP`b^Xgf8y44$!=*&l0n*pzneY?OD>>!Luli_@(|xbmV^DYXif`rM2Psa0#U z^(MS4F;{9;ci{~!6un^DvH-eMcWB}2LWsZ2?HMX^Z8||wj;1=6O}PPOtzf#;;CHFR z-Ktw;p1?jZQ%Us6dk_V~$)9pe2%p#DY>fq_r#`YT>n9?=cPjGBhU|(xj@dn!3&K2R z_vhGXgv+<6nBDQHH9HH~wNIu$Rb7?l4b}ZC^etgRp*jhWOsFmc4^ODhQO^^JliVH%)!Dr%4dM!_@lf5D+JH<8 z)gdKEhUy-ms_oe?@^by-HkP_MR4TO4$AA~GYc04y6Z8H{aNQY3 zPc@B0DoI$ix!Nc!=4uAQ{q$TA;J7^v8ik@O8g3C-J;rU$qXAdtS|P{rv$0Vw9Cu() zR-IN4OD>xeN1A zA~73tM>slS?pW-Kx!((m>r?#ZIT&gXrX|L2W_lB@xumObjWMAvqBB`AX}yH7}z+A0mMvLMF!J*8;t)O z37H&ml`lY}kh&0{$6)+tBkQ72pXTf6A~_t6 z&v|>w591&pTznT0l!Q#~hu-?(;*Vrpe3Kr*1i&O#ju>*O-pgSdPFf_aPm8Cd(J55abePkb!a70DxI5?cSG`)7rPt65;ZaZ$nMw0RY4at|Y zNk2w1&C#3|GQK&HH4#1|X!BV~Nig9onhT>BA#FtAnx6+vJ+3)^(lx6cMeV>fzt-w9 zOzGS;znZ4#ud2)Gysr5Rp>GKja?K?`GOl?B9v;`+QEvnKff}kM|EKmBkSlh3CF=vu z_|w|}NpskcdfQ13o;S0Vs`ktozYDt4DawyioGxd!C2W+7*^Vj|Q1N?Jim)x))>CL| zTNUv3&RnbGzSr9c!eKyg-wOfJW4z^bv_GF~g&cnmVWV95%WczrD|%kKtVnKvW;xt! zHZ4y(78NNuz9MfNmsLC;oAj^g6u!!JZw$Q7&yli38NepJaYy_jj%f@1tmwnJ- zee<%fB{#Cpp0z8@^*YJz+1)wYj(K(Ab3Y|(o;wCGTyIzE+hIPC2_fmPAf+Su;U@rE z<7B&V2GI{cMz%`dGq`@Z1F(C`9Y0$FD2F>f4vj)mNnilo@zW#gqC2jzl{^LKm37B+ z=EhwcUR_7dc)mA=o*%b-;fuQAp1rA}SOCFOZCprKH zAaSl%97>bB6^3>xfZMRVKWTClW;HGz9E32dF`+I*{#b?zjGo)ddWxkQO@xqld@-f_ z+c+5s+re+J3fY3v{a)E>fMXCAKv1StRPvhXfveOtvpjdo^8*qxImG%$pi!(?|6pWY z6zd92$p>&=U5oW^gjcs0#QN9bmM_G*3j#{WC2xe@`XSb{Ay$(Z!F!+(E5i!O^EYwO zb}Y|D2O!TSvei;U@_gkJ-ST`bmiI@VUsfqKC-6du-iYyYJ2v3OJi3tH<^dJaVG&n1 z&XNb{e9Bb4KF30V+5wd{qPh^+s=$=fM*%MKTj58@R_U7u(h670x5V>04SWnXNaom5Tk0xYa-UrCCaiRhH(l`hR<>&%}0(G((dh3UBJjAeer34TP`M;$a-5 zPMv5a5}$Nlr96Fop*l;cSvwo0g^I}8!mY^WLU|gF(oYw3@sO*H#CGy7oYru1AD>-& z(^&=!M+RRE6X5?u0=}{~-8fU8#hY`g_1XmP=q}x{WFCVrLZySPN)y#qd0wlTp7tzx z5`KJ$33riNM=9Qbu!Tms2{#@z34;<(*!v2&Cc)@!oz|NW_C}e)*5??u9?FHS&tPph zKZbvfx^#cQ_MgK)K?AH!htx{7^+Bi%F9b0522aSdOpq$k_0{6OffF1~9>G63Z(tCM zTLJCAN{h23vL-r_fd8Hi#o(aCglp^S6Ij)N-p6Qwbbm5Me_tNp+I=`dvqG)0k_7&byc)n~kpm*VM zxRBSO?h9C{zyINF=vf)Pe;-#{x`r00PW`hL8aJJPhp;U|+=Y{s^!u z7z}om<`#P=zb@!Fw5!ji3-R?tBV1v2+PU=lE~kuq((Bu@Rr<#R8P7GrV+k+1Keai* z=tH=4W}zv%elC}rM|3G5B|pOsEYbCKDC>vl3ebs=T>Avh$nyFohkVC^OLPE&%YlTD z;M#PATX1d0^8N^}%NHi5>+@4RbN-&*vCQHV=|Wr`Y=|q_U+0o)E5JQ2nxWfSMcFES z(?Cip2^mXBt(G5{Z6$x3qUlVzzC5ByK_wZ-4lL1h43zalG`VR)NTor?4+*5>IJ`R+ zNTLG}NDk141kwv(XqP25h2{MbNY84N=j*%5v_syVRFW@9b#6!LbLm1boo)ywz0)G@ zD&U1@7%y**Q;xs?`uYR(rqYTq3Qbns%}FQT)WV2OOST$NQ_EN}NfIr)=?M;yGFYi? zbZ;GfJAJ*;kpQ<4q3Wf-8KE6H==;aIiYnsTOKRLJE_6^xisQQgURrXq| z_9yxDYv=i)Q@uz+lQuaH$puP&9&8gf8WGfmo2l&%&yE|)rBJ*KD28sMzY0!Ok}-fJ z#%Q=O+o;d0+z!%2*46ZuR^qF)O3j6y7`;$=JWL$0Jsz5Z#&SKljh}Q%v@?jz1Gbuy zao=okj@6wd+chB!94@Y?e;Q5CUscyXc@Ni~3w=v?(BWDMjLhNM3@ki{YaR8Djvxbx z&NQYrNC|r!C6aCJhrr}V{Ele@OsvX}_#qeQdwZ^4`61km5xw#weuDXh4I7>{-+mXu zT{5My>4+0cu7W8zj`(4*%jLNh%lqT*`j3D+VDfs-3qcGZ3ybe$LmVpdw7*nUv z#*0M44NGS!R&Egmsd?^1Ybs8hsEd~6L#g`hKI^n5!Zk3;BzKZlc?(dFE*Aa5Nf@5! zh`mX++GjwnPMKt%467&yEc;RSyv&0r-aAGtNBTWoh>(eIUg=@F2)-sqvC!q*JVp{M3d<7QZ72MAC9jmf5H`w3VPMuvWd6|sQ z7t2LE?IcaB2~eT&sX&#y2s^-;C>}~?psXL7B}gy8;*`L-kKm3(*DQy=GtTH05SlO( z9e^-%AOhv5Png{cL%W38+pydt%s5APD#)gZK%3L0xl)7WbHcUJ6ZED5JZaD?x%S-d zU~(YN9=u@JwW(#o^$QY0c|@dwYx0-afh8i}4`uxjk$GrMNX&f`?<7D!$Z^xL02Lj8 z0Ck`#BtU-xL%Rg%&#}Be0`!_zqf}$Jef8cRyu5R{>6ld);_^wRRp{)zbK7v`NUR$# z3?8%%_mi#CcMYbLbb`qejt9HwN9YyzM^h9YEWwaR6e{2)Prwc=QTRW75`__TBqZQI zg;NrIzwK7=i4H*UIgk<(d`|@&x&+^uSl%DOmuQ6RGzIWYtX>(A*Y!dWdS}^%U_8Yq z7z2ZKE-0U!o7YiLUM^duA0Ko<833ClIFF5?KOsotDw~3JQi3gyU{%0QCa?obuwDdZ z{jf1RphF>O_i36S!FvhERL2&l=l}$-18E__`*IlCC3s(jb&)+AbwvDRa<^#rvZ}pl_?j*=nl3Y%N|Djoz{AN~IPD7X`{Sa>uNy&}zge~*cpTPo7<)E7g#rA`f(K~E z!fD-0>B+3kXnd2(svWJR5>EeWWBTds-Dx9+N}3js*Z53*8mJ3jJ%e{VqGvaDB@x84 zfE?gH-AniD7@E7%b5vJ_BHQnR{KDv&K>Yv7(Upy9d*I9XITY;Qp=MmH&M(v(aCyzR zHRHurb*|dlGgg`c=$58i6QbhSxxD0J-f~MOQnrdgL1yr-=#8?@74CLi6y1sUp%=mXPD$2FE7~Kvk5evcW8p(L~G7|)#}X-SqAwJ^s!ZH zz%BJlY3Fm(Q+3iUCd_QBs7X4BE8I1p+n5Qr19j-nfLV?wLa^2oq8Vk>3Byd7SR$f^ z**w1m&JFF@i@KQ2zpL25 zY8X<4JFV_b{1%f}BQY*t*t3)ZNsKa*DC?F#Ku4sVOuHyVa}v^3jq)s5OiRg~g2ZR) z^YCiyQgQ<{O;^L`)}Dp(Qp(*2*CQo2mKwFCTa&vHJI{qy$(sb8k~d?oVwsF=M+Q() z69pk!^}TYNMG&k!#pUHt6|F=dhUeiwS(cP>mEJ#{E8d1TpMh`8!yEAR8Wc{|7h7~Z z0PHEGzd9zCY^9P$xinXh(m=dB$Hc)*0i2~msWwyCRccgAQ*-6!ka_^V+#D-hRALtr zwo1+GvF$W;*Fu9BpMGK_*MtnMtHiK-CMT)C$;m6lBlb{2cO2eWotqot4+&HAc}ReP z>BE_snNq97j>lj+*1ZG1T*YI9KUJWr*Kn#5?w}z;(hVl^gz_I!7*)$9k#dLCohed0 zvIFM;W(J;qKx$K6ih{QDTyId6nC4nZWvWY>Mz}D9A%f;?UODp(%0U@<4r5zp#c03lIKM;!kPX{;ImEo%b-;W6-yR6B)u1NSVW285nsE zb2;j5M~di@Xe1=lUi1cn$ew3}AR11-)&?19*@*YvsA{-Zei-aQs@nb>=lTiVz!6ku zl}bPnznoMsDces+ICU;Hir8o*`7}%mY%^PGq?aQ)O~olBfi!i*{o67b9Za9;Qmb5p z|IZXM%P=laPR_*fX;TjlMdDzJUHNao-&xkmx>W2JSlxvI#dFbd4kS{}>;?c5V`*32 zIA9W{K5l|@G_QvCzeDQ@FP)P&(nvcSpU7L%5e|Tq&TafpfI}nVEdG(>&5kKAOh?^3eR|iB`P@k6cQJ6fP%QtTDO)|H1cJf|PjSeYp_KdEtI+LQ5~1xAhqM@}wiyN|%vzQD4D6+~ zIaBR!K4wkB$_!G=P45}3z02&xX$vQC(C64I<;JJo7=S-|cENd$dSeDaETWkym!wZT z{vXkFFJjENC-iT!)jk4lwO_To$aX`$2S&s?F_x~@nXG&g$O%MUmzNM7jQvF2FrzzU z#);#Yld%}}#b`9&ppY?o+@v@VrVx@<90KBGtP2QA1|>fQTIkV+0?m^46w<@}OdwCj zGL%rv_ZOTXoqG+2p_E>>9R(VT#~RTv!}Kn>W5t#orlPIuv|cqY!zc#OpJ8FYD+BCY ztFy4}!3{8+0U2OV?r6PIdZeATcfdf=l0R~n{2UR?;`>kG%MOt+s#|`9RgeZ4C6b5D zA$_O5rePpg3fWF9&!mu%3L4=P?dAyU6-<)rzHRqPx6J|8pwiW6;@7)fUQDddpcgqq zTy>grZ>M@s$VeT%eL(we%Hm9zqpnYqi%18*gcG!|)%<)cbQ9{}n`EnQFCg1{pzlx( ztEDC>uDSRUN~?Qq8k%9S7Y7Ad@o9_NGiHYd9wE2Z$}%-=5?5caI`fMw)WY2Cz!{L) zv6{zyRHvyda?Dgwc)&Q=g)?Ht!6*6TLX4#u2ZCC`IFORX9MWeT{1^su83#YZa-VU) zCfbd0aM?7H`vhFqQg7_(-YjVI=&`ODG)bV(!D|pOxf)7xeWIsJ?xE?ogdJcG$y{5r z(A23bj*fM+be+0Pwo30FurPuN05W7c)TU~Y$tGMc_N8b(`EMZL-Yb$rJ-C)CgiVE1 z$ZsSMJFYqM`t2H5iw=OR9VZK6uJ;? z2Wz5D>#uWRb{8ju_-FtMvpZy~^z{QK%rvN2;%lw;i3u#N#1v8Qkn77Mq7+n;w_^vE zh`JrhdM~2f6d{DtAY+Hb(Cav)I~GHt0}w+FpohfJU%}8WG4!`s-XAgaJm)@n$BvaI zk}l~;Bsr(kg?K7x;>pu@=c4NSoK*6Os(+BJ(mxq6QRRVnLP*L}#7WUGM-7@2^vMA!l5S0=g4LQ`O! zEf<^9L1YRMl<)O@V35tQ#4;y++q^EH3e@83EY};n#YQix2BX^*TUOa*G^1V z=iwH2cF7Ar`{HXWuT3epmO=;7ogoOIh;g~*V2amtHi3%WR^03his zni_v`3Pf7ru}B13^u;M!6Z7H}HU0FqE)7~WM&654w3b(vThE+550{3UVjTl>S9-SW zDgN3NH4lhC`$$M!U!y9I$)PN}KmnI2p3sI;S$1MPKC`v3P-?&_*(L29aQtt6FVD21W zZQ@-+gjk)S2a|eBvpm;9U9r-WXM=tahJyRri|;}sAe^YHQXUHr;Jzw_58${e1;6Mf ze&^2ytvS~0$)5t@P2$a5V3K(@sO?=Oilyk{3HvUR6)?$68bk;wrWK}}Z^GrlyGXvx z5U6PBh=6qEg!efqCJu2{77XY4YBJx}F!0?gED|u{$ZkA5fSc_201mRlFCMbfo^7;F z3PWBJ`)IEHSyo@YAUwz0z=y*yTK2fS-sUnWk0dDuj}A%dP>)W|kkh7YML|ohPbM&% zVPLumsZJn>Bczvw2XGS-AHYFK_{Bp=`-8#47M`Ue`ev^DE~}?rkP!`|-=&oJsOSy? zp*3a*+8t8SX14*CA)?j1o}e80+XUJJVW7De@DW;T9JzcUJb;^A_y7)a!7movBG!1Xu zxbBTw#KHL-M`%9`z>aEI9|K z4fj9r*++$|_;q80=Zq8oYl!IoJwjLHf*U^_{!DBHr^8WDWp4xl-yVcQ^6-Ay8yz0a zl$odcp2*2XTrEVjMU=$Uee!*+gEaD8-1+Dw%FA!WB|%ka3U03FZX5h+sOHV-20Gx5 z9KmKS=``~NXx478w2hZzhm%>Fk|{}bCl3@#@=bse^gm5ilXgIVy3?5}6fdhbTX0gD zUGk)E!h_571ncvLF5Gy0K&~!4UnR6CJam@@UjLdic)NpE4tUF6?u4HVq)C;>>Gr>M z64P8ew<~wQ)t!Hmh?rk9#Jr29=dY^UT6r&VdN1@X;X#);Nnm6yamv8LL+FlrB;$ib zA(5H3uM5O#j}gTTuWJLy{LF9$NgyM_TquHDrZYlyrdliErQL!Lu#JleT+S=!0M{o8 zF(Uteil!`yZXve*k-*|4fBY0r{>mZUoH`uPUt68|DOw}`|DehFtLns`diqiP4AT-qZM!k>NCE>49jR^jH#RvkFI+N7-)7x_yMoYTDgEg?jNe(LciN%~1c zqE-<47&ImQoR#zVDW1@!&q@oY#Q^(QrRKCRvRVu_R5fHlJs;aZsR1r1IaAHzm+&agz|`q*^bPZ?^q1u@%p1o7867$b;oI+n{$sKepp zZ*#5Oq=N$hO@9ULBk2I)m5&Z^fIM_?zy!P)vj{iDQ3?zPmsuzQKzRR`T&w4J{~ulK=aZ;(SgPhMRvDvSUY!iV$Oz&4nP_^ zz#d8mo`RuW>A&G$*4Rp1cu`GbIBXpx)WU}vzIY|li;dd>CWJC7d zEn9Vc&QybZ&I`Y^mM$1W+AHQJs?56W-2P z+bLw-8{MykMzJ||e;gjbopitla3mez7hPX!Id(E8LX^(dZ-vnH$O)@uLgS-W?|z!q z!y(44U75T)Yg$Iq!CLUFv^*%%D5x~>7R^5+AX_sC;lpp#2?oRTy5Fa6H9|YOy+p_m z+Y=mZ1i?AKnP7f23}*KtA7K-ZO6>gS@BnV2;{!N|4!`t|=zeSUZlPSyB=B7o*E6E~ zH38Y0K?omth^~EI%yv;4AbAZ!24!uRcjBH>nO)XSD$NSp!A*QMdYFR;ncz?ob^uW(xT>!{zp&UU(_mm+ zK_sv|J6oNu;@OO`t8iyzuGEAEWx5_7F74AC5}1H-86f%mtiPE8T59Sp-XXOl?Up&c z6v+5ei{{KL@kYY15VG`eKfu(;6h*;9=WLxe1)NMgvFg0g7GHd!VUjmlQu4HkW0}n@^odBRhVV^rO}Q zS&6ALDbJ7j5KY)$Rd);W=Er;-`j!wP7eIn1vrC$Rj%SzDQIE7^kTfKES$<5gE{GR< zj0o`pn^tWAiOPv5i@lzzwoMj0+u@V=I73yH)`N>7oUROK3g?a$E zcEK3`N^5rJ$>1lwSM?S#7b!-XSO<);a*H{Df7*y7&KS#~QOLg486)`{SVE56nbpv@ zgb*=?1W$%BGSKlbhNIr0X!5xzLt-`cRslA!dyHa(e<3`FA#AWgxL2MYaA!oXd`B3S zRMbw=aPqQBHXm#y|`M5^$5t|yh$>XVluAbJo!x?KX) z86)2t;iK2U6hi9N3Lm+Epk#2e6ME}?_~_)k>?QB!W{4uMF5$3thL()Pth9P@4Pr@< z?tByE{g+xS>QiqtAg!w~19BMxMD-ebhbd&jvUn1xepbn00LUXkdvQc52$ByWM23?O za=-|c8nzjDc1aZ*u?wHxCjlF7$(6Cd11Mw3Mv8($`?-Gw1G$v(-(tB(87FL_xU1IL z#XP&xt7fZn;LKCL(Zr3_R%K$o)V#iH{d;jI`qw!XuexPIC3Nr1a};MeyDs8VCtyR% z+R5Dt5zzT5b`K5h>Kc2&%;Tx3+rAHRb}j;5p0AQnNn?GVQ(1c|)iu^X$X4mw2FvvD zK*ZYrJthMF9NKDw_fStGUQzArt`QXlCRBk5{9j8jI`x!$8|UAlQS4ssniGSbp?h16 z58&8V!!L#>tJW;t*3S2GN5Yeh(b_%RRy!Q#l2P9we3+tE_jm-~;9l-y40npAh7`YN z$Y=$A6C}ibnB;SA7+~({o<%E*yMN%B;Q`#_!v}DX4}S5Gk9IiD3L8R5#dYsV+3L%$ zBlSQ=c;nx3?@4Hfutbow1`Yu|4~?|1i(9Ws4ky1v-ptz0J>bjR`v7WdTG2TcuW`X# zlMI$w?ShYjZ1O0;toLU1QEimJw4xcx$cp|pm#j`J+S;IPK7$M=v1!^A=O^I6JbyEr zWH7#QW^R|NecGvd9bS#9K`ga-J=7EW3bs^fuNG|UYHg;xduVbJWzgiL+Dbhka&T>z zFuDmE%@(bho3I`2?R~=P(qdSRc(nahoCoc599Hl^O9{`R+HSW|%y(8l+p6JQObnHb(am3zg)+`#8v)d!)r4 zZ;~!M$<)VT&fuG*zrh*84d6Xz_hN8h=z{b>JXbjheA`&E-8L8Y#__r zF?UJVG5=4qsW+!anK|W?tHJ+ z-i@~YM-^tJ)3Tq2Bn=1-Dbs?S+okwP?=`$#YH$PRXroMGn8F<|u{!rpS=%ao5lz-# zRp*f80;rs0tMnGAE}=slB0-bkkPKuz9O9^V401?28jzq$qpAbl+apEM{Zt!pX6QcL zE8jxh5Ya2&LPZr8xrO>`s@h)fuD+rS+lMuonIwNpm=gJY7AC3Fwx6aD2wdZS1{<~0 zxHavZZ+g&a1^Q^PQC)O%Y=w5Z-NsXVz9>qw~i59fo?Ama!)UlOC`cvwY3An z+aDX{B0NL#(yT1=2C!k&F=u&1^enp&x#k2+*?TBVpdC&*`VWq%%F&N-%!U3i{qd9y z;VOv8eYg?dB@%H4iPmh&#sxsEj+6~7cI^^98y4r=CE^<;o$e6r*a_#lFq50#&)@al z(0QHg4Ox@uVpr%06&SKQbv$sr(W)XG?M%7JLOTH+aT-R%r7;6xTDD5xJXrfV87Npg zIk{2|)H0JrTru{g*d}=)l=VIw_(U((Wgw7Eh5`VS923q!V9dE*(E)I{V~wGG;3XK^ z#o@2Va?d_+mmGc(zb&d$&emR6JhKzt=EHZv(+4T+%Fa5!T;RPN`$DGsEgr$Wc)7s4 zWvleg!Qx&C65?95aV@X!;+Bj2Z3?qLmkV?5k7~x200#;)1&-vC*n!36Z-=tpbGd^K zz=WsE1O^r-ByjHIFz#63hz>yDIKUkeINyb#T>|F^SRNEON@%;{zTDOkmtVugu*7ubq5T%x))HJoPp84>_FthLdZ135o27Z;Aa{wxGAf ziU5Yr4AR+j8+%Ue%z_72;zAp-u~rC=9R%KM6#YQ3gF zfJQ)oQTJNh5FWstLB$7fWKiK3-MiN=Q^}n{^(w0`zptSO+wx{mr6)vkr}M?KmlLS1 znT4=o+IPM*ycbZn+LbDF?{G+n`-n~x`xepZUreI=(=g!O%e#+FIg02$9v;9=bbJ5@ z(cu>l(OGF+o`|ni%Y???S-o4x)_lBpGPDLXvdi88<7qee$d}Ci8p<=F-w-Z3B()=h z)o5dh-E+Ojc|BrK%4DU1)`pfLQ>KMLC%p6p(uuuU+J zND5=1>X5AxY?K~9KzAomhyZjN= zGC2WsfhRm0ZAuzX<2@7g8Vkj82aMvLTe!|~#yzc!>&@Fs%`)7~$sW`lpJW$bO>)-Q zoUZ2IwZsWo1S|fkg>seA6!SFRcd#`(l8M0~Y(@7}d89T~TO$qVsioFchWG~jkIRN#HOc@GE$!~?A5oGe0n=Ehy`4@X> zG%4?smD^z1!^!^mC+gyC%za|e8?3Ms$qfyOeZR%(uv{SH>0*aqBe>KVOQxFc0;()c&GAPiie@&pBSOPvo#TrnDGF(x77ZMk<0G<9 zw?R{g;JDs&!%sSuDp?JK;{9L7Wj&ff={}}*k=30koAvkv5lEv!8;N(p z2RGAloqT|w^j^b!AOkM6dNFmY)SUJoSp)c|t#QU3G+}>Loimc_pmL5(?AJqe2_fPP z37!mRWT4~W3`f1gFcaHJ77{+GzYg$#-DeaJ+|&ke`FVhA1F@^+V*vH8qtXb(JS+)4X0JVM6qN#K|UQ`l&%;Q_%aN(9~o1;HP+cZ)^9QY<1_Kq(0GFSpFLMX^%=c@l z4n9``$q7j1($WY0MyJzfN-YSSv|J?b3lnnk_kEU7Bvz$9;IMM|R+!WC(KN2Eh6CydT!$h}T=>?^k znF$n85sBF%H%ld4!F~O$N__^BwZBwu;pe)d;3M6Hc!1-1*H|q(>Uze@YKOC4eJ_(x4<4Ef?STR>lCFNwk74;Mp zY{*(bG=zSb;CoC0!kNJ2-iP=Z@oL3UlhdQ@(a*;4fsDN$45@1w4vE+R!8eLF!5m`upb74N!6zsj@3s0d)wQ6l zElAYG{U5~*$-f|ct@Qk_Kv_@re`wtaz4o^$D-h(_8#V_D?S2iX!{YN*?KmxPK1zkc z&G2O8(eMwr*Vqo+@r-lP0fb*2OT&f~u5)CZKNIlcN`=1?%QLC)Bn-QKQ}2ptyaGsF zeN6H`=KkZ5z`roRz;{lg3+ewPg=}Znja~01H!C&9jN!ZB_^lep8!OTb8M;jsuZSV8 zE^3#kuD7PaEI_N&WcK%SG7)xmd&P&$e!py$-ZenXu0w1u+Jb*6p^?KDd8r2@&O#SAb#ncE%+0wH$MgGzJ56QIWWB18&q@U&5G4GU zDM=E!9H)lLGIRyCyaGZ}#SSb>_X;TMH8*E4&n??Q!~%(wt2kskHnT+sAW|Ga4vCc8 zU}%>}`2#HPk4U))?=ZnV?}_S6m+{oI@{1L1@GgXlW@2j{QWhc}ecjE@rWWAwoo0() zyQ!Jj>$En)t2W9^#=DP`M?UlVZL(F@w_r$LCFe8rvYise#>zGq+J>vsr@*0>>vo3@c2Y81*AL#`ijb?eYc7;;stk$f28ku|gT7i{aW zvgw;iPwP%I@nfw{n?}5mO~XXn*sEa%Ic#hf1QeW;djKlE*2;&tg@A}UF+`9$d<){l zXJK1M5l+5PKDIqMDFi@yH{9IbDANs;wDFD~SaP_!xqV2r)XpjBr9dg$EX0~OJZ>s@k)Qf&U!3(`m_%Q=Bg6v2T0rTadF0Jn=>NZ<{IlP~3(D!(oD zuL)e?RdFQXs(OrsoR{VPYpxY?Wc&*@%7u(oU~^S#I~fuz*#R*L@mV5+MA?2%jwKYG z`IEa~cJaCJa%@uo{Dv?SMk2@euOq5*d?Vm;;XBOrJQYglN#R3=8}a>nVTegQW_Irg zkdFO(gs&^C@KiuopTY{4DAy8Pz%By|9qis2!}mJ0fGc8F!OS>@6lnVnuD@c2fEHR< zZ%u>m-kGH)3tb+~Lc-s|xZcIG)gbNOnd>CSuA%}A2k0PVaz=$0vLE%}!fM`Bs0jJn zgyoEcN{+z7Bs7W*EHuIcxC0A(07qZ}zvy~a%U;Xr0>9eo$uAalK^)$}%jW{Wg1~5v z>kce1fcRygAao2YTD-qK7+&48EN0Up@oMn)OHzK_>R?`#RnR} zqQxv8hk!=C2`$*GQ8*8T76vHo!=xO3LBUrPwe&x@@Y`GnN_4=kiSiN^@OLG`ovF#(v%jFg^keE6IsAdhL*Ct12eK9 z90fj8@zb1W(dyDaQDhe$UpS7Y=&!14w!HC$6QOSj6N)cLfMnte8F+Z&3yylZTwA++ z1XB+u2ebha!jro?NWGD+&VN$Xp2ZiYbD^Iz+axy1#cT@NDr^U?tX(WgGxG&(idL?v za)0xNcqHJedW?je@r6IkwL*@J*J7hw$WReSOMC!E96M$AMbAoS`{XQWmLsx21DkyR zHs~R=m4gh#(fpQ(s+`vlUb)a5W_BJ{5E?R9SV0(J5`EdQ0z%OdR={FcSmFP}^8REi zJO?dQ7e*s~E?cE<9h_7vKTNF5hivRYyNoycv4g2+Y@==Q=@CKxlUP>kYVxh!+WC}IxX zhz>x%N@T00hOz-)0Wfvx*H>eCfAlLoYDX`z=6Kdl<`hT>t25T^9<|H19YZ;7OrZ;n zIx44>?Uqz&IDUVSV=gR)@AzVB&U>O+Qb-2WoNtt^(z^#sb6Oa&R3;@i5G?ILzV$^{ zmMbvGAuJO1!-V07B{Xux?>_*IV%6kB;Q`!gk`LfellY}KYVw;_PnNpU^h&?f!y&#`QVXA%3%xuBb{RGr;i4)k`hOI0LB7y`TctS@J$D)C5<&k-XzB_2 z<0nJ4Sy8(Vg8qA~F2g*;gZ{f{ivFs);LaQLe-ZR8VM0NF36M(BDx{#hY2y znqqVN3-GhuK7yZzlk3_5NelWT(MAR$FQ%$J3;KTuy3;Ajk5im3=dll9qg*_8uuvV^ zwT^p)Xm@{92yuT0w0thti{ah>L==m--%7vbs+W`L= zJu6)hB)3De?zRDb1wBM=1N<_gDn~QID;Ju>?9aCWgsRN74Iu0|iN5SM07B8R4S>b2 zFvZvzeG5}uhKf_Zh}Kzlp>`g+gZx5c0$l_sv~(G(%g)b7pAUeKldQtq!t>Ejm#qdV zh0p>Dg&ov6>GjrUo?mH}N^wp*8du6?I%5i&4=8|xaTx`i$FKnD3U|J)G;I8~Inl=3%cz+COtu&a=pmSv^@QLX+k3$|>JjNt$NfbQQiXs1-r((}epiGw7&UtxdyY zoGnNenuXTzUKI@(`)rj;l{(O#u9hX0{RYH(jzw8!g48-~wZbI#96-Iu>c~%`fDmyE z8b_xrl(BrU)K-X!3-!nEh!$2-G_+?n`F@yO;L0WhGT-kHn z9Nw8#tnFG~lz)%NJrl2q%q*2kz!ohiTh!Ng=fT>$qB%uqTHH6fL$*raGC2E2KIo9K zuQs%OFH7>%^S;lLrAflPLqfo5YHEgofEya^3U0~Uu>;F_z8%VXt(@Ca57*QC1SUzC zy^h1a7x{_lP$}Ag1`#Q};EwyJb|Eo5|VuPm?}yV)UlD zBSGjocq5WcY$X{#OUZ#?cP5WI=k@EY&^LcQOwFs990p^iV+(txTT``B{--HU4~_0@ zlol$Z>i2woW^t~(R2CXYwB#L($(j??QvELQmZeG&?qEIfI!bvTsti{SV9row6tWwN zpbge-dD#-axwaBmjzrvnq98rlBbcw{gS8r^q&(fKH};6pID7jVF7q~&jNi$i!^sah zwF-a-?X${8kP_dQEeH}PcdQp@(~}vf&n$Srm09#sx{Wm%jc!p{wWGCELMd{!G5Iv@ zPBkbL0!59_)Te=<;I>43XE=6lV^>KsfQOAP-LGRv?n=*AT@{MVzkoN6VXfC=c>)tM16K*x<0o!Uu%vRE`x%tg?gj9vx+DDp|Z_8S+&!N1G_t_cs|jvw*?9PvZ^;)x%wKo)27$nI~kkLJ`C ztiJqe${Xog22ZA%kuI8q9_dPpu}rk2Jz%>7l?y&zJ4dj#rWQhrvTlTxB5V#}mgD}{ z`P8kpPx?f!Xv~n>!LF);0Nfuoy?ycbg+(gF*a1b4S@ep0kg9ab7 zdb04U`B3pBM^n%#F8N&;#YIaWg7Qo_Bn0g|wA8*X2CQA;QngGDgc*9=!FV=GkSi;z z=o#eX3|uq6Ba*2Ia;P>zu{SJh-4VHYd#PCl6Jne!g7L}v6x!L7oG&(~tNC{&`BV`s z`A2*xVGXM|e7e!qr4bfQ9>dmbLv0lsSPera$giyKO_C}muSOBId|?ksmr>>^m2GE? zUlsWa=qp1YI#I5IpfQ-GOUa!=@XgfcOV!#^@>^({uEv=Eo`v#K%3U(o>6jZ!joQ+! z$=%RH@_lHPyb1q>cuL-ky^3Wr2{UYoWoi8YT5+l~ zBLDZDI|Y`0X}SgBc!=d!YqRxcp)^%rY!ym{>H7S_T)9;)G|MgY1fU}G^Qz_MR*2#+ zG|J6#tyP{Wl%P?ewm84Ar%-A%N_50|roK2eS8fg!vEx>CzFe3o&$UX;Ern7ITJY-g zC2%x$WAAY8yjh^i)0I*Uo(050c1yz+7W;>6k$q;qQtu>BL@W#^hvFaDjuFgga*NFt zEUG-16sXZs|L-l`nhR|F*xnXwG{Vhd-^t~Nf#roA$zvYLqnR>uqwJZMty?If)g>=E z#jn6M^vpAQ&w}!SJBTZg@LBd`fzdsa@t?fnj(W%cQcdw zp}K?yF^mL7hG8<0@Gy*{9wY~}Aqa`ew0&J5Q+tdkHn_bFATw+b?)7VoW5y$T<>#qU zk+n1S9$>v5PgUFBX0T}jti44DL`rK;-X7rkB*9D^^9vY6r)@utA!xWZ{wX#ZNshxm zM`g5e`ZUs#!nE9@>(A0$ljVraEH2Ddr%PaJZfjPmvuJXPQwZRp7&EF<}{KJf8~Z)OiUOeO9l3=Pr549up-#neN`A|Ye+i59iNgo%+#wfM+V~(j=c0we#@=CvuoPc78J<){<+F-HpM$ z5CyTMi5-}G`N_3V)|=oSix%w!d6u>#8{l-h)}YIzoxOrWiY&d5gTCWb577Y#e+L%O z-SB0y-33FtQa$d*@=U4+F*i@C=vbbe*R0+Yagsv=zY-JbI@mKh5nniR7xL;LHIXs4 z2$DnksfZP92*!2nhskCi;J6lQ!EclZ!Gvt~9@#4WgF(tSATU7E0q!BI9nj^)ElfZc zFt6okNPn@OAr?!+?E$s44Y!2L2RUf?qk^bZG$LpeMwV_~HN6CDL5kHmz->a&3xqns|m&M2uA9FkSofyK^02Qc-V zowMi{Cct2#g5=9DIl*)+UqlBWUmTDQ$(IuWF)sNshUNW{FPFBYsow)3)8-}-HJ0wX zsM0P>fJ1aiBbUU@fQ~$s^K-Kqikqj)R^8sQrohsR1jI4b9XAV9O8Sugjaf)~ktuzy zlncz`jwrAsS6~O0^f?pCdMKx0t*KK$vdiYr$YH;Y=M;;GYyagR}t{P@Sj8 zg-LdyG<|&uu27M3R5b7qYC$!y4npkD$cBhuc_?(7u4>j78`I#rk0K52mu{F|Y&2lW z6TEy!dVnaItHNCcJJL0fIn#nnfaX$q5M(bcwyJZ@F*s0*keXRaS3Q@mG+Vl3i3b-q z?nu|}EZ547Qmfv8_G@A9vkW;f^9%4}9UEo>`o1214)LFhjXC(WzEz)|m;#{SR~T+3 z5+Q63Jk@bz=8yy)nN8B^xl~e*x0d=jREFJJKUqNqMeJ zB@;JRTa^h);{tkz5qSeV{!0Z1Kt@o#(VCbm?<&tNUAjCSs+8vB&z0#x<=sGan9;Kc zcM7sfE7O%T<*CJ;(BB43&jMIMjYhdN4<&0sxJ;LEQA@8*H&km2i>--rZMr@Kwcv^A z#n$ZT8KccA{Cn8^I8kmi>Wv9VBbu2jHvrB!)oC~mz7Z0e%wASfFH8S_apw~nM-|8M znrf46lI=EWqP9t_jW(6GNtB+vl-gh{(mnLz&2h3byEBv7o$by{c4Gu7A~yOIp^IYC zdML#rDOjN(ih>sp9u)LYC`tv-o?4Ki2fyFn{Mqb+Axl6H`LOfy{>=Nm-+S}^{N8(N zyyHI|Q8>R-)w5B&t#?R5kG21!Be2Rb4?YBCK}0U{)Kr5mY@9-9FeHvcJyefbX{zCx zS@3FxW|&pz2a;jSl2S5sFkcY%c_1I9VK?8PJTB>*u ztT@2D%B*1n0wdfdE|6};XYse3s=gT-p4KQ+rE+EiH}>HSj&&hLOA3LuWaG+0QPEwR zVf#8Py^xXkEqjv+VI5Ti$c&FFp!0%5L^>FI(~35X!_aK1QT{?AKBm;+2PMqd3>0~P zO|PeqP|@A2RnVMD35w|2Wjkn|&P}Oo)vRi=ryLTCG?6X~u$|OcIn;hD2&(?mGc)yi z9nC{vd6j9eR+=%)r5X72XPRn+A>>66LJLe7zMzUHH$GMlR^=P$#KsG(VQ z$#U_>!wg)Hia+3&byTynA!@Y`F%8Re^r*RBL5~GH4m&!U_L;S)wn4@sK!jclt4Jb? zCMmE3NIz-?R-rpyfi{4xW?_g8g&!`o`^)hF00T938EIK2PFh%1BL&yf7c~=BnXaZA z28;vQE}U1}&B{^}Q*){>Y9LS}pni^_z zt>|2}gfn6*rVlg^wGDCarDOE_kn=UFt@9s zyTotY$@eSqHp9P3+#o&&LX}|(w2xqVQ5tz`E-%sNCF;CHo0ll_5?x-R%1bmbu|L3o z@?Hbh32Rzj%9^(jg?L9^s}o|SAHBrDUOiy@_zXACESi27$@Vmt5{ah146 z+$HW2QhujcoF!rk`A!z;u=>WKT{8149yTSlH?}6ViW$_s+G4!bue&w3wy?2W9A+;P zjkCl|t`HCQ0%L^P2ROvH8Q?o2><3newE^HdaVHDhBhKc4CE^S8a-DC8!^6NVQ72v@ zF6{v>6MIL1M~Jmi;5sq!5HLwxBt9la9|raj$M*tr#9PF>#7*KCVsamFi13JjcyA2& zkTAvpoA`{lLHteJHvv3HoF=5oe#Bp25gQdgJ#4D*U)x&Y`{<{kF|F!>)nyG?7cwb$ zW-TuG@0r0Li9hxOcZlFo;AP@3V%q`W8DgGzhqyr8B5o50CxOF+v~er^^#QSw=;+}; z5gqPG~|}=R>(wj%vvnEtIXgv$>kJ&9U*+8L6n{V%ET?=Ht`}q00rU-@hKsn z0&e7%UE3Q9jN7_5C9qewsB6hq@ovSHgiC}a`_m(vp((t(bA9CnCOx{8ek))i{$&3-=DoNDNwz78y@J>@ zI9zv>wMmCd7P742aQaYYUZp!C^B6J`-%vChs&7g(|KHrgx;dF}Ayk9wJIB(q8!Xru zJhE$u-d^Ow5m4eU>O!t}iTq)VfzEV!!E@98ws_ss;h6f)w8fZ7Qk6hMZSi9;TMIaP z9_frL{?9hG6XUaj7jg{MRQ<4PcG2lY9xz7lJsG=SKtJ;J<{6AJs(KBh7W8m^3=N|M l(_vbhbAReA-RXXut>uO|Fwyl&98~QzIFgJ9T~S*&{SOm9vF=xFp7CqDJ$@zkAet(WucFHHQB==kE92d*6Lk)zEzT z`%|auy}O)y?%D1+=brc6)%PBI#EK*EKiQVfe4{ycc)UI}HP@O-I*Zx5sn%p~Hks=# zzG89v^A?}ISk2bA>xVk6UVAcG%#MH-la1!gR6ChlynQj-jLo~vna()xzqXT1cAKp^ z*}bv4v8J*1_Qh&reYU#W?9L?Gt8DE0g-iEcvUi;SgF`jD3zhl$*^O4P|4z6$Qbd$X`)l1)Z(jY_55TsQX>8NW)^_U$@YP~tOJlUL zv2jx4$i`T9$ytroY;sn+H#e8G&pOm<-*FaOvG@l7?Cfmyy8O3=kMVW~7P9T?mA(Cq z4Qy8gS{qx%?`-78-u~IvRBr}=B*YzWJW|McEI@WPgKTeO8?L|cC|GpkWI*<*@W0dG ze`mn|w!?xNXVOA;vgVB)0L5y(LpIV;v(`m->!~)_h{B2(%wAGeTayPL_5Gc0yFS@{ zMlCr!-)eW0c7?56EWDuK5xIU6J6S{@@g@(;_u%}04tDAFE$zhE%7}I$7 zC0h%$-EI;&Rzv8Y%E2=}zpx7#0TwoQpwgO-UB~!tP7arIVnAM50eF47;Eht)T+@N+K}=1+BG<7B7q%J40?Dibc|Dn6jSs7x)))nJ3-8&5W8 zVd$ymWS5Vzop==C+(K~H=jK}7x}`I+H4M{&pT$qfrm&-7Y$ zb@T0{le7;eB->s9qdb?5vMk9Mgfk#&BSRD@Y1Ax2F*jCc)mYjRc#Q90V*1r_m~JdK z?nUWvpF(Tnm84=|73*mg_7b+*6e&Q>zc4|1b2*Uyzy;FL1QJ*ZfLBl=GfmL58hY=1 z(3wN>2IFA~nGV&?Qc%eeH_=)_D%9*PST6?@xYwSTNdHSe(z6wFi*?&}_y}PA!$iZ! z%IW8ObCca(j^kJC60^f!=B!@`%{rf-^>cjITOvd1tX``P*FglY{GSIH@6hB6I>sKQAHmvwXTYJi*s; zikWV>){jlnB z$Za_bImeXiL^Hva>Ve6YZw;=^!9-PYuWU_eGpX@FV@F_|@!4A5 zK-o*`5va$saK&@&4&av0Q%crZ^dv}Q6n0~}Ul zK{JCE%*&n3yiBaqLwY_AGn$?Y|Kto#ouAi`kvzGW9p^M^nTgD;==3reO(|DtMQ?yH zz?nGHoNRU%@1X{V>g_rBQ?r`Wld-chh#PM)RI|hevy;b`rAq;ckw~GpU*mzi-#4uy z_Q%p&@gE}L^fdgFs5spYe@eaoGI55lFt1IwQSVmJGYjNe={AxIoUR+KDfqip>C_J< z=s-(5t+~o{t33-%>y^2ri(YYf!5%>bVWd9O0yp5HX17rRE4S%LlI)Vb{7k{TP)a3pq&P^@jZ*?vt*2jU>l$^)-;7v$^gj2i*cEMDB;JRJkicI$yU}cJ8d;FLKIO zP;r1i0I3~$ivn+znfm@@rc(hAZe_CG1}{Y&1UJS9kQK-&%mq1mZ-K8gc(M^Sx!@fA zk%`zhL?bpsk=mJ0CY#gE$;B7r!S;0w&##7m0Kdm)D=Sq?bKon(B9uCcQ_d0DRdM!j`wGkTMI#ufJw7|XU#gP0>wgHoCLN*(eKeZBvH<5u zXN%AV#{W%fn%)cl2wlaf$Ywt7^eD@Ez)C%EWr9+IU={HqS7X&=>Oj)rk&g8B+WgtN zn&n|p4xtsS#~18adChiB%{VPpuK{zEcoF{~rKKIFklWxe zHd&vm>`y9?5(cL#Nbcz*clN+fF|)u-Nt4qy850O@vz|(f6UV(InwTY#366UaA;`&b z_^JfQ;ra!%tLTRb`?qPXSx1=!AUOL)|mpPD$dZtBhX(G zQ=^yN0358ibD_Gu5}o`Z+&Lnjiu-RMndwTWgDsz0mP=;B6jKeFMI)0;I+o<3?=tQ6 zYU4TLL3WM}oi%h-ioAtgl^GOxOmH>cB!}2+1H+t|_G3xeB)5JUEfPd%7E(^qpUGa? z8Ww;uAQcSNO)zIVzn5Qj3Lxu?|?Ez1T~0?H5>MS!>t5-P$QA5GH1mgq_zQ zB1xN^M>w>m458aEN(JphT0*+fHLSK0(H4R;8lR*a5EV#@YL@iJz(%=}@Tdo|>wlQ~QweRxhCQ z8+`lO`0N_M$-oV6XhmAg~)vR4+l|1NKg3U0O@z;ke(jQJ*uY9 z)ShLfJjTy1g-Gr(z6(1^IsrkHzElH%5r;_|k5>}W<8ImqM4~kUvH^9)beL&;>yniF zW%NgqR7idOR`l|ur76tr-+-+8yU61i7u5rvV5Bdo(3U#SIM+>6SuaG<|6SzOX4beUa>S z`Rp2%o4$u4M&+ij;C5jJhM_(c7!8&xBe^JBBZ9&BDq9PFC6-dT zh6O6|8Wg0^)3fy7smWZ6-O#}Nyv72N{3tV9dE~BdJN+8C_EVc~&LqRJ(0BK3p$j+$ zu+2}+DONFP6<3H6JzeVt$5s0ekaJ(1K-LTtloQ{4EOTi6zm;GeFQy|Py? zI~!aeh+E(4kg`s_VaF5oz(mR;mc&eESG9w*b&p zko}|w@3U)%3Yd_1LmpKMh%~|78ciqprU}*R7o4c&>)3j1nbYD*Sk~8!xV0&<=)E@Bct2?n1-28>bc4@KUoolnH7+#bdbJ=INVbifx zo8Xp+32tH&+=&0ssgn-?R@c%W(OxHKEz)#I#r%kNKXw}9O73bPm%=03wL)=Kst~w^ zJR1s`?8R%4JkAfQdA`?WqN&>KR%Uw;PHE0f&h(}dme~du)|0soh(LD|fS5s0mrqx| zGkV4HKq5|Ue*|4Ur#5^Qe`;I9kRU)6KP7#WW%hAv$S|4m5amY+M1Rx1PiUWnfh9ud zgeI|(JE7%};W?o>+Fj5$O-STr{f_}6!GvbVgO@# z-7IS`57MXLkm>*lA2X2nB|ZkxHWx&2&7L1I6*$$#fedcTPj>gu?d1RPTlG7|VQMGl z-(qEiojjF25lTSxR4 zqKLetGhuwicQA1|Be4>TODN%>;WE7g2OuAj@=(bN4T}1irz-!#gyyc&(4fak?W_ik zidKK({}y(ky{>8(x{q_Nj5kvbxb?D`pcd_kxdAT^Z-Cncmq90>-l$0X>%$YcBkg^8IBHL7ofVKV$2PV%!aDO-{2Y(apGg0tY4H8xP~2Q`&6dNX+y3 zY8uK4Gn^b=i54@CX z+6M~|H%EstT7sjegJ=kHbRi7oIQnoHl0G<^0a%8ki`!!E(9`ANMmeNZ&vYNW?lX5t zx(KkU5aq0=&w|k~_JC>W%o#`7I5%+^V5{^g3&2RI;z9eo%UWmJFS~3A;0E zRTj!IrPd!>6PPSeO)rJvVv7d75ylE7jAf!|Phx_4^nCdEtM?@W4Q4apk>_KqDU`KN%2&IF1zal+G~aIFQ)(bxBv|Q(aq1&n1&2ilJ2Z(LM|eC6WnrBKK7dA@?3qznY2b>;KC9Jo(J zSy&cWwXh7xP11i(c|Vl&gBN!2G1NxyHg;eQD$FPB01aX;bEP?5S!netj4Lbk8OT|j zg0ELF8iwoB*qE7i=FJVwG0!EU_C!(`MZtaEJN+yu2E~>Soa5JeY9jZY{lN0}r9$qzqL3T#(*IRI%i*X6H;P>f4&NA} z!=uj}?QUKwaVz&PTe2xY@7XJg(tDQ`&;_c2&v8?p0Xsql}}ev@~}<=N#>c z#5yUe|Fr1BFUX}V7K-Y}gd?Y-!dC{hEsZ?gG-6KU2Ojr}E36Udv?TI$3k)ogL<&n{ zD94UD1bNue(e5Fx%xFUt#ZEsg%TD1@c}1QdL>Q<1S~4CDi<}reI2nSx_$Ow^7M2ij z`r0|W9dms?AJU4#-dKuu`3d)W>@=4CZvYYeEU+Tugga1$Kybeq&{Hg4e_L)S-WfeUa1orX#kZHeF&AC&2wj*#*cgq=B`y4rS5{8&v+5 z%O)ZFyi#lCdwn-{l91*0dTKY-39*knO3U!Nzi>Yi&!ac)zV>o(QcS`35bMl`Hrbl# z&CYf30_DVnIw>VnwN8C@9zOdvF~Kf78f1}8J_z$N#|UVatA{w5;=kbz3ncRjYkv*z zcJ>G#dIi-S>%zVQmq_Tf))Zk?cRmwk2v-pUm>jkNR`W9I6`p`|7}99b1SD1^9peOw z!@^>oUkVbAN8v_=OPy=606(1awHuwc+ydX4z`7Xn%V-^-Ysn516XYkJm~cc-;oVbq z-*h>a;eqmo;2VICPQfi<*cIkZPNqhHXRfDjAgXHH9aeyzoIS0XnbslnI!OQXu92sJ z#}Bv-ybiUgX_Xca8TPkb(QeJw_QGd%E6=LzYtdh~TkR#_*#0J70lan%*7Al<^1-FD zqW8k>BR3{c9tJSb?O_f4`V3xvZnU7%P)n@^u1&*N9PysCm+RFM&*Iktm^0mw1OGp| zmm1wwkbhe&f>uHy{|XrE6PA!L<%~yiT*rRJY$82=br&j}!*lPW=x>Kp|xgMUVe`+b4TvZym7wmfW|JUy7Ig z%Irg~9`4y?H-^a*RXeM{0rYyh$2dR`Qp@?y+`yLH3gx#xF;B#+eq|&HMpjfwPB%Uj*3;{t)!!nZU`)Mh( zatHX2vC|kACAnY+m>u>xAj=#&(1^BD(vVEwn-Xb6XR+*|X>iL`4mFyS4dzAz%H_nG zqt8kMKUT>chEUL}U7v(6O^(nv_F8lB@gn#|By4?t$f<})03M$?-$?=`D{JFMQ|bAs zQ^p}huy!4ErE^C9!+QA2P^Ff7G!t(092Y{TVAcE!6Zn&@Y5c%z!P;#Ew!f*aVoT)$ zo(cm?BvG(dVkj4^%^}DWtaY^8Pl9l1=}e+IdoX4Ly=Jdd>9jy5;p&2&)Z%u?_)$@X z(e#JZG$K%U12;c7v#k}sCGv>Do>7WMxtw}Bb}A*OPC=?@C!O9*7lQ`)MF@-&Xi8Fk z$26v?TtgPq8a8mY)G|rSjizb*1|mj=yn!3ohE=HYHs3_!nM49@+g=O(i-P8Sn_nH#lt=#%U!}G=EGT%mPZ%b`1PgcK zH2{U>Dz`6Ra1U|lD7c4@T{Qr|fX{O^0Lis8XkGW~neT^rho z_PS;2d=k52RoB|6(~mH}%!j5l{DoYq)48LaY6ODNJEsto{u~Fe>cBt3x2Fsu<=YB3 z)O}d|t5J$f#NzTV%mp5`DM$fsH^?UF6zjcuRCofn_li&8@Lu5?onkfb)f)CGQ?_!; z5(h_>cx|r#an^W#4$##~z$Yc9iFS>gL&&t|4dLA{)&&is`)R#vSO>kL`^iPG>HEMy z6xY4DY9#9+k6D+)=~sr0*OCsWTjQ2598N9_C_Ja%04^S?!)Yui^yQZemc4i-hsd|M zkc@GDePj=Q#h^aZybF9=Xv|Mc@Jv96UQW)`;hO4fGP@trf5@i*UNG@B)djlwM+fH} z5a667*MYdN#B`%5B~FdVr*KD-;1#LLb$hRQI!&jtgE|Yd`&%>3$qGyN+W{X#=+dDA z3Xw}M278H_eh4d@h2`{M#B{5@7!}uayaPsizQq-0>~w>M3n9Nfd6AhlkR?7eKF8A` zkC@`@v79M2YvDKeqgBDPs2La>@f{UwZH7TT78SKa9Q^JB@M6 zE6V$Mt!*oVGOQ>|shf^VVbXAr#ZME^FIYo{B@(|;^7jOy zzo~9>m2y&k5eAkBAt$B8M$So@Lx#sm>1cO$Y1)uT%gXl!!D7P@Ay`J!_ZMJUb08w` zL^>wkNKJ?4Ks;)*Ns@k|KyW#$Z^llgSp5ulUc9>2tm}AC@zL$o#zuF6{XC`As=1@- zQP8Q#C&e92h@c_wr{Oy+_9s5M)C&2&UWA=W?Q3a&;?ttx(uGj^e}L)-@h3i&HY7~k ze4F=1H09fj_$sx{VY$Kmi9*$v@+XSJfZV>kKM`^0@F(J9mp}2Pu(&1iCq83xCaJe; zM(~pk55w^-KDBS(q7N=_zFhX^W#@_WuYvqwfzLLan>!u*#)5ro0f3cN_MwT!qn-^(kS9ZFT=@8_ zUVlj}8Qn-~$>|^C>T#PbHCK z_JO3kn6ZhX9dsW67((inqd>TlTv$-zHhmS0HdI&A_Go4iZY91ubeww)N3hd(W8{iw z7v7M}whm(1FgO4mtk3k|Pwp6z`5>6h#0$r$>yWad*Z?C)vPl0KAs$V?$pIJ2$sd1Nht%CgXtO4S;?V z!tcNwv0gW+wOfa3lu%Y{&edS+WNtVqy3TMk-9-PIE)Gnu;ww%Rzd6q!adTGj_90KC z$4rA=l(6U5IA=tnTqvOE_LBHXA04-)AANL`?3KND`I!oF8~`j zJIjF+9hLnhDkjvSbf2=oCMHOjVa)2N+zPaymE$F_!|N=1G^1AAampwR2!VQ9RC@&$ zX}vdEKv+z#aiQ;4Hu9GfbzQJ`MlH_*DzEI~Tj(o1zKT)n*h z>m*8`NnXaoe67Ht{r^<|cu4g#@czLvW5?Dv;+< zCIiiaZ#nMc&WPM|69NAfjQ|;i5@EUjgsz^j9KJG4vtU?Gv(}F12|6Z_M{PBS3yVx1 zlG_ZOLf#JDkSi6EI|c@p$e@s%#6&J6mqUanB$JZ+7p zHZ&1(XEgl@kwbWExR)OpDALRSwTMwgksyoc(vLtr0-5;rm3@%+q6#cBo2Eu=2RC`Z z7HPrld#vF@2{NoQma65$5^|ayo;jnJ_Ay3+NVAHn&Jyr51pGd<38 zhM?fcjr=Z=EIzbn@1A{oc3-pS*2^!eRI#Li-n+xX^>kydGS!-7-c8fS`ya7n(7ONE zuT!#g`ZSb;qv?&M1S0nteiiv++tpa$?z#fmh~|W-<{`N%Wdoou`~*Fv@~+*}plli2 zphp$1v2+{2D*Rl5LP)1vS#-*@lHgoH2`S)r#apE0o0Y+AN`aeA!0Qc}Dk6_glI5f<}2O%LHB1L53$wpJ2-)>n52ULw@k z7$@?pH$ndc5nLilpg6cBJRNt(i!-~lC-YI}(*X>JJ02gq-0^R~=N@-F_c8bDif=}p zcZcJM|CJ#+;vH^`0o?HKi167sW~}OlLa<~DWbm@Wobsj&o)&ggI*les+9`;)LT++AkR=vt}Hvoh$Gx#C;~}V7Q2^Pkf!$)aY?L+C{6r(c3hRDj%-)6Iwpg{YviP>Y0GWRrUF5Er5Yi|4 zoaj}1IT|{~(NqwU^PP#&Tf-Q2uk9v6LtFu@MtA}@HSq}?)P!$_MNM~GV_EyUVv@sVN)dr+* z1=J2Tg!=gY%yAh&WqVDLhd;t?XLbJzzn6Odr7Tv+qL@?7>FK1M%uOb6qo#W(Ngza8 zhay6hU1ml{sT>x!@G+=0FFs&N!mF}>0U~@*g1p75VO4tb@{?seRn3aEwv$=#m*Cw% zu0ds%+HwX_O5XHukm^U%zm6t;E!Oq$JtGjkeS)vq8R;7K_cXs+3c)!)F@~ zH0R*U4eBPi&MGe2x6eqNi0sD_OGN*BqDe?@t)TzQiICt7oG&DYuj1)nJM*{$zrSJ) z7v2U==eH4f{-*kIC_N1tM_z+UC!noF2GP01M2^mLi15(4qur@U=S5^7H#3WB4%BbY z6h-})6yOrYOF8O)y5o$du>gLXWFAbQX<^N9uL1kg%4DNHhcO`hzH&ztNx+B^CsEAC{t3ZiIdxI~5tB+chIJI{}j|Wb|0o zTM^D6?|VfV-X^f?D~~Z5*w03|mHZa$0};E<_Xig|@q`S7gAT4x0qQ|WdDD>cAWi7Nb(kM`YSfoN%Ry=se(0!1I0~bar$#9* zO4$Ip+ztI+4)Q-w`Vf9bDJ*jx>0IJS`Zx_VgDdIdK7e|Ol0I&A-Gm(|$Ae`!b{DoU zX4ejo<&nRiJ3vy$X$~*4YXbU)j#i>ntfeBDcD;IHs;IX`bF7G_Vu{i>%U;>n7iC4B|uUU3-L5G^8L7+s+89BkLdIR>MD2i4Mx7yG|Z+$;}Y8Sq` zp+v8GVoH#obMh7Du3x(g34)^cKV+|m1B#Wv9Z?7rN=biYqGtWEu}4{f8WgSyHR(DW zfHt|$Vk@q(%wj8|PM_y&C|;WjJ1u%)`iU@*bS0*Vj+>th5QGkd9HHXsu?r8H!ukPF z<4_gWXn^rVaD2HFJ}IYv=X~l^PUaD^y$A0mXx??sD&TCUTL*Ay0YAtApQIw65$J#& z#$ARs`-BL5@v1l1yt9{7np8QnIR*ab=JW!)1JQ$TYtMBB%Lx{ID5jPikzRw`Fq&Q! z%@opGF_!)a@ylw>T*>=~$Xe6-VrM|>OEIBHI;8dMFp*2^C-~f>^*Nwm=k;A{=DO)7 z+;^X^cN+sKesKf<)qhFfs$YWQ)%-l0KcHM6nd5P7)c%h$&x|G`p)^pR9+JJX`;#fPiY1NKi04cciJzt%`hr|o89AiTk$xTru;kE(;Mq{+ zke3jI5L(8YLK5iDIGX#GKwfYMw~Zty zL$!^xQTrD~#~cT&13ARyM9~)6YZ=-`3NQB_am0!v@IUOtuY3;cRU7Wv)t;Eb=@hxt zGQvqAC_Nbmu!PeHJR7QT${R^)g+e|pKO;%O$Pa8AIkNi}QDOiPQ4YL^MAYRlwM#_p z!RJdPqU1+$9(oZaK^dxu(njrHMAbM^loL_6$zID)L}_@j45szkD`qokPfW=)Cs$ZT zGAX>Ivp9eynQnq-ODvhx3YV{BQZRDKbPGpz-;zlT0Fudp_mE`zO_2w ztD0U8&$IFQg~{&zxt;u@MsS0g|1~+4&ZHp}f6wwl&q8Nfr|X3jq>6`2gd* z=eX!u6Fn=uXT5O-^xS?sxr|2|qm7Ns`f2Qdjou2rxDBEN6Szo7W^EM@vQylr&`G#C zm5A}VIT6!Ta&!8}NL-`oAK^bywiq(b7U=O7*@NJJMBl!|Bs-NM=n0j;A{Vn$SgW0( zMh)Yvtw79X`#ZG~eqn=mLER{@81U*CMHIJvs1N0OUao_q7BZqiYEk{!IWqs;qQ4Ipl@@jzoudJ3c=rw_mgTov;f$Y1a!4y{w=S@n63zXUQ6I=d>nh#q%M zupqdqe!G^x*K+LSBUs{b$D5K*T`|bExP~+`64MIyW@r~tPZRH_Si_qE^=f)4V1dQr1+g_yEL{a0ggW z?r8jz-C8!1;4j{XRoIw3gER^F+y(r%GD*r6q=}Vil9jxiRKTWXBbgK=G z=2}yU`a0;g@IV>~7PW*mUe2Kvri(#&*(L)jA&S;ZNYz{>(m4jX3)H%H@f*8W!`ewcra9Nw9OL*wI&CE`PkCfv!#hm*}&EIH1Yq28_B zxcl16N1Ag}$>9p{OgovuqT@tMOOEIh}sO?DT|14T<7%}{+29j!#^zMPO zQRIvhH25BXQBZivYICgyg1lFssS)9dt+gLZWYQ+TgHIp?Zg?%6?fwWm`Pptv5hzFn zrbGlajEp$=W;D=2EF;)Pt||RX1Z_0^NU3G}L;sN3fffqiSVTs-jl~Jn z#)fH*U&#@IT5MC_IV_K*&&By2phPVXft9PlYYOVua5o3IgQ6B&iYm{4AQzM6L@SF@7R@J(P&)Gb2+0pRPRt z^{$yZ|8KCi{?12qFrp(;wn5t%k!{FlqqEYFI0Bt#B~vF~e<^MvQ|tUHcx8X9+d!uV ze2CrBx>B}5OXherb=D^(h92E;IiNYva=rlvkR52GN+uwXyk8a6E0 z`4upPg|zo-LWH&o{-6-vu^{pU=+Rc;g#)c(#kjTt_~C#)EPc6R_#u)TJ5D{415~6O z_+2hRsGuz!%!20u-}m%xgNa;j=o&uHxuHqaj-?FHL2?|=nFc$zqb}K7xU)8>ex{6K5d=%`5DYkpjWTlJkJ7uq|{ov{|wjNSv zN@^dK!vte5Rq)l*LjM}vMtu;$p5{Xnb(uth)0yWk%J*XE1ajr`(#N=BmzWFwGAFn{ zJb}9mBA>uf1`*%r;#Di`dL$4J10#Q>oZgv${joKYU!v-6sKA{8n!~s-fX=53oMOxg zwGk*X$akZ(I$u*3$nhzHLMnU5^b>tqGEvb`G^cl_0PbwfmQ#AVs)wc z*<_^o=Wt%;&MGXz_pAHbSUnHF-2vi9o#+oV4?+b#Jm_~8X7{&dnv>EEfI@7j$oRY$CM}NEQcTTQQ!aKZ-n1b3L9v{d@IDCR%t7fSNSTVC1T^^*ZUFL{ndeS%M3aHQ1??AkjkRB-kvi3_PW^kh?-2?`_c#>Y6p3 z1=PAyFDN&|`hbZxx2a$s33C^1C7GwA=?M`{`K}}SO6_`>?0CdR7^&in74F2{h2nH8 zchm5#qq~q0=|~Pm{JPwQ`(SZCcOmz?^?T{??D<}|q^Iz-VoxCqI)J0_7Un%b$aI66 z{Dkm{tQJJ}cUhT*@>WFcK)XKQ81F!77sz9PmYs2_ZSy|HBMDIEVx+%KHc0{Ry5Z|* zWZ_`Jz|gepmEHN^dKhUnmV@!yp`wtTQnWAsEQNRSc@lvoypzv{PO;v}mxU*Adnfq> z4(}ws(aEHL@8s`WBl!tVm&-%*PW}$z(3;fkon+YX%R|8s=$%}kVKt)J)jtn&0#qM0 zTTNpL?-u`MvhgRvSamP(qYUUMZ}%6%6S(P#PvD>@eB+^~b4}SBCH5F@^439LW0{!! zR|`^$bTo%yB)#?pQ?&Q}JG7@3kfH4_L*K=1(fh8HLwXpIXL;Z2@N8i3`+BKArSqN5 zMUJ;gzGu#`yOpAR*Yz`X_}-07qsuwZ`JrtGMVj%gaHdPAJUhnP-e?$dBp75?PWNLR zFzClA*K0uZNsly{XrM#xY1UvC32Ah$9dZ!@@~Bl~v7{|4zE9y=`#KC?Fwlxu;r?o? zVZRF@9r7Xf>Vekaaz_L$^MWSfyC-3as)Vi?8SaF-Ji}~XZj;k6{Mw*%@4f? zu+tcqggzJh%ORms#GIMey;}GImL0m)YkK0PWP&pS^VBe#!ur^dK7g<;Laz50Mz3EU zhlT6?dC=A4ddF9WDPXDbQm*&=t--=ljJw|NBjEf^b;VxF_5NBISfYYl?-CC=*Lw~P z9@o30-SMcE9D6RQH}kasab=Ge!SAE#-31s!(ZD~b@=R)4NX_SvjZ0+A{Kil;b0-B? zg}RkzT&`+dBpqQX|2@E?lbe6r<<1Er{##lKIGytGBYdTgs%|RrAliF04%eMlTG_twakEw8Tk{pmQkk5VWHm#fZH7 zE)kT4+W~RgV@DD9rwXu_Bku61{KF=PBSz(pK2#Zzj=rggQMsc}Xv$KKK4D2q4VHKG zy&XVsIQsCh%h7kyXpy5Yj85)>6t@roFnR0J?C48ayb=NU5!^@@H|^N<^sAk4(KThq z_4H4`CCKa)_x1EiOxDg{N$0KYE9ul)ToVsoL&s~}fotezn&)P5ZvH`~oVSHWT~=UYAKMfWG@gB9L)H{gJ)7-##bQDS>s zpTTmbD{K~L-9ASjrz&f7?1FTJxv6?*e6rO}#;4oxwYBlfpeFhi_*dnk3I>#SRHhc@ zYT#pvZ;TH2U6rXOl2%ozu>Micub1oAuSRL&Bj|33|5(CxE)A9Mn8i*i~2b$9}| z%bHK%a9QIUU5RNSkl+`}2@lqp7H{PQgp-A-uURwu)u(RQ2SO&nxph}_c4`DSFKU_K zdr^U77WkKGqbx{+d+I?sICi!|wLak;$yQt>*c1LTdGdiEp3;+G7{gFSLw*Z91aQOK z4ltai!>|ffhX8~9Fd;eWB$HN5Jf!E?kYvYndh=+Z)jG5FcK6O+tDAHd??C_`tpjLU zxO!y(p(8LD^=`tw#?)t)P;xnzUdua+^~&Gok{=UXa>Kp#r$eV$cD^7yft#KA1PWgd){;MO~WXb5s^cvnkv>$Ag<^uetR zz&^S4IApk-m6_wqb)uPIO!dIz%vT1N=i$uXB8rGpw7(agz|EO_0tX%88xLo$LbIE# zH?L9IOLOh-x5lzaTr;vGd5uk?>qswCy@ya}&FE&TFfvLo)jtH+8)T|N7|N-@?}j1i zgQ*yRWtghCEyk-|M!D*lJ`ZH3Cte+89jSs^Z$`Zg_7QwJjUPfNg!O!QjPwrMTzFON zDON!(w|OSZ916G3xTsbyoCDD%xHgYj%qaOT+bv3P4F-e}wN6jO`B=8v1^td|nT4a) z5=@RPSLW*k7%P<787T908gwmR=4%9cu`*vsJ*>=E|A=AM`Pi~?9T5E^i50oK`33j$ zp((%Mz5)Mq)C+so_3hR{_>>Xcr-Y~&`*H8evKIP^*0h zL`m5rxKKG#pJ_oc$wN&nzJPZQ+Tb;9Cl&Zi8&(%<(Phm8$z0OL@=BHc^$yjZoU1gs zYC1l9Xn~L_Fnuy2X*7Kj$CYsXn;f89oOt5k7w49b6BAaT?RNeu-H^llHp;u2Y$*?@wl+ zW*%IynXI>`;MOn{(S`fQ%%C(=0!Gwi!m89CNx~ur&RjH}WXMoNQd8&(=RQ{?6<-u}k zL**XiC*Ws*lUOUN?~ zH^uTVOyECjP2&e1w~KSrrwMF-Q=OaAS3%?0EQP;^wh~FiO%g*nZptCZ!%dEM7kas= zkWeJ{vH=DGj5gP!JAS1y$=@6mi6BtCf?HVD9rE>ZdckDc6Nzf#vh~|ce(+PDBp|_MtD&n$ zXW^@OF4LSC$7e35#Wrg=Kad(XjS_hNrhRi$1qPPLAa0VF$Z=B+5gu-Gw7Y4E=tb^- zwp23!AKL4Q;=`2%J64_#uc;YllN$8Q;BinxSOJhSrVDxxElyTPQ8Y&N^l&mUqHKxewaYs zVGZYJBaP!41fIWX-yAm!150EO$4N}&I4*|>563y$o!1vtNW^9R^#^XTVTt0F>k6=) zSSY*KvJrE0HI+z(AeTQ?JtUmyAJSK|7yBNjFR^X+`ulnv*l%q4`kK zEJ>tKMl-tzs$%NKU&>zDZ!U-QE(1M~>xEf3DwAX-FB9wif~;5?I>6P^(tp5J;#lUl z>ot?bI*x;Mc9}5$EU{ITq@zp8K*|D}#E83$0GDaO%v8A7G5z4{Fn`ET%a<>{TJOSu zk{{`x!Dxep00=l%GxkI;k;|)WY!}Em`WGCL&ftJ|cTpJfL|HKaIH%<1s-=Z0dmi&B zP(zd`yN0<@`G=fNz~{Njp2X)oQ?_p*c3G>}t>Krd2NPfymKI=Q-T{Qyql|qO16FZ0 zbC7T-vIJGm**eiiSSIR$DX?||!gXWEZ*mB(MuD|m_R4;JSqLn(TuWH36F6dsP<27A z7b?xndU1TF9+;@ROd`Q4huqQFCqt(Q;nBccnBz*$Hg=kQ$m_8bw4Nb}% z=cGm{Vc7g6VNOR-{Ncx&SF7YJP@h;3?it#n?Cwk33B*All!Chmag@qruZ^G90Bzl- zaLEGso)5K~&gzIZF3BEEvAXopR8CVJ^td6!R zoOFy&`BZ`xfVVET5n4pBzu#b)hSrD#2Tbl9whsH>@>!OpYJZLK_b@*)ljK|QxyVR z z^or%#T{tq{2VFg`Lwu#{_OOF~4MTzeRs59nP3N1xvxW?lDR;*IErIB7s+;MhLR+7M zfh9u7nIW-}b7tg_;c;d-+Fj5$O-STr{f_~BZo?GjcwYVMJq1`t-r?>CtK6YFR-0p;n?j|`d1-2nWCwq+hQXopAogy78e>sr%vM&c>FX^ojclUyq z1S=qC`n@D*e-xJo{{pxDj>vsTS8-FI+cR?AfPo$dxYi}1UlsvZ&?Ujg${ut{unJ3G z%1eR*JyDkgWn=S_paOZI94s+?$gK_yl0Lv8w_q6)Nu4XXj^|F-+c7HB!&WO{vBo?DAkkl75l-C0qh{d2mYhS~k=N5<2qopd<)k{e&(Ls>V_v zk!^HHVjvc8czICaEj@?>kpDtCa_F9*B2n&v*6Gd4NPS^xDA1wfghIJ|?^!l9O&e6z z?jLP7LF4b0J7>LoFZNb@Vs7AT!l-jQbnb&rKxa|62HzZ>zZ{DX)@645d*c!>NA9Y(j;8LeKbdP%Qwx8fA=WV|a5P~g;LVMvi=Y+gM=h`c1 zSdEa5&dcc>F>Ny12!gVnnyCFo7`5(&e1!oQMN~fwPv9mhK7oU%@Xc_DYVFD9NY)l= z$M}AUD*Y?~tA%Og4bdZE>YSG~gz7$N=2&2}oF30n%@(Vbpqt!tlX4yt#-DpRr_;*g z#L)%e3EY&!CvZ>>z8MbX?6pRE5Gm&>!k;x^2-W>kjxytv-Ik{utCgf2`?*OucZTuj zUd}A7JdSdn6Q00LIeY>K<=~s)P|m&9NY+L!rOf$F!k;x^2-SU3&L-nLkRzFO;xj%GHUVs5g9DL2jV2^=(oZ-zrNr-lJrN}72T zOdV;=FiiAGGsnBV2syeLQSAiL=#NZ_xgv}=H^p2+D~_X>ec=h*6vHQQPz=5q4#lL_ zNERtCCB;k={;UausP7O#NbG>(Vc!lHK*-zS!iN=oJN!e| zHmc}l^zHBhAk5q0pTzm%ZijovwR~}ZZ7sp%$a1&CKMrH%w16%|*0hu9sn+CTdi_c` z6tAaWv-RfOV)}XLTK;zU`=J-R9gfr!cRSpV7^J@MK~l*eH-F{m@Nr;RDV(b5a`d$I zF&n))r3?mHu736*b0o2%xF=80_%<}!f5zhn>k`DYs42F=+7qQ9vw?n`CRJPrny2%!ubiH%$aO%55J3>rtfT?5dCL|-<@C?IcaxRj;k z%6H*eG$#~b9x>vej(b3FCy?R_pN)ZoJKb$X-0?n`0*gQOJXIIt zSP=$d61T)Y?}G*FgzhIbNiBkX-c7i2 zvJbw}M;!wDeA*h)52(gIe@!6zoA%8LlnhA?<~N1c^2BI9KNhRf}Z#6$B?S*0~LQnbrLH7apSQ)sT5;)Ed$csK!H&AQ1gc`{toB7+4~Nct~O+$3r<}czDRs z?t;E4MDB9d{}{kUHcU}m^uW-$=sFQ#%V{7q*m@l(b%51Groa!-oL*q&8f5Twx{wCg zK?5#PENvCL*}G+TSNNU zL*t}(5{Uk$eRI;Ez`znA#7PnxIZnzU!^26Ac27d(GXRaqz0L+52{_7zFN&jHU9bZ= zjtY;;Ym6Kfq2Blk~SK8NetLZbfXW52Yz1^-a)ZinvhlP!2 zJd3^ZKcw6pXUv?o92Kz{^y0iywb!E)r^n;|s zHyN=NwaF5rI05cA0vNOBTWeF(HR;0AY9HlaNJP-?Z!d)fzWb+RCkZPOrC$0pySQGt zOjanJ!9rAEUma>R!N6h_;c&N&`lS#;v28Dt1}?-I84V0PxPyzlap$7Ib*JFm`ZcH&vud;( zE2+rL!op&or@gR%32mESo(o>Xn@(?Y4Xb4iiME)LruZ^_DbDOR8X@Ka5&;YX8B+*#?@3`fQa&0aQC_JZ&Fxp@_d9>wPxwbt#6UY$dvX~Ov z1!b@t!Egq*{{H$u2dwhQ7gJU7cPDA#T7e4X@Uo#p_nq-dYz=p(u=CF-{6dQRHE{xev zh1nUwo7lFKWKM-Wh3N!;z!IeFGN<%?wtEus0H5co5t98V0L44z{S}7jWlx=) zN$PDnK{1=HhDX@JEafW#2CGJAk7vYmGnubfqbl^@~M zZR6uSvoZ0+15db-e79;!TL-O{)FV^4i<3aiEPq8 zN0CwV&yp8!V#4+^PE07PD4EYVzhx(6cy0J2N4XGCjUVWQHYQc7OsZ{g@7KGoNP|%)5G6| ziClX4d-&X^hZ&%Q=;154U0Z8T4W@jbP+Iw_nf)5~Wy?b2>W~(xS*o=TM+5TwjjNta zx3>1{V*o)&>{$BKg$E^i(w~DI8Jhk)!O))?@!~lOFWRx4 zAf@?BDM1UBW_u6&{ug`-@&JBMPaL}C2ali%=}fl?$9wSxKehsgb9P$@l7ykG7+kZc zS9)_z_}mI)BIWXtcok*AUV_~oim4^RrB@=cji#4J(;TWC5l%t;GG%oM?;oNXO<9SZ zk^2RTL{SXtN1w8K22A8qRulN#r>y>q03AeGUC9nnbZQ(-TRpL~w$i5dsw*ZbLe=ul zG8ji2vx<2HyTCN;LIJz8DMlepeqB>+(E144HJ(YLqBGaQXo}KxMO*gDUcM|8u(4>; zz)D$cGBC$*qJj{Pw|byqm7c!AewYaSb%_e68gP54?}1KWkw%rUdQEr&cVK}};0P?> z8{Ih20t-h1aWVAd0|@laT=_e!k^HuJr0<&Mh}M2@BOF?j2GQ-o1{~I6@9}>+xa8nH z{_u_f48}eF6=w_Hg}+R+e>Dt4A2;|JXr^G--H3woF<$aQ7uGdrfoO~I5+xXECjT$WE)6+6ArFz4A{w_>L;E>&}RpUm%Ta`4m8j;VkV z$-Yb3cVZ}f6DFCi!yyaLO-xBypQsaRgJ3rgs$V32qe9|Hb%a5Vq0(>2UfHXb)3II0ZSISj(a7dFR!95I<~H&7s`~jl@m?Ta zJutET-x6;n&iFrvPO)eFjoX9U=|1E02^^41KEAdX9)32SiuT-j{Og|JBnD=OCHYANufn^c^F4-Xm``X;(S0ih9_{- z2cN(}ANa;YAIdPY>?bf{9fnfV8p$t*BB_Jsi1q;`ghOl65W4#$j!lMC&k@Kv@mdNJ z`M_kREQ~HU;R)P?!Y6PL3cm3X3X~jS%XJV6zB5<;$JR*Jo|P9PxsNCW zvxnbGIJ71Wp}P#B6t_ihm{Pv!Pf$KPykXK(a0DS&(MuDlUm7-2*(A~I_jwmqwXNg= zSGdAl7*M!N|6jn$&|G13#}WKZEXwXOw!rkKNF>_~aw>e4>&+OK*z?)oteRnGVGa&Y z-R5NF(mmJSsORrMMlk+_s%~Hf!lw|Sbm0!DgMhUe)qQO$IMNxZckmW(N7c20zTjD- zA>rRT6pw4e9KD%(yD|qgMr0+!WdVyM&GZ2zOSoDUO`UiOW5LR0ZI=>_{G6`}Xe93& z8g^O3qaS0+UrT^#tcED$&Y>;XX^aaQpL6KtTBqcv*Cq83awVEXeiPbLGceH zQj|{2+hw_flugaOtLlNI7&_AIj9#nsg$TFMcIfJH3*jq6gIU_jtg)t9$L{+YmsrDv zH-tNeE++8&O?A_#lw;^J7+4~M977TlImb{A5gx~oqunNRljXK$)(hZyySEbWUe7Ds zSSY{`(l#$6cq%n5q||FoZ|6Sy8a&<1ui!;@ejyrNUznv*Y19uw1wksl$uGty&gz?m zXM$$}q&ngGw_om{Am>B0NHDnbUQT?ak7^qVCOIo(-f6tQ+#1XeBJKbu=3gh^{7rRY zPH%?BvBd&^3))Il5HU+U>LwM4NU@YM%a$WgR|RSv`Hot5Q=?7HfnSUe@{Z0GknXkaW5+TGh5*s<5$sxnTGmdsUQ9NRSnK(jF98$6) z@Pj>j6hHiV0e*A*5FVA6kEukA%3}v;az(}tHd52#AmZ8^SgxXQDahXvyJR(;dZtO@ zej-C8a0{`5or)|(z4%MEM?b)bY)d@EAZ2j(Ejy@8x1el0uhyZqr zMus^k(BgTea7zc6(exbXl=D|whB~Jj+=d}j%?3s_mF~iPA}GgrCUHg7b3>^Wa_YGb zJC&lI5j-8R!>`X}q&G2PJP-|IzhX4gCpX3EByCZcsrbfEL^S0aj~Fbq@nLzzLyh8O zS}N2iTpn^m^P$F@L1H;VjriCVYJ43mZizyT*9bq3C`&t7oN;&GaYix!06|8xQb}%M z;;79cj1)(lug^`@JL8kBb}~*?OvW#R6U!BtYC>G4hZncn0}5e~e_?Xl{{y?Hn@oPv z7ts_9EWTa#%I;lOfkm}ZR#LDlHmH5?*7aIX3sz2y0Q7@olG z@#hmbJpTAb-~T~Ehu^oxQnYmM)4q8G{m1qS=puZ0F~ol%e5&bbR=4+`Va6|S1=V8= z@h@D%YN}qeMeo1jko3odXGWH2O%#F3Mp@AK_2f?|cLkPzJSRr%C z3L&`As5UG8LqP4&LI`8dG!Q9Kz@Db~0ozXU4Zjt4)>nkYN~zr^;s-1`AWQK{PZT$q zXVAeav_YlL>NMh646e~yRsSc{=fj>n=;$hZmkmA^(Ek%G^2^@|b}t4_3R~@UD%i+~ zz04ZgPuX|`;&*}(o+1;Bha{G*MkAWLfUo{RiAU5*p_-o;o`IdlxY+Z>BaG9gqW7f; zG<2gEAClD$-*;iWLJLpx>FWXF$T(A$2f>tVs{n+MMXJe@6%kE2DIiWukwRFY zahH!!{-s<#!b+7}oOk&kJ{>L}eC%@hJPGiyL@pnZU9NxBZ7{D--`V9l2m?5NE^r+y z^s%eL+ShzP7=h0@c|@ML-dV_D=R1?v_C@oWILM-_=X%*|dFASuNO*|6J$Fdtl<@W( zfKIXAo`vuPZf_5tz~Sw|H@dAch_~lu)>wWGsf+I6IeA`6XtZW^J9!vF{1R5sJ34tL zUBhbL644f&Jc>8c{fLdclSfN1vd#x^&}A=8CVlTijMaC=EnlQ~x-g*doL&v14b4B} zOz||t0H|tm(Xh>+_NvCGQNF#hBgM0hf#r-Fii~v&#;n z{2N*MzCecmWYLW2YuTtnDb$7XXPe~rEo&%?y)-^RvxxgvaDF-^yXvjkz$xnR9^A&3 zwWcAm`jR56rOygoHEv4n@TPF1eg$?K<8o;kcwtVAUW7Eyg%{>H=<4yp;44F+SyI-_ zkJF^FTl$V$!-X-;y)b7Ic>bok`YYvyIU5F+$RIC_#6->ulS72Z3*%^4!V6>fj$r1| z^ymWopd{g^CM4R(Q`3Kw&>5N+rU^6agyi2&1ef#JGm!wv69vB%_9rB=u{{$A`4;D z0Ha<=p-3LnpTX|M34U?%L$AnBWUu9w0Han(htYN0zHE|Iedjn=FojQho`Aa-<#taA;k9R)>O zbcra&NY^4Z@-C5J9?9T&FSieS4}$PU=e;~V4u`_8;zFa^tn>#Ueum~(apt`!K_Z+g zY&+@n`y(#>Vw@_wb#Dk-y?8xVcS%?|E^^`;-ICQEE62Kq(wrym_dt}-vuI)f2gysU zp)6+8xI%M~;QVxe-KZ~CgWP;x2r-t_&*4cbJo}ZJhZNrH23mp3#bcva5o*B2v#hdg zBr>5I4N>^r97zvKmdyuC?Fc`Dybn8#aUr`5{5zkGUW7bw2>;ICKv$1{2VWW5**ZLx z^zZz$HC&i`xqs&y1fIXCuFFgLcfJDyOJtCLM`9x9-^n4uo8!2BZo#yQR)=YD){#bXKQ8_Jy}?Vd!#tBbAl7rNe`gs2TMeow+y1yJrwax9_#dobP~b)~y*o zkBB2R`kLM*du6X#7MHDjsIZc7&KALON7YOx_6eEQrEp4pLZYxlp3X<1Q>;_!3*iae zPANWt!zqPtbV3=#DfO?`Sbn0@HNxj!F<`aujqt*BZ%Mx#rJ^q>ge09nT^h zT9dkogJGjj;y5lOa8!lZt#&gZ-}5g_$$nE9jqVlQK#Pwn^f(osz)e7W0tW%%8y^9c zEA)7mHIlWLeGm}NAMIB?NI0}64WYXX0Ts7Jm$%Z->4#C)=3U;UgTMc4*hpm%L}T?0 zF05)>$px|SR=Y5uaF@Oburf4nwfQ+kk0~O2)@(n>qxXlnHIa8U>z5w}L4X;4xlBNh z^BU@pC5OSSP5(|z=x*ML30cByr z<_NuzNF{^nuVH;UmHVkp5{%%Tj}vN~yo0awQNz3wRiE>#){uTcH4geRf#`4AHwS$k z29^jR4wBf&aZnB!9u9J}I~8dFNhCxLaznGI=4jqpxQyb2j~3uE#|hz4c`eRUBSz(c zAvCrk14CP=>Cj@zr=M$*v!9?43EVb36+0E#hDLRi9lO=FGwaR(E8(C^4#D8%Iw@Ky z*AIy1{8C8ZaliARQ)CDj@ipY_Eg1rSTB#NCZN33JmD=XgPNFm#u72eizoBYMv}xLq zFs<`#o{VV9xft|=E4=&Lu(%}(?>@CP zm(*sUO3O@5_`;xk%V5#nD@sRqoj?o_+?_UpyUx)=v0YG&>T`T$ZV?>koJz=4&s!-x z$#QxR?6q#=_!&h+voOZ{PT4EFe_6zMJ&3SEyr%|2ykZjwdrK14{Tqq25>eexLZ{fM z-Tw|x;10U*2^>Kee4~@bAW_{PT4VXiOc(yci|T%l&}hx-j=L~~_~o_W1B~kaB@H{I zsP3`nnfQ)^b}Mv>rH@m>6S(PvPvD>reB+@HYhh9 zv?g^E2g636#IeqjF)EOIB)kz~oBlS1^lf4MxIw*{RuvbnZH6asQwE>FK^geQM;Yb9 zwa>9evNov?$|x1CeJ0`1nlyy&GL%u=7Q?kl)utasA({`@259X7?a*Srrxcrmi*UrI+AnNRDNyuw+}_BLZ(_t@!TQ-r zMs;N_>2#AR_N^$rLa*xvlNJO%Y{!5>9_eA%Mu0ZpjvPf=#(D3K2p)6k3 z2nL-Vyh04lUp_P(hI$=^h5^w+&a+Q+nY{L$fuJ=5z;fh#U^oov+KCC;egUXMA^lf$;D0K6?;Tf0ASBL5co8@^Pl#4HG+e{hWZE#<+5M_(Xpn7rj>L4-zi_ zbD*my`irj&%f+%^OGbaMvW5$92oIQDN#OaL>Naqx=SfNgNK+M?FJ6nDm6UtP+%F^ z5JoY~vkLa0Ji|N*37nqEHxck-1p4K zn?&v>GeiQn3ai+u$SO4AzQ^x|n*99k9y@{3&0=wi@V!=~;A;U}{=`yC;NiRrp;Khk z7FRpu%_$kRy|vT|`6k_rol0%e7F7vf+a1fu1yPx6C%1{BMy+UQ`;}aI2uv|{2klsx zlsO$VBARk0MTC~3gRqp~VO?SJt~YDr3rM zjo$zQf!#;C>c;E#R!}NnB`vfQ=j+`@rIXA|kK@zp;n%p}n6lj@N2ULbz>TK=#bFep z*3VRE>yUyNTds^mNdK8adS8{h<#)MxX<7MOqK*{$QRl}BBh5zKjGe|ftNJ{LhK)G3 z5B7huHP=n%;IBXEFWpDtPj0CtQ!kvB#J)SHoA+>*0C!nE8dt?*6%*{GVR8 z3H7NKcA|vY*_@qkwYy1s=WJ`LHeF4z|+Ng83GzU!!KJ4N}!F!!w^eJ#`on3 zl@ONXau>55Y)68tRLvV}_I4NR2=*-o*x5_^v!dCi$?<`9c1^V=A-M#6Y7yf% z($=#&p-G#nIrfdgUUsoLT%}6fgl1P1G}{-m^P(E&!1mylF=^v2lOU>%=ZFW{117{( zc{O06hM%t4Re9Q6vo&{HASZT5Wv(|nzc3Epo^QA73p?n5c6;Tb%3er{*in&{>;@ld zzTIrKYw$fu^}XLg2W3a2YU70xA#2!{2}?-)luS*=+7~6$6`g6s;pzoI^PiKwmKn{1 zo@l&EV&L>R5)>GUZEj-l+Y%SC7`)HGVEWHE03CJTBq85y60?BNer!VWlhTl&7eMW$ z28k-3{%`-o_=r%g=WJg$WCZXDRKn&KYXY&^x##9?Z@3_+VBML8YoQac$mb=Yt=J`| zgTKrPP7F`rPUPehI1)MWjcyQVDd6Y#DVjMd^DgJrG@!Mfvn&AohP{4@2)J+fEP9$@ zc3PCkSWuJ+sYjkfjIorT)r#soLSG%HztKZ3(dR!Z64svBM7fCjMU$ zo}oNa*d+boVg;PP;9vzoD)`HU^NnFRLzqxUNjeq=C9y|Pf?ss&iX)CtV)`Np=tUNw z9|{7Ro&>`f2Y7TEY=MU$al*nHU^q>OVHKLe0u1)UMA>J;kep*fk{#3O&ErA3)|rJb zvESKib>Ree4+8jT9Y7188i@#-6z|U*3A2N0`;f%ho}n4+wCJj)u-40=1wOPVCQ`l| zL`uU=9N%JViBi))4Nu@ER6c=&`tZ#|s-`zxXacYlYTBzy*2CncedO1{l`x=g#PbOT z(!t~5i8cO+G-L+X!8yDIb@1-+0!m`e(uyYgT^F9JJg%(SqV!HV?CcMNToOAj9XubN zp*&Jb=-?bK0y_BlVK_sWuyjUH%zC6?2_5{JAfQ1V9G1kTb@1E5ko2L08Gsf(H4+Kx z;2W2~)0NZ4$2cYtdfEBT6cHZ_qRgYA{{lLhio$=8{#@v4#Uuc(YUpj@1(d{`r87)UQxgQ99CYhzIIZUAx9MP%FCf!C0GA$wHz-9{i zSX+GxUe;%3DD!eInM^vJdV4{3>$WQM?G`?z*7NOTzTQqoa1Q$T=}fCWh4loQ?PRh$ zvryT;Q0a9r#Q{DXSHGfNpOwzVNQb=E(dsHpFvwNo%fvr?Q z5CLV5^SI>HxFk`?5t&yBBD@(U^4|_A{X2;>h}gT0I^0i8I+N|@{v`h~1$KrtZ!PBH zy?*o>PJ*PSwigai#!I@o<8BNy} zY#p8``1cl8Q`182{i`wEt)V@U7$W@scUeym2S1uJ=uNfSz`}Tj8gbtE)e&Z*F{srQeWC8()(;e;&}m6bstOETNU&kFKE9s?#h}&D^ToRV z%6{OuY^e~tCkC-W-CyfxJshtN-H&e!IqcE>j&?hw?vGJSQmJI+`hixr=Z@0q?p7PvKIRY7Tmo()M!pND)7l02)kjJfxX2d7!XH= zuvJY2~azX3MsP0&9iY>}Y&)+6Skwq9Zv zCqODdR)nz8K}U?}ncA~#eNBAbMUa5@L@u57{u8Cv&G-HjFj6`oIveqSiJBe z86w0fLS=o{7wBcz?C&*arfMB30^zSv#$<^~H8C&s^1wMX)iE>XQn&Yd$ph<8+Bx z=goU}M&T*YDK>HYyzm6>>_$F;BXJww7{;Kw10KxpC0TAAGvU-9>|Jmr8G3Bq`WHQK6&~>EU@-D#OaUVuWSuVBjttHzKG9r z1>wj(6@X&Rp8g7b^|Gt*6x@M2O3kUk&2Ue#U~ZPM<5tqPDprjv2>eF)z01f5*WoQP z!B4TIwd%_%7~==9d?k{eNVyY*}Mg8Pugp7pvu^ zzr>a1ZIUAe;+3cebTZLR?@TOjyqHOWVk}3Re>6w5nYRw64+(f~j|qdswR|On(r*Du zhG>wS=p}J!j<8K24e%XKc@gGFd(SjC8kz^1a}ZPHd_hhfa@WoFX1Yzt#TRdOK>Mah z!>_axh(D53uQ%7cvj-)Qr^xFw1)2NJ=>-~lve$0IPr+Y;-yVvoCB>zWMQR&O&yFTK zbnS8H(YJ}-3DrA!{}AP1Pp-Pe&VcHYOrxjQn zAz2KryPn*a3rPdPtGtRUFWMSW8x@Li!ljRPZL&4fo1MD|E69jKg-T;=&^ibbHl9h^ zBAro>CM?Hup-*C-kmEPPMO*YqC{j&Z z2sDy~nkBsjo()j}KGITvIz{3c2(M%^Fi0%l%F*c5fZhVVnxGZ~$YG7ug#`6SU}~43 z{y0AO2x>;Z3VW_&6W1W(vMB&2OLCeWDI?W!_`%eDN73oeIpLx*$Bv@Ye+HKrvmNfD z)9eTmC_Byj*=46$KN*0CDm;yKmji{Tw_HmluVrXT$dlZ2DN)j|BgsJa82$ri(PAqU z$qp+*e_8gRiqIGIeNarYF;?N(QxSSGJ1JBF+R}{*tZb@3RZ^=p=bGJGEw0ovujQ<0 zv6}uIFq3WJFpG~MXl2OxE453(TH}CNHF!4Wros98ZmQ4ppt#&C7Ws9-Eqk-|2a>s@UGKKq(0@IcVeq|c2>!#5 z4Qv|70hqf3eva^;z4i?J+SF}L*7n01@hwcZ8cUBaEM`Yfw_4pfC}F3)yn02psROrN zp-N=!FnrH$b`hRzhQnKP9!#QHx`YcujVSZ4Ds9jJyNZv!@3e;c6|G z&7<#hFJ8Se8)?*MXFQIM^OrKRiL9wahAy1>lh)vL4BQ_23`0T^#H-l7IvVe#pt zJ_}FQcU+2_0x6Zj; z=UlMJ2TiH2`|Y5YKytxx8~1Z6Nc9QCAY(VzwADZb@Te^2jyLo?RH+Lx!4cOs5y9Mb zccA>b(N5wJdrU=~gGeQIXzuhW zQcblp2qT3>Vcb%r1bGU!-N?;Ebjh^csNL~NNIuI-p%BhRT>~)@RG=Lr%{e-)=hfsC zEhfg-r+7vV28q;=b?}7Qn~g`l$j=>$TZrf~wF;6G^dN}7+jryix#pT~4Aj5`Qxu#| z#Ccun`V>En983P%~)B;7?zBOd8imB4nwH9tKzN<Eh5R4U!m&FDJ5pV=`Tx99lygY@3#hZOvpvGoVk-Cas)bPcYoa^s)Fql=9E63EfCO12$vgVA@^n$ zlqoY_#y}9380#bi!B*V}2TkaeiBbkSNillsmN(4e;M!7NVPSTC!CQdZdKG}P>0I{C z&ExJY;l?W9Q^Jc60t`Y6=WBQu2_G|a!-s^Q@kaA*66Vl}_YbZTUF8UjE9H3E7>2WH zNcVF?~I(cyg!bD ziGLC1jsYqJc?xTMD9;jN%ziR>z9d{K+!NX}Z{zN1FWTj_dn79(-`gT_uMnQcFPz>M z;Z_as8{z#1;3Gn939wA~vI+Qx@W~0lXN22?KMBK=fDz$4!ViQ63iJ};Wx}fj5$!K{ z^%G$lds$&7_Vx}ZT2|X~)QsXJbqh9f`Z*hKl89djzn=o!A^7(LUL&+00CWkW$6HkE zAz>QXtS}SVqr;Icr|jINHchlC*g$e}HoQ%u-X(nhFyKeRxkmtx5oGCl;tZ~MX3$jP zS>b;tzEF!9pZ&zKL4OR94U_oQW0p&THN0#3!9Z z*Y}%YVnfs|7j6oT5ZD!232p77US_Q9FUjh`=z`hS?}UD7*-6!t2MWvD)rlUf#i-I~ zWukw$O~aUe+Umi+^8Xys3-AQ2Frl@c>P75r`!L-=1H8e?W?udtES7iDmtf5z3li*O q*isRkkZi!xA($v$EQ`f(TXX}TG`a>52vJ?#l|5Cd>Z(>9 zGt)}_XubB@YYu~LE^{viFP9d>avAu*fVd3?3@l=oHOBhidvRn$WJFYC zRkhSw|9l^%>C8A@ygS}|5qZa|`?r(SvZ*y!sn(B7l*;9Lqa3vslC|Z=bZ0iI zw-@eP*#3J9FI*T)hMJ|rtwyIg9W5kBL5t~1wN`FM^@Up&l8xBBU9Ghyc>gu6Xu4f( z)MfX|s> z5FJ5)x;4LRfgpw{wlLGRFsRVtVmY#wd_w;)~fYrVSi_;lnj^J?PhhV z(*_*inpafIEnMH4=~}7Pf`{<$RrS&=``6lXXD}!GuWn+tZA1H;;V(qrpicV zedWZ;ippqm>CQ@HHrmjli?dXQ?re7rv^Y0;wYiY&WH`8>U=^wffi$`Hg=B*D7!U1GS-ro#P(r4-3Fyd|k^Dh7 z?$&vo3;E6rJQH*CyHF5dVfBNB#!TosCU$dn*vpv#Wn~%Q^*KT|a$$3I3#JD(m0V_y zTNopCP^i{JLEFBNoEL~(%PMTxW)cf5vl8_6bcSQb;LS#SQ*2d15w$x_P2YaaT+-M~ zwH6iUO6|(70wBI{QDJ|h9_=WAc*UT}8_oG*t=ekuDm=3eTK(p^QoUSiO-whM(Zoy> z^xVWVO6}4f{MU{`y)!#EKLHJz&C>iWa;QV4X0i49T?BYK z)3}0=j@wD}arv8Q`K5Zj(JmRLC|S)2DAa`bQ%XND%1Gs9VbYuo9ht4|YJsf+URgWW zj9O9iP(&*8P8j75Hp-He4$%34sPzm{VEfTv3432zm5hb5tiWS<2OZO|55sh2p>jVe zo!6#lt-OXT7p!84R$(q-v&rZJ)a(l#q`$}q(wl4`9YY|20|Iyj+k^t7qW8i7S7c6# z9Md>*!RlhSS{EyOZXi^Ft}2=o9FiRc>69lr%|7m?S+cCYP%=H5j{?y?Od@csoPMrT z2VIj<7|V8v+2LRMtY7xcI+vaGANZ`>l4S*Bs1K_{RX!%nR$( zfU~J!nA^5(tg#N_&(v|QIsk`8g-aY{(-@9xW-^n2VYvuv`j` zl4Tc3GG3(PK0X@uLT)rA%NiL<#+$GUV<87TL&@rDowgT>T3v~zRlvdi(8v{^?gs^A zWv0}rwTp*JwN9jim27Es=Fk-`wq{Gs_HCU8Ze{KP6vwAZXd|aTDKzYdU|H`6eEzLu z!My|X1Zd@B3U_ZZh8C#FJlC=GbT5`FR^Ev(gif%oFUfVe1v}pFpWxdW<^;(W6J+^; z-lz0d=d8N6NguSD7CsVboI+f@E5k7$z5XHjK8UICL>#5$hL zp!{Y*;bk`)fFAY(YDYPrAd8C;kDqBwe3yUX{221i-5cJP?P?cV#;*j~yRJ<7g5R&S%L7(>m z8lMQSO{K$)P#3)eFr22s(A5Ne*AL0rCL~?$4hPV{r@||4(=(oH=g2i<>O2j}?t(#- zC%O>*n|IX?lk#im6lzk2m;0QIik%br1QzzfHx85H)juRCed)`Be<2E811*Xd-XM)| zB7hX;LB@WJ<`CG6ylC(WY*!fa3GB6gNO}-h24F7&`?MZoHyP30Vi`yXvGtuU&J{0C z9O7IiHVX3)5BVpsi!-0VBF^~cu@UFQm^o~Z=y4GH7w5Z)4hA50`|HPO4sreqFB-h! z+!cm=;`~8BBt3{T129;eyEl9<>=AizlSko{K8IxvNTiUG)wzQNl}9S8leIIQT8*XB z-ince7ga`ax_!%F`WK+I(6*n&FsB>!wwkjP*)dEy4q;g8V6!w=Q3C=`xU>Xmy4|XGR}f4krDHXe~H74#6N@oWQ?V1wO3OpXnG;p zY7ObIKoE}=#Ye4xtzR})v<}9Ij?C4n)7AFEJ=EZEsac1ADlwz@8vu&3Z>+pk+i6N{ zuqe^!l8mDxGZHIwrW6^-=1}ABA@)b(ZGbPv!tuB932|}!efX!`B~(PJ z9Ktt6PMW_;Cfhjq9gU@V5BCf0b6s?bakdW zy>K^1VV}cr{7m={;C5TGyf9`cdVHlyLuyhOMj_X=S*#)}7burMCd#qI%V zCRmogFb1T86w`zjmUd?NNlfuARRW-dQuMGu`Tqj?WROt8QVt{n{5f3$Cyg>}Sll6O zSt_y;8mwzUVH}H}tE?c&3yp{b3k2!-`RrbD>t6ifU|MHC<{# zQAP>;GKbMpat>T_lqVAFWT>7K%x03Cg`s*T$&S@f;VX^X7Du1fjcJ0^&#eTuyJ^n` zYYqmMNMi0KO@&!PQyeo0a)_g)-P2NW%*QB_@JY`@pc`r6JV=~w=z{Z%IQd82hstau zzA`{a_pqk8&FmI0Ih!?|pr-LT@E_fe9gCl)JWH%O0WNM^uFDpb8XJtiG4SYSNJI|b zEx!XhjmBppq$llz6~$MmAf4}I4H<$#FPKGh+IS?OFcy^$MlDvzsyXWM$8atdCG2Bd z$#iVIk@yq2*3DyBe8EFN^#2b1eHI(B#fgsC3L?71C{BR%N8JU;?aBjdiY+<`ARIvX zw_G+U+3)09GpF@K*hxZ`p>=t80V5semM66`++aZ6IMVyZ-Pc?WyQMOmS}3t_-E^bY znXR|5uzYed-6=)oVyiSe2c^@Klf$$wjV+StM`2!?b`139z5z~_%HLpz1(tc(pl|%J z8eKikgwF}tAU|?*ySsssGDwr`h)|(>9QiY1$-^VVRDi}(vy>xEHAvf za`&??$9VP>^lxG@XKfxOi>b}1JPa~(9i1a6NEO>E9Im!2EM(ZI)f$H}>LB&(uHh>o zI0(`P`nFh}NzWC)nS-16G#j(U{c!lL@VkWr4f@wDMtcc3wtp5s%}~4=oj~X$A6zC~ z!TDQ;Z;T=Wr`>@{)M}|#Xw(ap#$jBSTuY$@|86$nn1xg7(!A&rI0)tA+!>r>4CYq|T;m`F6lz{Y;-6(+(#3iG5ct4^uht)*pkc?iB0`p*+o{skPyv@Bal#ev3QWo zn4tRR8MAB@yysLQuy}FdYCHM)D)^{`-S@UzA?MA;$RKvRCq# zOYJ7T$}zRD-Cl&|6&EyA4E;CstKDWYXWqrqx;`{h-|QmQ30 ziw)#pFLk^>akWlyW3>ucfp}+=_{#$Yf=6I-U(}IfB0e60v?C)$dHi-jP^M-z{yGGW z!Vk4Vz3N-zZ(^4nc}xgh6#!+eoJdqm_)er3i+FxZ30#36!bgm66+ zUI&E1L8x^F5DrCfDNvbtT6z(Y)&7zt+Ll<~Nd_h7YBm^+GW{rWv{mRz+ly@JAHLEo zs9_cLIvcgLh0rNPHTyyb{w2mVZnce~#fyqwOklg4sv1653E-VDutXA>PKlvRjy8iJ zM~>FgZi*D);_{h9bMk1+21dK*0}6CO}ytH4Vtm z-M}3WE^KSW-x7HwU>}0vR8ep<9)ipD)CaIrExB@gff__+2Yp%WP#<9+-25v+i!^=e%f&||7$=~PG-bcE;9QS1<&#c$3)~V z{GA>GKNUDyc&?Isur1d+5)QR zH`rBqc(qAoo-_pye2J7~uK};?SQv&?5ez26b$Oo=E>Y2-UIdpbq;-j7Kf)KuDz5R8 zw+dxQcNKsFkdHKDRd)&BG#M)KyY}Rj6v`7_0bCy}XkzaQ*QUkS$X>~RUZQa*K^59o zr(wMHD*p(VOn;~&Xi_fK8s|}V(E>pjs7nzP7jXb1{B@j*rVOGq%;j&WhO;)CLyE;^ zU+4=w8DR7%iz#a@+5Z4jQR> zVox6qTf2xo*_NLoIldA`8(i#Z)T`@7uxaUQRf>&V#i9cEPb@K$D2g}V@f`)Y9Gk|2tDRXn5Ck;XORV)nSlKMBst0qX zo6W_fnN7<(5V0Q`@}Or=*D1IVYTHp6`3qwpLvbh)jyo@&GsW2{sPX2<4W^}zP98rn zTj-qX5$BeF^l>8W-%o{o@dKepuhosbpUwHcbR%{e0NS3Fa`RTzJkXu+0 z!#o+fI%1gkN^_nJFG-JK3QvZEEdJC1y}%gKPbwa-JdZ$hH&tD&T=B|_U|@+5idRZ( zWa5<>WH{oLmUd_5<_(FoB!6E}EG7&Aie)5zVizncu|$*|GZdiume`b^_gF_w2Np{_ z1jDH;>1GOqfs1+zJLMAfGwhY|>A_~z#)F9uZl4l1xC_wp_j9e9$DHmY%=;0y zPu|r%R!KvA$GQ55t(CihuEEv}g<2*NdBM=%3fb%NN1C)iZ}}KI;@I^vatt7)OOChV z>XFPw07+8HR=h+nb=;pSvDhu_s%mL9DwnJP=Uu-NpIxjQ7MCjk06u-qNiKp&HWZ|~ zHvTPXKI6`@o(q_^2aAaaC~>+_)aEFTT5HrsFBCcdhG@2Nh~H^O7uwVDM=e>8l^p!i znDi*5ytu575hO#z`w-%hcyBOINMkx0KLVKNx4G?+3-`NFJXa?01O`oVbxKm)&(qGt zV$ddGBAY=g<8y~W^7yGnj~#h-RzSk$9K(}`yoesl4R%r0p4--(5r}eOdVD|UyZdK|s%=#sBybdGGD8GYnXiVutx2~_%fQAqhOqSha z8&(OWi?-PcPm-&RnAoB|8EI39UL2>JR znz({P^6=%kdRruv(6$UuP8#ZGa<$vecVmv$Og)(NWgo%G2m2xUDaBye8Ajk&n)- zK*>^BUIKG3AJ!Fxo~GK4_c8=wK9M{)OJr%`SngA#H34NX`W!_!Xc2?WxuXS7%m zu)KH#@6v{B96wMXx1l6)MkX#JeLRGnd9M3ImVyH4>Z91n8ZS__TN#SNN_pN0W7acujDDP zxY8}dIKNg1)QV~|6TCx|&;Nuc_v3Hi9p| zLTQR9oD-Lw>M`BN8XByh+nEz1sfU=qD^T-u1~=&2nt?d2Up1z1n^k4gf^d<8aBeT8 zl}w-X)ZK!Y05dkqnS9>{=>O>eDdD%C*rdci9go6`J-hTLvuWj*0~nSlJU+HX;a9G6 zN8x#Bxz`AMHE6#(nE3ni2N-|1gfaSvzP}?NW@DLgOm!5zx3oaXF1w3Uo`}KS!j3|# zQUy(0hO~aIrM;p6KEFg7Zu5&K$gP<`Z)XpF|DEj@lpJzk;DT=<0$WRgrETsBz=mNa zN`xOVySz>IO5XE0i0NC%oQdc^ck$@X>6+#Rwg=C}yQa6KtXI3zTQFq$L!H29OH$>? z5{yHq&@90v{t4_^0zQEyOMq`whE%cy-rHVC2#ozJpvK!r$J8^8ncc=y-IJ=xej}&g zojWYma6J*ifW)3^U?_E4GaQ0DxYqLh!|Zftm&%^^KH~y3HCD|>u5dVN2`4? zZ3bY_6-6)ePhe+2K7oY+@r{E4l?X_d)7VRW?SEv9We`#cA_uY*n}X2MG;fw_Sb4KY^W<_yiVK!Z(9rrSBSJ8FXD- zR(gnVXiVutcOF*i-WD^Ssml?MAu6&NPp`V|-#n~euM^Y2Mt%Z#;SCe$s!vC7W~O~OiXbOi zny#>DpPmk-yRW!Qk6Ela@jXn^S%s;2Na?{f;|+H8RiQH{KTF0-(v0M4Gn(b!G~-rN zR--Lt5T(M6&q014iO&jV`!t62INlTxzm4-X1HWZcTVn&xZC#!V!92HhDRvs=n$VTo zy4rG6*!7ubdR*=Tb${WxjSItjX(XH_z?iw$@6gh>CVZ!=Ka?y-8`8;Objak6$aFmq zx;ipl_)4?HhX1CYILls+#R1R0(1Gt5)3|K}3JcGGH3@8YQ`I%hl>s{p14|@P225fo zlL5;h$dLiFv^x$%$5wuj$VuF7K*gA2rY6amKOc#o(*pyt5+=1f7{|E4au%+LMLv24v05y0<{%z+CuV+1|f*Hoq}r8*{k@N>&8 zmRX|DxWY$V+t%;1S~q)KKCJH~UP(xP1It(0+09gvFNBc%AHtkfNbr?9YM(-~d4oQj z8%RY+Hb5tzN8huM90LPOWRQ?ZOk{*4g9wL^SlV6C52HvTCw&bALS;f0BvcRQ6)OLz z{Bw6V28_xJF3_tBEV#IYns#?Z<<*H?xa8jw*CbHS%EhbP3B3_Jb#p?$uUt)>JOQgK zWV$#lOcgO8=X(jQXNZybV6Ij0bFO9R+eT;DA zM<=g^N~MSokSW$skKmww=T#me&M1{-rX%f3EL9%&0-&}kkADNGU1u%(tnzrS?Zj(e zMIEf9u{{sp+qtHXvX1OI+&-!}PP0UjZ4=OEq?Efy#ahz4N7E;|i8^LusGBY_sCf72 zM%gQQ!xF53u%U>qJxDJouz$XkyCC+LI^v!rQDChsP!b{naacN%A}%iA00>p83*sSo zHnI2a8%w`SMO?$@*cgh}`oiuFUYNQa^pseMX~NRwFN5iQTYb)G;)t;g35uzDCX6;X zQ#IldIgt}z>MT!Y=_XENt69=_j?KL@bRIzl)wz&BjG0asz~Kb^=mvatib6%8{dYk7 z^vnYPJ{f$~s#CAt)`<#Lx)QTmhOl#WW}cmO=)h;Q>un)yLiiqwsiiE$??4=l#BbxM z>aGIOYV$qOv$4}jgzCSPsCFw)#oi0bfW4OrBIReFz5fJEWV835!siZqA2UF~z3cfZ znQLdNaISr>)UNbp@`dLQM*q^DjlKlMY4f>*<1wozWMo_!wf7y&w>TSgXCu{;eqHuT z9$0eDih>to+cKoQVjq@Ko=6F!VCm1~3iFuJ6fg0=-~h%3Uc2P9kwA)}idKu~Ob>}abtQCxTv#3@l%gZvg##E$ z=oEN1I3?ud0-=GHFhxlHoW^n7v-%MOfcmkZ+oyh>4^!JbqbYp8IO^xxR=e4mhA;C* zkG)qUK^dr5q>S3T9y-FABA-{(mc5psSES&@P(?$^EAADgPjrR!`*MYO6jF+p_+>bN zp^zHzY;X!G>lLMo5jttS3TTKX7gihOG6BeK^LR7(n8OtqxE;%X^-% zTKXV7TTHc-E@tVfr4&Z4mOjKW-LqN}1AtnxAl;{y{x?i*Q%nDf&%J6%k5k$6_mvm0 zeMjXr1|J|u@!fFp!IHVh#|)%Zbp6Q!yY+v~W(!1>Jwj?zaKGo88od2iO zuGXsU`Eij88L!UHHQ*!T&GFerxl@Z4A_NH6AbRovCV0;Y(X%Le7I@E+@~!5|aAl;j zo-cU^5O*zv+SZAilpq2^N@}xskeqDaXHLU;s7Q>@)4w52rTE5M0ap;s+=BlJz3ry5 z33_anJt_$Q=AJ`^QF01H&;1eu2Qd;QA+U5%6=_EU7l)@Oh(+6(q@yrN;(IV3_Jvoa>mG=6~t)PUW5#3qDdpr1PfgGrkZ8b(rW858@Uok5pF2--P1gxC|q3 z^UG(Tpuoi(TC15euG!soDU=qpb`^FJKkk}j+3oZa+co^XQaL9d!4hvb5R)DpNH*Dq z)anf5yRbJyyGUp1c>jH4cs-&v7C!=5UpR$6KMB?mAu$@Cd~8MIY^LQXgfLB3ry5ID`PyAzZp^UA5$N$9u~fQsv>M*ki;}3Ul;yaQOIQ5%1(K zHsJdYQM-lzohxDbnjNA7EP7fE}(`fu@{Le|5W5vnyO6=lW!Otoy z!!s)74qLIh+Xte8cj_-Pc?`T&mww!-@TLnOgk$ zuw;BVT~*5P+EZY{?;GgU1!*k_5}-rK&`OY@RyrC{sRgpUUF!Oc?qH04>c zu~-B}-YM0J#JGaA=3|LWBJ#GQnRyTj*S{7nc3ZHMgcFt(U!ejrnldP81!hD9Hw+J3 zF zMJ>qGbBW41^qDtz#FJQuZJ_u~tFYNR!{gYpwi7h05xq=-PFj!ZUQ|FsTL#ZQZ^LEi z?y%N!x0lvHg2xD-I}{Aa|B|dm;`97qJ`>4f++sXe_IfN4(_^V+3Vd9{br>Pc1MsZ3 z{SkAxaf_6!QwSr93HfZaS9&%_pmndL+vMvmLn1P>4pn;Sn-r!R?Ft4p-~;lS$^=gr z@5IN)4z~urHA4J=c6h`ya%xKb&43wRBAJ2hj&)0YOcqALkbcGfa${J(V&}UpgoUj4 zDnf*^3jUxgyrW*^3DASR!awe770V`+6~G@B=>6K48-`~g6s&~t#T=k+#(|&E5{wGg z(jqLlA8>sQ?;|jgE%f{`e4YtCld2t!8KC`?FrE!xXZIXfu$qU{yPF3b)oC5N2joVX zJ|Nh*#}3!k&Q9$rfZxjQs8_#bx{^)DVifETU2T7jQ&E^xw{WOx`^&Od(tLF78CwsT zvs7yzoxubXuk_wlM+@~^ZtK-Sgm~%?b=3VrBEcHWvtP3JQ|JVGCFpw0NBk4m?=<8S zSnf2$H)@n$xu10fFb`XD_MkYu(^tOr7=0u+)2Lx6&tU+XLpuq8!KVa*Vk`)^AVY;e z11HV0 zI&pUc;o$BD;#OJYDnd3IY(K0yBZ8&ApgcN5Zv|q@%dXJ(gz0u)YfxRH`0Xf6Sroe! z2hxuDM30dLBpq-m#{lSno}!kyKIL^^E_Cw%$sb^+QLZF2aY+`v(YGlVs3M2o$buV!@v?1bU~HGL*|023>q94R9V`ch?>#G z0*e0ew*x6R$JUj8PDT3NT%_RY-h?1P&y2)>+J$~fBo3u6C=xdkzk-@}kEzP*r?>>k zzjfhRy+vnpH@hLYTuH3JPPvrC^lsemXaUtiRm)@0t_VCGo~oE>beQAg3}{RY@5gI` zAs`Yp4_8}CUT^ts)ga?vz(h|l7TOmR6^z0BSmR7&LI8o7O+2_PaG^*==2h1<^kkFI z9nea)SV*U=#`?PJiUu5#*)yQE9-U=9DO8E&rDdH#3glRTH?wb2F8fdv2ukFD6^M2> z8doCPGr4ApC)aZ!mn)K6u~RNZqNL0TCc`R&OermN2wxfup=w#Nwk(3EH95Pi9*?q@rmu@O$H2r>CP@o=Ho-AZa|m(5_fkPvAp z3q}0e!iDdL#ksdt>$Gzwl1}R$DTG1$2o&DLq6Y|>>QGah5WaNPfXx0b zqq0yQgD4(smgXuGEx5A<>KLG9YeHJvY>aUQ0m?#*^lx2EJ_~qP9bY%oiU12HhW=jm zN^W~}BaE~fBfxmgKvBqcDato|79%?O1Bt*K(aG;Xr_ku+!~O~E(MdjmB|3?3R5s~7 zIyro-K9ZZ^RJ}Z~=;UgcK4WF=(Mg64w>}gCfziotGSZ|W?OnagFlWH@+hnU~ED_z} zf9Ya8?#HTqf!hfeVbSgj{1e#uiBDkRCw$}Jr*n1P8>IFaZnEA%Ph;trz21PdZ+`6w zrr_xNHAGVbNFVw0@OSsN7=2HTL;MX?8%Ff~6Y#9>==+egpECH)=AyvcgIrsM1mADJ zu2zDt*vK-vOz@m<+ICQ;8Q+Rvx(v#*ZLArMh9QT&N#-=@zQqEAx}CDU21Ng!!J2(- za_=<;Gg!#ji11A=LO>C{lygi7e_q*7dV0 zJ5;Y%kHkyO1bYM)sbM~a@d+Vy0O4KuLht_^yneYI7NPeaKvzfT9baj#fMLdSh29@A z2J>q%9(w;b0?yr3bwqQ8-j{7PL+=s~Y3Tj_vyNJJ6#lQWib5+Hd^lq8mUi3FJXwe@ zJ(|ST0`!(SUVz|_#NX|LI@A&TYeC7U`|r$AQ+H{&aH)bz*_&!#mMQCFi^Jm#jvlqA)NEv_*Jc7uyJ=bU{N z0qSn5a&~+yG!6`X#n(bxi55yKNt~pd%^5m_5(h(D+EKE|Nq32$#NQ5>+Z;QHxzFx` zy$o~vN9Erw`9^@q@Q5GUj=+fD{|FeBNBo4z%oXtyF10je*@)k!FLS~IFoUfn;RvzC)62?sCtS`o(AxolX$T@&X~N= za#sO@NDx&o&BBehtzxY-71hKuapjlxR9@|&J#ANKqvEa6Jnxz|63;~NJ-xPD9K7dJ zCjOKHM3(($lEtmDU}fhmB93?t|Hrb|lHoG_c>bv&gcsY6u*N#x{#{}q6mNK3KgC=8 zTO5FL3F%py^(qSq==6s=6zjKzsx(18OrThyNK2+~d(?TCInheiW1|iNf1d`WmD^#3 z>neMsVG&~Rll>^NM<-8$PN3|AO0m!KPhbyD^9d}$X?&wvDK*&vnuKwMu}g(i^a^~Z zGshldB)7d&J#k;M1LshK!O1BBVz!{vYVSwOigntT5`qnge6-NLD)m^p;B3rS>YU?X>Oh^tFwrCDY|#As49lz)uLZB9 z4|FEE#E&XFlUzWH3}cdO{1e!jgil~$5_~flCYd%yGPrj!nWRYgGbZ$*x<@8CCRGq( z*O%dx4O$z)F2+-xXI|#VoP8lLp*4r`%z}RcJJ0Y5EIfm62E#LNF-9^-xR^ZiM#7&l zp%2x0c&2+>ES0cr1Jj=I4`74pD3u6u`_sGJHlh(?U*qH3Udo>SkZ++w3MH;I?sBv5 zJ2E$HPMDuU2)_O8s|IVNsgz{5xc#j^Ahd#s_=**VyhPm(9 z*j1Ge_YHGDhpzc=nEMj+VmHho_plr0dPfY~c8)HYU={H{vRJnS3%^@o`EkG<>~4iG zLod{RAT`=mb@xKVwHD3N)g73L6|w-I+ltziM!AJ|d6?orWksbjye!pfl;^BR(^0Ec zYR=1UaBLU8Yl2Uy^;|Q;)cr8dfnWB*;w22b7NR3?Z%7Ny1hdj2h)FCZkfh0r*C8%P z;vxJ`=*70;Jm=C0sly5sPFVaCo+sr(7cV~=L55AS77m+bT8#6*U4yKVGQ=+ zaQ&`K)Z>T6kkyetu@(FS&Ya6{&%s}eZGo+)pz@BTDcC)A#_7-;LB{igu_N==qB!Mu zpsORDkFQh~O>GcIotDmD%@846KJlkye2RwdH-^-0f*Mu>l_?VW`v^pLQ#I0)t3>5G z7+4~N;(`(znM8gD8IDB0rQI&%g&z4rqA%%Z6p&UEuGG_VUU)eYpVI~NNF-k2vXh#2 zt#G+k3wCCt2QGq*;A%>!NrfE--DHZm<9$%oy{(k_lpacfBk!6Fug_lX)(2OXBknuwa$Z-K-|LMTpPm2v=6|!B^_20}!7d z8AG}ORmA591fsiX&*JlA7+4~N#7ANyBR&~qIK;=&?r9$J@iK@ca?3(@a+w_rHK1=c(-=TEknjc!Xw&bK9}ev8G6$3I=8#| zO|p!Tp;74S@Zs>)fMw{Z#*l766&X60Ky)|lS%%Jofh9snh9ovJGL%7vLxwEv&U4F9 z7Y>nBPI?~$q{xIRNQzGAg7y4Tbgjq)WW)y@woWU`ek>b%wAxUA)ItX?g1W%egPXS* zp)|R`txx(uB9la>9?Xf7Lxjl0gc+;Z!B+zonU@+vy5&F-nL7wXchjCl<}MgmB7{Un zVk09m8Duy_#?p>9EIo3Cq%+(0^f(HLjR{wf*c|MF`TSyYQ>y!MEoRWbxxRV{WJj1C zIfmE>fj4K9A0yi$_CK;a*6|s!+7AXZsAL==N$(|OStSWy4Oo&sXAJ2U4@HtbLm;}F z_AE(XfPp1KNRlKrGLn=*hC`Ap?Jh>+(+7{F($w!rAWp%aRj&ompe1h5vt zk59+BSPH0*apj`fcyP;qu66T-17GlFAjhfDKT`ssq<#=voXCi+ARI zTs}^~3G#5lP_bD$Tto~D7EqqZr4#L&xz^2T-@s08+Mjs@Flv$vp8&?373uB3g z22U?oWc?*LI-_&0k>tW+8et^9GuPU5nr;D<-vRvtX^I%hM^l_2rK#Vf@bh6JsU^;b z^?2Z>lUzB~sn*KH7JZ}BeFGDc%YGCj{j$eJ_Jq8<>x4SDaik<&VDjpva6rd^l};ph zPPtr-rcE5~(fW=twOk~Hw+r$u^>V2-G2LiJ6ZB{Tb>$w^m5{5uxNx;l-s+w7>vhC2 z0nr~y2_Vsae=z%tGI2Zr@ow2`>CzxQkFh-%u}l-D_W{VoZ0!tMczR~tZ>FJUY5AQNmWY1rC`{HpA#(%V0>hA>vJJ%cqHRN+pvoJDB5C0S}K?EClN`g zjN%hkr=RpnR!X&DCL>@2%wFoq9v#uiY^+ZKBoNtbl3=VJ5A*x%D_?$mJgm}zffUd2 z+W;&5)#MS$=@YBT@lI7PuQg&+plYReB0-p!{w?_Wkp7W1&52E(?9cZ-MV5yW7ljEJsU_Ri(3g+UgaU5pi zHk->%!6Y-c-!|aUVb!?kOGW;q4As?^=sk`(kT~`6T2=Q~?8bIx8 zR;tIpR{s)wp1Grd{6_&O9(wKVM0zK=o<7`0J1FL}(dWGS^OX1G_LQwaxLxK4mW0df z0J@v+yhBsC)5xw8hJfuX|cI-Gq$kG=q=wbdnHRB z{i)l$oPVsa^28S|j8&d=%YrHPVvXo|q-%`dgv+&f9+D`jz6Yc-{k@W2>d1bNM4Qzi z4)8qUbB91F4B^MQOU;9jYe?8U!Oq7!0fZdRhYbm-3X5L_qYcdYIJvtlNH2s@giOL8 za-@P^*v$*se?v6eI0V@nENwnis&(L>P`uoNV2#M%$oL#(MlqI)Uo^x|8yZnY^^1n* z_dITD)RR620dD=8!CKl;g5+2m{6bH3i<5rW7}~8OFz(B5VnlezP}}bGGl5Mx$`nW( zkw>UrjbN~X_pfk>e2k1exg8c90(MwRvOcBD4zE1XZim<6bC(@vfc9gD_i(?qSoM5T zFb)V)U69-OrZc-O?yHuB#Z@8gW@b;(R7={E+1ADs)~;r(>u}mmh>H41SM5&(j!sY= z?HHSP8y-^C6K{pl24+8>;9zoTG#MqxXdcHA8DKP(8Rd-_3ogSc=?bO;; zIB6u_?0~!`Y|h!v1&V~*on{?uZlP1J-qwNSXto|{y3>Rb^R^H#A#RVw)RN)iDa6r8 zJjqej-9uK4)f2E2Ggh}qRJ(P8VypyZz*tGiNjV1Xqsv$whKX#O#uwmom$71i_G7HB zUO+r}Ss)>e`YWW8HLr377B`U0D zz#gIgbLa#fY0zCe@9|GyPb}~WEQtktqdEub1x~2MlDh;5&sDSoproez<{C@S(dX!ElwEKxz`}S0*H&}`i@#`0}yg}T{a}7 zsE+Rj#0<>qI?iQ0q}#>lKyKH)oR6$-m+=+m3-{VjZwtQ)ic6fSg)|{@a`#bEUQa?= z1Cw2Ba760A=Sz3&#c{&Y9s7(abtcT0?zo~0H+j+>&xEe|(;eqSui$jYlCor5qUcatx`f3jp^_UL-|D!^PHPB_Bn>h6G{#^%*u9qcs9wW{mG3EKS& z&qP0_08V83O=5Tw9T5r6(8ACig>p1gf=w2djxr-<9Ix%_F})&q#jzDdMmv);q@U1rRh>GkzMRXz8(S-~AJ4?%H?rO=+)*+H3jVixpp$ z>7$GN?Y*DT>)u-hp^rWI4K_DQ9eYgF_U@uO!5vs*&-Ug!3i!=Qc@s8m)1Ohb1a!Ap zuqIr7>pLk_v~6F0lCJICT1PnK7~=hR-~y&2lh-Y!ZM%wFxRD(rK;}Ra-4Y0r#;-)36G&3`rTz@JUyXX3~!%JG9SZ5Cp}5 z>i!Ar{J|%%@CUwe@CP|Vjt#lRQM%I@$)Hofe%wfcl5@+LpJ?2!LgT4Y$T@ZJ6i?2N)EurLa~aWM*9Il`7}INDI@YPs$G?~RcR zn)SdaIDc@k@RNi?V^SZw^Ds*Hwipddjc>dekzt93NlzgSVx%=Z^ipT1hX;++l{85( zR)228szOSxa7Fd74Ff6e;{Qu7EhLpxogIH2YEr{4@~=FiR1eb`M~FAk`I-rvvjwhy z0l^8H9vm8N5KaeGslL z+yVC>z?E=N^wX@Crr@h91-fvgHC$@pDc)9kuN8cu5F%?dB>cAohgO;}N2gY57VwS{ zd6VIifJL%qe8Llfz2RsT{wMDhhD+HmB_7$zR|PzhjSY8sdRMO05>g@SFo|ZpLZQnRRYWhHO3~gzy3|^~@g@~}w zGoY&@EQGIACNwpx9u`u(WBYlHTa4ihi=ya0B{1|{0?*x4b)0hrhKew-Lj$dYV{@d9Mt?47E2XXF)5EOfySqLN=Dcri8YdX3;UdbAS{!)nn^ zI+GDl}Fg~*0zS(t8@EU+rWjr_eB?SdL{~;~XdSwQ_ zQb+Z(bLz}nqnvLw26Ka`F!P%UICoQ(nd2rj4!tb!ub{0&1u?V4Lx!0%XmBvIrQId{ zGDFJ#eGdf!V?r1tFt6%DgZu(>so1bs@18kafm=7p(TSnZlYd&4B3%WzYq>CoUx~L$ zN$|$#yRagauigA5Swu+7Lxc>gwBRdsRKK){D`~l%5`Rj1la>0lF{B$%MP`0QAiA6O zEHnQK151RE%t&lxWF~_Qhs;>ojiY+R3ueL?L1HY)*%9QyoIOY$zTO4D8F}!J%CC>P zAYfFUJ3yDq4AHB*7zBV{A9DsZ?d~V8xq;Oxijac*TVj{^@#2Ec;%+8G7`TUc0e0%< zA!_Nvz3K)=R9oUE204R=Z`np=rqPtQwWm8Ael@SSkqV@BfFnwb402H5#cOlnmW~FD z#8*QnUwH_UfpZO#VZdCoj&V()JwL~eXaT0RXA)P$J+rx1$hjxRPPw>e7bw# z&{&pKBR;mJ8s7(tTclLu)gq1~uBGiS&$zqiJfoPuk0hghQ%PoFVyn$EjFd<0cI|_D z8gsKbpfDrZ7rM0lPoSRaGPzk_WK%G)_$k>dxqnF|7E?kQSw&lJP{{__UaMunX%M4J zRO9;+GdaqGzYU#2Q-{CwPhgMu^9d{we|)3TUnvh(f+N|GKYOY3($JIivE00*YVN_M z4p+ha8B=Tz`ZI*M)vRE4OdWm$P?Q-~iTsGR81zpCBmO#KHXHQ!-j3o(#CiMZG&pC_ zH1N(HoH>}VktT~nkvXuTF(p>~aX{_BifBiz)gMxkfd58m14d2?34anP>$-cysH8n0 z(gxrWvroOS8~9`ZihIg*(pMOP0(>GyY{B64tZ~`@Wct;xr}sO$Qh(e3Sit|!GT1MB z6xhBPa9cN<>r7!I-?eBA?ba^na`U6W2v0Z9i=FXZx`vE+?nb`)Mt&1<`-TSya>4k5Fw_QLsv(B0bgnM(lCuV^9z4&4CiNRUU>Sa1fIL8YF%^X z7v2a1OJq=ZNn#=sUdkZC5ni&iGtvmsfLZbjX7AJpc=8K(cfpUcB}b<1rXP49r%g=< z7RY%BhEo~IO-=-t%h=bkQ!W|X{|v}-Fq6YCedRG6xWl830Ub;%gJp{9W%(DR_t=H8 zrRKD#7w2D!5!;GE51aD9phpIy^z&S(=G*(961n|U;oEzp%7B?ji{bDshxSY&jBMk^ zlY3yMb=WBvGi~NuQpr=U=uWnw4(}eQh zrkoWJr@2_cuh4j;M;QNHksjftN)l%yJ%~?Bqz50{B0bN6#Vt~#M--K--*W3O*wb@S zxe7ub@t*T++X{8;G2!hiAsxb{2Zr`c9X%22d@`(1?vJMtE+Oy_Qz# zxQ>L!D9H0NiJTlko|izU&>+u(e*$}uhfiP$^57el1^Nl{yu}#HZ6Q_FJ-8sx8wriZ zto9%eLx@|$3Vz2R&x>rsW&;!z4DzJ15x)?zkqz?X4xN4RF~;g=!HESkt zDR($GZlg=u(hyrcoU+y87lS@A7g6{Q@kH!2%JtF`h{8N2coEV)7g3nApsOPagReA$ z)?XB6uQ8mT{dp8-4}s@ys+zxCQJ8%&utWw$VI(FpQJ4%O98nlcyBtv%vv+_nkHq6$ z@PnF!@0yTl19wfwQ`3P(VeW+CR7P@>6T#&&_IubVmyDewDr&Ljl%g>$wWtQK1T~G1 zP}#k7mC8Nor8k(C`*Wd%Z? z440~3;^#xR(8vgbN!KtRgZ_chkiQFP%E^rQ%0*_sV&TycVT5xhv87fRcvTXi50Jd(FPV*vDUq$ibMoe7&&S8yMg04 zB&f1mjfT)kD=2hPLlQ=fi=4Pfhhx>i%CWYgl;DZ|Juu}T89dQPfaDFvP=>H6QlSJ$ zaDLjru2&bUK(0UU3NhZKpTUzfc;>5g9x{0E>uUwJ5RZx8luE{gCi$Uk7GQLbc{Kz!#X!HbX^4iVq^A#`=bckq>Fo%@ULEIUmf&M&>U zt$@~We*=N%ZmQbyT=AV10F6Wj#djnoGVz@ZA{_A@OS>HL9kX|UB#*@3?}8sCzJp8~ zxDWh1H62)d=fYf+=Q4IacFHAVS3pICrN~C=mqM#LJJqOFr}@ZxTk$sN78*9nf}kt0--WTd(U-Hrd_Ysq3W(EOtl-yO zJcK0de6A3ZaDOFN4r2}2T3Fci zeCPQmu=59>z``H+#=#%y)i1_Y2~O5n?s432jMO)GLsSn*fGRIb*!bvYl z-E1}!`aSzX*X+0X(P&@MEG<5afnMyNz|KH?0t*A-8y5rRyWjDCV=zW}<)R35U>GC6>2(ZG>EXKea9&N#EcFEY}B>i`C zQVsJ?PO3@;Z_`m@+N0j7($H1^e1wW|e`9++&scBbET>=+zz8)Y|8P83ANkPHR z_tPR_$CUlt5WZ4Jt$5iv-HlmyUw>^3<^~Zdz?u221f096%FJ;G8V3e;|C9 zFl$~14r+Br=!HZoIaEJ@^{HI$<~GSNLUz7GsIkfpzEVf^%Z|8*lc&POpE{twF@|&l zsz}hU2}F0(o+aqFFt9`jNsz=wMuIZPa7d7)-6_Ze$Ra*=ka$XhnxlJb;4(-O9_oV2 zj3oF+7C8H62(^dH0yk&TfW6ByivGV(iq-H`K1++_5`7c4nLz zU{^S(nnMV9zD_BxlQ(AycrMopIhkj%Q!X;+ z4ieoJ3|FuEEU}#s_&p+spVv8=Ulh=klNs@qi_CsC!qdBAtC%ajDD>>);ua~rdwruG6>D%yORXqkVQ_s*f7#tVxwE@gAo@t|&S=S9>*&7RE||t$ z1qfs3zCClRbt<7#9dD)bB+u#dKx@^>)EIuK!`cu(=9cm)v% zdyA6Q{h>r!j;!wYpi^j8_ka5*uqR#k1eT-=zEN4DpRDfs?fO`5HdB@V;Ig`FVg8H- zx943LLfraV$N^?`zs0CCn5^zjKaT9so=FP}OUhm3pTN!^d;$x9;2Q^jq;Uiz++fe@ z-e`=}H+SUA>RwAYG$!?-yGQ0&Yv`CXk-Gxk2(?ZB)|K=jKYr|>HfdF1oN=dr0y}5$ z2`rp}Z(N*_FJ1e9F_J+f#Rm`68~M_;uOS>7llst|hcmjj#dK|IYU77cA!pOI-V;BL zx=e2$o%udGXcBnm4$k?0*hU(KAB>!@4UH)Q;s*h>1IziI+}#~qfGsxN{laKUiK0(& zdmEDSjkG*0ct7LhR2S+|s~wfuC!*9Fdb=cnkC-`N&_`<8cW2J&(rjUpyDRYgKN&37 zM{4-z#!!YVD-44{4}L=o&YwRu?1y?SrG^2~LeH}=bLq0S;>o(=%m=NW0G1w?!RBith7e>HS>VKWBk|rY_)$Xmd#LH-A^ZEs0IAA&Zt_bC3U+>g7HQ33;VX4i ze+DbvwOO;j?=l8+gNPL1%=~r&&fQdH=JO;B#Rixy%T`1JElq?5m zBtl3^BsMZql0k+;N-XUrM20tz{;5#p?TNbsgJ?lA@Vzb=&d7j&RG#;}EMQcgF+w*h zFk`fnnhq@QyC)Y%aS99q`%60kJc7~28zHniz@}yf9%y5oa9LBoS z#l_#lb!KDTxvNfoDe+}Zx+>;C)l`E^JpK&k_ZcB0Ol`wJs$=5Mz-R*tQ;&FWUm{KH}&Bpg(@kDXPP1HC_&iW`h_+a6y+=67r-=L*R#ta;=Ly47;F{PiB#I zxWj-b2y_@ur>5P#`kapA&AC>{DR&cg%0;={igzv;E>-d7iDz2N{c42e0I?s5s{u_p znGs*P$eikI)7~NTaKBK>%`bctKKI_{5(L-} zw+hu8{}%s=##`?gPakIm3?DPVR!!GRt=2-kYYja48!KGz$FWD5F;9mdi@yTTlPAy3 zPq(M)o zYDaHJ%XB00M*!o&*0Zt+^y`OY4?;iz5bzwaUN9_hO0eQ`{E{_b1e$nx7#t<6L619gHI0Ri@1=tM|7TN+5idn>4VKdwcVu8PVkUz&pFjjcF)u!LJd5VGCNs z#EnFHc28*3q}v>O#$YG8L?5m&M$&|CR}eJY7m}w0HOzqRz%3Kf%I!Ksj8$GN9wd+G z5Rb{D0rN%tbj_~9Gwanx{btY2+B*vM&g|U$M7>;UHcRt6XoGf3;iAHRD2muokT==& zKh#{a+GrNxdy?t*e)}DC`@;QSh>oKFp{R^i?vj{U&1ffFBJrn`Zt~iGDW$L5=0@zY z?gZxlne4U1m>&#A<#iGRr-$*Pz))y&9fQlqLp7ej;A=Gu#>;R3+Vj3yLcUSwY5}47 zSchbDZb&d3kkV3tpY869{5wp6k>;-A`?MiQ&o6 z2}I;elDx}yiRs{9`UFq$PhhX;wY^>$^{{h?PAI}|0v>NYP+ zZ%av*T_gd$$N==KUO?j$VHj;EkI{oo@DMbPUs(eTr>QWkM1NR-!T!)m`(r;OXPb~D zTUwnt+))=>v+zmw+d7RlY~}7j08do`H1Mggi14WJAk9fIJD9fgAkE%^dG566F~wjF z$)N>4lqWh;R!-<<&#*dn<~RyEg_`MO{1ez2l}}*dK78|-n&~kE00UtP^?NtdPFr$n z2Jvnie1RWOJL35Sec9l>{)zKrsDB%r!JF3xKhM8_oR~ALqAq^1f2#brGG+_1JNdBl zLO;kkv17BrFZa)oA1OI(a0VA18~n$9IDMEfY=&3OI<#O88~h$Gpk5p7*TlJP@PmFx zda%I^Km(r&i+FADjf)WS%2?wqmPv$Nw!YI<#J9aDtJqoR8_+4#LjTM^ft`){1Qy=J zH;<`>UbRyP;8C^E%V2UH@oo!!oF7m-;`s!9S?JUK6D!ga=)?4Hp)+{%TIlor3&@E% z!)EH@cZGkd{J1h^3$oDpu=89$$T_iNv(Od)4Ed3g!$N0p;jz#!@WbiDgke#1Anh6dGbDi=m1KcY(8?o~ z)$uo>C?P%uH}CvBGs}li>C#Vlo(YirEodg9)+{YN7Hfq;S6*6bMXg;07FOLgX%EDf zrXaxzhe*=2>u&x;q)^%E+A)X;t>Gi40hja(?c8Axz1#OvYE zj%xSfZ$sB)4ZLp8&qWIfFX6Bq<2qbw))(%HkAV^5Pe8AD3;qkaCq5QO?Hw`5eLt;? zF0p(jNdYpNSqNhifz=_#zl5gzgN~oXe?lE2$c`o_4*;XrqFE}R!&*uq5v{^()UGt3 z431&T-j#{l!b6$39Hwtsj20o?MbIoY3)QpC44*Cjetx+oD z#RAo4G~KSv7pCS5ofg(Qz!&67dzz(L8C+b-AWG*Y{x?MMNc^uH&!VD8mmxcymLiua z{4x%rWa`>;EYF^%JWGbJDpDd#3cPC1bi{t3 z7dYO#Scv^^A&8B~SEic4%o~59m-TSG!Zvri;i2OjO%FRxR9o7ONzbdBF_IKX!ux>d zW6qiG4MknFQt8Z2%8bOPbRiw?DENmL3e>dg)f+F7$=JoQ+v)I!t8nb74o(g^xasGM z*~NQfx;a-e!rW>oPb9|48+ybbvfIQ-T`ElYZwNUv_`!^F|}A|J=i~5U)alnLeQ$2YmQg#nU2_3_5#Pt7Yng}5Q12* z34dcR>*08{m~ecf>0yTnx3s&&XTn45k|b2p_fTN)O$dVw{;$bG`K?1fgFkP{_YT1H z^RuLI8oh>BsduK^ohF?BsLm9s?Lu?}_W0H>&R8?dTxhKCBu&Wne=(TZqT=uveFE3rRNcPk+710P3@njDwx3}p-1Z-Jj*c!jkcuzE z(eKBsX66HI|K?sG*#Mmu#j8372JVVkzwICEWkDgRRSkVt+kbv9P&{?9(0W1tXuZCd z1%;qhv-90;|5Pt<6c-DzS5?S5^-=3;rK*rM~aEjm0Z z!dKZB65V9O-<^wTcsApm*l9Fg3&26f4%QN1p`A5| z-$2?8(+un_-i84oL`b_8(nJQquBAERkK>Fif!z1#5&>+~k@%CjaKO`*eDUjmNFRm% zJ{yJ%#YvBt3nIP5E>3`4fT9S9?wZRQDvHm%2o_MD$fXnQzng2_oc7_ zIa7eZea}e&lCA7s0SldfiK8<*=Nd^aET$1g;$P)jn@-d9fbw5J|3I1|M)J`VCrD}P zS14G zEK3)fymskaPGCSxN1i<=`}gbU(t3|^+>ip?1@}S0;r-UcbfXzf(4#bA>%MYry^cU8 zF#1C&5hUtQK9^|_!9MO?f~dH{^VO%zUQ3-8>7noK!RTfBF+FsZv!{BfYP~wC(7XCW zogTX-X03M@*eePzf=+t(VW5b47j(xmvp(Y&4gXQw~vmg z$e7v9x#}j|bM)Cew^nhBRa(laU0LaeC!R}03j-J*+1y%QNF1I7Jl{5~QnV)8VvS=e zo$+~yqygL)_{u>e+fuvh!|J_Z%a4y=4ePaIAjNZBfYJJ`@?-^iSm>FIc$B)lF_2M$ zYTr)b$h1~~YVK`v#8KGB?QB6+_u}F>QKxCvyG`PiH;raFg1g8Y1t?{p${ukbrrr@?SaA?oqY1v0^W(TydiZc8{GlKjh1@$`h>TMmk`?yR|pE6YLS7+vF?CDOk34aRt67u#~Of5Ms zz6NnL67S=v>Mq(C+T+2a<=BZC+bboigG`s8445t{G%44hwRD-TDVWG+x@PdX%XBe7 z`!QYnm_aEbTl8(~VkZwtf-bAj2+mS1ram zrGsE$?V02)vKhb28KXO6iH#nHVUEaN$!nI7HP)6+<~TJP$7GSm(36H+Tus!t$_8y1 zfnejQj^g_yvaANfzD0i(bOOB?dT-I6dgt(-$mBESyPfE5{`q=1cgeuem5l0G3--g9 z#LEdeZcQfIVoV}s)%acn8rdS9C2qm90UE#)3naOkT;UcciKm%jO49L|AU0 z{+Sgny6@O>`}9A;S=VHT{q||L1@YWJ&HI`6PqTh90TFZqbpf_xo*Sq)T|;+Y%hZ(6 zCzkI73gZ{U&|hJHS}1|8^tIYWmi2ru7+MnPV`*`ZP>;XtfbtV zDJd4K^=i9V47>B0U+SFl;#j=(cYs+oahS!|5S07K`Ky#l-b=>;vFYH+sGSGrO4GNN z4n_-7^@xTB(?K#uG&}>Y)>G~|U%{wPv|R4n5G1QxjZSkK&V%ki4YVxT$Q@nCxY6_d z$$IgmR)tIH_9ts02+)Qjd##1!XgFky7qGV=6-3{OC@&9i&L;hd<)a9!aK<4 z7m{OU8jW@xuCP;H?pu~@Xu)Y$xFxc91U_sxy8ur%;uYU>;1bQ!AzT=8gguG)vD_k_ zGbqw&YXBK$8n;Mns zP1x|^fSc$EV7J~v@~4mHT2ZImC?1(bmf9R0nQOEnPzq^J;u5&0;83+yWh}a>Sgy88 zQ#D)&hjNV&h{}#+JuIdLB2a3>edjRf2HuQ5r-e7QPz!LJygt!r9^6@u4()`Nt(^8`I#Ebea>zH0?$M#Jn1{XK0#Ad$tBs47E#BAVcMLWntgiWE41ZwkU;Df?sTb zqKX#oNjA6Up?>B_u~I!)sloq&dso&P$oT8&UdkfBnDTD8uQI)-vRG?Omui3nKah7`wU z`15uA zIb{?4jNwlMf7mZm+|KlTj1yK@rRfdzZOHEhVd>Nza0~_?8Ch+Tl8&(GQ166kO-+wA z9?I53+K5A9R_b(&HaCp@bjh{9rVQ(l64Tdtbt*MHGr?b<}&{L zKCn@DE!+UU3fyr6-Va#H7Py#fLh0^lkJrh^WR}-e>(jMP8N95+1P$ad7Co?ZO zr!*xsEi)&zcuMRPjf}vI;MC2lnfw@8OERQ0iYEVK*5l33kjY@qkj>D^kn`r7Y{}wN z&sUn1!L8Xir531zHG?gKJ$6cl0F2)w3AHCFu{bk1CO$VYGfyEmKczG$bqZLe7^(^e z6cw#gpvIyqLNSJQ3eaucAh(5gAh}JjG$}Dd9^@v)*eN{{1(nGqNqM?pSLlKqp$m0H zVumu%y{ZT`dSErk&X_F6CKm@Z505W}p}s6mEh#NP^B-0@xX&_{1D(GV8JQWa8BH1UGv;LM$k>|kIO9QS z4`*ItZfZ$o0WiUUg8H>zMvh-bt6#=^zlNCwSx-Lnc4x31!^9*_Jnw5dhN#1PcHF delta 279 zcmaE?I8Bzdfpuy(-$vFtCJnzH-hfKy5GOx92sNc`N@5RBW?phmX-aBZW=?AHl-Ma5 zfr*D^kn`r9?9bxE$UC{8QEu`LHe=RqpsG%= zsx~B50+YSjOIW7^<=Q46VNYaSHd&3si&0>6AxAC~Q^uXmkGVE8J8#R_oRO80p3$7q zkg+afb!iW0USe))No4`h9ko+5GPe0;Wcg(@`(>>2E6q>@iEPf`0jk#ps?W_>oza%D zZ1Q_PRpn)g8OlI+s{*k)5NpOx>0!+*&dpDm(oveBoh8r6z%cm)yFUxaHJiKmBN+i| Cuww`S diff --git a/docs-out/_build/doctrees/PyCTBN.tests.structure_graph.doctree b/docs-out/_build/doctrees/PyCTBN.tests.structure_graph.doctree index 07fd39e249acfa54b4a3f302d20ddcfe9dadc65d..68a2feebf780729214588e31c9491db1abbc96d7 100644 GIT binary patch literal 112918 zcmdsg36x|-l{VdUS9SHu(v%2AlOi_N&{f?)qu788-P$5Usn8;_{K>1#SCtu^m6>F| z?5+a+m7_AYKIgb3u19efw8dW?Twru?8OCvrXU1_sf1P1;926ZLXZTSZ$2tGKvA%d2 z?`6Ctp;FG_b!EI45%=D>@!cCYwpXsc^=U_~I12ysH?^CUYJG9qDVOVwvfJ+ZYs!sM zXThy|-M4hN-Q0b7chVngIfvSfPOId0{iEQEQl(lex7>R7x~{(wKliG&_B78w+ICA` zwNaPZE2}FbmC@_Ela(=lwO93OZs3*wlou}T*?;lOwCA?H_H^58bxK~Rv&$PI@V!UR`$<*k5bPou>LR3#_%= zIsB&Mk9y8LzUo#sRVFIyE2mVBu59ry*->dMxI0>%dfjd9IMiqz*ulgl{s98pQ;m+t ze}|>Wq%qxU13#x;y0SA{S;v}Gv`OU{@!MZ}MQ3)QQSQ`$Rx0grElEnUaxM^fHY0GR zaw>|UQUEQfoCYm)I{d#C{-1>Z&jh|I+bKWO?DNVLP_a6g!C%`}wK^huC^b;nS|uD& zSeT{B08i7g%0;DhZLw5cC@{ta-x1lka?xx@1+z)n_z^j|mKiFXs60QJDE9?Kxds~a zD1UXeUUnA)eTsFr$VTx;LBCs7s*;obs-{zIb^R$OfeQ*|iE%~3PKu0o{q5}gDZ9@r zBQsvtL2Y;`G$3cee`i1K=DJRyVTXhUM#~OC%XD*TH+BPHsXkw5%-L};y&qWF)2NrL zh*eJQlDg;C+f{GrG6xD;#O|^Jqyd0#qSL2fp!l#j`rO;Chutc?KZvqB8)`@ar?S z(GG_NZ=wY|^?Ji|LdL@%VL}p}Q~Z>j4w`17@~3va$RAr=sO@fpRe{!7(`>nIw{_5^ zIQ1GR zqecTb7^577$=?#MNP_HspXua&G#R*iG@MZ@I*!b1 zmk&F}23jffxMEmNYgK(hCcz|~|NEl(_gB=rPS|LF6$EfERkLFy0ga~Ha=b<>Nc@V6 zMBVV0UgiC9RW^F7{0^^j%pa-NsfQI1?wG_3QC}cMulHv$^@23#oKDRv9&~CQSEs>0 zzTIgy8!fNcUT|984V{JuCh{<9?}LmqH`1gEHUA=fcz4jh5gv_jh{T7VgAX~_@cs}e zd{H_=BAY+L9h4|Hw#PoNrl8rajQDHjI<*>Ap2`tq<`tDKSmmWFfP|N!tO96KYM>bm zsIuyY>embElY}Tr!s@FYCKRD#H>hR|ncurie$U4jngfp3TD@SP2 zp3|Cly>6t8K%dAKWNFJXH<_sIRJl5{fsWQYS|P_%Zpc3ThxQS24F1WwNh)u!a?roN z?Rqb6?!h79l6x7yccuWE7;5tKq92_l2y5R9n}DtjCIukPVn;n{_9pV>s|_ zhNpv2n{*vAORWpp1b^y^LpBGJ{7awLXdK{(UzlsO3ecrIjCpjL+#1YP7jal#n04W` zTfnd(zDIwojX?&l;<7KN1yto)rc`foH*z&WKF68s4|b@J-1J_HnV9Lli|3D1Pt3WI zRVQRw*`feIsV2JOwDV|#9e+f)Pk#r6_@mI9nEN!sKpo@Z5c8mEYr=+NLs z>a9*N1G$AT;?eS?^%WMdwTh+2LKA|@=m@~y?%W)BZ{V2c=RQcsVKx`XA(rS!UxG)R zVvO`N`t<+UdO6@vR+Je!B{qZT6@9*vdQL|MzvN2VU&)089P*c#FfRw zDhZI^qcE^6)mzC=AT38ja$y!l61IgCN`d=9-hiE118_(B7y+~r1przZ_&1{!`4-el zPFe|%Z^K^@7NAkpF8MB|Z^88Y;V%O+@vfE@m0n5}p$dch+y*cbfoAeUAS5sY+MH>l zBuof=B%qLGOiD(ot@en$k z1!*~=!=!D)OC(@KQ6!k+4U-xPL;-*V243Tkz=5hwNZ?}nAd#TuHe1UY36Q`+BLNda z1QIX;*hrTl0Zq}7;3lp*$$W=HGS~7)0w#tmNT9eShmr9R60{)gu|@*Q6qs_1rE{Vv z5_r5}QX_#VKo+a{L~%%PJ5+5#f+Lt7iv-H&!t#UGM>#8OqJT{tSd;V_NfHl5GcVQQ!qs0ix;}C;6UV~(bT}IqR=#n zSoYzFc@}Kb@DdYTWD#056I^0)f!TY}SA5i64;SyuyReK0r_e;jd41K*xR2dRc z{D@*KNtqz`LCe_rB`7CYr$oLYbI{c|$D|(j&iQ;M!e#+VSQ1_T>DH@Jdh+UVZpD!Q z(d|e2nO3X7{KVy^LK7`c36lvk68p>@BiIGQx#*lnFLT;V zgleJw(F5wwhs%pyiJ~I=Vwnl=qT;9QZFKDaJE{M+fohEAKO%DtnUY~#>m4FQ>7SdT zfyLM;RbE~8YmT->D=~_KMJNH;lTj>ydM0WVx7pMa1kvV~I#uI|slsTG(ue?6YU(0p zX~|#8=7|1ivhr8*tKbq5uG+yQotf?N%zRUeq@qoLWg}z~GJ&3aS5_IlMuhB+ui(c$ z6~H19QNd4T1%ag?oTWgD&e8MYD|}e1Fn&b{r$hNG!ub%+git$J6hcm?Lg_!y$GIny zGN@X}uK_(G9Nu%1_sA}rZW*D|E#yQbll!%-dr-gjKRI9-{n|-=mLlf`Aq$}f)27#a zt0f@hDG(A9%0d>gz$7a_ZVXYNH{vAOiGeuFbsq;&zA@{i<+=}Y5tbTU-SKM3nq+kc z*#jkzD&!)2@h@yz@*FHRYQYOMyjaXJY`zcl8dQ{E06E+nkvl%a^j7$k&oB}EGuz@0 zSPKXfHr%zRGd7m9G*;e^TH$eZ^3HAar`QS;jowh8LLT~&(2teT+At(GuCrx`+ZG!eU?@L8Et$n9aI809BhJ zEdPS(JrNe#hj>UM^<40r-a}~6!!GKY5L>Pp47RYVS#&IE2{>qB0@OnV24nFiN&2w}&r}5nen%pB(z?8KaIqzeVQ30&EZwLd6h4& z=EIGM{N^ZcFuz15KcWZ=5+=xAXsu+?-Dk@jG`f2th$r3pfjR%FOcY6?yC{LKe_rCq zF3qRg9L0$Lp8Q}LE6NbjrP+h75Fi`=SK z=pVV=8s;O!cR(^Pa+kKj^83BW-Dim&?-5T*I)sm z2<2OHY)oIUbPqLqdTKQ zu?fN@#*(IE2o1$zg;+#Si;Klx5H^i*^-R(c@b*Fz_d>VDNepTx^yF9?SyzqyMz_8@ zv85r+8 zAanWO9vXv_NQpvW{U>l!6mHY}jM5jSND~;PyCIXUQTh!1Hei%SIWu9aq^HAKB;q?= zbH1B~;D5+OFz-k`1Z(L)u=uSL{Hrts|2#3l${fZSQq_aVT}W5RkiG}f24qN|n-9uK z6U)e_CicBt!l_NHC;&{XK`L=3c4EYAVhfl)7!&)yL+ITuIW?z+Snn=ACI+^hvw^i? zAcJ|mxu4?M)Zc4d={clrW@5qC@}D(l)~&VGZ}aHw+!ReH%x|i^IwCz4lr#Bg?;M%S z|A*l+zBUcqGYY(*$Mo8_cz)*jGAZ-~=J^uHWNV(EL%+?>JiBQKcCrw>LG(T9?S_rC z>Fu~5O4Yl^%hRy1l!b+jf&~U2VIGXH$Ng}!&c&^1xOh_*F4hY!5cI-47+#LU;c>iA z(HuJcA5TO79f|3;bDI?Qk-bP)$ZeW}v;nzId-Jef(rIGEQ>SSMmv3sPNfZE1lR+kN zPSX#dYExX|0Zbo^({xk7;~g3nJ(u$>82orfHabcIalzd_#`kO_Tu zW<-R~(mv!SBbv|0~JJFa0S;OVKGRaoK-CFo%FY6OMEQ_!!Jx%}@9qe-@D^d8%MQTosX zXaQ}x$$(i5PF*V-6HJYm(0-Q`euCh{+aQyz1%C_uHbAPJ69^kbF;^fAqWG=r*r(GF z{D~|ChXM^DvQ2OM1SkGB4GVvrg@tgKA;g36b-&=mzog;ffn2zNP=n|Mf#n;Li{R@3 z7d%;4r{AaH;$Q3aE9L0utP zHu@TYTkXWUF`7rFoMYwM_*isnb_g#o)k{>T3pP@caI8Lf{l}k zu9P#*#{C&oWC|v{8Pg+d9AShacBb2Mc+h7@7Q?-!MYlZfCOnhFxNKW30Jk`@SnNPG zmc;h3OWGnW9Ydlx^YNsfp6lUpB(i8}LKG@))V~np>~OMFIJ%eXcCIb`wJnH_AC$TL zk1unZ9TrL!AXjXY&!7ZCp7L#wHXtBBwU0UoFz0kplzbm=BqK`NtREHy05llbje~~o zK-DH__&%mbKm+d+*4s|LIKkU z0}JyM{~wFZW7lRKA;(dg0Wx-&O-H0idH`f1o-hU{@gM2n@>FQ<_Jj%c*p=&m&9pV0ul_vqo<~85HXBOn_Y*#m-9Z5 z%&%IKx%}@85A-Eyu56&F#6w<>k_v&M2WbNW#eF%ctAtBNKZVPKywOv`r6>U4(jb;N zxcn$oZGy`?F?}#_`HFDww3+nD6)e5H!P16<3{cr$_iP9-0OhVUO(9@1U1l95zsfZ~ z8A#qMbNSyIGLW=ssB93aghT!Tn;cLu2(Z-PE3W_%l1{7`h$bgQQS*oB783y-p zclyQ=c$uXL9XK!N{UVtwIU{rV-ycfgv}w9*4y6(ixgMnzLeNVfZ9oWmX^!eE$K8wv z3Z<9w#!n5Uq5yzWgJ|NQ^c7IG2})mu>4Sk%wwhwjfwcwpw?N0PfyjF`g`_P5|QCRq47rVj=duA@eL-u37yYjhWGuAbB7xp+<* zeHq~4DQ1(R6>oqDahp**QA`g%Dia z4`~B}izi#Chx8;EZ4@%T&l@W>WQYO)G7K!oLB@u4X2>`e(+2|?EeRQoR@rU2<>KrT z1&$&td@nZUiu}lqTybPRHynv4Is>@uj@F*|It_?(hNX-J3|W7#W78R+CCL|PJXz-Q z?;93uif@5zfTiR?&O_0J0BZ}R4G6H#Ppfhg#Tda9#R|MxQ=^zD08q>zhd3154^^8S zpQ|u^Fev889wts0LKG|K3R+j@23i`888Aw_?UAl*j}ik#mdT1*UOI06QXo*&YaMXv zT*s0*Lqz8C?-~}s3AI?3@snboybL7~!WS3P281u#O^-3^BH@J5N8x0iH(F{q5d{F8 z7}$=3lXpSYCOEkb(+3SFZ4aTPSnn*%x~*jjCmM}|ffKC?gNLK=Li@58PW0D0oZQ8A zEE$}9Qsx>SIMJm*At3FXm|~xN1tk%JlOvG!*u#m=p9sq^`Y4>-$r~*-oQMJdP7G|v z!O4%IY7?A1i0OlYll|1#<{qfMBo~JS$;tp46Z>I<+l=cSYP1gQQ$~d`+v9eONl6H3 z2&Cv}@ZVfTlA*z)GM9h*FgO=X`dR!5#W7jCz83%<27wF+08WZ-dg($il4zfQgf~s< zJ}(M@K5yVOuFr1+!I=8|6sE`ad3{f9@M0W5HL)32T>S-v$vg7&j8Rv)K1~v)UFCX# zkuG{;qv0yoBHY#FpJ#uSEB4afYg~B&)7V4%T;qxbSY6?Yca&zm!nN%zG;8j)5Qp+) zrF=(s#Qm%K6|OA*QCfb9GQ-n|^_-V#9xDc90F!lj8o?U~a^tE2z4>5R?VNK$osaE#ZScU8$>z zOLTQ>fGW7T^}_y!I*?&H%!YPttCD^H-RP(5CFOZ(>y1*AZI9=`b4(7(T+3W>aFNF8)tCBEzEfzpM3l;X+sB46vG@Ptc z^0vg3;Kn~ACF&@a$Lp%rkH<4(K85xU$OIbkU8xZ(E)t@HzjSHc6JLS(s#ab>s;gT6 zCceT%SG6)abl)ZD^oY|W@b*plTsEKv5A+>Qo}^)Ng8i2U5sy zYGu8FI-+eZFryBo)C%7utOuBP=&_TPSBeCmE>%#jW*{$woTr{qm}%5q zYH%hi8P1;Dg^H8t#9j2+cFJ7CC2r;P1P__xSQ$*x&G#P3uC3dJ&W;iixtMm(47(gm zWf33xzEqc0QXe$?!St#!?z8tgUqx%aG@QN-fqN8y+gob7UGhGGP6&&*FeMPM$uV!)q(3!QRInqh!A11j-r=CVYZL2lRg>FwqHgn#SWzwPj zF0Q-%bzcn0&}4m5=JNk~8M{%*gqdX`MG1s_1!aR}sXk4PK-yp|%>^0sPuL<(GMilG zEo%gNn-c`@l&WEpL>#*P7;>7>?LkbBKsVk&)1Dw$jna^VPOIw7)@%Xf`r%e7lgW&=x=Twuw9 z9efMjlaR(JrjT|aZ`ah2CJKPjqd^dHkk*8%O_1hc`d}dK+F)19AG=fK)jxVp{8kKAWcZFU~s9{teh} zXt|6&Xz%uG3wu;}$>Q+l=wdW8AQUq|W(FLI@|=TRAW)M5Qcg9gRv?Q&m%iWWK=Vzm zh{=HF8#0%F_mBaNCbBHfi;@9(0L2l)oUcLJU@#{%$=X+I1^h57Dg1n$w_j@b5d{GJ z7?_WPpZ|fXP4KgF)4<@T80b219UXB?UZYjbGYqspFP|kyUIw_C)bTN>BEcFAF!O{6 zSqXTFe6PdGiO`zK$48rGF8@=*0V_diW^-W_?_?{AAp|FzAZ;*kveiyk^JR1I~vMgd2V*#Fl^UR3u5}ub!-kJk;f{gtWnQ`4dfDp7JAn1x63;B~D~nhAK)1R=x%@8-gM$+( z?reh{B?j_)lt>7WegbKO0i?4N>y;e$FhVINJ;+-zH71Dy0Fw;-$6?Y*$Cxo`3#P|n zl3KZh<%btQ@@0%-CkzlKcZ=y6qc$#2O2V{_%iE1~(LIZXjmxvRQg~PYjmvCkHHCBO zz5AAVej4$|uPA&@^^28Z^teTlqYhgYH(IOufrw&Oete4!7E^EO_tw=h*L6mYMXO z%8CX5)*Jv>)RJbOvdl{{$@N|^w+FNXfHl)5WqN1E6{56cdz1x5utWLjW|a%iRr)vIYv4j|1HVyiD$;VCHb9@$#zTf zk@yPCTatMNskS8F9baLhEy;`y-75*YGh$6UZb^PC6-x9D4)HB+Nj52is)fu#Q4vn* zSqXZbz9IQ_NFU#j%z6TKFw0zAMhA1S8fOU+4{%L>0J+$PWNcdN4av*c7lEFEIuYFZU>ZR1y~t~hML4HQ{6olv{$*+} z@t}X513}n|+rl_3tP_F7jYW1TuH{l$;n3(Fikg10IKE!G?Rpv0QIv(;A0Y(MohmV# ze)ni*FS3ToChXB#m~C$_EI920+Y9U{(&9m<)^WGd4j4Sw^~7jGS*MKtK)0}`W6LI9 z@>-C&{5zMWza1&&o(RXuF>>c(|4V^-{wV*L`B;Aykv^`z(}jJ36r0hlGJ60|gG_N? zCyX5$#&hYn6-DqWRHiVsfkfCuOux|Sydn*qFUUgY`k=ap={39@_w_`b{sU>~pHED` zawEdfDcS@b5Y<=6IY?J1Dt0oY<>r78YM$u6X0`x8jJl%xgYZ)rZ4}~9;o>v;DK;C+ zL;(sgIJwIfOdTW`iH_9%YsSXy186U7nG>IMdipkVY_1dK44T5A{dE7U? z(>v{_xz-7rsym3Lp#YBcJ|T1YcPvv&)GOm2BXowP(5W~l1Nc75Gln5kPX~h}zSCv? zbt%0B2I)S?WNVPVOur2fyhdnMnBvfjaX4Cn>tE<(qaUZC`Jb}Tye^>sVX}MQjr&@f zF7W?KL;P>D5TDUyIqtYv|IqBRY=lh7G{nx7s?JWngn|s2(vL#gAWSK}pH2o}r%f;? ztSBRkTG1oCsZ(1~Q24UMNmrJSO>~>D})8=F;^I%Xl5|Wc) z^mbK*!K7R&)OK2K-D|_f7dT%-TqB^_O@6gNjQQN4Ns!^pxF1T@(d6p*&bbvP1SjGD zGvWVRD{n;|MU#1@%;kSznVU@3cr=cz;S zA^5Ju1lt*31skM-bcKxXiy&C-p5tSZ0eab@*9ve5@-SVXgnb^%;)A{Ot0y))o>AS@4Z|D=>+wpr!G( z3bqrA(_oW8$tuXL6}m1^sL&WKO*Q8=tT|trs5xJPUvD9o;yP>+m0Ik?Gp88uH%)`2kETf%;7vu`4xi zpcm;fD^}mlSbbL_R{7Ea-VsKC)wfett+azlC5d*REKxhKE&8o$_!GvDfGnwE+DVY% zIXzTJzMfhbLC9#Z-*H2PuR_hHA;Q-%eK13W7sFbI7dQ9RoOZ@(tFfqcr(SK$%8%1@e@kVB@MvzQy+6Qp-hSE)*TDWj<{BD7tA(V&Q{DR>^!_W! zsWCzqG3rwCA-}`|LIaqUd|y)JWVnd8qPK4my(ZH|`9Ayi)!gPfu02h`L49@l8&5KQ+YFMVF4aexPL z3J?=20N)<^L!BnS#bd6zh=)`bW?gvg7FwNp9p8I!5>p$;SkzrY+aZTnxt6JXjI&Xn zC&&(KwN_&%azE{&R5;st{y2>cSaKmtu;j9zD{YLkyxtIiXn&c;AmL zgQu25)Gx=CDi(Llg6goHPN9`5A%Y?;I)mT1m6E6G_A*qkVJqmS&?mxO?@5?hj#&O#0TA3@C3n8R5QylUs^TrCSXO&4JtEJc_b>uu0qk0LX4Fac6iDwDAZsirw zSs6*R$G?=fixCbZ4RinlL;gb?ICkTwVeVW*@?PcMc$0Va$(3MTL6t(6)~L;(OM2Bza2 zif=>JCNTLPrVj>8W~gxJQkHF2cfy(by_zN5lRhRONyz{e>@Fw0=^1w{%2!ci$gx0u zY{x_(Mep~&;yRJ6-~U|Z@^4$l{oc63CXu6{7$yIWJcqjZze3s|y7?3K<6*JAZ7s%g zoEX}xf6Ch;b*~l$K(99N7}u*$KEd3pPsQ}uUab#9g6p3HzKhsW2!zQkw|d4X-({O5 zOgq_O%19U8?rk{P;R*~5oMUmag8+`+a~*i@*mE63ZgIwfBbK!xg0HPiRMxWyyga`k z^QjKvoM2I7qEj8hnI)W9p6U?J4_?I6p;@eF8R)4FPn9{SRCcD`ub1pp2SIzHQypX` zePe@SA(xH%qLwtLI>@{fb;PfHPIVBaB|FtYaD3yaOv<2YAtfj(gVQOsnXJd#X-5d| zs3fmP`gr__^#tl%x?EgF=Q6Y+YU{;tQ+s=N!REY$Ntn1F<=?93g^z$B+S{4zv=-g?PSb$AHMiVNGvoa*pf$eR3AhaW;NcB%t5?PGeXgV3;?eG#q` z{nkJ5r5R)62px&;m)^k~;-sR8Ne37-1ARU&Y(V2%I)^@1g)e3j@D# zXz^L7+JqMOV0r{v@J^C;?)`Gs;5T$|$H9{2bi35M{WxDCekp{o+2by9>A^eROq`qy z$iUWI$Vx(7_8`Ir?E`@Xp;R3KzRC3@83KGm=E`NGx@0hK1duI|rROVV$pgrDsONtT z(gxA<+4fo~8og;nk7oqY9{+XTCaHV8C;)oAfzP-e|36T*smHH;!oYg`i>W;3;W}@+ zHN9HSsnb6{qgxQ5C_}$5><>Z`gOfnXa`dQ1M#qHZA$ouB3mpJXgf>bxibNM+v&`jx zcp19@0hwi6bEo(vTaon;25f?~L14g^cs&r~IZhLWfn#~gq=o@e0KkBO)i@Y<4peP| zflDxbFoypnA+@iU7jpuFKgkUUfTj#kz_zOBWfda%=~ic_#@z(kU#u3?$sVUcuo@k_BnNyjk(U7~rZiHO*I=r~ z;6j`dD>eZjeZJDMhylL6~b~SJBS;%E|S3VGhuu(Uk#H*kQ#I z45Rq&aY4q-UkVh7dac99FS$}BgO7(~F8|0fhmTMzWpPIo*W~vofDmr{1kwh98>dI$ zhR&IANf>1mFdpQslo~KZ0RR{VhT{O^q!Z16u?5oy0~j;3J0w`oFMFIOU*&$-tmikE z!TbWYx_o5D>pIvtFNHCEk|_(eo?liF;I0P=0;~7=0+v9E-rsjY10;_{?3B53SD^#yn7&=kE_-^6tynH4`Ib1my$%_NY; za4Sa1VdOc~t6PxvSoLbkjIh;=7}~2n-WI8QwI~33wSmXDUVS@MZR*uWFg>q{HL zt10-J2(d&I2$M^w^^8%wbUq^q({}0HZKR7X-#6^i*^jFuZFcDh^i8)*N8}cJW@2~g z;C_^tT{`EP2PgXVr(Vk;ZiyZ#$Zil7et$%6{qoh`+!9dyhywanKSAz;ma%g#um|Av zt6z~h=tiCMGi=n^Wq1AeX+NQZeDbJ^N@#Rg+?UY#=jwwfm)# zWZkXvT)ntN+jSICuwUnbB!Z@M{y`=*Z(7N{{{kR7h*Blxxn<{fQip99LE<9OM`W&L ztu*?sokYDvZre$iOCk~7x3lJnwwNN;PvO2DC0#O#1yJunP33OXwOK%CI9aD;JTWCW zjccStEs%P=cJ6GCXU4p9XA&~m?%dfOUx9h&4zD29&YkDQSD0w$4x>Z&QiAS{P&M4S zb2=4D^zu;gE$-YgDTAto{2DMJ!V$ID`leu3zmWArB#>|2VV!|`od3xI$mnqncI(bU zsHrk<-C4u}lWg6&F+_phe95-%97Orf>Lmn~C1&f+t08Ohtvgl7#kTHX(^_xcS>C=0 z^bS-D%iTL~g-`hsZGwN&b5B$6-g!xI*NDy3rRr)S4<)>R=eZfY9c>$o=J*JfVFynR zm)HcDNgj_2WY%q}Mm;sZF`Ibk65RdLSq9kox$T*D-6vQ$<~RB}L%YXm^-0jzCdkqFkJTnc z@B+mir;njT*dC{&c>XxG#GE{yCu9lnJlWZmO2!2mPlAd}fyOPE-V_Ml=hReAZ;LkOgEgG8eHHpCx=ZD@&+-&oz2dqDcPbX zF5~*R13687+{N^WKF-u#NfFBr4xj?yBL=MiJ~FPOXN;OmXh_1e$%M9%E*e=hOeXvY z#?1b?{g3=o5YjuFz_U|@Y){MUfXtC*tLX%cn#W8hJi`oDQStnFw~qTj;k;~pULm5G zsCk8+Vq`GQk0{BWpb7E{Xf|t`M`s#dCUel4hG%7%X}BoOOoNn1*T0bEPZSna+4Z>x z#a12*IhEeZ`Z7&Is8aO7;Xa{bS*IoF4YdjuWw|NmCnUWvQE{2M+nD>Q%ovIXNPa7>4UV{B{I?pk1t7~+BOAF zc&Mfz_hJFm$5BB5y1>YwLxS|k_d0EVmzXy64~?`v{!<|T8qbV*3gkzS$#x3l;rI&7 zQy{#8R8t@;PL8#TiKajp9lCE7bjrj40H;9ykqRX`0xrJADG-w~s9MM!P*j8i9kDK< z4Tww`CJI=C)8p77;h<~!#vozkgcIM%RCoyHWrv+_m{5=sDCabGfb<-Lj#b zw)rA*H9`J@GuIy;G5*O7dKojZX`9bW;ph%q&`A$OPK7LS88$6M3tY#AbiW0kn?kzx zV|q_Wmm1V9gb|u$+NR~!ZExVl{>ifP{R88#6=j(PvvJmNo^bZG}8)d~K zD>KXqJu&iQ5fO;_LXQdjlIvlAJr=`2G*l1CT>dwP(eH|pUlyCI#6o_L62h_qR^}&= zHdrfjc4F<46Hts`3fvF!)-?jR%>lK``4X zbNS!?qXIK2%`BLvq(d%7L4`2wEJzzHrk$Tw^CYw}y4l=1Z|l_1HYJtCB#t;}b0DY5 z5pywpFwn-%`AM^OCV|ssan4TyXD+zXLt8bgLOuPRtk8ngePX^+6>e~<5-ha2Nh(2- z(fuKr%m2dA;!O5U`brGsFiIo@C@n}EETB9o7EmaIVv>OoNRh+it(O`(L;>Iw8TgJv zj@zMX6LK8E^uZuUojOGeotjsDY=&;70eC`T@-w(UJ7RSvT#*4?*lFY855;gT;;ru8 ze3@%tvZ2}+WiJ13h8A^t<(9>zQ6eFKkJ1St(B~m-um}{jCWP6i9%cm^F=8ni-NRco zH5!Qm0F4YXh(n`)hpJ6z^f0E!qLCU3WBC!0E-{%4gvq54dd8?Vf`5>NX=?;moMNJj zF5xk(5qu}iL;4pcStBT2rQXGYyd2uBeHRPLa>UBL*h2`O6~Ah5(`Aivr{)$)4M6g` z*A_t2lP)2KYyvq!XlDcdW4j)muFYF3bI`SU&&#kj?{u5Bd0qd>7EAC#V6TYuTbW?6 zNY|nli-}g&@r80qk0;3)AT@szXGAuWD|&`_rCKmn9YE-+aR2mJ{cSp>1J1nLl^7?! zH|uFZeLo4k_RQ<(xC*bXJ(}qWZS|FLlQI5CyU}Tt+-_wGv22CEvD9g`Krf3tea2re zQfk$@+nw>(z-+Zwt3WxCioVrTMcxzmb(6NbB%^q zZ+LFt<)th94Q)8LquyC4F3vSt3tdRr2&;gr&0?vsut2-ojDIpqaceG3DIThNm13#p zwBZIltdVDs3G3lpnMTVi*4%?`t$XQ8e{IF7$)BtJW8K9n$jWoPPFsAm+FxCEXFKyy z-o`^ts}8b)FIuj%04ZZI;wrhwRQI+1#%jIUfoo#wrA8UP>iT0HZ*J=Rsdg3qp3q+w z-Bzp7Dps6&x#qS&&PZy>>-w7-9ZxT1H7%vFUR zLmLED0TI=Jr>?)D=G5mqpuiyUGW=fY*1P`kEw|KYm5XJ!>DJ3oO_fS|1Ul9nun7{W zmW$1nJ6FY{ru~gh$7>W-lE1PFO0}WfS!foe;(=gkLKPsiRd;IGbem`jNVnd`=2uD0 zw%aK;ii-=VQpdQ9aPFxKNTG64Eh%}$gH>Pff;(5*X?j1W09XbSn=T#c@=|*dQ zN7+5N1HNqU==vvM4oV2*D0=P!G?NF-vIf$pp0aZn$aQ0Dt`w>UQ&cq*q8hK!fNoxO zy*XM<#apOB6=R+=3w@~URl1k1@lOGbTqw%UDakLk0jS*WVgH!+Qr&~dZKXP2slorC zy{l>sRQ&br1qZs>4ISv!Z4lG(^f&uitTjpw7wjpeiUS=88jtlhkTDe?p^KJlxhv+vT(&Vjqs$qsy+i?>nk#K*m`*@AolA4|Bj>mWWxvCLKY*nyAj@aXtsSgW_x zq_nYmXDWMVXq7Xxx*1y446SB{RsnCJ4KuYvD19 zk4x||gO4}j<5qm!kB=YXW6L^tJQ*J@J_tUJ;Nz3{co-j#;)5d3UIe09e8e>#eqhyj zug~6iZE!xpLNpyOP1^->i>5;sdDGp1j2^_tnH%7-6CX$L@kx93 z-gi#$CRciMEWvvK=>>@d?*$`xcNoFjf#{7%1TO_4cyS29bNmUO^-u6*Zi1(G6Fk6| z;32;R5B(%~Feq~@aK|UX?VYhA#Sg4RdN{joswuA&GF6#{P{m<+5bwidrsz>r1kaD4 zr+3he%XA|*^R6(sMKF>TD-Qg?N*wRXQyf{$ypoG7MF>c2$pZo5CKS3+h2XMIx~P`m z(i^&JiQt4a!AWg`Gff0%qXd5k7*^2iCSr< z=7;|9{(Mr9%J! delta 11409 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 RoEqrP?#0yny9P$W{{gL%OuPU9 diff --git a/docs-out/_build/doctrees/environment.pickle b/docs-out/_build/doctrees/environment.pickle index 072d2a56319646d02bef21ae6af425dfd4cdb2d5..17494034dbd96a0eefce92d4fd08941a0a4e0953 100644 GIT binary patch literal 162647 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 literal 148546 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 diff --git a/docs-out/_build/doctrees/example.doctree b/docs-out/_build/doctrees/example.doctree new file mode 100644 index 0000000000000000000000000000000000000000..cc7921e8db0dc4313cae68d1ddac45a3de58f911 GIT binary patch literal 2337 zcmZWqO>Y}F5KZhzvTRwllO~tgZHgjDgT_`7eVC-@KXmyZ7&t;l27V9=S?Ly}F=`X~VcnagUiIlwAAt zCB6J7eMsNOp`}Y_f-QK8_n=V-shH(Dy-#tR)xA{iqO~75UU+GAXD)i8F9z?E7{;EL zUhz9Oam-h=tQ3D%8WwQXDn59}S2=6aMv96TxOs_;#1CR0nd~;1h*#TA*Dlru9X{e!w!I(6MX(u3 z(&08*OB(#*p5xw2y#PN>x`NNG(VlCTV*d}S0)SgHMjTD!aKV8D^~NR~7zOSgrN-f) z2}9uf3djBS7_7qS(3^r}yz?!>^^ljnN%7&_7_W`zcP=mQ$HUAv9ZIsA8(Stw#tvn! zNMXuMVh5K`8wppumXM|Nf~>2Kh^;|OgJ~RDUK#6&;@4cI%bmC{sOpZrc*0i_Sb6G$ zTPyWqkMUVpAl!IKtp--mu$-2V485fV&yPx<;#le`c*1pI7_?Fx20uUl>D)wZs9prR;DDRqyn~q#A6Z@)%LwBY$bm2t%$UZ0Ve}kt1RRo)3hg9UN%Z5G25-o% zDDFrw>X3!9A|301YAui;oYhoihex#p&}x@!e=DjS56qBNnfY|gSCw&`+_kJJQh0JL zoox7dM3{7Rrt(ADEC=gu5U=70k8$8Xtp^(@)2flVRL#72lD`ndahr8e-t3K`-Uk?- z-4Xme$t?xi=ml7)WGQ|6_4q{`SG*zsg`*LR8n988%qVitoe`f2?<@E7WU^c?FRB|a zjJ_~-F=70A0!=qb@o~1O6M+Ts9D@~Yhk*_G`STy&0N1gd7h7SnBIH6S{DZm=l*z0gxssyC z{t9Sm2bdn!=jKS1DQFAqSs^I82W4+s4H(w|!ul#y2$2_1y;j;0@EP1Oh17E}U_BEa z<|*OAY*X);mov`LrZW*S{psw@Q-O}eICz`w|%uY_u@WgKw(1e@DvXUqZEL}8?XchZ(I2nJpN<) w9X!VFM`vJLJB*(uU^faj#0Q&LK{IQ`)BZ^{}T_B<2?6q=GrD#i=Ew1(Ug%q?j^X yHmfp8Ff%r9wqxDIEEAg%RougwmzbMcQdy8%Jf(I@Myy|Ph9Z!T+RVcl$_N0)MIxdA delta 92 zcmaDR@=%1Ofpu!wMwZu%GQ0tm&LK{IdJt+#+Z4YZj?{|8+=86c;>mnWQk%7yB$yc+ rH#@U#VwQ={h$!yi%uCEoEvYO>EuK<4B_rCeI71OgM{E}43}plWz=|Kw diff --git a/docs-out/_build/html/PyCTBN.PyCTBN.html b/docs-out/_build/html/PyCTBN.PyCTBN.html index bd6313d..29ef30a 100644 --- a/docs-out/_build/html/PyCTBN.PyCTBN.html +++ b/docs-out/_build/html/PyCTBN.PyCTBN.html @@ -142,18 +142,22 @@
  • PyCTBN.PyCTBN.structure_graph package
  • PyCTBN.PyCTBN.utility package

    Submodules¶

    +
    +

    PyCTBN.basic_main module¶

    +
    +
    +

    PyCTBN.setup module¶

    +

    Module contents¶

    diff --git a/docs-out/_build/html/PyCTBN.tests.html b/docs-out/_build/html/PyCTBN.tests.html index 83be260..7036b72 100644 --- a/docs-out/_build/html/PyCTBN.tests.html +++ b/docs-out/_build/html/PyCTBN.tests.html @@ -137,11 +137,13 @@
  • PyCTBN.tests.structure_graph package
  • diff --git a/docs-out/_build/html/PyCTBN.tests.structure_graph.html b/docs-out/_build/html/PyCTBN.tests.structure_graph.html index f3dae53..a63e83d 100644 --- a/docs-out/_build/html/PyCTBN.tests.structure_graph.html +++ b/docs-out/_build/html/PyCTBN.tests.structure_graph.html @@ -146,6 +146,25 @@ + +
    +

    PyCTBN.tests.structure_graph.test_networkgenerator module¶

    +
    +
    +class PyCTBN.tests.structure_graph.test_networkgenerator.TestNetworkGenerator(methodName='runTest')¶
    +

    Bases: unittest.case.TestCase

    +
    +
    +test_generate_cims()¶
    +
    + +
    +
    +test_generate_graph()¶
    +
    + +
    +

    PyCTBN.tests.structure_graph.test_networkgraph module¶

    @@ -443,6 +462,41 @@ +
    +
    +

    PyCTBN.tests.structure_graph.test_trajectorygenerator module¶

    +
    +
    +class PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator(methodName='runTest')¶
    +

    Bases: unittest.case.TestCase

    +
    +
    +classmethod setUpClass() → None¶
    +

    Hook method for setting up class fixture before running tests in the class.

    +
    + +
    +
    +test_generated_trajectory()¶
    +
    + +
    +
    +test_generated_trajectory_max_tr()¶
    +
    + +
    +
    +test_init()¶
    +
    + +
    +
    +test_multi_trajectory()¶
    +
    + +
    +

    Module contents¶

    diff --git a/docs-out/_build/html/_sources/PyCTBN.PyCTBN.structure_graph.rst.txt b/docs-out/_build/html/_sources/PyCTBN.PyCTBN.structure_graph.rst.txt index c236017..f00477b 100644 --- a/docs-out/_build/html/_sources/PyCTBN.PyCTBN.structure_graph.rst.txt +++ b/docs-out/_build/html/_sources/PyCTBN.PyCTBN.structure_graph.rst.txt @@ -12,6 +12,14 @@ PyCTBN.PyCTBN.structure\_graph.conditional\_intensity\_matrix module :undoc-members: :show-inheritance: +PyCTBN.PyCTBN.structure\_graph.network\_generator module +-------------------------------------------------------- + +.. automodule:: PyCTBN.PyCTBN.structure_graph.network_generator + :members: + :undoc-members: + :show-inheritance: + PyCTBN.PyCTBN.structure\_graph.network\_graph module ---------------------------------------------------- @@ -52,6 +60,14 @@ PyCTBN.PyCTBN.structure\_graph.trajectory module :undoc-members: :show-inheritance: +PyCTBN.PyCTBN.structure\_graph.trajectory\_generator module +----------------------------------------------------------- + +.. automodule:: PyCTBN.PyCTBN.structure_graph.trajectory_generator + :members: + :undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/docs-out/_build/html/_sources/PyCTBN.PyCTBN.utility.rst.txt b/docs-out/_build/html/_sources/PyCTBN.PyCTBN.utility.rst.txt index 1a8a33d..d804edf 100644 --- a/docs-out/_build/html/_sources/PyCTBN.PyCTBN.utility.rst.txt +++ b/docs-out/_build/html/_sources/PyCTBN.PyCTBN.utility.rst.txt @@ -4,6 +4,14 @@ PyCTBN.PyCTBN.utility package Submodules ---------- +PyCTBN.PyCTBN.utility.abstract\_exporter module +----------------------------------------------- + +.. automodule:: PyCTBN.PyCTBN.utility.abstract_exporter + :members: + :undoc-members: + :show-inheritance: + PyCTBN.PyCTBN.utility.abstract\_importer module ----------------------------------------------- @@ -20,6 +28,14 @@ PyCTBN.PyCTBN.utility.cache module :undoc-members: :show-inheritance: +PyCTBN.PyCTBN.utility.json\_exporter module +------------------------------------------- + +.. automodule:: PyCTBN.PyCTBN.utility.json_exporter + :members: + :undoc-members: + :show-inheritance: + PyCTBN.PyCTBN.utility.json\_importer module ------------------------------------------- diff --git a/docs-out/_build/html/_sources/PyCTBN.rst.txt b/docs-out/_build/html/_sources/PyCTBN.rst.txt index db94109..3aaa3ce 100644 --- a/docs-out/_build/html/_sources/PyCTBN.rst.txt +++ b/docs-out/_build/html/_sources/PyCTBN.rst.txt @@ -8,10 +8,27 @@ Subpackages :maxdepth: 4 PyCTBN.PyCTBN + PyCTBN.tests Submodules ---------- +PyCTBN.basic\_main module +------------------------- + +.. automodule:: PyCTBN.basic_main + :members: + :undoc-members: + :show-inheritance: + +PyCTBN.setup module +------------------- + +.. automodule:: PyCTBN.setup + :members: + :undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/docs-out/_build/html/_sources/PyCTBN.tests.structure_graph.rst.txt b/docs-out/_build/html/_sources/PyCTBN.tests.structure_graph.rst.txt index 257d48d..7240498 100644 --- a/docs-out/_build/html/_sources/PyCTBN.tests.structure_graph.rst.txt +++ b/docs-out/_build/html/_sources/PyCTBN.tests.structure_graph.rst.txt @@ -12,6 +12,14 @@ PyCTBN.tests.structure\_graph.test\_cim module :undoc-members: :show-inheritance: +PyCTBN.tests.structure\_graph.test\_networkgenerator module +----------------------------------------------------------- + +.. automodule:: PyCTBN.tests.structure_graph.test_networkgenerator + :members: + :undoc-members: + :show-inheritance: + PyCTBN.tests.structure\_graph.test\_networkgraph module ------------------------------------------------------- @@ -52,6 +60,14 @@ PyCTBN.tests.structure\_graph.test\_trajectory module :undoc-members: :show-inheritance: +PyCTBN.tests.structure\_graph.test\_trajectorygenerator module +-------------------------------------------------------------- + +.. automodule:: PyCTBN.tests.structure_graph.test_trajectorygenerator + :members: + :undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/docs-out/_build/html/_sources/example.rst.txt b/docs-out/_build/html/_sources/example.rst.txt new file mode 100644 index 0000000..7789de1 --- /dev/null +++ b/docs-out/_build/html/_sources/example.rst.txt @@ -0,0 +1,7 @@ +example module +============== + +.. automodule:: example + :members: + :undoc-members: + :show-inheritance: diff --git a/docs-out/_build/html/_sources/modules.rst.txt b/docs-out/_build/html/_sources/modules.rst.txt index 4ec310b..aa7e7d5 100644 --- a/docs-out/_build/html/_sources/modules.rst.txt +++ b/docs-out/_build/html/_sources/modules.rst.txt @@ -4,5 +4,6 @@ PyCTBN .. toctree:: :maxdepth: 4 - PyCTBN.PyCTBN - examples + PyCTBN + example + setup diff --git a/docs-out/_build/html/example.html b/docs-out/_build/html/example.html new file mode 100644 index 0000000..926439d --- /dev/null +++ b/docs-out/_build/html/example.html @@ -0,0 +1,179 @@ + + + + + + + + + + + example module — PyCTBN 2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    +
    +
    +
    +
    + +
    +
    + + + + + + + + + + + + +
    + +
    + +
    +
    +

    example module¶

    +
    + + +
    +
    + + +
    + +
    +

    + © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. +

    +
    + + Built with Sphinx using a theme provided by Porão do Juca. + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-out/_build/html/genindex.html b/docs-out/_build/html/genindex.html index bd2996c..763383b 100644 --- a/docs-out/_build/html/genindex.html +++ b/docs-out/_build/html/genindex.html @@ -134,11 +134,14 @@ | S | T | V + | W

    A

    +

    E

    @@ -337,6 +352,10 @@

    G

    +
  • graph() (PyCTBN.PyCTBN.structure_graph.network_generator.NetworkGenerator property) +
  • @@ -414,6 +435,10 @@

    J

    + +

    N

    @@ -699,6 +748,13 @@ +
  • + PyCTBN.PyCTBN.structure_graph.network_generator + +
  • @@ -734,6 +790,13 @@
  • +
  • + PyCTBN.PyCTBN.structure_graph.trajectory_generator + +
  • @@ -741,6 +804,13 @@
  • +
  • + PyCTBN.PyCTBN.utility.abstract_exporter + +
  • @@ -757,6 +827,13 @@
  • +
  • + PyCTBN.PyCTBN.utility.json_exporter + +
  • @@ -848,6 +925,13 @@
  • +
  • + PyCTBN.tests.structure_graph.test_networkgenerator + +
  • @@ -883,6 +967,13 @@
  • +
  • + PyCTBN.tests.structure_graph.test_trajectorygenerator + +
  • @@ -973,6 +1064,8 @@
  • (PyCTBN.tests.structure_graph.test_structure.TestStructure class method)
  • (PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory class method) +
  • +
  • (PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator class method)
  • (PyCTBN.tests.utility.test_json_importer.TestJsonImporter class method)
  • @@ -1088,8 +1181,16 @@
  • test_filter_cims_with_mask() (PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims method)
  • test_find() (PyCTBN.tests.utility.test_cache.TestCache method) +
  • +
  • test_generate_cims() (PyCTBN.tests.structure_graph.test_networkgenerator.TestNetworkGenerator method) +
  • +
  • test_generate_graph() (PyCTBN.tests.structure_graph.test_networkgenerator.TestNetworkGenerator method)
  • test_generate_possible_sub_sets_of_size() (PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator method) +
  • +
  • test_generated_trajectory() (PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator method) +
  • +
  • test_generated_trajectory_max_tr() (PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator method)
  • test_get_node_id() (PyCTBN.tests.structure_graph.test_structure.TestStructure method)
  • @@ -1133,6 +1234,8 @@
  • (PyCTBN.tests.structure_graph.test_structure.TestStructure method)
  • (PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory method) +
  • +
  • (PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator method)
  • (PyCTBN.tests.utility.test_cache.TestCache method)
  • @@ -1146,6 +1249,8 @@
  • test_init_not_filled_dataframse() (PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath method)
  • test_init_not_initialized_importer() (PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath method) +
  • +
  • test_multi_trajectory() (PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator method)
  • test_normalize_trajectories() (PyCTBN.tests.utility.test_json_importer.TestJsonImporter method)
  • @@ -1210,6 +1315,8 @@
  • TestHillClimbingSearch (class in PyCTBN.tests.optimizers.test_hill_climbing_search)
  • TestJsonImporter (class in PyCTBN.tests.utility.test_json_importer) +
  • +
  • TestNetworkGenerator (class in PyCTBN.tests.structure_graph.test_networkgenerator)
  • TestNetworkGraph (class in PyCTBN.tests.structure_graph.test_networkgraph)
  • @@ -1232,6 +1339,8 @@
  • TestTabuSearch (class in PyCTBN.tests.optimizers.test_tabu_search)
  • TestTrajectory (class in PyCTBN.tests.structure_graph.test_trajectory) +
  • +
  • TestTrajectoryGenerator (class in PyCTBN.tests.structure_graph.test_trajectorygenerator)
  • time_filtering() (PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph property)
  • @@ -1248,6 +1357,8 @@
  • Trajectory (class in PyCTBN.PyCTBN.structure_graph.trajectory)
  • trajectory() (PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory property) +
  • +
  • TrajectoryGenerator (class in PyCTBN.PyCTBN.structure_graph.trajectory_generator)
  • transition_filtering() (PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph property)
  • @@ -1260,12 +1371,24 @@
    +
    + +

    W

    + +
    diff --git a/docs-out/_build/html/index.html b/docs-out/_build/html/index.html index 996979e..910075a 100644 --- a/docs-out/_build/html/index.html +++ b/docs-out/_build/html/index.html @@ -142,18 +142,22 @@
  • PyCTBN.PyCTBN.structure_graph package
  • PyCTBN.PyCTBN.utility package
  • diff --git a/docs-out/_build/html/objects.inv b/docs-out/_build/html/objects.inv index 66df86dbc6c144c36c84a755d0698af0ded70f0e..d3f8181e0820dfa32dfdf7ecfc72de5e384faea5 100644 GIT binary patch delta 3127 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 R=m%Z7?wx6a{{wl1XIJs&`HTPn delta 2892 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 diff --git a/docs-out/_build/html/py-modindex.html b/docs-out/_build/html/py-modindex.html index d729367..460b1f7 100644 --- a/docs-out/_build/html/py-modindex.html +++ b/docs-out/_build/html/py-modindex.html @@ -202,6 +202,11 @@     PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix + + +     + PyCTBN.PyCTBN.structure_graph.network_generator +     @@ -227,11 +232,21 @@     PyCTBN.PyCTBN.structure_graph.trajectory + + +     + PyCTBN.PyCTBN.structure_graph.trajectory_generator +     PyCTBN.PyCTBN.utility + + +     + PyCTBN.PyCTBN.utility.abstract_exporter +     @@ -242,6 +257,11 @@     PyCTBN.PyCTBN.utility.cache + + +     + PyCTBN.PyCTBN.utility.json_exporter +     @@ -307,6 +327,11 @@     PyCTBN.tests.structure_graph.test_cim + + +     + PyCTBN.tests.structure_graph.test_networkgenerator +     @@ -332,6 +357,11 @@     PyCTBN.tests.structure_graph.test_trajectory + + +     + PyCTBN.tests.structure_graph.test_trajectorygenerator +     diff --git a/docs-out/_build/html/searchindex.js b/docs-out/_build/html/searchindex.js index 22a6a83..70f998c 100644 --- a/docs-out/_build/html/searchindex.js +++ b/docs-out/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:[2,4],indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],latest:12,lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) \ No newline at end of file +Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","example","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","example.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_generator:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"],trajectory_generator:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_generator":{NetworkGenerator:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_generator.NetworkGenerator":{cims:[4,2,1,""],dyn_str:[4,2,1,""],generate_cims:[4,2,1,""],generate_graph:[4,2,1,""],graph:[4,2,1,""],variables:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory_generator":{TrajectoryGenerator:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory_generator.TrajectoryGenerator":{CTBN_Sample:[4,2,1,""],multi_trajectory:[4,2,1,""],worker:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_exporter:[5,0,0,"-"],abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_exporter:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_exporter":{AbstractExporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_exporter.AbstractExporter":{add_trajectory:[5,2,1,""],out_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_exporter":{JsonExporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_exporter.JsonExporter":{cims_to_json:[5,2,1,""],out_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgenerator:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"],test_trajectorygenerator:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgenerator":{TestNetworkGenerator:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgenerator.TestNetworkGenerator":{test_generate_cims:[9,2,1,""],test_generate_graph:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectorygenerator":{TestTrajectoryGenerator:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator":{setUpClass:[9,2,1,""],test_generated_trajectory:[9,2,1,""],test_generated_trajectory_max_tr:[9,2,1,""],test_init:[9,2,1,""],test_multi_trajectory:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,13],"boolean":[2,4],"case":[4,7,8,9,10],"class":[2,3,4,5,7,8,9,10,13],"default":[2,3,5],"float":[2,4],"function":2,"import":[4,5,14],"int":[2,3,4,5],"new":5,"null":2,"return":[2,3,4,5,9,13],"static":[2,4],"super":13,"true":[2,13],"var":13,For:4,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,13],Use:[2,13],__actual_cach:5,__generate_cim:4,__init__:13,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,13],_df_structur:5,_df_variabl:[5,13],_dyn_cim:5,_dyn_str:5,_file_path:13,_generated_trajectori:4,_graph:[4,13],_import:4,_indx:4,_label:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_parent:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,13],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:[4,5],_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_val:4,_variabl:5,_variables_label:5,_vname:4,abc:[3,5],about:[3,4],abstract_export:[0,1,14],abstract_import:[0,1,4,14],abstractexport:5,abstractimport:[4,5,13],accord:4,act:5,actual:[2,4],actual_cim:[4,13],add:[4,5],add_edg:4,add_nod:4,add_trajectori:5,added:[2,4,5],adding:4,addit:2,adjac:[2,13],adjacency_matrix:[2,13],after:[4,5],against:2,aggreg:4,algorithm:[2,3,13],all:[2,3,4,5,9,13],allow:4,along:5,alpha_xu:2,alpha_xxu:2,alreadi:[5,13],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,13],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:13,base:[2,3,4,5,7,8,9,10],basic_main:15,bayesian:2,been:4,befor:[2,3,7,8,9,10],belong:[2,4],best:2,between:[4,5],bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,13],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,13],build_structur:[4,13],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,13],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,14],calcul:2,call:[5,13],can:5,cardin:[2,4,5,9],cardinalit:[4,5],care:4,caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,13],cim_equality_test:7,cims_kei:5,cims_label:[5,7],cims_to_json:5,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,13],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,13],compute_cim_coeffici:4,compute_parameters_for_nod:[2,13],compute_row_delta_in_all_samples_fram:[5,13],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,14],conditionalintensitymatrix:[2,4],consid:[2,4],consider:4,constraint:2,constraint_based_optim:[0,1,14],constraintbasedoptim:3,construct:[4,5,13],conta:5,contain:[2,4,5,9],contains_edg:4,content:[14,15],convent:4,convert:[2,5],copi:5,core:[4,5],correct:[4,5],correspond:4,could:2,count:4,creat:[2,4,5,13],csv:13,csvimport:13,ctbn:2,ctbn_sampl:4,ctpc:[2,3,13],ctpc_algorithm:[2,13],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,14],datafram:[4,5,13],dataset:[3,4,5],dataset_id:[5,13],datfram:5,def:13,defin:[4,5],definit:5,defualt:2,delta:[2,4,5],demonstr:13,densiti:4,describ:5,desir:[2,4],df_samples_list:5,dict:[4,5,13],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:13,direct:[2,4],directli:5,directori:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:13,drop:13,duplic:4,dyn:13,dyn_cim:[4,5],dyn_str:[4,5],each:[2,3,4,5],edg:[2,4,5,13],edges_list:4,end:[4,5],entir:2,equal:4,equality_of_cims_of_nod:7,est:13,estim:[0,1,3,4,6,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:13,exampl:[5,14,15],exclud:2,exctract:5,execut:4,exist:[4,5],exp_test_alfa:2,exponenti:2,expos:5,extend:13,extens:[2,5],extract:[4,5],fals:[2,4],fam_score_calcul:[0,1,14],famscor:2,famscorecalcul:2,fast_init:[2,4,13],file:[2,5,13],file_path:[2,5,13],filenam:5,filepath:5,fill:[2,13],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,13],fix:4,fixtur:[7,8,9,10],follow:[4,5],form:4,format:[5,13],formula:2,found:5,frame:[4,5],from:[4,5,13],from_nod:5,gener:[2,4,5],generate_cim:4,generate_graph:4,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:13,graph:[2,4,9,13],graph_struct:4,graphic:2,grid:[4,9],group:4,grpah:13,has:[4,5,13],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,4,5,14],import_data:[5,13],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,13],improv:[2,3],includ:[2,5],independ:2,independence_test:2,index:[2,4,5,13,14],indic:[2,4],indx:5,info:[4,13],inform:[3,4,5],init:13,initi:[2,4,5,13],inplac:13,insid:13,instal:14,instanti:4,interest:4,interfac:3,intes:4,isn:4,item:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:13,json:[2,5,13],json_export:[0,1,14],json_import:[0,1,14],jsonarrai:5,jsonexport:5,jsonimport:[5,13],just:4,keep:[2,3,5],kei:[4,5],kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],last:4,latest:13,lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,13],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,made:4,main:13,mandatori:4,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,13],max_par:[2,3],max_tr:4,max_val:4,maximum:[2,3,4],member:[4,5],mention:4,merg:5,method:[2,4,5,7,8,9,10],methodnam:[7,8,9,10],min_val:4,minimum:4,model:2,modul:[14,15],more:5,multi_trajectori:4,multipl:5,multiprocess:2,must:[4,5],name:[2,4,5,13],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,13],net_graph:2,network:[2,4,5],network_gener:[0,1,14],network_graph:[0,1,2,14],networkgener:4,networkgraph:[2,4,13],networkx:2,node:[2,3,4,5,9,13],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,13],none:[2,3,4,5,7,9,10,13],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,13],object:[2,3,4,5,13],obvious:4,one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,14],optimize_structur:3,option:[2,3],order:[2,4,5,10],origin:5,original_cols_numb:4,otherwis:[2,4,5],out:5,out_fil:5,outer:[5,13],output:[4,5],over:2,own:14,p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[14,15],page:14,panda:[4,5,13],parallel:4,param:4,paramet:[2,3,4,5,9,14],parameters_estim:[0,1,14],parametersestim:[2,13],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:[2,4],particular:[2,5],pass:13,path:[2,5,13],patienc:[2,3],peest:13,perform:2,pip:13,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],previous:5,print:13,prior:[2,13],prior_net_structur:5,privat:4,probabl:4,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],provid:[4,5],put:5,pyctbn:13,q_xx:4,rappres:4,raw:5,raw_data:5,reach:4,read:[5,13],read_csv:13,read_csv_fil:13,read_fil:13,read_json_fil:5,real:[2,4,5,13],refer:[4,5],reject:2,rel:4,relat:[4,5],releas:13,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,requir:4,res:4,resid:[2,4],respect:4,result:[2,4,5,13],row:4,rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:[4,5],sampl:[4,5,13],sample_fram:[5,13],sample_import:[0,1,14],sample_path:[0,1,2,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,13],samples_label:5,save:[2,5,13],save_plot_estimated_structure_graph:2,save_result:[2,13],scalar_index:2,scalar_indexes_struct:2,score:2,se1:13,search:[2,3,14],second:2,see:5,select:13,self:[2,5,13],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,14],setofcim:[2,4,5,13],setup:15,setupclass:[7,8,9,10],share:4,shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:13,simpli:13,sinc:4,singl:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:13,sorter:5,specif:[2,4,13],specifi:4,spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,13],string:[2,3,4,5],structur:[0,1,2,3,5,9,14],structure_constraint_based_estim:[0,1,14],structure_estim:[0,1,3,14],structure_estimation_exampl:13,structure_graph:[0,1,2,5,6,14],structure_label:5,structure_score_based_estim:[0,1,14],structureconstraintbasedestim:2,structureestim:[2,3,13],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,14,15],subpackag:[14,15],subsequ:5,subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_end:4,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,14],tabusearch:3,take:[4,13],taken:4,tar:13,task:[2,4],tau_xu:2,ternari:13,test:[0,2,15],test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:[0,6],test_child:2,test_cim:[0,6],test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_cim:9,test_generate_graph:9,test_generate_possible_sub_sets_of_s:7,test_generated_trajectori:9,test_generated_trajectory_max_tr:9,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:[0,6],test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:[0,6],test_multi_trajectori:9,test_networkgener:[0,6],test_networkgraph:[0,6],test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:[0,6],test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:[0,6],test_sample_path:[0,6],test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:[0,6],test_structur:[0,6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:[0,6],test_structure_estim:[0,6],test_structure_monoprocesso:7,test_structure_score_based_estim:[0,6],test_tabu_search:[0,6],test_tim:7,test_trajectori:[0,6],test_trajectorygener:[0,6],testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgener:9,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,testtrajectorygener:9,tha:5,therefor:4,theta:2,thi:[2,4,5,13],three:13,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,13],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,13,14],trajectories_kei:5,trajectory_gener:[0,1,14],trajectory_list:5,trajectorygener:4,trajectri:13,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:[2,4],type:[2,3,4,5,13],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:14,use:[2,13],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,14],val:4,valid:2,valu:[2,3,4,5,9,13],values_list:13,var_id:2,variabl:[2,3,4,5,13],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:13,when:[2,4],where:[4,5],whether:4,which:[2,3,4,5],whl:13,who:2,without:[2,3],worker:4,write:5,you:[2,5,13],your:14},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","example module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":13,abstract_export:5,abstract_import:5,basic_main:[0,11],cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:13,document:14,estim:[2,7,13],exampl:[12,13],fam_score_calcul:2,hill_climbing_search:3,implement:13,indic:14,instal:13,json_export:5,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,12,16],network_gener:4,network_graph:4,optim:[3,8],own:13,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:13,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,14,15],sample_import:5,sample_path:4,set_of_cim:4,setup:[0,16],structur:[4,13],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:14,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgener:9,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,test_trajectorygener:9,trajectori:4,trajectory_gener:4,usag:13,util:[5,10],welcom:14,your:13}}) \ No newline at end of file diff --git a/docs/PyCTBN.PyCTBN.estimators.html b/docs/PyCTBN.PyCTBN.estimators.html index 1644fa4..744c567 100644 --- a/docs/PyCTBN.PyCTBN.estimators.html +++ b/docs/PyCTBN.PyCTBN.estimators.html @@ -19,10 +19,6 @@ - - - - @@ -127,13 +123,13 @@

    PyCTBN.PyCTBN.estimators.fam_score_calculator module¶

    -
    -class PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator¶
    +
    +class PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator¶

    Bases: object

    Has the task of calculating the FamScore of a node by using a Bayesian score function

    -
    -get_fam_score(cims: numpy.array, tau_xu: float = 0.1, alpha_xu: float = 1)¶
    +
    +get_fam_score(cims: numpy.array, tau_xu: float = 0.1, alpha_xu: float = 1)¶

    Calculate the FamScore value of the node

    Parameters
    @@ -153,8 +149,8 @@
    -
    -marginal_likelihood_q(cims: numpy.array, tau_xu: float = 0.1, alpha_xu: float = 1)¶
    +
    +marginal_likelihood_q(cims: numpy.array, tau_xu: float = 0.1, alpha_xu: float = 1)¶

    Calculate the value of the marginal likelihood over q of the node identified by the label node_id

    Parameters
    @@ -174,8 +170,8 @@
    -
    -marginal_likelihood_theta(cims: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, alpha_xu: float, alpha_xxu: float)¶
    +
    +marginal_likelihood_theta(cims: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, alpha_xu: float, alpha_xxu: float)¶

    Calculate the FamScore value of the node identified by the label node_id

    Parameters
    @@ -195,8 +191,8 @@
    -
    -single_cim_xu_marginal_likelihood_q(M_xu_suff_stats: float, T_xu_suff_stats: float, tau_xu: float = 0.1, alpha_xu: float = 1)¶
    +
    +single_cim_xu_marginal_likelihood_q(M_xu_suff_stats: float, T_xu_suff_stats: float, tau_xu: float = 0.1, alpha_xu: float = 1)¶

    Calculate the marginal likelihood on q of the node when assumes a specif value and a specif parents’s assignment

    @@ -219,8 +215,8 @@ and a specif parents’s assignment

    -
    -single_cim_xu_marginal_likelihood_theta(index: int, cim: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, alpha_xu: float, alpha_xxu: float)¶
    +
    +single_cim_xu_marginal_likelihood_theta(index: int, cim: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, alpha_xu: float, alpha_xxu: float)¶

    Calculate the marginal likelihood on q of the node when assumes a specif value and a specif parents’s assignment

    @@ -241,8 +237,8 @@ and a specif parents’s assignment

    -
    -single_internal_cim_xxu_marginal_likelihood_theta(M_xxu_suff_stats: float, alpha_xxu: float = 1)¶
    +
    +single_internal_cim_xxu_marginal_likelihood_theta(M_xxu_suff_stats: float, alpha_xxu: float = 1)¶

    Calculate the second part of the marginal likelihood over theta formula

    Parameters
    @@ -261,8 +257,8 @@ and a specif parents’s assignment

    -
    -variable_cim_xu_marginal_likelihood_q(cim: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, tau_xu: float = 0.1, alpha_xu: float = 1)¶
    +
    +variable_cim_xu_marginal_likelihood_q(cim: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, tau_xu: float = 0.1, alpha_xu: float = 1)¶

    Calculate the value of the marginal likelihood over q given a cim

    Parameters
    @@ -282,8 +278,8 @@ and a specif parents’s assignment

    -
    -variable_cim_xu_marginal_likelihood_theta(cim: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, alpha_xu: float, alpha_xxu: float)¶
    +
    +variable_cim_xu_marginal_likelihood_theta(cim: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, alpha_xu: float, alpha_xxu: float)¶

    Calculate the value of the marginal likelihood over theta given a cim

    Parameters
    @@ -308,8 +304,8 @@ and a specif parents’s assignment

    PyCTBN.PyCTBN.estimators.parameters_estimator module¶

    -
    -class PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator(trajectories: PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory, net_graph: PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph)¶
    +
    +class PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator(trajectories: PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory, net_graph: PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph)¶

    Bases: object

    Has the task of computing the cims of particular node given the trajectories and the net structure in the graph _net_graph.

    @@ -325,8 +321,8 @@ in the graph _net_g
    -
    -compute_parameters_for_node(node_id: str)PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims¶
    +
    +compute_parameters_for_node(node_id: str)PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims¶

    Compute the CIMS of the node identified by the label node_id.

    Parameters
    @@ -342,8 +338,8 @@ in the graph _net_g
    -
    -static compute_state_res_time_for_node(times: numpy.ndarray, trajectory: numpy.ndarray, cols_filter: numpy.ndarray, scalar_indexes_struct: numpy.ndarray, T: numpy.ndarray)None¶
    +
    +static compute_state_res_time_for_node(times: numpy.ndarray, trajectory: numpy.ndarray, cols_filter: numpy.ndarray, scalar_indexes_struct: numpy.ndarray, T: numpy.ndarray) → None¶

    Compute the state residence times for a node and fill the matrix T with the results

    Parameters
    @@ -360,8 +356,8 @@ in the graph _net_g
    -
    -static compute_state_transitions_for_a_node(node_indx: int, trajectory: numpy.ndarray, cols_filter: numpy.ndarray, scalar_indexing: numpy.ndarray, M: numpy.ndarray)None¶
    +
    +static compute_state_transitions_for_a_node(node_indx: int, trajectory: numpy.ndarray, cols_filter: numpy.ndarray, scalar_indexing: numpy.ndarray, M: numpy.ndarray) → None¶

    Compute the state residence times for a node and fill the matrices M with the results.

    Parameters
    @@ -377,8 +373,8 @@ in the graph _net_g
    -
    -fast_init(node_id: str)None¶
    +
    +fast_init(node_id: str) → None¶

    Initializes all the necessary structures for the parameters estimation for the node node_id.

    Parameters
    @@ -393,8 +389,8 @@ in the graph _net_g

    PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator module¶

    -
    -class PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator(sample_path: PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath, exp_test_alfa: float, chi_test_alfa: float, known_edges: List = [], thumb_threshold: int = 25)¶
    +
    +class PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator(sample_path: PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath, exp_test_alfa: float, chi_test_alfa: float, known_edges: List = [], thumb_threshold: int = 25)¶

    Bases: PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator

    Has the task of estimating the network structure given the trajectories in samplepath by using a constraint-based approach.

    @@ -424,8 +420,8 @@ in the graph _net_g
    -
    -complete_test(test_parent: str, test_child: str, parent_set: List, child_states_numb: int, tot_vars_count: int, parent_indx, child_indx)bool¶
    +
    +complete_test(test_parent: str, test_child: str, parent_set: List, child_states_numb: int, tot_vars_count: int, parent_indx, child_indx) → bool¶

    Performs a complete independence test on the directed graphs G1 = {test_child U parent_set} G2 = {G1 U test_parent} (added as an additional parent of the test_child). Generates all the necessary structures and datas to perform the tests.

    @@ -449,8 +445,8 @@ Generates all the necessary structures and datas to perform the tests.

    -
    -compute_thumb_value(parent_val, child_val, parent_set_vals)¶
    +
    +compute_thumb_value(parent_val, child_val, parent_set_vals)¶

    Compute the value to test against the thumb_threshold.

    Parameters
    @@ -470,10 +466,8 @@ Generates all the necessary structures and datas to perform the tests.

    -
    ctpc_algorithm(disable_multiprocessing: bool = False, processes_number: int = None)¶
    -

    Compute the CTPC algorithm over the entire net.

    Parameters
    @@ -488,11 +482,9 @@ Generates all the necessary structures and datas to perform the tests.

    -
    estimate_structure(disable_multiprocessing: bool = False, processes_number: int = None)¶

    Compute the constraint-based algorithm to find the optimal structure

    -
    Parameters
      @@ -506,8 +498,8 @@ Generates all the necessary structures and datas to perform the tests.

    -
    -independence_test(child_states_numb: int, cim1: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, cim2: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, thumb_value: float, parent_indx, child_indx)bool¶
    +
    +independence_test(child_states_numb: int, cim1: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, cim2: PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, thumb_value: float, parent_indx, child_indx) → bool¶

    Compute the actual independence test using two cims. It is performed first the exponential test and if the null hypothesis is not rejected, it is performed also the chi_test.

    @@ -529,8 +521,8 @@ it is performed also the chi_test.

    -
    -one_iteration_of_CTPC_algorithm(var_id: str, tot_vars_count: int)List¶
    +
    +one_iteration_of_CTPC_algorithm(var_id: str, tot_vars_count: int) → List¶

    Performs an iteration of the CTPC algorithm using the node var_id as test_child.

    Parameters
    @@ -545,8 +537,8 @@ it is performed also the chi_test.

    PyCTBN.PyCTBN.estimators.structure_estimator module¶

    -
    -class PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator(sample_path: PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath, known_edges: Optional[List] = None)¶
    +
    +class PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator(sample_path: PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath, known_edges: List = None)¶

    Bases: object

    Has the task of estimating the network structure given the trajectories in samplepath.

    @@ -570,8 +562,8 @@ it is performed also the chi_test.

    -
    -adjacency_matrix()numpy.ndarray¶
    +
    +adjacency_matrix() → numpy.ndarray¶

    Converts the estimated structure _complete_graph to a boolean adjacency matrix representation.

    Returns
    @@ -584,8 +576,8 @@ it is performed also the chi_test.

    -
    -static build_complete_graph(node_ids: List)networkx.classes.digraph.DiGraph¶
    +
    +static build_complete_graph(node_ids: List) → networkx.classes.digraph.DiGraph¶

    Builds a complete directed graph (no self loops) given the nodes labels in the list node_ids:

    Parameters
    @@ -601,8 +593,8 @@ it is performed also the chi_test.

    -
    -build_removable_edges_matrix(known_edges: List)¶
    +
    +build_removable_edges_matrix(known_edges: List)¶

    Builds a boolean matrix who shows if a edge could be removed or not, based on prior knowledge given:

    Parameters
    @@ -618,8 +610,8 @@ it is performed also the chi_test.

    -
    -abstract estimate_structure()List¶
    +
    +abstract estimate_structure() → List¶

    Abstract method to estimate the structure

    Returns
    @@ -632,8 +624,8 @@ it is performed also the chi_test.

    -
    -static generate_possible_sub_sets_of_size(u: List, size: int, parent_label: str)¶
    +
    +static generate_possible_sub_sets_of_size(u: List, size: int, parent_label: str)¶

    Creates a list containing all possible subsets of the list u of size size, that do not contains a the node identified by parent_label.

    @@ -654,11 +646,9 @@ that do not contains a the node identified by -
    save_plot_estimated_structure_graph(file_path: str) → None¶

    Plot the estimated structure in a graphical model style, use .png extension.

    -
    Parameters

    file_path – path to save the file to

    @@ -670,8 +660,8 @@ that do not contains a the node identified by -
    -save_results(file_path: str)None¶
    +
    +save_results(file_path: str) → None¶

    Save the estimated Structure to a .json file in file_path.

    Parameters
    @@ -681,8 +671,8 @@ that do not contains a the node identified by -
    -spurious_edges()List¶
    +
    +spurious_edges() → List¶
    Return the spurious edges present in the estimated structure, if a prior net structure is present in

    _sample_path.structure.

    @@ -703,8 +693,8 @@ that do not contains a the node identified by

    PyCTBN.PyCTBN.estimators.structure_score_based_estimator module¶

    -
    -class PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator(sample_path: PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath, tau_xu: int = 0.1, alpha_xu: int = 1, known_edges: List = [])¶
    +
    +class PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator(sample_path: PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath, tau_xu: int = 0.1, alpha_xu: int = 1, known_edges: List = [])¶

    Bases: PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator

    Has the task of estimating the network structure given the trajectories in samplepath by using a score based approach and differt kinds of optimization algorithms.

    @@ -719,8 +709,8 @@ using a score based approach and differt kinds of optimization algorithms.

    -
    -estimate_parents(node_id: str, max_parents: Optional[int] = None, iterations_number: int = 40, patience: int = 10, tabu_length: Optional[int] = None, tabu_rules_duration: int = 5, optimizer: str = 'hill')¶
    +
    +estimate_parents(node_id: str, max_parents: int = None, iterations_number: int = 40, patience: int = 10, tabu_length: int = None, tabu_rules_duration: int = 5, optimizer: str = 'hill')¶

    Use the FamScore of a node in order to find the best parent nodes

    Parameters
    @@ -744,10 +734,8 @@ using a score based approach and differt kinds of optimization algorithms.

    -
    estimate_structure(max_parents: int = None, iterations_number: int = 40, patience: int = None, tabu_length: int = None, tabu_rules_duration: int = None, optimizer: str = 'tabu', disable_multiprocessing: bool = False, processes_number: int = None)¶
    -

    Compute the score-based algorithm to find the optimal structure

    Parameters
    @@ -768,8 +756,8 @@ using a score based approach and differt kinds of optimization algorithms.

    -
    -get_score_from_graph(graph: PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph, node_id: str)¶
    +
    +get_score_from_graph(graph: PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph, node_id: str)¶

    Get the FamScore of a node

    Parameters
    @@ -832,9 +820,6 @@ using a score based approach and differt kinds of optimization algorithms.

    FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/PyCTBN.PyCTBN.html b/docs/PyCTBN.PyCTBN.html index 17c42b8..29ef30a 100644 --- a/docs/PyCTBN.PyCTBN.html +++ b/docs/PyCTBN.PyCTBN.html @@ -19,10 +19,6 @@ - - - - @@ -212,9 +208,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/PyCTBN.PyCTBN.optimizers.html b/docs/PyCTBN.PyCTBN.optimizers.html index 94e6d69..58423f2 100644 --- a/docs/PyCTBN.PyCTBN.optimizers.html +++ b/docs/PyCTBN.PyCTBN.optimizers.html @@ -19,10 +19,6 @@ - - - - @@ -127,8 +123,8 @@

    PyCTBN.PyCTBN.optimizers.constraint_based_optimizer module¶

    -
    -class PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer(node_id: str, structure_estimator: PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator, tot_vars_count: int)¶
    +
    +class PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer(node_id: str, structure_estimator: PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator, tot_vars_count: int)¶

    Bases: PyCTBN.PyCTBN.optimizers.optimizer.Optimizer

    Optimizer class that implement a CTPC Algorithm

    @@ -141,8 +137,8 @@
    -
    -optimize_structure()¶
    +
    +optimize_structure()¶

    Compute Optimization process for a structure_estimator by using a CTPC Algorithm

    Returns
    @@ -160,8 +156,8 @@
    -
    +
    +

    PyCTBN.PyCTBN.structure_graph.network_generator module¶

    -
    -class PyCTBN.PyCTBN.structure_graph.network_generator.NetworkGenerator(labels, vals)¶
    +
    +class PyCTBN.PyCTBN.structure_graph.network_generator.NetworkGenerator(labels, vals)¶

    Bases: object

    Provides the methods to generate a network graph and the CIMs related to it Items in _labels, _vals and _indxs are related, and therefore respect the same order

    @@ -187,19 +183,19 @@ Items in _labels, _vals and _indxs are related, and therefore respect the same o
    -
    -
    -property cims: dict¶
    +
    +
    +property cims¶
    -
    -
    -property dyn_str: list¶
    +
    +
    +property dyn_str¶
    -
    -generate_cims(min_val, max_val)¶
    +
    +generate_cims(min_val, max_val)¶
    For each node, generate the corresponding SetOfCims. The objective is to group the CIMs

    (actually generated by private method __generate_cim) according to parents possibles states of every node. This method must obviously be executed after the graph has been generated.

    @@ -216,8 +212,8 @@ This method must obviously be executed after the graph has been generated.

    -
    -generate_graph(density, fixed: bool = False)¶
    +
    +generate_graph(density, fixed: bool = False)¶
    Generate the edges according to specified density, and then instantiate the NetworkGraph object

    to represent the network

    @@ -232,14 +228,14 @@ This method must obviously be executed after the graph has been generated.

    -
    -
    -property graph: PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph¶
    +
    +
    +property graph¶
    -
    -
    -property variables: list¶
    +
    +
    +property variables¶
    @@ -248,8 +244,8 @@ This method must obviously be executed after the graph has been generated.

    PyCTBN.PyCTBN.structure_graph.network_graph module¶

    -
    -class PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph(graph_struct: PyCTBN.PyCTBN.structure_graph.structure.Structure)¶
    +
    +class PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph(graph_struct: PyCTBN.PyCTBN.structure_graph.structure.Structure)¶

    Bases: object

    Abstracts the infos contained in the Structure class in the form of a directed graph. Has the task of creating all the necessary filtering and indexing structures for parameters estimation

    @@ -282,8 +278,8 @@ from one state to another

    -
    -add_edges(list_of_edges: List)None¶
    +
    +add_edges(list_of_edges: List) → None¶

    Add the edges to the _graph contained in the list list_of_edges.

    Parameters
    @@ -293,8 +289,8 @@ from one state to another

    -
    -add_nodes(list_of_nodes: List)None¶
    +
    +add_nodes(list_of_nodes: List) → None¶

    Adds the nodes to the _graph contained in the list of nodes list_of_nodes. Sets all the properties that identify a nodes (index, positional index, cardinality)

    @@ -305,8 +301,8 @@ Sets all the properties that identify a nodes (index, positional index, cardinal
    -
    -static build_p_comb_structure_for_a_node(parents_values: List)numpy.ndarray¶
    +
    +static build_p_comb_structure_for_a_node(parents_values: List) → numpy.ndarray¶

    Builds the combinatorial structure that contains the combinations of all the values contained in parents_values.

    @@ -323,8 +319,8 @@ Sets all the properties that identify a nodes (index, positional index, cardinal
    -
    -static build_time_columns_filtering_for_a_node(node_indx: int, p_indxs: List)numpy.ndarray¶
    +
    +static build_time_columns_filtering_for_a_node(node_indx: int, p_indxs: List) → numpy.ndarray¶

    Builds the necessary structure to filter the desired columns indicated by node_indx and p_indxs in the dataset. This structute will be used in the computation of the state res times. @@ -337,8 +333,8 @@ This structute will be used in the computation of the state res times.

    -
    -static build_time_scalar_indexing_structure_for_a_node(node_states: int, parents_vals: List)numpy.ndarray¶
    +
    +static build_time_scalar_indexing_structure_for_a_node(node_states: int, parents_vals: List) → numpy.ndarray¶

    Builds an indexing structure for the computation of state residence times values.

    Parameters
    @@ -357,8 +353,8 @@ This structute will be used in the computation of the state res times.
    -
    -static build_transition_filtering_for_a_node(node_indx: int, p_indxs: List, nodes_number: int)numpy.ndarray¶
    +
    +static build_transition_filtering_for_a_node(node_indx: int, p_indxs: List, nodes_number: int) → numpy.ndarray¶

    Builds the necessary structure to filter the desired columns indicated by node_indx and p_indxs in the dataset. This structure will be used in the computation of the state transitions values. @@ -373,8 +369,8 @@ This structure will be used in the computation of the state transitions values.

    -
    -static build_transition_scalar_indexing_structure_for_a_node(node_states_number: int, parents_vals: List)numpy.ndarray¶
    +
    +static build_transition_scalar_indexing_structure_for_a_node(node_states_number: int, parents_vals: List) → numpy.ndarray¶

    Builds an indexing structure for the computation of state transitions values.

    Parameters
    @@ -393,19 +389,19 @@ This structure will be used in the computation of the state transitions values.
    -
    -clear_indexing_filtering_structures()None¶
    +
    +clear_indexing_filtering_structures() → None¶

    Initialize all the filtering/indexing structures.

    -
    -
    -property edges: List¶
    +
    +
    +property edges¶
    -
    -fast_init(node_id: str)None¶
    +
    +fast_init(node_id: str) → None¶

    Initializes all the necessary structures for parameters estimation of the node identified by the label node_id

    @@ -416,13 +412,13 @@ node_id

    -
    -get_node_indx(node_id)int¶
    +
    +get_node_indx(node_id) → int¶
    -
    -get_ordered_by_indx_set_of_parents(node: str)Tuple¶
    +
    +get_ordered_by_indx_set_of_parents(node: str) → Tuple¶

    Builds the aggregated structure that holds all the infos relative to the parent set of the node, namely (parents_labels, parents_indexes, parents_cardinalities).

    @@ -439,8 +435,8 @@ node_id

    -
    -get_parents_by_id(node_id)List¶
    +
    +get_parents_by_id(node_id) → List¶

    Returns a list of labels of the parents of the node node_id

    Parameters
    @@ -456,18 +452,18 @@ node_id

    -
    -get_positional_node_indx(node_id)int¶
    +
    +get_positional_node_indx(node_id) → int¶
    -
    -get_states_number(node_id)int¶
    +
    +get_states_number(node_id) → int¶
    -
    -has_edge(edge: tuple)bool¶
    +
    +has_edge(edge: tuple) → bool¶

    Check if the graph contains a specific edge

    Parameters:

    edge: a tuple that rappresents the edge

    @@ -477,29 +473,29 @@ node_id

    -
    -
    -property nodes: List¶
    +
    +
    +property nodes¶
    -
    -
    -property nodes_indexes: numpy.ndarray¶
    +
    +
    +property nodes_indexes¶
    -
    -
    -property nodes_values: numpy.ndarray¶
    +
    +
    +property nodes_values¶
    -
    -
    -property p_combs: numpy.ndarray¶
    +
    +
    +property p_combs¶
    -
    -remove_edges(list_of_edges: List)None¶
    +
    +remove_edges(list_of_edges: List) → None¶

    Remove the edges to the graph contained in the list list_of_edges.

    Parameters
    @@ -509,30 +505,30 @@ node_id

    -
    -remove_node(node_id: str)None¶
    +
    +remove_node(node_id: str) → None¶

    Remove the node node_id from all the class members. Initialize all the filtering/indexing structures.

    -
    -
    -property time_filtering: numpy.ndarray¶
    +
    +
    +property time_filtering¶
    -
    -
    -property time_scalar_indexing_strucure: numpy.ndarray¶
    +
    +
    +property time_scalar_indexing_strucure¶
    -
    -
    -property transition_filtering: numpy.ndarray¶
    +
    +
    +property transition_filtering¶
    -
    -
    -property transition_scalar_indexing_structure: numpy.ndarray¶
    +
    +
    +property transition_scalar_indexing_structure¶
    @@ -541,8 +537,8 @@ Initialize all the filtering/indexing structures.

    PyCTBN.PyCTBN.structure_graph.sample_path module¶

    -
    -class PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath(importer: PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter)¶
    +
    +class PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath(importer: PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter)¶

    Bases: object

    Aggregates all the informations about the trajectories, the real structure of the sampled net and variables cardinalites. Has the task of creating the objects Trajectory and Structure that will @@ -562,41 +558,41 @@ contain the mentioned data.

    -
    -build_structure()None¶
    +
    +build_structure() → None¶

    Builds the Structure object that aggregates all the infos about the net.

    -
    -build_trajectories()None¶
    +
    +build_trajectories() → None¶

    Builds the Trajectory object that will contain all the trajectories. Clears all the unused dataframes in _importer Object

    -
    -clear_memory()¶
    +
    +clear_memory()¶
    -
    -
    -property has_prior_net_structure: bool¶
    +
    +
    +property has_prior_net_structure¶
    -
    -
    -property structure: PyCTBN.PyCTBN.structure_graph.structure.Structure¶
    +
    +
    +property structure¶
    -
    -
    -property total_variables_count: int¶
    +
    +
    +property total_variables_count¶
    -
    -
    -property trajectories: PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory¶
    +
    +
    +property trajectories¶
    @@ -605,8 +601,8 @@ Clears all the unused dataframes in <

    PyCTBN.PyCTBN.structure_graph.set_of_cims module¶

    -
    -class PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims(node_id: str, parents_states_number: List, node_states_number: int, p_combs: numpy.ndarray, cims: Optional[numpy.ndarray] = None)¶
    +
    +class PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims(node_id: str, parents_states_number: List, node_states_number: int, p_combs: numpy.ndarray, cims: numpy.ndarray = None)¶

    Bases: object

    Aggregates all the CIMS of the node identified by the label _node_id.

    @@ -628,14 +624,14 @@ Clears all the unused dataframes in <

    the cims of the node

    -
    -
    -property actual_cims: numpy.ndarray¶
    +
    +
    +property actual_cims¶
    -
    -build_cims(state_res_times: numpy.ndarray, transition_matrices: numpy.ndarray)None¶
    +
    +build_cims(state_res_times: numpy.ndarray, transition_matrices: numpy.ndarray) → None¶

    Build the ConditionalIntensityMatrix objects given the state residence times and transitions matrices. Compute the cim coefficients.The class member _actual_cims will contain the computed cims.

    @@ -649,14 +645,14 @@ Compute the cim coefficients.The class member -
    -build_times_and_transitions_structures()None¶
    +
    +build_times_and_transitions_structures() → None¶

    Initializes at the correct dimensions the state residence times matrix and the state transition matrices.

    -
    -filter_cims_with_mask(mask_arr: numpy.ndarray, comb: List)numpy.ndarray¶
    +
    +filter_cims_with_mask(mask_arr: numpy.ndarray, comb: List) → numpy.ndarray¶

    Filter the cims contained in the array _actual_cims given the boolean mask mask_arr and the index comb.

    @@ -676,13 +672,13 @@ Compute the cim coefficients.The class member -
    -get_cims_number()¶
    +
    +get_cims_number()¶
    -
    -
    -property p_combs: numpy.ndarray¶
    +
    +
    +property p_combs¶
    @@ -691,8 +687,8 @@ Compute the cim coefficients.The class member

    PyCTBN.PyCTBN.structure_graph.structure module¶

    -
    -class PyCTBN.PyCTBN.structure_graph.structure.Structure(nodes_labels_list: List, nodes_indexes_arr: numpy.ndarray, nodes_vals_arr: numpy.ndarray, edges_list: List, total_variables_number: int)¶
    +
    +class PyCTBN.PyCTBN.structure_graph.structure.Structure(nodes_labels_list: List, nodes_indexes_arr: numpy.ndarray, nodes_vals_arr: numpy.ndarray, edges_list: List, total_variables_number: int)¶

    Bases: object

    Contains all the infos about the network structure(nodes labels, nodes caridinalites, edges, indexes)

    @@ -707,28 +703,28 @@ Compute the cim coefficients.The class member -
    -add_edge(edge: tuple)¶
    +
    +add_edge(edge: tuple)¶
    -
    -clean_structure_edges()¶
    +
    +clean_structure_edges()¶
    -
    -contains_edge(edge: tuple)bool¶
    +
    +contains_edge(edge: tuple) → bool¶
    -
    -
    -property edges: List¶
    +
    +
    +property edges¶
    -
    -get_node_id(node_indx: int)str¶
    +
    +get_node_id(node_indx: int) → str¶

    Given the node_index returns the node label.

    Parameters
    @@ -744,8 +740,8 @@ Compute the cim coefficients.The class member -
    -get_node_indx(node_id: str)int¶
    +
    +get_node_indx(node_id: str) → int¶

    Given the node_index returns the node label.

    Parameters
    @@ -761,13 +757,13 @@ Compute the cim coefficients.The class member -
    -get_positional_node_indx(node_id: str)int¶
    +
    +get_positional_node_indx(node_id: str) → int¶
    -
    -get_states_number(node: str)int¶
    +
    +get_states_number(node: str) → int¶

    Given the node label node returns the cardinality of the node.

    Parameters
    @@ -782,36 +778,36 @@ Compute the cim coefficients.The class member -
    -property nodes_indexes: numpy.ndarray¶
    +
    +
    +property nodes_indexes¶
    -
    -
    -property nodes_labels: List¶
    +
    +
    +property nodes_labels¶
    -
    -
    -property nodes_values: numpy.ndarray¶
    +
    +
    +property nodes_values¶
    -
    -remove_edge(edge: tuple)¶
    +
    +remove_edge(edge: tuple)¶
    -
    -remove_node(node_id: str)None¶
    +
    +remove_node(node_id: str) → None¶

    Remove the node node_id from all the class members. The class member _total_variables_number since it refers to the total number of variables in the dataset.

    -
    -
    -property total_variables_number: int¶
    +
    +
    +property total_variables_number¶
    @@ -820,8 +816,8 @@ The class member _t

    PyCTBN.PyCTBN.structure_graph.trajectory module¶

    -
    -class PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory(list_of_columns: List, original_cols_number: int)¶
    +
    +class PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory(list_of_columns: List, original_cols_number: int)¶

    Bases: object

    Abstracts the infos about a complete set of trajectories, represented as a numpy array of doubles (the time deltas) and a numpy matrix of ints (the changes of states).

    @@ -839,32 +835,101 @@ The class member _t

    the array containing the time deltas

    -
    -
    -property complete_trajectory: numpy.ndarray¶
    +
    +
    +property complete_trajectory¶
    -
    -size()¶
    +
    +size()¶
    -
    -
    -property times¶
    +
    +
    +property times¶
    -
    -
    -property trajectory: numpy.ndarray¶
    +
    +
    +property trajectory¶
    +
    +
    +

    PyCTBN.PyCTBN.structure_graph.trajectory_generator module¶

    +
    +
    +class PyCTBN.PyCTBN.structure_graph.trajectory_generator.TrajectoryGenerator(importer: PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter = None, variables: pandas.core.frame.DataFrame = None, dyn_str: pandas.core.frame.DataFrame = None, dyn_cims: dict = None)¶
    +

    Bases: object

    +

    Provides the methods to generate a trajectory basing on the network defined +in the importer.

    +
    +
    Parameters
    +
      +
    • _importer (AbstractImporter) – the Importer object which contains the imported and processed data

    • +
    • _vnames (List) – List of the variables labels that belong to the network

    • +
    • _parents (Dict) – It contains, for each variable label (the key), the list of related parents labels

    • +
    • _cims (Dict) – It contains, for each variable label (the key), the SetOfCims object related to it

    • +
    • _generated_trajectory (pandas.DataFrame) – Result of the execution of CTBN_Sample, contains the output trajectory

    • +
    +
    +
    +
    +
    +CTBN_Sample(t_end=- 1, max_tr=- 1)¶
    +
    +
    This method implements the generation of a trajectory, basing on the network structure and

    on the coefficients defined in the CIMs. +The variables are initialized with value 0, and the method takes care of adding the +conventional last row made up of -1.

    +
    +
    +
    +
    Parameters
    +
      +
    • t_end (float) – If defined, the sampling ends when end time is reached

    • +
    • max_tr (int) – Parameter taken in consideration in case that t_end isn’t defined. It specifies the number of transitions to execute

    • +
    +
    +
    +
    + +
    +
    +multi_trajectory(t_ends: list = None, max_trs: list = None)¶
    +

    Generate n trajectories in parallel, where n is the number of items in +t_ends, if defined, or the number of items in max_trs otherwise

    +
    +
    Parameters
    +
      +
    • t_ends (list) – List of t_end values for the trajectories that will be generated

    • +
    • max_trs (list) – List of max_tr values for the trajectories that will be generated

    • +
    +
    +
    +
    + +
    +
    +worker(t_end, max_tr, trajectories)¶
    +

    Single process that will be executed in parallel in order to generate one trajectory.

    +
    +
    Parameters
    +
      +
    • t_end (float) – If defined, the sampling ends when end time is reached

    • +
    • max_tr (int) – Parameter taken in consideration in case that t_end isn’t defined. It specifies the number of transitions to execute

    • +
    • trajectories (list) – Shared list that contains to which the generated trajectory is added

    • +
    +
    +
    +
    + +
    -

    Module contents¶

    @@ -906,9 +971,6 @@ The class member _t FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/PyCTBN.PyCTBN.utility.html b/docs/PyCTBN.PyCTBN.utility.html index 05eaa8e..fe87d56 100644 --- a/docs/PyCTBN.PyCTBN.utility.html +++ b/docs/PyCTBN.PyCTBN.utility.html @@ -19,10 +19,6 @@ - - - - @@ -123,14 +119,58 @@

    PyCTBN.PyCTBN.utility package¶

    Submodules¶

    +
    +
    +

    PyCTBN.PyCTBN.utility.abstract_exporter module¶

    +
    +
    +class PyCTBN.PyCTBN.utility.abstract_exporter.AbstractExporter(variables: pandas.core.frame.DataFrame = None, dyn_str: pandas.core.frame.DataFrame = None, dyn_cims: dict = None)¶
    +

    Bases: abc.ABC

    +

    Abstract class that exposes the methods to save in json format a network information +along with one or more trajectories generated basing on it

    +
    +
    Parameters
    +
      +
    • _variables (pandas.DataFrame) – Dataframe containing the nodes labels and cardinalities

    • +
    • _dyn_str (pandas.DataFrame) – Dataframe containing the structure of the network (edges)

    • +
    • _dyn_cims (dict) – It contains, for every variable (label is the key), the SetOfCims object related to it

    • +
    • _trajectories (List) – List of trajectories, that can be added subsequently

    • +
    +
    +
    +
    +
    +add_trajectory(trajectory: list)¶
    +

    Add a new trajectory to the current list

    +
    +
    Parameters
    +

    trajectory (pandas.DataFrame) – The trajectory to add

    +
    +
    +
    + +
    +
    +abstract out_file(filename)¶
    +
    +
    Create a file in current directory and write on it the previously added data

    (variables, dyn_str, dyn_cims and trajectories)

    +
    +
    +
    +
    Parameters
    +

    filename (string) – Name of the output file (it must include json extension)

    +
    +
    +
    + +
    -

    PyCTBN.PyCTBN.utility.abstract_importer module¶

    -
    -class PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter(file_path: Optional[str] = None, trajectory_list: Optional[Union[pandas.core.frame.DataFrame, numpy.ndarray]] = None, variables: Optional[pandas.core.frame.DataFrame] = None, prior_net_structure: Optional[pandas.core.frame.DataFrame] = None)¶
    +
    +class PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter(file_path: str = None, trajectory_list: Union[pandas.core.frame.DataFrame, numpy.ndarray] = None, variables: pandas.core.frame.DataFrame = None, prior_net_structure: pandas.core.frame.DataFrame = None)¶

    Bases: abc.ABC

    Abstract class that exposes all the necessary methods to process the trajectories and the net structure.

    @@ -161,8 +201,8 @@ See the tutorial on how to construct a correct JsonImporter for an example implementation

    -
    -build_list_of_samples_array(concatenated_sample: pandas.core.frame.DataFrame)List¶
    +
    +build_list_of_samples_array(concatenated_sample: pandas.core.frame.DataFrame) → List¶

    Builds a List containing the the delta times numpy array, and the complete transitions matrix

    Parameters
    @@ -179,8 +219,8 @@ and converted

    -
    -abstract build_sorter(trajecory_header: object)List¶
    +
    +abstract build_sorter(trajecory_header: object) → List¶

    Initializes the _sorter class member from a trajectory dataframe, exctracting the header of the frame and keeping ONLY the variables symbolic labels, cutting out the time label in the header.

    @@ -197,14 +237,14 @@ and keeping ONLY the variables symbolic labels, cutting out the time label in th
    -
    -clear_concatenated_frame()None¶
    +
    +clear_concatenated_frame() → None¶

    Removes all values in the dataframe concatenated_samples.

    -
    -compute_row_delta_in_all_samples_frames(df_samples_list: List)None¶
    +
    +compute_row_delta_in_all_samples_frames(df_samples_list: List) → None¶

    Calls the method compute_row_delta_sigle_samples_frame on every dataframe present in the list df_samples_list. Concatenates the result in the dataframe concatanated_samples

    @@ -227,8 +267,8 @@ and merged trajectories

    -
    -compute_row_delta_sigle_samples_frame(sample_frame: pandas.core.frame.DataFrame, columns_header: List, shifted_cols_header: List)pandas.core.frame.DataFrame¶
    +
    +compute_row_delta_sigle_samples_frame(sample_frame: pandas.core.frame.DataFrame, columns_header: List, shifted_cols_header: List) → pandas.core.frame.DataFrame¶

    Computes the difference between each value present in th time column. Copies and shift by one position up all the values present in the remaining columns.

    @@ -253,36 +293,36 @@ Header of sample_frame = [Time | Variable values]

    -
    -
    -property concatenated_samples: pandas.core.frame.DataFrame¶
    +
    +
    +property concatenated_samples¶
    -
    -abstract dataset_id()object¶
    +
    +abstract dataset_id() → object¶

    If the original dataset contains multiple dataset, this method returns a unique id to identify the current dataset

    -
    -
    -property file_path: str¶
    +
    +
    +property file_path¶
    -
    -
    -property sorter: List¶
    +
    +
    +property sorter¶
    -
    -
    -property structure: pandas.core.frame.DataFrame¶
    +
    +
    +property structure¶
    -
    -
    -property variables: pandas.core.frame.DataFrame¶
    +
    +
    +property variables¶
    @@ -291,8 +331,8 @@ dataset

    PyCTBN.PyCTBN.utility.cache module¶

    -
    -class PyCTBN.PyCTBN.utility.cache.Cache¶
    +
    +class PyCTBN.PyCTBN.utility.cache.Cache¶

    Bases: object

    This class acts as a cache of SetOfCims objects for a node.

    @@ -305,14 +345,14 @@ index is related

    -
    -clear()¶
    +
    +clear()¶

    Clear the contents both of __actual_cache and __list_of_sets_of_parents.

    -
    -find(parents_comb: Set)¶
    +
    +find(parents_comb: Set)¶

    Tries to find in cache given the symbolic parents combination parents_comb the SetOfCims related to that parents_comb.

    @@ -330,8 +370,8 @@ None otherwise.

    -
    -put(parents_comb: Set, socim: PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims)¶
    +
    +put(parents_comb: Set, socim: PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims)¶

    Place in cache the SetOfCims object, and the related symbolic index parents_comb in __list_of_sets_of_parents.

    @@ -346,14 +386,52 @@ None otherwise.

    +
    +
    +

    PyCTBN.PyCTBN.utility.json_exporter module¶

    +
    +
    +class PyCTBN.PyCTBN.utility.json_exporter.JsonExporter(variables: pandas.core.frame.DataFrame = None, dyn_str: pandas.core.frame.DataFrame = None, dyn_cims: dict = None)¶
    +

    Bases: PyCTBN.PyCTBN.utility.abstract_exporter.AbstractExporter

    +

    Provides the methods to save in json format a network information +along with one or more trajectories generated basing on it

    +
    +
    Parameters
    +
      +
    • _variables (pandas.DataFrame) – Dataframe containing the nodes labels and cardinalities

    • +
    • _dyn_str (pandas.DataFrame) – Dataframe containing the structure of the network (edges)

    • +
    • _dyn_cims (dict) – It contains, for every variable (label is the key), the SetOfCims object related to it

    • +
    • _trajectories (List) – List of trajectories, that can be added subsequently

    • +
    +
    +
    +
    +
    +cims_to_json() → dict¶
    +
    + +
    +
    +out_file(filename)¶
    +
    +
    Create a file in current directory and write on it the previously added data

    (variables, dyn_str, dyn_cims and trajectories)

    +
    +
    +
    +
    Parameters
    +

    filename (string) – Name of the output file (it must include json extension)

    +
    +
    +
    + +
    -

    PyCTBN.PyCTBN.utility.json_importer module¶

    -
    -class PyCTBN.PyCTBN.utility.json_importer.JsonImporter(file_path: str, samples_label: str, structure_label: str, variables_label: str, time_key: str, variables_key: str, cims_label: Optional[str] = None)¶
    +
    +class PyCTBN.PyCTBN.utility.json_importer.JsonImporter(file_path: str, samples_label: str, structure_label: str, variables_label: str, time_key: str, variables_key: str, cims_label: str = None)¶

    Bases: PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter

    Implements the abstracts methods of AbstractImporter and adds all the necessary methods to process and prepare the data in json extension.

    @@ -379,29 +457,27 @@ the data in json extension.

    -
    -build_sorter(sample_frame: pandas.core.frame.DataFrame)List¶
    +
    +build_sorter(sample_frame: pandas.core.frame.DataFrame) → List¶

    Implements the abstract method build_sorter of the AbstractImporter for this dataset.

    -
    -clear_data_frame_list()None¶
    +
    +clear_data_frame_list() → None¶

    Removes all values present in the dataframes in the list _df_samples_list.

    -
    -dataset_id()object¶
    +
    +dataset_id() → object¶

    If the original dataset contains multiple dataset, this method returns a unique id to identify the current dataset

    -
    import_data(indx: int = 0) → None¶
    -

    Implements the abstract method of AbstractImporter.

    Parameters
    @@ -411,8 +487,8 @@ dataset

    -
    -import_sampled_cims(raw_data: List, indx: int, cims_key: str)Dict¶
    +
    +import_sampled_cims(raw_data: List, indx: int, cims_key: str) → Dict¶

    Imports the synthetic CIMS in the dataset in a dictionary, using variables labels as keys for the set of CIMS of a particular node.

    @@ -433,8 +509,8 @@ as keys for the set of CIMS of a particular node.

    -
    -import_structure(raw_data: List)pandas.core.frame.DataFrame¶
    +
    +import_structure(raw_data: List) → pandas.core.frame.DataFrame¶

    Imports in a dataframe the data in the list raw_data at the key _structure_label

    Parameters
    @@ -450,8 +526,8 @@ as keys for the set of CIMS of a particular node.

    -
    -import_trajectories(raw_data: List)List¶
    +
    +import_trajectories(raw_data: List) → List¶

    Imports the trajectories from the list of dicts raw_data.

    Parameters
    @@ -467,8 +543,8 @@ as keys for the set of CIMS of a particular node.

    -
    -import_variables(raw_data: List)pandas.core.frame.DataFrame¶
    +
    +import_variables(raw_data: List) → pandas.core.frame.DataFrame¶

    Imports the data in raw_data at the key _variables_label.

    Parameters
    @@ -484,8 +560,8 @@ as keys for the set of CIMS of a particular node.

    -
    -normalize_trajectories(raw_data: List, indx: int, trajectories_key: str)List¶
    +
    +normalize_trajectories(raw_data: List, indx: int, trajectories_key: str) → List¶

    Extracts the trajectories in raw_data at the index index at the key trajectories key.

    Parameters
    @@ -505,8 +581,8 @@ as keys for the set of CIMS of a particular node.

    -
    -one_level_normalizing(raw_data: List, indx: int, key: str)pandas.core.frame.DataFrame¶
    +
    +one_level_normalizing(raw_data: List, indx: int, key: str) → pandas.core.frame.DataFrame¶

    Extracts the one-level nested data in the list raw_data at the index indx at the key key.

    Parameters
    @@ -526,8 +602,8 @@ as keys for the set of CIMS of a particular node.

    -
    -read_json_file()List¶
    +
    +read_json_file() → List¶

    Reads the JSON file in the path self.filePath.

    Returns
    @@ -545,8 +621,8 @@ as keys for the set of CIMS of a particular node.

    PyCTBN.PyCTBN.utility.sample_importer module¶

    -
    -class PyCTBN.PyCTBN.utility.sample_importer.SampleImporter(trajectory_list: Optional[Union[pandas.core.frame.DataFrame, numpy.ndarray, List]] = None, variables: Optional[Union[pandas.core.frame.DataFrame, numpy.ndarray, List]] = None, prior_net_structure: Optional[Union[pandas.core.frame.DataFrame, numpy.ndarray, List]] = None)¶
    +
    +class PyCTBN.PyCTBN.utility.sample_importer.SampleImporter(trajectory_list: Union[pandas.core.frame.DataFrame, numpy.ndarray, List] = None, variables: Union[pandas.core.frame.DataFrame, numpy.ndarray, List] = None, prior_net_structure: Union[pandas.core.frame.DataFrame, numpy.ndarray, List] = None)¶

    Bases: PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter

    Implements the abstracts methods of AbstractImporter and adds all the necessary methods to process and prepare the data loaded directly by using DataFrame

    @@ -566,21 +642,21 @@ the data loaded directly by using DataFrame

    -
    -build_sorter(sample_frame: pandas.core.frame.DataFrame)List¶
    +
    +build_sorter(sample_frame: pandas.core.frame.DataFrame) → List¶

    Implements the abstract method build_sorter of the AbstractImporter in order to get the ordered variables list.

    -
    -dataset_id()str¶
    +
    +dataset_id() → str¶

    If the original dataset contains multiple dataset, this method returns a unique id to identify the current dataset

    -
    -import_data(header_column=None)¶
    +
    +import_data(header_column=None)¶
    @@ -628,9 +704,6 @@ dataset

    FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/PyCTBN.html b/docs/PyCTBN.html index a6024f3..c4d5c15 100644 --- a/docs/PyCTBN.html +++ b/docs/PyCTBN.html @@ -19,10 +19,6 @@ - - - - @@ -177,29 +173,29 @@
  • PyCTBN.tests.estimators package
  • PyCTBN.tests.optimizers package
  • PyCTBN.tests.structure_graph package
  • @@ -221,10 +217,14 @@

    Submodules¶

    - +
    +
    +

    PyCTBN.basic_main module¶

    +
    +
    +

    PyCTBN.setup module¶

    -

    Module contents¶

    @@ -257,9 +257,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/PyCTBN.tests.estimators.html b/docs/PyCTBN.tests.estimators.html index c39f871..8a63d1f 100644 --- a/docs/PyCTBN.tests.estimators.html +++ b/docs/PyCTBN.tests.estimators.html @@ -19,10 +19,6 @@ - - - - @@ -124,43 +120,42 @@

    PyCTBN.tests.estimators.test_parameters_estimator module¶

    -
    -class PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior(methodName='runTest')¶
    +
    +class PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -aux_import_sampled_cims(cims_label)¶
    +
    +aux_import_sampled_cims(cims_label)¶
    -
    -cim_equality_test(cim1, cim2)¶
    +
    +cim_equality_test(cim1, cim2)¶
    -
    -equality_of_cims_of_node(sampled_cims, estimated_cims)¶
    +
    +equality_of_cims_of_node(sampled_cims, estimated_cims)¶
    -
    -classmethod setUpClass()None¶
    +
    +classmethod setUpClass() → None¶

    Hook method for setting up class fixture before running tests in the class.

    -
    -test_compute_parameters_for_node()¶
    +
    +test_compute_parameters_for_node()¶
    -
    -test_fast_init()¶
    +
    +test_fast_init()¶
    -

    PyCTBN.tests.estimators.test_structure_constraint_based_estimator module¶

    @@ -193,61 +188,59 @@
    -

    PyCTBN.tests.estimators.test_structure_estimator module¶

    -
    -class PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator(methodName='runTest')¶
    +
    +class PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -classmethod setUpClass()¶
    +
    +classmethod setUpClass()¶

    Hook method for setting up class fixture before running tests in the class.

    -
    -test_adjacency_matrix()¶
    +
    +test_adjacency_matrix()¶
    -
    -test_build_complete_graph()¶
    +
    +test_build_complete_graph()¶
    -
    -test_build_removable_edges_matrix()¶
    +
    +test_build_removable_edges_matrix()¶
    -
    -test_generate_possible_sub_sets_of_size()¶
    +
    +test_generate_possible_sub_sets_of_size()¶
    -
    -test_init()¶
    +
    +test_init()¶
    -
    -test_save_plot_estimated_graph()¶
    +
    +test_save_plot_estimated_graph()¶
    -
    -test_save_results()¶
    +
    +test_save_results()¶
    -
    -test_time()¶
    +
    +test_time()¶
    -

    PyCTBN.tests.estimators.test_structure_score_based_estimator module¶

    @@ -317,9 +310,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/PyCTBN.tests.html b/docs/PyCTBN.tests.html index 57c3a3d..7036b72 100644 --- a/docs/PyCTBN.tests.html +++ b/docs/PyCTBN.tests.html @@ -19,10 +19,6 @@ - - - - @@ -125,29 +121,29 @@
  • PyCTBN.tests.estimators package
  • PyCTBN.tests.optimizers package
  • PyCTBN.tests.structure_graph package
  • @@ -195,9 +191,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/PyCTBN.tests.optimizers.html b/docs/PyCTBN.tests.optimizers.html index 2e20c9a..96038cc 100644 --- a/docs/PyCTBN.tests.optimizers.html +++ b/docs/PyCTBN.tests.optimizers.html @@ -19,10 +19,6 @@ - - - - @@ -204,9 +200,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/PyCTBN.tests.structure_graph.html b/docs/PyCTBN.tests.structure_graph.html index 581cd0c..a63e83d 100644 --- a/docs/PyCTBN.tests.structure_graph.html +++ b/docs/PyCTBN.tests.structure_graph.html @@ -19,10 +19,6 @@ - - - - @@ -124,28 +120,47 @@

    PyCTBN.tests.structure_graph.test_cim module¶

    -
    -class PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix(methodName='runTest')¶
    +
    +class PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -classmethod setUpClass()None¶
    +
    +classmethod setUpClass() → None¶

    Hook method for setting up class fixture before running tests in the class.

    -
    -test_compute_cim_coefficients()¶
    +
    +test_compute_cim_coefficients()¶
    -
    -test_init()¶
    +
    +test_init()¶
    -
    -test_repr()¶
    +
    +test_repr()¶
    +
    + +
    + +
    +
    +

    PyCTBN.tests.structure_graph.test_networkgenerator module¶

    +
    +
    +class PyCTBN.tests.structure_graph.test_networkgenerator.TestNetworkGenerator(methodName='runTest')¶
    +

    Bases: unittest.case.TestCase

    +
    +
    +test_generate_cims()¶
    +
    + +
    +
    +test_generate_graph()¶
    @@ -154,103 +169,103 @@

    PyCTBN.tests.structure_graph.test_networkgraph module¶

    -
    -class PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph(methodName='runTest')¶
    +
    +class PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -aux_build_p_combs_structure(graph, p_vals)¶
    +
    +aux_build_p_combs_structure(graph, p_vals)¶
    -
    -aux_build_time_columns_filtering_structure_for_a_node(graph, node_id, p_indxs)¶
    +
    +aux_build_time_columns_filtering_structure_for_a_node(graph, node_id, p_indxs)¶
    -
    -aux_build_time_scalar_indexing_structure_for_a_node(graph, node_id, parents_indxs, parents_labels, parents_vals)¶
    +
    +aux_build_time_scalar_indexing_structure_for_a_node(graph, node_id, parents_indxs, parents_labels, parents_vals)¶
    -
    -aux_build_transition_columns_filtering_structure(graph, node_id, p_indxs)¶
    +
    +aux_build_transition_columns_filtering_structure(graph, node_id, p_indxs)¶
    -
    -aux_build_transition_scalar_indexing_structure_for_a_node(graph, node_id, parents_indxs, parents_labels, parents_values)¶
    +
    +aux_build_transition_scalar_indexing_structure_for_a_node(graph, node_id, parents_indxs, parents_labels, parents_values)¶
    -
    -classmethod setUpClass()¶
    +
    +classmethod setUpClass()¶

    Hook method for setting up class fixture before running tests in the class.

    -
    -test_add_edges()¶
    +
    +test_add_edges()¶
    -
    -test_add_nodes()¶
    +
    +test_add_nodes()¶
    -
    -test_build_p_combs_structure()¶
    +
    +test_build_p_combs_structure()¶
    -
    -test_build_time_columns_filtering_structure_for_a_node()¶
    +
    +test_build_time_columns_filtering_structure_for_a_node()¶
    -
    -test_build_time_scalar_indexing_structure_for_a_node()¶
    +
    +test_build_time_scalar_indexing_structure_for_a_node()¶
    -
    -test_build_transition_columns_filtering_structure()¶
    +
    +test_build_transition_columns_filtering_structure()¶
    -
    -test_build_transition_scalar_indexing_structure_for_a_node()¶
    +
    +test_build_transition_scalar_indexing_structure_for_a_node()¶
    -
    -test_fast_init()¶
    +
    +test_fast_init()¶
    -
    -test_get_node_indx()¶
    +
    +test_get_node_indx()¶
    -
    -test_get_ordered_by_indx_set_of_parents()¶
    +
    +test_get_ordered_by_indx_set_of_parents()¶
    -
    -test_get_parents_by_id()¶
    +
    +test_get_parents_by_id()¶
    -
    -test_get_states_number()¶
    +
    +test_get_states_number()¶
    -
    -test_init()¶
    +
    +test_init()¶
    @@ -259,58 +274,58 @@

    PyCTBN.tests.structure_graph.test_sample_path module¶

    -
    -class PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath(methodName='runTest')¶
    +
    +class PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -classmethod setUpClass()None¶
    +
    +classmethod setUpClass() → None¶

    Hook method for setting up class fixture before running tests in the class.

    -
    -test_buid_samplepath_no_concatenated_samples()¶
    +
    +test_buid_samplepath_no_concatenated_samples()¶
    -
    -test_buid_samplepath_no_variables()¶
    +
    +test_buid_samplepath_no_variables()¶
    -
    -test_build_saplepath_no_prior_net_structure()¶
    +
    +test_build_saplepath_no_prior_net_structure()¶
    -
    -test_build_structure()¶
    +
    +test_build_structure()¶
    -
    -test_build_structure_bad_sorter()¶
    +
    +test_build_structure_bad_sorter()¶
    -
    -test_build_trajectories()¶
    +
    +test_build_trajectories()¶
    -
    -test_init()¶
    +
    +test_init()¶
    -
    -test_init_not_filled_dataframse()¶
    +
    +test_init_not_filled_dataframse()¶
    -
    -test_init_not_initialized_importer()¶
    +
    +test_init_not_initialized_importer()¶
    @@ -319,27 +334,27 @@

    PyCTBN.tests.structure_graph.test_setofcims module¶

    -
    -class PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims(methodName='runTest')¶
    +
    +class PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -another_filtering_method(p_combs, mask, parent_value)¶
    +
    +another_filtering_method(p_combs, mask, parent_value)¶
    -
    -aux_test_build_cims(node_id, p_values, node_states, p_combs)¶
    +
    +aux_test_build_cims(node_id, p_values, node_states, p_combs)¶
    -
    -aux_test_init(node_id, parents_states_number, node_states_number, p_combs)¶
    +
    +aux_test_init(node_id, parents_states_number, node_states_number, p_combs)¶
    -
    -build_p_comb_structure_for_a_node(parents_values)¶
    +
    +build_p_comb_structure_for_a_node(parents_values)¶

    Builds the combinatory structure that contains the combinations of all the values contained in parents_values.

    Parameters:

    parents_values: the cardinalities of the nodes

    @@ -350,24 +365,24 @@
    -
    -classmethod setUpClass()None¶
    +
    +classmethod setUpClass() → None¶

    Hook method for setting up class fixture before running tests in the class.

    -
    -test_build_cims()¶
    +
    +test_build_cims()¶
    -
    -test_filter_cims_with_mask()¶
    +
    +test_filter_cims_with_mask()¶
    -
    -test_init()¶
    +
    +test_init()¶
    @@ -376,53 +391,53 @@

    PyCTBN.tests.structure_graph.test_structure module¶

    -
    -class PyCTBN.tests.structure_graph.test_structure.TestStructure(methodName='runTest')¶
    +
    +class PyCTBN.tests.structure_graph.test_structure.TestStructure(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -classmethod setUpClass()¶
    +
    +classmethod setUpClass()¶

    Hook method for setting up class fixture before running tests in the class.

    -
    -test_edges_operations()¶
    +
    +test_edges_operations()¶
    -
    -test_equality()¶
    +
    +test_equality()¶
    -
    -test_get_node_id()¶
    +
    +test_get_node_id()¶
    -
    -test_get_node_indx()¶
    +
    +test_get_node_indx()¶
    -
    -test_get_positional_node_indx()¶
    +
    +test_get_positional_node_indx()¶
    -
    -test_get_states_number()¶
    +
    +test_get_states_number()¶
    -
    -test_init()¶
    +
    +test_init()¶
    -
    -test_repr()¶
    +
    +test_repr()¶
    @@ -431,22 +446,56 @@

    PyCTBN.tests.structure_graph.test_trajectory module¶

    -
    -class PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory(methodName='runTest')¶
    +
    +class PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -classmethod setUpClass()None¶
    +
    +classmethod setUpClass() → None¶

    Hook method for setting up class fixture before running tests in the class.

    -
    -test_init()¶
    +
    +test_init()¶
    +
    +
    +

    PyCTBN.tests.structure_graph.test_trajectorygenerator module¶

    +
    +
    +class PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator(methodName='runTest')¶
    +

    Bases: unittest.case.TestCase

    +
    +
    +classmethod setUpClass() → None¶
    +

    Hook method for setting up class fixture before running tests in the class.

    +
    + +
    +
    +test_generated_trajectory()¶
    +
    + +
    +
    +test_generated_trajectory_max_tr()¶
    +
    + +
    +
    +test_init()¶
    +
    + +
    +
    +test_multi_trajectory()¶
    +
    + +
    @@ -482,9 +531,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/PyCTBN.tests.utility.html b/docs/PyCTBN.tests.utility.html index 6e10516..606ce71 100644 --- a/docs/PyCTBN.tests.utility.html +++ b/docs/PyCTBN.tests.utility.html @@ -19,10 +19,6 @@ - - - - @@ -124,27 +120,27 @@

    PyCTBN.tests.utility.test_cache module¶

    -
    -class PyCTBN.tests.utility.test_cache.TestCache(methodName='runTest')¶
    +
    +class PyCTBN.tests.utility.test_cache.TestCache(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -test_clear()¶
    +
    +test_clear()¶
    -
    -test_find()¶
    +
    +test_find()¶
    -
    -test_init()¶
    +
    +test_init()¶
    -
    -test_put()¶
    +
    +test_put()¶
    @@ -153,108 +149,108 @@

    PyCTBN.tests.utility.test_json_importer module¶

    -
    -class PyCTBN.tests.utility.test_json_importer.TestJsonImporter(methodName='runTest')¶
    +
    +class PyCTBN.tests.utility.test_json_importer.TestJsonImporter(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -ordered(obj)¶
    +
    +ordered(obj)¶
    -
    -classmethod setUpClass()None¶
    +
    +classmethod setUpClass() → None¶

    Hook method for setting up class fixture before running tests in the class.

    -
    -test_build_sorter()¶
    +
    +test_build_sorter()¶
    -
    -test_clear_concatenated_frame()¶
    +
    +test_clear_concatenated_frame()¶
    -
    -test_clear_data_frame_list()¶
    +
    +test_clear_data_frame_list()¶
    -
    -test_compute_row_delta_in_all_frames()¶
    +
    +test_compute_row_delta_in_all_frames()¶
    -
    -test_compute_row_delta_in_all_frames_not_init_sorter()¶
    +
    +test_compute_row_delta_in_all_frames_not_init_sorter()¶
    -
    -test_compute_row_delta_single_samples_frame()¶
    +
    +test_compute_row_delta_single_samples_frame()¶
    -
    -test_dataset_id()¶
    +
    +test_dataset_id()¶
    -
    -test_file_path()¶
    +
    +test_file_path()¶
    -
    -test_import_data()¶
    +
    +test_import_data()¶
    -
    -test_import_sampled_cims()¶
    +
    +test_import_sampled_cims()¶
    -
    -test_import_structure()¶
    +
    +test_import_structure()¶
    -
    -test_import_variables()¶
    +
    +test_import_variables()¶
    -
    -test_init()¶
    +
    +test_init()¶
    -
    -test_normalize_trajectories()¶
    +
    +test_normalize_trajectories()¶
    -
    -test_normalize_trajectories_wrong_indx()¶
    +
    +test_normalize_trajectories_wrong_indx()¶
    -
    -test_normalize_trajectories_wrong_key()¶
    +
    +test_normalize_trajectories_wrong_key()¶
    -
    -test_read_json_file_found()¶
    +
    +test_read_json_file_found()¶
    -
    -test_read_json_file_not_found()¶
    +
    +test_read_json_file_not_found()¶
    @@ -263,28 +259,28 @@

    PyCTBN.tests.utility.test_sample_importer module¶

    -
    -class PyCTBN.tests.utility.test_sample_importer.TestSampleImporter(methodName='runTest')¶
    +
    +class PyCTBN.tests.utility.test_sample_importer.TestSampleImporter(methodName='runTest')¶

    Bases: unittest.case.TestCase

    -
    -ordered(obj)¶
    +
    +ordered(obj)¶
    -
    -classmethod setUpClass()None¶
    +
    +classmethod setUpClass() → None¶

    Hook method for setting up class fixture before running tests in the class.

    -
    -test_init()¶
    +
    +test_init()¶
    -
    -test_order()¶
    +
    +test_order()¶
    @@ -323,9 +319,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/_static/basic.css b/docs/_static/basic.css index aa9df31..24a49f0 100644 --- a/docs/_static/basic.css +++ b/docs/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -130,7 +130,7 @@ ul.search li a { font-weight: bold; } -ul.search li p.context { +ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -277,25 +277,25 @@ p.rubric { font-weight: bold; } -img.align-left, figure.align-left, .figure.align-left, object.align-left { +img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } -img.align-right, figure.align-right, .figure.align-right, object.align-right { +img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } -img.align-center, figure.align-center, .figure.align-center, object.align-center { +img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } -img.align-default, figure.align-default, .figure.align-default { +img.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; @@ -319,8 +319,7 @@ img.align-default, figure.align-default, .figure.align-default { /* -- sidebars -------------------------------------------------------------- */ -div.sidebar, -aside.sidebar { +div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px; @@ -378,14 +377,12 @@ div.body p.centered { /* -- content of sidebars/topics/admonitions -------------------------------- */ div.sidebar > :last-child, -aside.sidebar > :last-child, div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; } div.sidebar::after, -aside.sidebar::after, div.topic::after, div.admonition::after, blockquote::after { @@ -458,22 +455,20 @@ td > :last-child { /* -- figures --------------------------------------------------------------- */ -div.figure, figure { +div.figure { margin: 0.5em; padding: 0.5em; } -div.figure p.caption, figcaption { +div.figure p.caption { padding: 0.3em; } -div.figure p.caption span.caption-number, -figcaption span.caption-number { +div.figure p.caption span.caption-number { font-style: italic; } -div.figure p.caption span.caption-text, -figcaption span.caption-text { +div.figure p.caption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ @@ -508,63 +503,6 @@ table.hlist td { vertical-align: top; } -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - /* -- other body styles ----------------------------------------------------- */ @@ -691,6 +629,14 @@ dl.glossary dt { font-size: 1.1em; } +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + .versionmodified { font-style: italic; } @@ -820,11 +766,7 @@ div.code-block-caption code { table.highlighttable td.linenos, span.linenos, div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ + user-select: none; } div.code-block-caption span.caption-number { @@ -839,6 +781,16 @@ div.literal-block-wrapper { margin: 1em 0; } +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + code.xref, a code { background-color: transparent; font-weight: bold; diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js index 61ac9d2..7d88f80 100644 --- a/docs/_static/doctools.js +++ b/docs/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -29,14 +29,9 @@ if (!window.console || !console.firebug) { /** * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL */ jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); + return decodeURIComponent(x).replace(/\+/g, ' '); }; /** diff --git a/docs/_static/language_data.js b/docs/_static/language_data.js index 863704b..d2b4ee9 100644 --- a/docs/_static/language_data.js +++ b/docs/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -13,8 +13,7 @@ var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; -/* Non-minified version is copied as a separate JS file, is available */ - +/* Non-minified version JS is _stemmer.js if file is provided */ /** * Porter Stemmer */ @@ -200,6 +199,7 @@ var Stemmer = function() { + var splitChars = (function() { var result = {}; var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, diff --git a/docs/_static/pygments.css b/docs/_static/pygments.css index 28eb679..348ec44 100644 --- a/docs/_static/pygments.css +++ b/docs/_static/pygments.css @@ -1,7 +1,7 @@ -pre { line-height: 125%; margin: 0; } -td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } -span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } -td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } -span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight { background: #ffffff; } \ No newline at end of file diff --git a/docs/_static/searchtools.js b/docs/_static/searchtools.js index e09f926..261ecaa 100644 --- a/docs/_static/searchtools.js +++ b/docs/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -248,7 +248,7 @@ var Search = { // results left, load the summary and display it if (results.length) { var item = results.pop(); - var listItem = $('
  • '); + var listItem = $('
  • '); var requestUrl = ""; var linkUrl = ""; if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') { @@ -273,9 +273,9 @@ var Search = { if (item[3]) { listItem.append($(' (' + item[3] + ')')); Search.output.append(listItem); - setTimeout(function() { + listItem.slideDown(5, function() { displayNextItem(); - }, 5); + }); } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { $.ajax({url: requestUrl, dataType: "text", @@ -285,16 +285,16 @@ var Search = { listItem.append(Search.makeSearchSummary(data, searchterms, hlterms)); } Search.output.append(listItem); - setTimeout(function() { + listItem.slideDown(5, function() { displayNextItem(); - }, 5); + }); }}); } else { // no source available, just display title Search.output.append(listItem); - setTimeout(function() { + listItem.slideDown(5, function() { displayNextItem(); - }, 5); + }); } } // search finished, update title and status message @@ -379,13 +379,6 @@ var Search = { return results; }, - /** - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - */ - escapeRegExp : function(string) { - return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string - }, - /** * search for full-text terms in the index */ @@ -409,14 +402,13 @@ var Search = { ]; // add support for partial matches if (word.length > 2) { - var word_regex = this.escapeRegExp(word); for (var w in terms) { - if (w.match(word_regex) && !terms[word]) { + if (w.match(word) && !terms[word]) { _o.push({files: terms[w], score: Scorer.partialTerm}) } } for (var w in titleterms) { - if (w.match(word_regex) && !titleterms[word]) { + if (w.match(word) && !titleterms[word]) { _o.push({files: titleterms[w], score: Scorer.partialTitle}) } } @@ -509,7 +501,7 @@ var Search = { var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); - var rv = $('

    ').text(excerpt); + var rv = $('
    ').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlighted'); }); diff --git a/docs/_static/underscore-1.13.1.js b/docs/_static/underscore-1.13.1.js deleted file mode 100644 index ffd77af..0000000 --- a/docs/_static/underscore-1.13.1.js +++ /dev/null @@ -1,2042 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define('underscore', factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () { - var current = global._; - var exports = global._ = factory(); - exports.noConflict = function () { global._ = current; return exports; }; - }())); -}(this, (function () { - // Underscore.js 1.13.1 - // https://underscorejs.org - // (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors - // Underscore may be freely distributed under the MIT license. - - // Current version. - var VERSION = '1.13.1'; - - // Establish the root object, `window` (`self`) in the browser, `global` - // on the server, or `this` in some virtual machines. We use `self` - // instead of `window` for `WebWorker` support. - var root = typeof self == 'object' && self.self === self && self || - typeof global == 'object' && global.global === global && global || - Function('return this')() || - {}; - - // Save bytes in the minified (but not gzipped) version: - var ArrayProto = Array.prototype, ObjProto = Object.prototype; - var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; - - // Create quick reference variables for speed access to core prototypes. - var push = ArrayProto.push, - slice = ArrayProto.slice, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; - - // Modern feature detection. - var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', - supportsDataView = typeof DataView !== 'undefined'; - - // All **ECMAScript 5+** native function implementations that we hope to use - // are declared here. - var nativeIsArray = Array.isArray, - nativeKeys = Object.keys, - nativeCreate = Object.create, - nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; - - // Create references to these builtin functions because we override them. - var _isNaN = isNaN, - _isFinite = isFinite; - - // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. - var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); - var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', - 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; - - // The largest integer that can be represented exactly. - var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; - - // Some functions take a variable number of arguments, or a few expected - // arguments at the beginning and then a variable number of values to operate - // on. This helper accumulates all remaining arguments past the function’s - // argument length (or an explicit `startIndex`), into an array that becomes - // the last argument. Similar to ES6’s "rest parameter". - function restArguments(func, startIndex) { - startIndex = startIndex == null ? func.length - 1 : +startIndex; - return function() { - var length = Math.max(arguments.length - startIndex, 0), - rest = Array(length), - index = 0; - for (; index < length; index++) { - rest[index] = arguments[index + startIndex]; - } - switch (startIndex) { - case 0: return func.call(this, rest); - case 1: return func.call(this, arguments[0], rest); - case 2: return func.call(this, arguments[0], arguments[1], rest); - } - var args = Array(startIndex + 1); - for (index = 0; index < startIndex; index++) { - args[index] = arguments[index]; - } - args[startIndex] = rest; - return func.apply(this, args); - }; - } - - // Is a given variable an object? - function isObject(obj) { - var type = typeof obj; - return type === 'function' || type === 'object' && !!obj; - } - - // Is a given value equal to null? - function isNull(obj) { - return obj === null; - } - - // Is a given variable undefined? - function isUndefined(obj) { - return obj === void 0; - } - - // Is a given value a boolean? - function isBoolean(obj) { - return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; - } - - // Is a given value a DOM element? - function isElement(obj) { - return !!(obj && obj.nodeType === 1); - } - - // Internal function for creating a `toString`-based type tester. - function tagTester(name) { - var tag = '[object ' + name + ']'; - return function(obj) { - return toString.call(obj) === tag; - }; - } - - var isString = tagTester('String'); - - var isNumber = tagTester('Number'); - - var isDate = tagTester('Date'); - - var isRegExp = tagTester('RegExp'); - - var isError = tagTester('Error'); - - var isSymbol = tagTester('Symbol'); - - var isArrayBuffer = tagTester('ArrayBuffer'); - - var isFunction = tagTester('Function'); - - // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old - // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). - var nodelist = root.document && root.document.childNodes; - if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { - isFunction = function(obj) { - return typeof obj == 'function' || false; - }; - } - - var isFunction$1 = isFunction; - - var hasObjectTag = tagTester('Object'); - - // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. - // In IE 11, the most common among them, this problem also applies to - // `Map`, `WeakMap` and `Set`. - var hasStringTagBug = ( - supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) - ), - isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); - - var isDataView = tagTester('DataView'); - - // In IE 10 - Edge 13, we need a different heuristic - // to determine whether an object is a `DataView`. - function ie10IsDataView(obj) { - return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); - } - - var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); - - // Is a given value an array? - // Delegates to ECMA5's native `Array.isArray`. - var isArray = nativeIsArray || tagTester('Array'); - - // Internal function to check whether `key` is an own property name of `obj`. - function has$1(obj, key) { - return obj != null && hasOwnProperty.call(obj, key); - } - - var isArguments = tagTester('Arguments'); - - // Define a fallback version of the method in browsers (ahem, IE < 9), where - // there isn't any inspectable "Arguments" type. - (function() { - if (!isArguments(arguments)) { - isArguments = function(obj) { - return has$1(obj, 'callee'); - }; - } - }()); - - var isArguments$1 = isArguments; - - // Is a given object a finite number? - function isFinite$1(obj) { - return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); - } - - // Is the given value `NaN`? - function isNaN$1(obj) { - return isNumber(obj) && _isNaN(obj); - } - - // Predicate-generating function. Often useful outside of Underscore. - function constant(value) { - return function() { - return value; - }; - } - - // Common internal logic for `isArrayLike` and `isBufferLike`. - function createSizePropertyCheck(getSizeProperty) { - return function(collection) { - var sizeProperty = getSizeProperty(collection); - return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; - } - } - - // Internal helper to generate a function to obtain property `key` from `obj`. - function shallowProperty(key) { - return function(obj) { - return obj == null ? void 0 : obj[key]; - }; - } - - // Internal helper to obtain the `byteLength` property of an object. - var getByteLength = shallowProperty('byteLength'); - - // Internal helper to determine whether we should spend extensive checks against - // `ArrayBuffer` et al. - var isBufferLike = createSizePropertyCheck(getByteLength); - - // Is a given value a typed array? - var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; - function isTypedArray(obj) { - // `ArrayBuffer.isView` is the most future-proof, so use it when available. - // Otherwise, fall back on the above regular expression. - return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : - isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); - } - - var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); - - // Internal helper to obtain the `length` property of an object. - var getLength = shallowProperty('length'); - - // Internal helper to create a simple lookup structure. - // `collectNonEnumProps` used to depend on `_.contains`, but this led to - // circular imports. `emulatedSet` is a one-off solution that only works for - // arrays of strings. - function emulatedSet(keys) { - var hash = {}; - for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; - return { - contains: function(key) { return hash[key]; }, - push: function(key) { - hash[key] = true; - return keys.push(key); - } - }; - } - - // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't - // be iterated by `for key in ...` and thus missed. Extends `keys` in place if - // needed. - function collectNonEnumProps(obj, keys) { - keys = emulatedSet(keys); - var nonEnumIdx = nonEnumerableProps.length; - var constructor = obj.constructor; - var proto = isFunction$1(constructor) && constructor.prototype || ObjProto; - - // Constructor is a special case. - var prop = 'constructor'; - if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); - - while (nonEnumIdx--) { - prop = nonEnumerableProps[nonEnumIdx]; - if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { - keys.push(prop); - } - } - } - - // Retrieve the names of an object's own properties. - // Delegates to **ECMAScript 5**'s native `Object.keys`. - function keys(obj) { - if (!isObject(obj)) return []; - if (nativeKeys) return nativeKeys(obj); - var keys = []; - for (var key in obj) if (has$1(obj, key)) keys.push(key); - // Ahem, IE < 9. - if (hasEnumBug) collectNonEnumProps(obj, keys); - return keys; - } - - // Is a given array, string, or object empty? - // An "empty" object has no enumerable own-properties. - function isEmpty(obj) { - if (obj == null) return true; - // Skip the more expensive `toString`-based type checks if `obj` has no - // `.length`. - var length = getLength(obj); - if (typeof length == 'number' && ( - isArray(obj) || isString(obj) || isArguments$1(obj) - )) return length === 0; - return getLength(keys(obj)) === 0; - } - - // Returns whether an object has a given set of `key:value` pairs. - function isMatch(object, attrs) { - var _keys = keys(attrs), length = _keys.length; - if (object == null) return !length; - var obj = Object(object); - for (var i = 0; i < length; i++) { - var key = _keys[i]; - if (attrs[key] !== obj[key] || !(key in obj)) return false; - } - return true; - } - - // If Underscore is called as a function, it returns a wrapped object that can - // be used OO-style. This wrapper holds altered versions of all functions added - // through `_.mixin`. Wrapped objects may be chained. - function _$1(obj) { - if (obj instanceof _$1) return obj; - if (!(this instanceof _$1)) return new _$1(obj); - this._wrapped = obj; - } - - _$1.VERSION = VERSION; - - // Extracts the result from a wrapped and chained object. - _$1.prototype.value = function() { - return this._wrapped; - }; - - // Provide unwrapping proxies for some methods used in engine operations - // such as arithmetic and JSON stringification. - _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; - - _$1.prototype.toString = function() { - return String(this._wrapped); - }; - - // Internal function to wrap or shallow-copy an ArrayBuffer, - // typed array or DataView to a new view, reusing the buffer. - function toBufferView(bufferSource) { - return new Uint8Array( - bufferSource.buffer || bufferSource, - bufferSource.byteOffset || 0, - getByteLength(bufferSource) - ); - } - - // We use this string twice, so give it a name for minification. - var tagDataView = '[object DataView]'; - - // Internal recursive comparison function for `_.isEqual`. - function eq(a, b, aStack, bStack) { - // Identical objects are equal. `0 === -0`, but they aren't identical. - // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). - if (a === b) return a !== 0 || 1 / a === 1 / b; - // `null` or `undefined` only equal to itself (strict comparison). - if (a == null || b == null) return false; - // `NaN`s are equivalent, but non-reflexive. - if (a !== a) return b !== b; - // Exhaust primitive checks - var type = typeof a; - if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; - return deepEq(a, b, aStack, bStack); - } - - // Internal recursive comparison function for `_.isEqual`. - function deepEq(a, b, aStack, bStack) { - // Unwrap any wrapped objects. - if (a instanceof _$1) a = a._wrapped; - if (b instanceof _$1) b = b._wrapped; - // Compare `[[Class]]` names. - var className = toString.call(a); - if (className !== toString.call(b)) return false; - // Work around a bug in IE 10 - Edge 13. - if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { - if (!isDataView$1(b)) return false; - className = tagDataView; - } - switch (className) { - // These types are compared by value. - case '[object RegExp]': - // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') - case '[object String]': - // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is - // equivalent to `new String("5")`. - return '' + a === '' + b; - case '[object Number]': - // `NaN`s are equivalent, but non-reflexive. - // Object(NaN) is equivalent to NaN. - if (+a !== +a) return +b !== +b; - // An `egal` comparison is performed for other numeric values. - return +a === 0 ? 1 / +a === 1 / b : +a === +b; - case '[object Date]': - case '[object Boolean]': - // Coerce dates and booleans to numeric primitive values. Dates are compared by their - // millisecond representations. Note that invalid dates with millisecond representations - // of `NaN` are not equivalent. - return +a === +b; - case '[object Symbol]': - return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); - case '[object ArrayBuffer]': - case tagDataView: - // Coerce to typed array so we can fall through. - return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); - } - - var areArrays = className === '[object Array]'; - if (!areArrays && isTypedArray$1(a)) { - var byteLength = getByteLength(a); - if (byteLength !== getByteLength(b)) return false; - if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; - areArrays = true; - } - if (!areArrays) { - if (typeof a != 'object' || typeof b != 'object') return false; - - // Objects with different constructors are not equivalent, but `Object`s or `Array`s - // from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && - isFunction$1(bCtor) && bCtor instanceof bCtor) - && ('constructor' in a && 'constructor' in b)) { - return false; - } - } - // Assume equality for cyclic structures. The algorithm for detecting cyclic - // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. - - // Initializing stack of traversed objects. - // It's done here since we only need them for objects and arrays comparison. - aStack = aStack || []; - bStack = bStack || []; - var length = aStack.length; - while (length--) { - // Linear search. Performance is inversely proportional to the number of - // unique nested structures. - if (aStack[length] === a) return bStack[length] === b; - } - - // Add the first object to the stack of traversed objects. - aStack.push(a); - bStack.push(b); - - // Recursively compare objects and arrays. - if (areArrays) { - // Compare array lengths to determine if a deep comparison is necessary. - length = a.length; - if (length !== b.length) return false; - // Deep compare the contents, ignoring non-numeric properties. - while (length--) { - if (!eq(a[length], b[length], aStack, bStack)) return false; - } - } else { - // Deep compare objects. - var _keys = keys(a), key; - length = _keys.length; - // Ensure that both objects contain the same number of properties before comparing deep equality. - if (keys(b).length !== length) return false; - while (length--) { - // Deep compare each member - key = _keys[length]; - if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; - } - } - // Remove the first object from the stack of traversed objects. - aStack.pop(); - bStack.pop(); - return true; - } - - // Perform a deep comparison to check if two objects are equal. - function isEqual(a, b) { - return eq(a, b); - } - - // Retrieve all the enumerable property names of an object. - function allKeys(obj) { - if (!isObject(obj)) return []; - var keys = []; - for (var key in obj) keys.push(key); - // Ahem, IE < 9. - if (hasEnumBug) collectNonEnumProps(obj, keys); - return keys; - } - - // Since the regular `Object.prototype.toString` type tests don't work for - // some types in IE 11, we use a fingerprinting heuristic instead, based - // on the methods. It's not great, but it's the best we got. - // The fingerprint method lists are defined below. - function ie11fingerprint(methods) { - var length = getLength(methods); - return function(obj) { - if (obj == null) return false; - // `Map`, `WeakMap` and `Set` have no enumerable keys. - var keys = allKeys(obj); - if (getLength(keys)) return false; - for (var i = 0; i < length; i++) { - if (!isFunction$1(obj[methods[i]])) return false; - } - // If we are testing against `WeakMap`, we need to ensure that - // `obj` doesn't have a `forEach` method in order to distinguish - // it from a regular `Map`. - return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); - }; - } - - // In the interest of compact minification, we write - // each string in the fingerprints only once. - var forEachName = 'forEach', - hasName = 'has', - commonInit = ['clear', 'delete'], - mapTail = ['get', hasName, 'set']; - - // `Map`, `WeakMap` and `Set` each have slightly different - // combinations of the above sublists. - var mapMethods = commonInit.concat(forEachName, mapTail), - weakMapMethods = commonInit.concat(mapTail), - setMethods = ['add'].concat(commonInit, forEachName, hasName); - - var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); - - var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); - - var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); - - var isWeakSet = tagTester('WeakSet'); - - // Retrieve the values of an object's properties. - function values(obj) { - var _keys = keys(obj); - var length = _keys.length; - var values = Array(length); - for (var i = 0; i < length; i++) { - values[i] = obj[_keys[i]]; - } - return values; - } - - // Convert an object into a list of `[key, value]` pairs. - // The opposite of `_.object` with one argument. - function pairs(obj) { - var _keys = keys(obj); - var length = _keys.length; - var pairs = Array(length); - for (var i = 0; i < length; i++) { - pairs[i] = [_keys[i], obj[_keys[i]]]; - } - return pairs; - } - - // Invert the keys and values of an object. The values must be serializable. - function invert(obj) { - var result = {}; - var _keys = keys(obj); - for (var i = 0, length = _keys.length; i < length; i++) { - result[obj[_keys[i]]] = _keys[i]; - } - return result; - } - - // Return a sorted list of the function names available on the object. - function functions(obj) { - var names = []; - for (var key in obj) { - if (isFunction$1(obj[key])) names.push(key); - } - return names.sort(); - } - - // An internal function for creating assigner functions. - function createAssigner(keysFunc, defaults) { - return function(obj) { - var length = arguments.length; - if (defaults) obj = Object(obj); - if (length < 2 || obj == null) return obj; - for (var index = 1; index < length; index++) { - var source = arguments[index], - keys = keysFunc(source), - l = keys.length; - for (var i = 0; i < l; i++) { - var key = keys[i]; - if (!defaults || obj[key] === void 0) obj[key] = source[key]; - } - } - return obj; - }; - } - - // Extend a given object with all the properties in passed-in object(s). - var extend = createAssigner(allKeys); - - // Assigns a given object with all the own properties in the passed-in - // object(s). - // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) - var extendOwn = createAssigner(keys); - - // Fill in a given object with default properties. - var defaults = createAssigner(allKeys, true); - - // Create a naked function reference for surrogate-prototype-swapping. - function ctor() { - return function(){}; - } - - // An internal function for creating a new object that inherits from another. - function baseCreate(prototype) { - if (!isObject(prototype)) return {}; - if (nativeCreate) return nativeCreate(prototype); - var Ctor = ctor(); - Ctor.prototype = prototype; - var result = new Ctor; - Ctor.prototype = null; - return result; - } - - // Creates an object that inherits from the given prototype object. - // If additional properties are provided then they will be added to the - // created object. - function create(prototype, props) { - var result = baseCreate(prototype); - if (props) extendOwn(result, props); - return result; - } - - // Create a (shallow-cloned) duplicate of an object. - function clone(obj) { - if (!isObject(obj)) return obj; - return isArray(obj) ? obj.slice() : extend({}, obj); - } - - // Invokes `interceptor` with the `obj` and then returns `obj`. - // The primary purpose of this method is to "tap into" a method chain, in - // order to perform operations on intermediate results within the chain. - function tap(obj, interceptor) { - interceptor(obj); - return obj; - } - - // Normalize a (deep) property `path` to array. - // Like `_.iteratee`, this function can be customized. - function toPath$1(path) { - return isArray(path) ? path : [path]; - } - _$1.toPath = toPath$1; - - // Internal wrapper for `_.toPath` to enable minification. - // Similar to `cb` for `_.iteratee`. - function toPath(path) { - return _$1.toPath(path); - } - - // Internal function to obtain a nested property in `obj` along `path`. - function deepGet(obj, path) { - var length = path.length; - for (var i = 0; i < length; i++) { - if (obj == null) return void 0; - obj = obj[path[i]]; - } - return length ? obj : void 0; - } - - // Get the value of the (deep) property on `path` from `object`. - // If any property in `path` does not exist or if the value is - // `undefined`, return `defaultValue` instead. - // The `path` is normalized through `_.toPath`. - function get(object, path, defaultValue) { - var value = deepGet(object, toPath(path)); - return isUndefined(value) ? defaultValue : value; - } - - // Shortcut function for checking if an object has a given property directly on - // itself (in other words, not on a prototype). Unlike the internal `has` - // function, this public version can also traverse nested properties. - function has(obj, path) { - path = toPath(path); - var length = path.length; - for (var i = 0; i < length; i++) { - var key = path[i]; - if (!has$1(obj, key)) return false; - obj = obj[key]; - } - return !!length; - } - - // Keep the identity function around for default iteratees. - function identity(value) { - return value; - } - - // Returns a predicate for checking whether an object has a given set of - // `key:value` pairs. - function matcher(attrs) { - attrs = extendOwn({}, attrs); - return function(obj) { - return isMatch(obj, attrs); - }; - } - - // Creates a function that, when passed an object, will traverse that object’s - // properties down the given `path`, specified as an array of keys or indices. - function property(path) { - path = toPath(path); - return function(obj) { - return deepGet(obj, path); - }; - } - - // Internal function that returns an efficient (for current engines) version - // of the passed-in callback, to be repeatedly applied in other Underscore - // functions. - function optimizeCb(func, context, argCount) { - if (context === void 0) return func; - switch (argCount == null ? 3 : argCount) { - case 1: return function(value) { - return func.call(context, value); - }; - // The 2-argument case is omitted because we’re not using it. - case 3: return function(value, index, collection) { - return func.call(context, value, index, collection); - }; - case 4: return function(accumulator, value, index, collection) { - return func.call(context, accumulator, value, index, collection); - }; - } - return function() { - return func.apply(context, arguments); - }; - } - - // An internal function to generate callbacks that can be applied to each - // element in a collection, returning the desired result — either `_.identity`, - // an arbitrary callback, a property matcher, or a property accessor. - function baseIteratee(value, context, argCount) { - if (value == null) return identity; - if (isFunction$1(value)) return optimizeCb(value, context, argCount); - if (isObject(value) && !isArray(value)) return matcher(value); - return property(value); - } - - // External wrapper for our callback generator. Users may customize - // `_.iteratee` if they want additional predicate/iteratee shorthand styles. - // This abstraction hides the internal-only `argCount` argument. - function iteratee(value, context) { - return baseIteratee(value, context, Infinity); - } - _$1.iteratee = iteratee; - - // The function we call internally to generate a callback. It invokes - // `_.iteratee` if overridden, otherwise `baseIteratee`. - function cb(value, context, argCount) { - if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); - return baseIteratee(value, context, argCount); - } - - // Returns the results of applying the `iteratee` to each element of `obj`. - // In contrast to `_.map` it returns an object. - function mapObject(obj, iteratee, context) { - iteratee = cb(iteratee, context); - var _keys = keys(obj), - length = _keys.length, - results = {}; - for (var index = 0; index < length; index++) { - var currentKey = _keys[index]; - results[currentKey] = iteratee(obj[currentKey], currentKey, obj); - } - return results; - } - - // Predicate-generating function. Often useful outside of Underscore. - function noop(){} - - // Generates a function for a given object that returns a given property. - function propertyOf(obj) { - if (obj == null) return noop; - return function(path) { - return get(obj, path); - }; - } - - // Run a function **n** times. - function times(n, iteratee, context) { - var accum = Array(Math.max(0, n)); - iteratee = optimizeCb(iteratee, context, 1); - for (var i = 0; i < n; i++) accum[i] = iteratee(i); - return accum; - } - - // Return a random integer between `min` and `max` (inclusive). - function random(min, max) { - if (max == null) { - max = min; - min = 0; - } - return min + Math.floor(Math.random() * (max - min + 1)); - } - - // A (possibly faster) way to get the current timestamp as an integer. - var now = Date.now || function() { - return new Date().getTime(); - }; - - // Internal helper to generate functions for escaping and unescaping strings - // to/from HTML interpolation. - function createEscaper(map) { - var escaper = function(match) { - return map[match]; - }; - // Regexes for identifying a key that needs to be escaped. - var source = '(?:' + keys(map).join('|') + ')'; - var testRegexp = RegExp(source); - var replaceRegexp = RegExp(source, 'g'); - return function(string) { - string = string == null ? '' : '' + string; - return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; - }; - } - - // Internal list of HTML entities for escaping. - var escapeMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '`': '`' - }; - - // Function for escaping strings to HTML interpolation. - var _escape = createEscaper(escapeMap); - - // Internal list of HTML entities for unescaping. - var unescapeMap = invert(escapeMap); - - // Function for unescaping strings from HTML interpolation. - var _unescape = createEscaper(unescapeMap); - - // By default, Underscore uses ERB-style template delimiters. Change the - // following template settings to use alternative delimiters. - var templateSettings = _$1.templateSettings = { - evaluate: /<%([\s\S]+?)%>/g, - interpolate: /<%=([\s\S]+?)%>/g, - escape: /<%-([\s\S]+?)%>/g - }; - - // When customizing `_.templateSettings`, if you don't want to define an - // interpolation, evaluation or escaping regex, we need one that is - // guaranteed not to match. - var noMatch = /(.)^/; - - // Certain characters need to be escaped so that they can be put into a - // string literal. - var escapes = { - "'": "'", - '\\': '\\', - '\r': 'r', - '\n': 'n', - '\u2028': 'u2028', - '\u2029': 'u2029' - }; - - var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; - - function escapeChar(match) { - return '\\' + escapes[match]; - } - - // In order to prevent third-party code injection through - // `_.templateSettings.variable`, we test it against the following regular - // expression. It is intentionally a bit more liberal than just matching valid - // identifiers, but still prevents possible loopholes through defaults or - // destructuring assignment. - var bareIdentifier = /^\s*(\w|\$)+\s*$/; - - // JavaScript micro-templating, similar to John Resig's implementation. - // Underscore templating handles arbitrary delimiters, preserves whitespace, - // and correctly escapes quotes within interpolated code. - // NB: `oldSettings` only exists for backwards compatibility. - function template(text, settings, oldSettings) { - if (!settings && oldSettings) settings = oldSettings; - settings = defaults({}, settings, _$1.templateSettings); - - // Combine delimiters into one regular expression via alternation. - var matcher = RegExp([ - (settings.escape || noMatch).source, - (settings.interpolate || noMatch).source, - (settings.evaluate || noMatch).source - ].join('|') + '|$', 'g'); - - // Compile the template source, escaping string literals appropriately. - var index = 0; - var source = "__p+='"; - text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { - source += text.slice(index, offset).replace(escapeRegExp, escapeChar); - index = offset + match.length; - - if (escape) { - source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; - } else if (interpolate) { - source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; - } else if (evaluate) { - source += "';\n" + evaluate + "\n__p+='"; - } - - // Adobe VMs need the match returned to produce the correct offset. - return match; - }); - source += "';\n"; - - var argument = settings.variable; - if (argument) { - // Insure against third-party code injection. (CVE-2021-23358) - if (!bareIdentifier.test(argument)) throw new Error( - 'variable is not a bare identifier: ' + argument - ); - } else { - // If a variable is not specified, place data values in local scope. - source = 'with(obj||{}){\n' + source + '}\n'; - argument = 'obj'; - } - - source = "var __t,__p='',__j=Array.prototype.join," + - "print=function(){__p+=__j.call(arguments,'');};\n" + - source + 'return __p;\n'; - - var render; - try { - render = new Function(argument, '_', source); - } catch (e) { - e.source = source; - throw e; - } - - var template = function(data) { - return render.call(this, data, _$1); - }; - - // Provide the compiled source as a convenience for precompilation. - template.source = 'function(' + argument + '){\n' + source + '}'; - - return template; - } - - // Traverses the children of `obj` along `path`. If a child is a function, it - // is invoked with its parent as context. Returns the value of the final - // child, or `fallback` if any child is undefined. - function result(obj, path, fallback) { - path = toPath(path); - var length = path.length; - if (!length) { - return isFunction$1(fallback) ? fallback.call(obj) : fallback; - } - for (var i = 0; i < length; i++) { - var prop = obj == null ? void 0 : obj[path[i]]; - if (prop === void 0) { - prop = fallback; - i = length; // Ensure we don't continue iterating. - } - obj = isFunction$1(prop) ? prop.call(obj) : prop; - } - return obj; - } - - // Generate a unique integer id (unique within the entire client session). - // Useful for temporary DOM ids. - var idCounter = 0; - function uniqueId(prefix) { - var id = ++idCounter + ''; - return prefix ? prefix + id : id; - } - - // Start chaining a wrapped Underscore object. - function chain(obj) { - var instance = _$1(obj); - instance._chain = true; - return instance; - } - - // Internal function to execute `sourceFunc` bound to `context` with optional - // `args`. Determines whether to execute a function as a constructor or as a - // normal function. - function executeBound(sourceFunc, boundFunc, context, callingContext, args) { - if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); - var self = baseCreate(sourceFunc.prototype); - var result = sourceFunc.apply(self, args); - if (isObject(result)) return result; - return self; - } - - // Partially apply a function by creating a version that has had some of its - // arguments pre-filled, without changing its dynamic `this` context. `_` acts - // as a placeholder by default, allowing any combination of arguments to be - // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. - var partial = restArguments(function(func, boundArgs) { - var placeholder = partial.placeholder; - var bound = function() { - var position = 0, length = boundArgs.length; - var args = Array(length); - for (var i = 0; i < length; i++) { - args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; - } - while (position < arguments.length) args.push(arguments[position++]); - return executeBound(func, bound, this, this, args); - }; - return bound; - }); - - partial.placeholder = _$1; - - // Create a function bound to a given object (assigning `this`, and arguments, - // optionally). - var bind = restArguments(function(func, context, args) { - if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); - var bound = restArguments(function(callArgs) { - return executeBound(func, bound, context, this, args.concat(callArgs)); - }); - return bound; - }); - - // Internal helper for collection methods to determine whether a collection - // should be iterated as an array or as an object. - // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength - // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 - var isArrayLike = createSizePropertyCheck(getLength); - - // Internal implementation of a recursive `flatten` function. - function flatten$1(input, depth, strict, output) { - output = output || []; - if (!depth && depth !== 0) { - depth = Infinity; - } else if (depth <= 0) { - return output.concat(input); - } - var idx = output.length; - for (var i = 0, length = getLength(input); i < length; i++) { - var value = input[i]; - if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { - // Flatten current level of array or arguments object. - if (depth > 1) { - flatten$1(value, depth - 1, strict, output); - idx = output.length; - } else { - var j = 0, len = value.length; - while (j < len) output[idx++] = value[j++]; - } - } else if (!strict) { - output[idx++] = value; - } - } - return output; - } - - // Bind a number of an object's methods to that object. Remaining arguments - // are the method names to be bound. Useful for ensuring that all callbacks - // defined on an object belong to it. - var bindAll = restArguments(function(obj, keys) { - keys = flatten$1(keys, false, false); - var index = keys.length; - if (index < 1) throw new Error('bindAll must be passed function names'); - while (index--) { - var key = keys[index]; - obj[key] = bind(obj[key], obj); - } - return obj; - }); - - // Memoize an expensive function by storing its results. - function memoize(func, hasher) { - var memoize = function(key) { - var cache = memoize.cache; - var address = '' + (hasher ? hasher.apply(this, arguments) : key); - if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); - return cache[address]; - }; - memoize.cache = {}; - return memoize; - } - - // Delays a function for the given number of milliseconds, and then calls - // it with the arguments supplied. - var delay = restArguments(function(func, wait, args) { - return setTimeout(function() { - return func.apply(null, args); - }, wait); - }); - - // Defers a function, scheduling it to run after the current call stack has - // cleared. - var defer = partial(delay, _$1, 1); - - // Returns a function, that, when invoked, will only be triggered at most once - // during a given window of time. Normally, the throttled function will run - // as much as it can, without ever going more than once per `wait` duration; - // but if you'd like to disable the execution on the leading edge, pass - // `{leading: false}`. To disable execution on the trailing edge, ditto. - function throttle(func, wait, options) { - var timeout, context, args, result; - var previous = 0; - if (!options) options = {}; - - var later = function() { - previous = options.leading === false ? 0 : now(); - timeout = null; - result = func.apply(context, args); - if (!timeout) context = args = null; - }; - - var throttled = function() { - var _now = now(); - if (!previous && options.leading === false) previous = _now; - var remaining = wait - (_now - previous); - context = this; - args = arguments; - if (remaining <= 0 || remaining > wait) { - if (timeout) { - clearTimeout(timeout); - timeout = null; - } - previous = _now; - result = func.apply(context, args); - if (!timeout) context = args = null; - } else if (!timeout && options.trailing !== false) { - timeout = setTimeout(later, remaining); - } - return result; - }; - - throttled.cancel = function() { - clearTimeout(timeout); - previous = 0; - timeout = context = args = null; - }; - - return throttled; - } - - // When a sequence of calls of the returned function ends, the argument - // function is triggered. The end of a sequence is defined by the `wait` - // parameter. If `immediate` is passed, the argument function will be - // triggered at the beginning of the sequence instead of at the end. - function debounce(func, wait, immediate) { - var timeout, previous, args, result, context; - - var later = function() { - var passed = now() - previous; - if (wait > passed) { - timeout = setTimeout(later, wait - passed); - } else { - timeout = null; - if (!immediate) result = func.apply(context, args); - // This check is needed because `func` can recursively invoke `debounced`. - if (!timeout) args = context = null; - } - }; - - var debounced = restArguments(function(_args) { - context = this; - args = _args; - previous = now(); - if (!timeout) { - timeout = setTimeout(later, wait); - if (immediate) result = func.apply(context, args); - } - return result; - }); - - debounced.cancel = function() { - clearTimeout(timeout); - timeout = args = context = null; - }; - - return debounced; - } - - // Returns the first function passed as an argument to the second, - // allowing you to adjust arguments, run code before and after, and - // conditionally execute the original function. - function wrap(func, wrapper) { - return partial(wrapper, func); - } - - // Returns a negated version of the passed-in predicate. - function negate(predicate) { - return function() { - return !predicate.apply(this, arguments); - }; - } - - // Returns a function that is the composition of a list of functions, each - // consuming the return value of the function that follows. - function compose() { - var args = arguments; - var start = args.length - 1; - return function() { - var i = start; - var result = args[start].apply(this, arguments); - while (i--) result = args[i].call(this, result); - return result; - }; - } - - // Returns a function that will only be executed on and after the Nth call. - function after(times, func) { - return function() { - if (--times < 1) { - return func.apply(this, arguments); - } - }; - } - - // Returns a function that will only be executed up to (but not including) the - // Nth call. - function before(times, func) { - var memo; - return function() { - if (--times > 0) { - memo = func.apply(this, arguments); - } - if (times <= 1) func = null; - return memo; - }; - } - - // Returns a function that will be executed at most one time, no matter how - // often you call it. Useful for lazy initialization. - var once = partial(before, 2); - - // Returns the first key on an object that passes a truth test. - function findKey(obj, predicate, context) { - predicate = cb(predicate, context); - var _keys = keys(obj), key; - for (var i = 0, length = _keys.length; i < length; i++) { - key = _keys[i]; - if (predicate(obj[key], key, obj)) return key; - } - } - - // Internal function to generate `_.findIndex` and `_.findLastIndex`. - function createPredicateIndexFinder(dir) { - return function(array, predicate, context) { - predicate = cb(predicate, context); - var length = getLength(array); - var index = dir > 0 ? 0 : length - 1; - for (; index >= 0 && index < length; index += dir) { - if (predicate(array[index], index, array)) return index; - } - return -1; - }; - } - - // Returns the first index on an array-like that passes a truth test. - var findIndex = createPredicateIndexFinder(1); - - // Returns the last index on an array-like that passes a truth test. - var findLastIndex = createPredicateIndexFinder(-1); - - // Use a comparator function to figure out the smallest index at which - // an object should be inserted so as to maintain order. Uses binary search. - function sortedIndex(array, obj, iteratee, context) { - iteratee = cb(iteratee, context, 1); - var value = iteratee(obj); - var low = 0, high = getLength(array); - while (low < high) { - var mid = Math.floor((low + high) / 2); - if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; - } - return low; - } - - // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. - function createIndexFinder(dir, predicateFind, sortedIndex) { - return function(array, item, idx) { - var i = 0, length = getLength(array); - if (typeof idx == 'number') { - if (dir > 0) { - i = idx >= 0 ? idx : Math.max(idx + length, i); - } else { - length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; - } - } else if (sortedIndex && idx && length) { - idx = sortedIndex(array, item); - return array[idx] === item ? idx : -1; - } - if (item !== item) { - idx = predicateFind(slice.call(array, i, length), isNaN$1); - return idx >= 0 ? idx + i : -1; - } - for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { - if (array[idx] === item) return idx; - } - return -1; - }; - } - - // Return the position of the first occurrence of an item in an array, - // or -1 if the item is not included in the array. - // If the array is large and already in sort order, pass `true` - // for **isSorted** to use binary search. - var indexOf = createIndexFinder(1, findIndex, sortedIndex); - - // Return the position of the last occurrence of an item in an array, - // or -1 if the item is not included in the array. - var lastIndexOf = createIndexFinder(-1, findLastIndex); - - // Return the first value which passes a truth test. - function find(obj, predicate, context) { - var keyFinder = isArrayLike(obj) ? findIndex : findKey; - var key = keyFinder(obj, predicate, context); - if (key !== void 0 && key !== -1) return obj[key]; - } - - // Convenience version of a common use case of `_.find`: getting the first - // object containing specific `key:value` pairs. - function findWhere(obj, attrs) { - return find(obj, matcher(attrs)); - } - - // The cornerstone for collection functions, an `each` - // implementation, aka `forEach`. - // Handles raw objects in addition to array-likes. Treats all - // sparse array-likes as if they were dense. - function each(obj, iteratee, context) { - iteratee = optimizeCb(iteratee, context); - var i, length; - if (isArrayLike(obj)) { - for (i = 0, length = obj.length; i < length; i++) { - iteratee(obj[i], i, obj); - } - } else { - var _keys = keys(obj); - for (i = 0, length = _keys.length; i < length; i++) { - iteratee(obj[_keys[i]], _keys[i], obj); - } - } - return obj; - } - - // Return the results of applying the iteratee to each element. - function map(obj, iteratee, context) { - iteratee = cb(iteratee, context); - var _keys = !isArrayLike(obj) && keys(obj), - length = (_keys || obj).length, - results = Array(length); - for (var index = 0; index < length; index++) { - var currentKey = _keys ? _keys[index] : index; - results[index] = iteratee(obj[currentKey], currentKey, obj); - } - return results; - } - - // Internal helper to create a reducing function, iterating left or right. - function createReduce(dir) { - // Wrap code that reassigns argument variables in a separate function than - // the one that accesses `arguments.length` to avoid a perf hit. (#1991) - var reducer = function(obj, iteratee, memo, initial) { - var _keys = !isArrayLike(obj) && keys(obj), - length = (_keys || obj).length, - index = dir > 0 ? 0 : length - 1; - if (!initial) { - memo = obj[_keys ? _keys[index] : index]; - index += dir; - } - for (; index >= 0 && index < length; index += dir) { - var currentKey = _keys ? _keys[index] : index; - memo = iteratee(memo, obj[currentKey], currentKey, obj); - } - return memo; - }; - - return function(obj, iteratee, memo, context) { - var initial = arguments.length >= 3; - return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); - }; - } - - // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. - var reduce = createReduce(1); - - // The right-associative version of reduce, also known as `foldr`. - var reduceRight = createReduce(-1); - - // Return all the elements that pass a truth test. - function filter(obj, predicate, context) { - var results = []; - predicate = cb(predicate, context); - each(obj, function(value, index, list) { - if (predicate(value, index, list)) results.push(value); - }); - return results; - } - - // Return all the elements for which a truth test fails. - function reject(obj, predicate, context) { - return filter(obj, negate(cb(predicate)), context); - } - - // Determine whether all of the elements pass a truth test. - function every(obj, predicate, context) { - predicate = cb(predicate, context); - var _keys = !isArrayLike(obj) && keys(obj), - length = (_keys || obj).length; - for (var index = 0; index < length; index++) { - var currentKey = _keys ? _keys[index] : index; - if (!predicate(obj[currentKey], currentKey, obj)) return false; - } - return true; - } - - // Determine if at least one element in the object passes a truth test. - function some(obj, predicate, context) { - predicate = cb(predicate, context); - var _keys = !isArrayLike(obj) && keys(obj), - length = (_keys || obj).length; - for (var index = 0; index < length; index++) { - var currentKey = _keys ? _keys[index] : index; - if (predicate(obj[currentKey], currentKey, obj)) return true; - } - return false; - } - - // Determine if the array or object contains a given item (using `===`). - function contains(obj, item, fromIndex, guard) { - if (!isArrayLike(obj)) obj = values(obj); - if (typeof fromIndex != 'number' || guard) fromIndex = 0; - return indexOf(obj, item, fromIndex) >= 0; - } - - // Invoke a method (with arguments) on every item in a collection. - var invoke = restArguments(function(obj, path, args) { - var contextPath, func; - if (isFunction$1(path)) { - func = path; - } else { - path = toPath(path); - contextPath = path.slice(0, -1); - path = path[path.length - 1]; - } - return map(obj, function(context) { - var method = func; - if (!method) { - if (contextPath && contextPath.length) { - context = deepGet(context, contextPath); - } - if (context == null) return void 0; - method = context[path]; - } - return method == null ? method : method.apply(context, args); - }); - }); - - // Convenience version of a common use case of `_.map`: fetching a property. - function pluck(obj, key) { - return map(obj, property(key)); - } - - // Convenience version of a common use case of `_.filter`: selecting only - // objects containing specific `key:value` pairs. - function where(obj, attrs) { - return filter(obj, matcher(attrs)); - } - - // Return the maximum element (or element-based computation). - function max(obj, iteratee, context) { - var result = -Infinity, lastComputed = -Infinity, - value, computed; - if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { - obj = isArrayLike(obj) ? obj : values(obj); - for (var i = 0, length = obj.length; i < length; i++) { - value = obj[i]; - if (value != null && value > result) { - result = value; - } - } - } else { - iteratee = cb(iteratee, context); - each(obj, function(v, index, list) { - computed = iteratee(v, index, list); - if (computed > lastComputed || computed === -Infinity && result === -Infinity) { - result = v; - lastComputed = computed; - } - }); - } - return result; - } - - // Return the minimum element (or element-based computation). - function min(obj, iteratee, context) { - var result = Infinity, lastComputed = Infinity, - value, computed; - if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { - obj = isArrayLike(obj) ? obj : values(obj); - for (var i = 0, length = obj.length; i < length; i++) { - value = obj[i]; - if (value != null && value < result) { - result = value; - } - } - } else { - iteratee = cb(iteratee, context); - each(obj, function(v, index, list) { - computed = iteratee(v, index, list); - if (computed < lastComputed || computed === Infinity && result === Infinity) { - result = v; - lastComputed = computed; - } - }); - } - return result; - } - - // Sample **n** random values from a collection using the modern version of the - // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). - // If **n** is not specified, returns a single random element. - // The internal `guard` argument allows it to work with `_.map`. - function sample(obj, n, guard) { - if (n == null || guard) { - if (!isArrayLike(obj)) obj = values(obj); - return obj[random(obj.length - 1)]; - } - var sample = isArrayLike(obj) ? clone(obj) : values(obj); - var length = getLength(sample); - n = Math.max(Math.min(n, length), 0); - var last = length - 1; - for (var index = 0; index < n; index++) { - var rand = random(index, last); - var temp = sample[index]; - sample[index] = sample[rand]; - sample[rand] = temp; - } - return sample.slice(0, n); - } - - // Shuffle a collection. - function shuffle(obj) { - return sample(obj, Infinity); - } - - // Sort the object's values by a criterion produced by an iteratee. - function sortBy(obj, iteratee, context) { - var index = 0; - iteratee = cb(iteratee, context); - return pluck(map(obj, function(value, key, list) { - return { - value: value, - index: index++, - criteria: iteratee(value, key, list) - }; - }).sort(function(left, right) { - var a = left.criteria; - var b = right.criteria; - if (a !== b) { - if (a > b || a === void 0) return 1; - if (a < b || b === void 0) return -1; - } - return left.index - right.index; - }), 'value'); - } - - // An internal function used for aggregate "group by" operations. - function group(behavior, partition) { - return function(obj, iteratee, context) { - var result = partition ? [[], []] : {}; - iteratee = cb(iteratee, context); - each(obj, function(value, index) { - var key = iteratee(value, index, obj); - behavior(result, value, key); - }); - return result; - }; - } - - // Groups the object's values by a criterion. Pass either a string attribute - // to group by, or a function that returns the criterion. - var groupBy = group(function(result, value, key) { - if (has$1(result, key)) result[key].push(value); else result[key] = [value]; - }); - - // Indexes the object's values by a criterion, similar to `_.groupBy`, but for - // when you know that your index values will be unique. - var indexBy = group(function(result, value, key) { - result[key] = value; - }); - - // Counts instances of an object that group by a certain criterion. Pass - // either a string attribute to count by, or a function that returns the - // criterion. - var countBy = group(function(result, value, key) { - if (has$1(result, key)) result[key]++; else result[key] = 1; - }); - - // Split a collection into two arrays: one whose elements all pass the given - // truth test, and one whose elements all do not pass the truth test. - var partition = group(function(result, value, pass) { - result[pass ? 0 : 1].push(value); - }, true); - - // Safely create a real, live array from anything iterable. - var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; - function toArray(obj) { - if (!obj) return []; - if (isArray(obj)) return slice.call(obj); - if (isString(obj)) { - // Keep surrogate pair characters together. - return obj.match(reStrSymbol); - } - if (isArrayLike(obj)) return map(obj, identity); - return values(obj); - } - - // Return the number of elements in a collection. - function size(obj) { - if (obj == null) return 0; - return isArrayLike(obj) ? obj.length : keys(obj).length; - } - - // Internal `_.pick` helper function to determine whether `key` is an enumerable - // property name of `obj`. - function keyInObj(value, key, obj) { - return key in obj; - } - - // Return a copy of the object only containing the allowed properties. - var pick = restArguments(function(obj, keys) { - var result = {}, iteratee = keys[0]; - if (obj == null) return result; - if (isFunction$1(iteratee)) { - if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); - keys = allKeys(obj); - } else { - iteratee = keyInObj; - keys = flatten$1(keys, false, false); - obj = Object(obj); - } - for (var i = 0, length = keys.length; i < length; i++) { - var key = keys[i]; - var value = obj[key]; - if (iteratee(value, key, obj)) result[key] = value; - } - return result; - }); - - // Return a copy of the object without the disallowed properties. - var omit = restArguments(function(obj, keys) { - var iteratee = keys[0], context; - if (isFunction$1(iteratee)) { - iteratee = negate(iteratee); - if (keys.length > 1) context = keys[1]; - } else { - keys = map(flatten$1(keys, false, false), String); - iteratee = function(value, key) { - return !contains(keys, key); - }; - } - return pick(obj, iteratee, context); - }); - - // Returns everything but the last entry of the array. Especially useful on - // the arguments object. Passing **n** will return all the values in - // the array, excluding the last N. - function initial(array, n, guard) { - return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); - } - - // Get the first element of an array. Passing **n** will return the first N - // values in the array. The **guard** check allows it to work with `_.map`. - function first(array, n, guard) { - if (array == null || array.length < 1) return n == null || guard ? void 0 : []; - if (n == null || guard) return array[0]; - return initial(array, array.length - n); - } - - // Returns everything but the first entry of the `array`. Especially useful on - // the `arguments` object. Passing an **n** will return the rest N values in the - // `array`. - function rest(array, n, guard) { - return slice.call(array, n == null || guard ? 1 : n); - } - - // Get the last element of an array. Passing **n** will return the last N - // values in the array. - function last(array, n, guard) { - if (array == null || array.length < 1) return n == null || guard ? void 0 : []; - if (n == null || guard) return array[array.length - 1]; - return rest(array, Math.max(0, array.length - n)); - } - - // Trim out all falsy values from an array. - function compact(array) { - return filter(array, Boolean); - } - - // Flatten out an array, either recursively (by default), or up to `depth`. - // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. - function flatten(array, depth) { - return flatten$1(array, depth, false); - } - - // Take the difference between one array and a number of other arrays. - // Only the elements present in just the first array will remain. - var difference = restArguments(function(array, rest) { - rest = flatten$1(rest, true, true); - return filter(array, function(value){ - return !contains(rest, value); - }); - }); - - // Return a version of the array that does not contain the specified value(s). - var without = restArguments(function(array, otherArrays) { - return difference(array, otherArrays); - }); - - // Produce a duplicate-free version of the array. If the array has already - // been sorted, you have the option of using a faster algorithm. - // The faster algorithm will not work with an iteratee if the iteratee - // is not a one-to-one function, so providing an iteratee will disable - // the faster algorithm. - function uniq(array, isSorted, iteratee, context) { - if (!isBoolean(isSorted)) { - context = iteratee; - iteratee = isSorted; - isSorted = false; - } - if (iteratee != null) iteratee = cb(iteratee, context); - var result = []; - var seen = []; - for (var i = 0, length = getLength(array); i < length; i++) { - var value = array[i], - computed = iteratee ? iteratee(value, i, array) : value; - if (isSorted && !iteratee) { - if (!i || seen !== computed) result.push(value); - seen = computed; - } else if (iteratee) { - if (!contains(seen, computed)) { - seen.push(computed); - result.push(value); - } - } else if (!contains(result, value)) { - result.push(value); - } - } - return result; - } - - // Produce an array that contains the union: each distinct element from all of - // the passed-in arrays. - var union = restArguments(function(arrays) { - return uniq(flatten$1(arrays, true, true)); - }); - - // Produce an array that contains every item shared between all the - // passed-in arrays. - function intersection(array) { - var result = []; - var argsLength = arguments.length; - for (var i = 0, length = getLength(array); i < length; i++) { - var item = array[i]; - if (contains(result, item)) continue; - var j; - for (j = 1; j < argsLength; j++) { - if (!contains(arguments[j], item)) break; - } - if (j === argsLength) result.push(item); - } - return result; - } - - // Complement of zip. Unzip accepts an array of arrays and groups - // each array's elements on shared indices. - function unzip(array) { - var length = array && max(array, getLength).length || 0; - var result = Array(length); - - for (var index = 0; index < length; index++) { - result[index] = pluck(array, index); - } - return result; - } - - // Zip together multiple lists into a single array -- elements that share - // an index go together. - var zip = restArguments(unzip); - - // Converts lists into objects. Pass either a single array of `[key, value]` - // pairs, or two parallel arrays of the same length -- one of keys, and one of - // the corresponding values. Passing by pairs is the reverse of `_.pairs`. - function object(list, values) { - var result = {}; - for (var i = 0, length = getLength(list); i < length; i++) { - if (values) { - result[list[i]] = values[i]; - } else { - result[list[i][0]] = list[i][1]; - } - } - return result; - } - - // Generate an integer Array containing an arithmetic progression. A port of - // the native Python `range()` function. See - // [the Python documentation](https://docs.python.org/library/functions.html#range). - function range(start, stop, step) { - if (stop == null) { - stop = start || 0; - start = 0; - } - if (!step) { - step = stop < start ? -1 : 1; - } - - var length = Math.max(Math.ceil((stop - start) / step), 0); - var range = Array(length); - - for (var idx = 0; idx < length; idx++, start += step) { - range[idx] = start; - } - - return range; - } - - // Chunk a single array into multiple arrays, each containing `count` or fewer - // items. - function chunk(array, count) { - if (count == null || count < 1) return []; - var result = []; - var i = 0, length = array.length; - while (i < length) { - result.push(slice.call(array, i, i += count)); - } - return result; - } - - // Helper function to continue chaining intermediate results. - function chainResult(instance, obj) { - return instance._chain ? _$1(obj).chain() : obj; - } - - // Add your own custom functions to the Underscore object. - function mixin(obj) { - each(functions(obj), function(name) { - var func = _$1[name] = obj[name]; - _$1.prototype[name] = function() { - var args = [this._wrapped]; - push.apply(args, arguments); - return chainResult(this, func.apply(_$1, args)); - }; - }); - return _$1; - } - - // Add all mutator `Array` functions to the wrapper. - each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { - var method = ArrayProto[name]; - _$1.prototype[name] = function() { - var obj = this._wrapped; - if (obj != null) { - method.apply(obj, arguments); - if ((name === 'shift' || name === 'splice') && obj.length === 0) { - delete obj[0]; - } - } - return chainResult(this, obj); - }; - }); - - // Add all accessor `Array` functions to the wrapper. - each(['concat', 'join', 'slice'], function(name) { - var method = ArrayProto[name]; - _$1.prototype[name] = function() { - var obj = this._wrapped; - if (obj != null) obj = method.apply(obj, arguments); - return chainResult(this, obj); - }; - }); - - // Named Exports - - var allExports = { - __proto__: null, - VERSION: VERSION, - restArguments: restArguments, - isObject: isObject, - isNull: isNull, - isUndefined: isUndefined, - isBoolean: isBoolean, - isElement: isElement, - isString: isString, - isNumber: isNumber, - isDate: isDate, - isRegExp: isRegExp, - isError: isError, - isSymbol: isSymbol, - isArrayBuffer: isArrayBuffer, - isDataView: isDataView$1, - isArray: isArray, - isFunction: isFunction$1, - isArguments: isArguments$1, - isFinite: isFinite$1, - isNaN: isNaN$1, - isTypedArray: isTypedArray$1, - isEmpty: isEmpty, - isMatch: isMatch, - isEqual: isEqual, - isMap: isMap, - isWeakMap: isWeakMap, - isSet: isSet, - isWeakSet: isWeakSet, - keys: keys, - allKeys: allKeys, - values: values, - pairs: pairs, - invert: invert, - functions: functions, - methods: functions, - extend: extend, - extendOwn: extendOwn, - assign: extendOwn, - defaults: defaults, - create: create, - clone: clone, - tap: tap, - get: get, - has: has, - mapObject: mapObject, - identity: identity, - constant: constant, - noop: noop, - toPath: toPath$1, - property: property, - propertyOf: propertyOf, - matcher: matcher, - matches: matcher, - times: times, - random: random, - now: now, - escape: _escape, - unescape: _unescape, - templateSettings: templateSettings, - template: template, - result: result, - uniqueId: uniqueId, - chain: chain, - iteratee: iteratee, - partial: partial, - bind: bind, - bindAll: bindAll, - memoize: memoize, - delay: delay, - defer: defer, - throttle: throttle, - debounce: debounce, - wrap: wrap, - negate: negate, - compose: compose, - after: after, - before: before, - once: once, - findKey: findKey, - findIndex: findIndex, - findLastIndex: findLastIndex, - sortedIndex: sortedIndex, - indexOf: indexOf, - lastIndexOf: lastIndexOf, - find: find, - detect: find, - findWhere: findWhere, - each: each, - forEach: each, - map: map, - collect: map, - reduce: reduce, - foldl: reduce, - inject: reduce, - reduceRight: reduceRight, - foldr: reduceRight, - filter: filter, - select: filter, - reject: reject, - every: every, - all: every, - some: some, - any: some, - contains: contains, - includes: contains, - include: contains, - invoke: invoke, - pluck: pluck, - where: where, - max: max, - min: min, - shuffle: shuffle, - sample: sample, - sortBy: sortBy, - groupBy: groupBy, - indexBy: indexBy, - countBy: countBy, - partition: partition, - toArray: toArray, - size: size, - pick: pick, - omit: omit, - first: first, - head: first, - take: first, - initial: initial, - last: last, - rest: rest, - tail: rest, - drop: rest, - compact: compact, - flatten: flatten, - without: without, - uniq: uniq, - unique: uniq, - union: union, - intersection: intersection, - difference: difference, - unzip: unzip, - transpose: unzip, - zip: zip, - object: object, - range: range, - chunk: chunk, - mixin: mixin, - 'default': _$1 - }; - - // Default Export - - // Add all of the Underscore functions to the wrapper object. - var _ = mixin(allExports); - // Legacy Node.js API. - _._ = _; - - return _; - -}))); -//# sourceMappingURL=underscore-umd.js.map diff --git a/docs/_static/underscore.js b/docs/_static/underscore.js index cf177d4..5b55f32 100644 --- a/docs/_static/underscore.js +++ b/docs/_static/underscore.js @@ -1,6 +1,31 @@ -!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){ -// Underscore.js 1.13.1 -// https://underscorejs.org -// (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors -// Underscore may be freely distributed under the MIT license. -var n="1.13.1",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ao&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t2;a== +null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect= +function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e= +e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= +function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a, +c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}}; +b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments, +1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)}; +b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"}; +b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a), +function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+ +u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]= +function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain= +true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); diff --git a/docs/basic_main.html b/docs/basic_main.html index 551dae4..a74fa74 100644 --- a/docs/basic_main.html +++ b/docs/basic_main.html @@ -19,10 +19,6 @@ - - - - @@ -148,9 +144,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/example.html b/docs/example.html index b77f93f..926439d 100644 --- a/docs/example.html +++ b/docs/example.html @@ -19,10 +19,6 @@ - - - - @@ -62,7 +58,7 @@ -

    Contents:

    +

    Contents:

      -
    • has_prior_net_structure (PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath property) +
    • has_prior_net_structure() (PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath property)
    • HillClimbing (class in PyCTBN.PyCTBN.optimizers.hill_climbing_search)
    • @@ -459,8 +448,6 @@

      M

        -
      • variables (PyCTBN.PyCTBN.structure_graph.network_generator.NetworkGenerator property) +
      • variables() (PyCTBN.PyCTBN.structure_graph.network_generator.NetworkGenerator property)
        • (PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter property) @@ -1319,9 +1422,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/index.html b/docs/index.html index 8f2e8f1..910075a 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,10 +19,6 @@ - - - - @@ -226,9 +222,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/modules.html b/docs/modules.html index 1f64d19..9609747 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -19,10 +19,6 @@ - - - - @@ -174,9 +170,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/objects.inv b/docs/objects.inv index bb95ee3b00e8a9497ccc975e71b0cde6344a8fe0..d3f8181e0820dfa32dfdf7ecfc72de5e384faea5 100644 GIT binary patch delta 3131 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 Ps+{^x_rd=G+sWDmIX|^6 diff --git a/docs/py-modindex.html b/docs/py-modindex.html index d191c8c..460b1f7 100644 --- a/docs/py-modindex.html +++ b/docs/py-modindex.html @@ -19,10 +19,6 @@ - - - - @@ -123,20 +119,11 @@

          Python Module Index

          - e | p
          - - - - - @@ -300,16 +287,36 @@ + + + + + + + + + + + + + + + + + +
           
          - e
          - example -
           
          p
              PyCTBN.tests.estimators.test_parameters_estimator
              + PyCTBN.tests.estimators.test_structure_constraint_based_estimator +
              PyCTBN.tests.estimators.test_structure_estimator
              + PyCTBN.tests.estimators.test_structure_score_based_estimator +
              PyCTBN.tests.optimizers
              + PyCTBN.tests.optimizers.test_hill_climbing_search +
              + PyCTBN.tests.optimizers.test_tabu_search +
              @@ -320,6 +327,11 @@     PyCTBN.tests.structure_graph.test_cim
              + PyCTBN.tests.structure_graph.test_networkgenerator +
              @@ -345,6 +357,11 @@     PyCTBN.tests.structure_graph.test_trajectory
              + PyCTBN.tests.structure_graph.test_trajectorygenerator +
              @@ -395,9 +412,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/search.html b/docs/search.html index 32554f6..21fd6c9 100644 --- a/docs/search.html +++ b/docs/search.html @@ -19,10 +19,6 @@ - - - - @@ -157,9 +153,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - + diff --git a/docs/searchindex.js b/docs/searchindex.js index f7e966e..70f998c 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,12],"boolean":[2,4],"case":[7,8,9,10],"class":[2,3,4,5,7,8,9,10,12],"default":[2,3,5],"float":2,"function":2,"import":[4,5,13,14],"int":[2,3,4,5],"null":2,"return":[2,3,4,5,9,12],"static":[2,4],"super":12,"true":[2,12],"var":12,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,12],Use:[2,12],__actual_cach:5,__init__:12,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,12],_df_structur:5,_df_variabl:[5,12],_file_path:12,_graph:[4,12],_import:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,12],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:4,_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_variables_label:5,abc:[3,5],about:[3,4],abstract_import:[0,1,4,13,14],abstractimport:[4,5,12],act:5,actual:[2,4],actual_cim:[4,12],add:[4,5],add_edg:4,add_nod:4,added:2,addit:2,adjac:[2,12],adjacency_matrix:[2,12],after:5,against:2,aggreg:4,algorithm:[2,3,12],all:[2,3,4,5,9,12],alpha_xu:2,alpha_xxu:2,alreadi:[5,12],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,12],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:12,base:[2,3,4,5,7,8,9,10],bayesian:2,befor:[2,3,7,8,9,10],belong:2,best:2,between:5,bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,12],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,12],build_structur:[4,12],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,12],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,13,14],calcul:2,call:[5,12],cardin:[2,4,5,9],cardinalit:[4,5],caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,12],cim_equality_test:7,cims_kei:5,cims_label:7,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,12],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,12],compute_cim_coeffici:4,compute_parameters_for_nod:[2,12],compute_row_delta_in_all_samples_fram:[5,12],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,13,14],conditionalintensitymatrix:[2,4],consid:[2,4],constraint:2,constraint_based_optim:[0,1,13,14],constraintbasedoptim:3,construct:[4,5,12],conta:5,contain:[2,4,5,9],contains_edg:4,content:[13,14],convert:[2,5],copi:5,core:5,correct:[4,5],could:2,count:4,creat:[2,4,12],csv:12,csvimport:12,ctbn:2,ctpc:[2,3,12],ctpc_algorithm:[2,12],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,13,14],datafram:[4,5,12],dataset:[3,4,5],dataset_id:[5,12],datfram:5,def:12,defin:5,definit:5,defualt:2,delta:[2,4,5],demonstr:12,describ:5,desir:[2,4],df_samples_list:5,dict:[5,12],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:12,direct:[2,4],directli:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:12,drop:12,duplic:4,dyn:12,each:[2,3,5],edg:[2,4,5,12],edges_list:4,end:5,entir:2,equal:4,equality_of_cims_of_nod:7,est:12,estim:[0,1,3,4,6,13,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:12,exampl:[5,13,14],exclud:2,exctract:5,exist:5,exp_test_alfa:2,exponenti:2,expos:5,extend:12,extens:[2,5],extract:[4,5],fals:2,fam_score_calcul:[0,1,13,14],famscor:2,famscorecalcul:2,fast_init:[2,4,12],file:[2,5,12],file_path:[2,5,12],filepath:5,fill:[2,12],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,12],fixtur:[7,8,9,10],follow:[4,5],form:4,format:12,formula:2,found:5,frame:5,from:[4,5,12],from_nod:5,gener:2,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:12,graph:[2,4,9,12],graph_struct:4,graphic:2,grid:[4,9],grpah:12,has:[5,12],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,13,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,5,13,14],import_data:[5,12],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,12],improv:[2,3],includ:2,independ:2,independence_test:2,index:[2,4,5,12,13],indic:[2,4],indx:5,info:[4,12],inform:[3,4],init:12,initi:[2,4,5,12],inplac:12,insid:12,instal:[13,14],interest:4,interfac:3,intes:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:12,json:[2,5,12],json_import:[0,1,13,14],jsonarrai:5,jsonimport:[5,12],keep:[2,3,5],kei:5,kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],latest:12,lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,12],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,main:12,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,12],max_par:[2,3],maximum:[2,3],member:[4,5],mention:4,merg:5,method:[2,5,7,8,9,10],methodnam:[7,8,9,10],model:2,modul:[13,14],multipl:5,multiprocess:2,name:[2,4,5,12],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,12],net_graph:2,network:[2,4,5],network_graph:[0,1,2,13,14],networkgraph:[2,4,12],networkx:2,node:[2,3,4,5,9,12],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,12],none:[2,3,4,5,7,9,10,12],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,12],object:[2,3,4,5,12],one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,13,14],optimize_structur:3,option:[2,3],order:[2,5,10],origin:5,original_cols_numb:4,otherwis:[2,5],out:5,outer:[5,12],over:2,own:[13,14],p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[13,14],page:13,panda:[5,12],param:4,paramet:[2,3,4,5,9,13,14],parameters_estim:[0,1,13,14],parametersestim:[2,12],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:2,particular:[2,5],pass:12,path:[2,5,12],patienc:[2,3],peest:12,perform:2,pip:12,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],print:12,prior:[2,12],prior_net_structur:5,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],put:5,pyctbn:12,q_xx:4,rappres:4,raw:5,raw_data:5,read:[5,12],read_csv:12,read_csv_fil:12,read_fil:12,read_json_fil:5,real:[2,4,5,12],refer:[4,5],reject:2,rel:4,relat:5,releas:12,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,res:4,resid:[2,4],result:[2,5,12],rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:5,sampl:[4,5,12],sample_fram:[5,12],sample_import:[0,1,13,14],sample_path:[0,1,2,13,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,12],samples_label:5,save:[2,12],save_plot_estimated_structure_graph:2,save_result:[2,12],scalar_index:2,scalar_indexes_struct:2,score:2,se1:12,search:[2,3,13],second:2,see:5,select:12,self:[2,5,12],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,13,14],setofcim:[2,4,5,12],setupclass:[7,8,9,10],shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:12,simpli:12,sinc:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:12,sorter:5,specif:[2,4,12],spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,12],string:[2,3,4,5],structur:[0,1,2,3,5,9,13,14],structure_constraint_based_estim:[0,1,13,14],structure_estim:[0,1,3,13,14],structure_estimation_exampl:12,structure_graph:[0,1,2,5,6,13,14],structure_label:5,structure_score_based_estim:[0,1,13,14],structureconstraintbasedestim:2,structureestim:[2,3,12],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,13,14],subpackag:[13,14],subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,13,14],tabusearch:3,take:12,tar:12,task:[2,4],tau_xu:2,ternari:12,test:2,test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:6,test_child:2,test_cim:6,test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_possible_sub_sets_of_s:7,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:6,test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:6,test_networkgraph:6,test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:6,test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:6,test_sample_path:6,test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:6,test_structur:[6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:6,test_structure_estim:6,test_structure_monoprocesso:7,test_structure_score_based_estim:6,test_tabu_search:6,test_tim:7,test_trajectori:6,testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,tha:5,theta:2,thi:[2,4,5,12],three:12,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,12],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,12,13,14],trajectories_kei:5,trajectory_list:5,trajectri:12,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:2,type:[2,3,4,5,12],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:[13,14],use:[2,12],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,13,14],valid:2,valu:[2,3,4,5,9,12],values_list:12,var_id:2,variabl:[2,3,4,5,12],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:12,when:2,where:5,which:[2,3,4,5],whl:12,who:2,without:[2,3],you:[2,5,12],your:[13,14]},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":12,abstract_import:5,basic_main:11,cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:12,document:13,estim:[2,7,12],exampl:12,fam_score_calcul:2,hill_climbing_search:3,implement:12,indic:13,instal:12,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,15],network_graph:4,optim:[3,8],own:12,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:12,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,13,14],sample_import:5,sample_path:4,set_of_cim:4,setup:15,structur:[4,12],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:13,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,trajectori:4,usag:12,util:[5,10],welcom:13,your:12}}) +Search.setIndex({docnames:["PyCTBN","PyCTBN.PyCTBN","PyCTBN.PyCTBN.estimators","PyCTBN.PyCTBN.optimizers","PyCTBN.PyCTBN.structure_graph","PyCTBN.PyCTBN.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","example","examples","index","modules","setup"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","PyCTBN.PyCTBN.rst","PyCTBN.PyCTBN.estimators.rst","PyCTBN.PyCTBN.optimizers.rst","PyCTBN.PyCTBN.structure_graph.rst","PyCTBN.PyCTBN.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","example.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"PyCTBN.PyCTBN":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"PyCTBN.PyCTBN.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"PyCTBN.PyCTBN.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"PyCTBN.PyCTBN.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"PyCTBN.PyCTBN.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer":{Optimizer:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"PyCTBN.PyCTBN.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"PyCTBN.PyCTBN.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_generator:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"],trajectory_generator:[4,0,0,"-"]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_generator":{NetworkGenerator:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_generator.NetworkGenerator":{cims:[4,2,1,""],dyn_str:[4,2,1,""],generate_cims:[4,2,1,""],generate_graph:[4,2,1,""],graph:[4,2,1,""],variables:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.structure":{Structure:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory_generator":{TrajectoryGenerator:[4,1,1,""]},"PyCTBN.PyCTBN.structure_graph.trajectory_generator.TrajectoryGenerator":{CTBN_Sample:[4,2,1,""],multi_trajectory:[4,2,1,""],worker:[4,2,1,""]},"PyCTBN.PyCTBN.utility":{abstract_exporter:[5,0,0,"-"],abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_exporter:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"PyCTBN.PyCTBN.utility.abstract_exporter":{AbstractExporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_exporter.AbstractExporter":{add_trajectory:[5,2,1,""],out_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"PyCTBN.PyCTBN.utility.cache":{Cache:[5,1,1,""]},"PyCTBN.PyCTBN.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_exporter":{JsonExporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_exporter.JsonExporter":{cims_to_json:[5,2,1,""],out_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.json_importer":{JsonImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"PyCTBN.PyCTBN.utility.sample_importer":{SampleImporter:[5,1,1,""]},"PyCTBN.PyCTBN.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgenerator:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"],test_trajectorygenerator:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgenerator":{TestNetworkGenerator:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgenerator.TestNetworkGenerator":{test_generate_cims:[9,2,1,""],test_generate_graph:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectorygenerator":{TestTrajectoryGenerator:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator":{setUpClass:[9,2,1,""],test_generated_trajectory:[9,2,1,""],test_generated_trajectory_max_tr:[9,2,1,""],test_init:[9,2,1,""],test_multi_trajectory:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,13],"boolean":[2,4],"case":[4,7,8,9,10],"class":[2,3,4,5,7,8,9,10,13],"default":[2,3,5],"float":[2,4],"function":2,"import":[4,5,14],"int":[2,3,4,5],"new":5,"null":2,"return":[2,3,4,5,9,13],"static":[2,4],"super":13,"true":[2,13],"var":13,For:4,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,13],Use:[2,13],__actual_cach:5,__generate_cim:4,__init__:13,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,13],_df_structur:5,_df_variabl:[5,13],_dyn_cim:5,_dyn_str:5,_file_path:13,_generated_trajectori:4,_graph:[4,13],_import:4,_indx:4,_label:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_parent:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,13],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:[4,5],_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_val:4,_variabl:5,_variables_label:5,_vname:4,abc:[3,5],about:[3,4],abstract_export:[0,1,14],abstract_import:[0,1,4,14],abstractexport:5,abstractimport:[4,5,13],accord:4,act:5,actual:[2,4],actual_cim:[4,13],add:[4,5],add_edg:4,add_nod:4,add_trajectori:5,added:[2,4,5],adding:4,addit:2,adjac:[2,13],adjacency_matrix:[2,13],after:[4,5],against:2,aggreg:4,algorithm:[2,3,13],all:[2,3,4,5,9,13],allow:4,along:5,alpha_xu:2,alpha_xxu:2,alreadi:[5,13],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,13],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:13,base:[2,3,4,5,7,8,9,10],basic_main:15,bayesian:2,been:4,befor:[2,3,7,8,9,10],belong:[2,4],best:2,between:[4,5],bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,13],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,13],build_structur:[4,13],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,13],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,14],calcul:2,call:[5,13],can:5,cardin:[2,4,5,9],cardinalit:[4,5],care:4,caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,13],cim_equality_test:7,cims_kei:5,cims_label:[5,7],cims_to_json:5,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,13],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,13],compute_cim_coeffici:4,compute_parameters_for_nod:[2,13],compute_row_delta_in_all_samples_fram:[5,13],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,14],conditionalintensitymatrix:[2,4],consid:[2,4],consider:4,constraint:2,constraint_based_optim:[0,1,14],constraintbasedoptim:3,construct:[4,5,13],conta:5,contain:[2,4,5,9],contains_edg:4,content:[14,15],convent:4,convert:[2,5],copi:5,core:[4,5],correct:[4,5],correspond:4,could:2,count:4,creat:[2,4,5,13],csv:13,csvimport:13,ctbn:2,ctbn_sampl:4,ctpc:[2,3,13],ctpc_algorithm:[2,13],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,14],datafram:[4,5,13],dataset:[3,4,5],dataset_id:[5,13],datfram:5,def:13,defin:[4,5],definit:5,defualt:2,delta:[2,4,5],demonstr:13,densiti:4,describ:5,desir:[2,4],df_samples_list:5,dict:[4,5,13],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:13,direct:[2,4],directli:5,directori:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:13,drop:13,duplic:4,dyn:13,dyn_cim:[4,5],dyn_str:[4,5],each:[2,3,4,5],edg:[2,4,5,13],edges_list:4,end:[4,5],entir:2,equal:4,equality_of_cims_of_nod:7,est:13,estim:[0,1,3,4,6,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:13,exampl:[5,14,15],exclud:2,exctract:5,execut:4,exist:[4,5],exp_test_alfa:2,exponenti:2,expos:5,extend:13,extens:[2,5],extract:[4,5],fals:[2,4],fam_score_calcul:[0,1,14],famscor:2,famscorecalcul:2,fast_init:[2,4,13],file:[2,5,13],file_path:[2,5,13],filenam:5,filepath:5,fill:[2,13],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,13],fix:4,fixtur:[7,8,9,10],follow:[4,5],form:4,format:[5,13],formula:2,found:5,frame:[4,5],from:[4,5,13],from_nod:5,gener:[2,4,5],generate_cim:4,generate_graph:4,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:13,graph:[2,4,9,13],graph_struct:4,graphic:2,grid:[4,9],group:4,grpah:13,has:[4,5,13],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,4,5,14],import_data:[5,13],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,13],improv:[2,3],includ:[2,5],independ:2,independence_test:2,index:[2,4,5,13,14],indic:[2,4],indx:5,info:[4,13],inform:[3,4,5],init:13,initi:[2,4,5,13],inplac:13,insid:13,instal:14,instanti:4,interest:4,interfac:3,intes:4,isn:4,item:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:13,json:[2,5,13],json_export:[0,1,14],json_import:[0,1,14],jsonarrai:5,jsonexport:5,jsonimport:[5,13],just:4,keep:[2,3,5],kei:[4,5],kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],last:4,latest:13,lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,13],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,made:4,main:13,mandatori:4,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,13],max_par:[2,3],max_tr:4,max_val:4,maximum:[2,3,4],member:[4,5],mention:4,merg:5,method:[2,4,5,7,8,9,10],methodnam:[7,8,9,10],min_val:4,minimum:4,model:2,modul:[14,15],more:5,multi_trajectori:4,multipl:5,multiprocess:2,must:[4,5],name:[2,4,5,13],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,13],net_graph:2,network:[2,4,5],network_gener:[0,1,14],network_graph:[0,1,2,14],networkgener:4,networkgraph:[2,4,13],networkx:2,node:[2,3,4,5,9,13],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,13],none:[2,3,4,5,7,9,10,13],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,13],object:[2,3,4,5,13],obvious:4,one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,14],optimize_structur:3,option:[2,3],order:[2,4,5,10],origin:5,original_cols_numb:4,otherwis:[2,4,5],out:5,out_fil:5,outer:[5,13],output:[4,5],over:2,own:14,p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[14,15],page:14,panda:[4,5,13],parallel:4,param:4,paramet:[2,3,4,5,9,14],parameters_estim:[0,1,14],parametersestim:[2,13],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:[2,4],particular:[2,5],pass:13,path:[2,5,13],patienc:[2,3],peest:13,perform:2,pip:13,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],previous:5,print:13,prior:[2,13],prior_net_structur:5,privat:4,probabl:4,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],provid:[4,5],put:5,pyctbn:13,q_xx:4,rappres:4,raw:5,raw_data:5,reach:4,read:[5,13],read_csv:13,read_csv_fil:13,read_fil:13,read_json_fil:5,real:[2,4,5,13],refer:[4,5],reject:2,rel:4,relat:[4,5],releas:13,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,requir:4,res:4,resid:[2,4],respect:4,result:[2,4,5,13],row:4,rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:[4,5],sampl:[4,5,13],sample_fram:[5,13],sample_import:[0,1,14],sample_path:[0,1,2,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,13],samples_label:5,save:[2,5,13],save_plot_estimated_structure_graph:2,save_result:[2,13],scalar_index:2,scalar_indexes_struct:2,score:2,se1:13,search:[2,3,14],second:2,see:5,select:13,self:[2,5,13],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,14],setofcim:[2,4,5,13],setup:15,setupclass:[7,8,9,10],share:4,shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:13,simpli:13,sinc:4,singl:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:13,sorter:5,specif:[2,4,13],specifi:4,spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,13],string:[2,3,4,5],structur:[0,1,2,3,5,9,14],structure_constraint_based_estim:[0,1,14],structure_estim:[0,1,3,14],structure_estimation_exampl:13,structure_graph:[0,1,2,5,6,14],structure_label:5,structure_score_based_estim:[0,1,14],structureconstraintbasedestim:2,structureestim:[2,3,13],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,14,15],subpackag:[14,15],subsequ:5,subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_end:4,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,14],tabusearch:3,take:[4,13],taken:4,tar:13,task:[2,4],tau_xu:2,ternari:13,test:[0,2,15],test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:[0,6],test_child:2,test_cim:[0,6],test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_cim:9,test_generate_graph:9,test_generate_possible_sub_sets_of_s:7,test_generated_trajectori:9,test_generated_trajectory_max_tr:9,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:[0,6],test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:[0,6],test_multi_trajectori:9,test_networkgener:[0,6],test_networkgraph:[0,6],test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:[0,6],test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:[0,6],test_sample_path:[0,6],test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:[0,6],test_structur:[0,6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:[0,6],test_structure_estim:[0,6],test_structure_monoprocesso:7,test_structure_score_based_estim:[0,6],test_tabu_search:[0,6],test_tim:7,test_trajectori:[0,6],test_trajectorygener:[0,6],testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgener:9,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,testtrajectorygener:9,tha:5,therefor:4,theta:2,thi:[2,4,5,13],three:13,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,13],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,13,14],trajectories_kei:5,trajectory_gener:[0,1,14],trajectory_list:5,trajectorygener:4,trajectri:13,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:[2,4],type:[2,3,4,5,13],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:14,use:[2,13],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,14],val:4,valid:2,valu:[2,3,4,5,9,13],values_list:13,var_id:2,variabl:[2,3,4,5,13],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:13,when:[2,4],where:[4,5],whether:4,which:[2,3,4,5],whl:13,who:2,without:[2,3],worker:4,write:5,you:[2,5,13],your:14},titles:["PyCTBN package","PyCTBN.PyCTBN package","PyCTBN.PyCTBN.estimators package","PyCTBN.PyCTBN.optimizers package","PyCTBN.PyCTBN.structure_graph package","PyCTBN.PyCTBN.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","example module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":13,abstract_export:5,abstract_import:5,basic_main:[0,11],cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:13,document:14,estim:[2,7,13],exampl:[12,13],fam_score_calcul:2,hill_climbing_search:3,implement:13,indic:14,instal:13,json_export:5,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,12,16],network_gener:4,network_graph:4,optim:[3,8],own:13,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:13,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,14,15],sample_import:5,sample_path:4,set_of_cim:4,setup:[0,16],structur:[4,13],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:14,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgener:9,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,test_trajectorygener:9,trajectori:4,trajectory_gener:4,usag:13,util:[5,10],welcom:14,your:13}}) \ No newline at end of file diff --git a/docs/setup.html b/docs/setup.html index 1e64098..8f74cf7 100644 --- a/docs/setup.html +++ b/docs/setup.html @@ -19,10 +19,6 @@ - - - - @@ -148,9 +144,6 @@ FILE_SUFFIX:'.html', HAS_SOURCE: true }; - - +