From 8810d97eec95799a2a6ddd0b99ce2ec48abe6f8c Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Thu, 14 Oct 2021 09:52:33 -0500 Subject: [PATCH 01/38] Trim table in readme, add logo --- README.md | 6 ++---- docs/src/assets/logo.png | Bin 0 -> 40319 bytes 2 files changed, 2 insertions(+), 4 deletions(-) create mode 100644 docs/src/assets/logo.png diff --git a/README.md b/README.md index 9b6c535a..08aee526 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,7 @@ A Julia package for Adaptive Resonance Theory (ART) algorithms. |:------------------:|:----------------:|:------------:| | [![Stable][docs-stable-img]][docs-stable-url] | [![Build Status][ci-img]][ci-url] | [![Codecov][codecov-img]][codecov-url] | | [![Dev][docs-dev-img]][docs-dev-url] | [![Build Status][appveyor-img]][appveyor-url] | [![Coveralls][coveralls-img]][coveralls-url] | - | **Dependents** | **Date** | **Status** | -|:--------------:|:--------:|:----------:| | [![deps][deps-img]][deps-url] | [![version][version-img]][version-url] | [![pkgeval][pkgeval-img]][pkgeval-url] | [deps-img]: https://juliahub.com/docs/AdaptiveResonance/deps.svg @@ -54,7 +52,7 @@ Please read the [documentation](https://ap6yc.github.io/AdaptiveResonance.jl/dev - [Implemented Modules](#implemented-modules) - [Structure](#structure) - [History](#history) - - [Credits](#credits) + - [Acknowledgements](#acknowledgements) - [Authors](#authors) - [Software](#software) - [Datasets](#datasets) @@ -183,7 +181,7 @@ AdaptiveResonance - 2/8/2021 - Formalize usage documentation. - 10/13/2021 - Initiate GitFlow contribution. -## Credits +## Acknowledgements ### Authors diff --git a/docs/src/assets/logo.png b/docs/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..25e2519eff60fa462d43d56a06388f3409eff597 GIT binary patch literal 40319 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 c0 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 literal 0 HcmV?d00001 From c3b14ba6ec999eb572d79fc4177a2488e6eb77b8 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Thu, 14 Oct 2021 10:41:09 -0500 Subject: [PATCH 02/38] Add colored logo, banner, and favicon --- docs/make.jl | 7 ++++++- docs/src/assets/favicon.ico | Bin 0 -> 60421 bytes docs/src/assets/header.png | Bin 0 -> 82431 bytes docs/src/assets/logo.png | Bin 40319 -> 60421 bytes docs/src/index.md | 4 ++++ 5 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 docs/src/assets/favicon.ico create mode 100644 docs/src/assets/header.png diff --git a/docs/make.jl b/docs/make.jl index e65b0b3a..eadb5c23 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -2,7 +2,12 @@ using Documenter, AdaptiveResonance makedocs( modules=[AdaptiveResonance], - format=Documenter.HTML(prettyurls = get(ENV, "CI", nothing) == "true"), + format=Documenter.HTML( + prettyurls = get(ENV, "CI", nothing) == "true", + assets = [ + joinpath("assets", "favicon.ico"), + ] + ), # format=Documenter.HTML(), pages=[ "Home" => "index.md", diff --git a/docs/src/assets/favicon.ico b/docs/src/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1b566461841b412d3551e6b4e7ad073ea0b0fd5a GIT binary patch literal 60421 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 QB8`Coqi3vJqU{j=Kizim6aWAK literal 0 HcmV?d00001 diff --git a/docs/src/assets/header.png b/docs/src/assets/header.png new file mode 100644 index 0000000000000000000000000000000000000000..6477eec0d1a4f04427227f2805713cb4307c3be5 GIT binary patch literal 82431 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 sTw0+)k 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

BxGgr&SL0sw~g@Hic`pFv4@BXy;z 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 QB8`Coqi3vJqU{j=Kizim6aWAK literal 40319 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 c0 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 diff --git a/docs/src/index.md b/docs/src/index.md index 13df2192..44427ad8 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -1,3 +1,7 @@ +![header](assets/header.png) + +--- + # AdaptiveResonance.jl These pages serve as the official documentation for the AdaptiveResonance.jl Julia package. From 9eb49c2404c13c71e5b653b262ca24c18fe6e7d4 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Fri, 15 Oct 2021 10:00:04 -0500 Subject: [PATCH 03/38] Optimize artwork --- docs/make.jl | 5 +++-- docs/src/assets/favicon.ico | Bin 60421 -> 35595 bytes docs/src/assets/header.png | Bin 82431 -> 87351 bytes docs/src/assets/logo.png | Bin 60421 -> 35595 bytes 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/make.jl b/docs/make.jl index eadb5c23..4caf120e 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,11 +1,12 @@ -using Documenter, AdaptiveResonance +using Documenter +using AdaptiveResonance makedocs( modules=[AdaptiveResonance], format=Documenter.HTML( prettyurls = get(ENV, "CI", nothing) == "true", assets = [ - joinpath("assets", "favicon.ico"), + joinpath("assets", "favicon.ico") ] ), # format=Documenter.HTML(), diff --git a/docs/src/assets/favicon.ico b/docs/src/assets/favicon.ico index 1b566461841b412d3551e6b4e7ad073ea0b0fd5a..24efd77fb30b26d090ea050cc714925de5e37707 100644 GIT binary patch literal 35595 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

XT&PX_W4j zm>|5h7MGo0vJ6bY&9i|z7ca7^yh8(VjqG;LXP{8VZ_u62MD>6@<`TeLjA3lb9oX7o zqOv)5ewC#ugn6HiRI$n?k@o)VlB%EXffc($u6^#8PWb=^0qjalVhk7r1mYlQ?rX*o z(C+$S=k+6=on2e}32eCSa8ID|{&jF176Q84es%FNz9&gM{k7~A#4)2Z3^gEzV6(;!br8KDI%1N`gyX2s z>Q#U&Pck@MvqHrQMI0&q+A@bCQoEBb+AnAIS!64ykd@i&uFOwIi!pSICIer??9&Mn zSJ0w?&RMmKM%PRC-)ZKoLwSW0*heq)Bu0oRqf*9<lY7Aazs(^BQ*oj(yrcrDm}_@xaRvuARt*hG_WS^D&wGPD=N4 z8-AvW7O8#o&>a4~%*$Sfjo%f5a8!wyTA5EGN~GjYEnM|u37{%0qMAd7n?K@;S$5Jt zdUmo%aV=5B7(5PWsv-Tva_A|`(2@vnF{`L)$pz-I;_%cf)N+^mtGpmTx4bNZUSTzF3rUx2A*Qe8+KN;BA?tLt)>}Xp7V|2P2ii}258xlGN<&rK452NMe{r7PG{Ru927m9>mV-Y z?ds)q7Kb}{1#e@<#510^KGqw7j}UawCQRUlzvZ=VQ|Rjp@84`HL`n!aFU=p^Z-xo7 z?ccvelx~G;VsO`maz2c{K66xBJ2ErB7jV|`!{EZtV#Lsw~Xd zZhlowHe?xz9Z){;o`%L{;=oBN-^bV-QD7*W%c?vS%x>)Rw0m#8f+X!$pblC0fa@A%WRG+#=R4G_+WH=P7UlOh}oTZC;tiF&q zTDR$ZJ4jbx<;2+B`P`y9R&DSh3Z zg4otX)vw6rYp;$sIIT)%G4a!55i~XkZI;XX9^%$}t+ypLYNX9pU^B$JR^^sYT^uhC<_YPaw7!%hEuaxfO z&dBaJgc1F(vgP6LPJ;#6;5KK2=J~BMOj)ZTpS5n8P47xh$;kZqgRvfqIWpYm4*NO9 zGjD+Mnyc$yS61$NSsAHk%;yNX|3J5Tk!z*JWgj&+<6!f)z}ETo*VX)chO#`U?hs?M z-WpeK{HTiq&r=qV^~_QpJQS8A(6ya{>xG|RgYH&ru} zb_pxEWcSwD1lL5&jK$Yo2c=ou-=}|Z94u>>E@x|l^KOF_pNg#Zk(lzWBalsEVpPcK zpakJ*(L~ExxSj_PY4sD(&z~wj{wC}q_q_nDIb+}g!qucQetS-t2duw>JI+m zEv`ttSa5~7ol{%RbXE%hRHmiO$*sC#D$& zlX~rTX*q0Q^)pm{_w*aTG~L{b;uv$OxtQGhVYDX77H9G@%2Cm^%JEODUM@Uy6BP!Y z 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 literal 60421 zcmcG#byU<}*FHQ0$Pf|=0@4_SQqmoQf>HuX2uPQ7NW;*Gq$1rC1|8DfT_W8>N)8>v z%`M2&5#65M_7`e8#tz*LH$H=z_2QLG`|n z`9UC?NzY`ZU%I{7n#K1b9zTce-Rlb0@@KqpQ{l0tszTV00+*?`+g972sycb)Ipxn) ze?EM|Ve_t}Jm>h!_D^z-pPo1HLsO$8?wyG7vQXnZo6{cXJM+e*S33>VoxpduFVebG z<}dnE#;>0L|L<25vF;hYGX=8U8gu&X8)b}0>`gLFV3B8P-zk;P22dyc5$4)Yd)Z64%F7YeJ1=Wrt#$h$#~m?Z}i8dgv2Q_j8!8 z;ROd&{5<#|9&-Iwwb!$>sy!#JcDcZ{urQ&uWKwq~E;w5d#afd$BE5=|-TC*g#;#i= z7~kGB=o0}7>+ub0IDQj1ZUo%l2@)9OPTF<-fYF^%N_4R=8{gEH4ppn2k1&z;kbn9SLl5$mdtc1i92>RP zHWySGwlqnwvpKwW`kJh!E6bxqJ#!(Ouf0)ZE3|v;ueXfSlHSE#JN!eLOONZ8K-4MO zEDX8r|BsL439+212NY4oTfgT8DwXQoe#qhECTn#6U z<`wc9cgf%q{QF(Z{BMU{}@Jh5Bt@>`7l>m`N*nA;L7ZB zzSc(k(1w%Xj}R&5Pf_4dr5qDrhV=JD`vUBV`sDRyRWa{iNp5~K6aNa;y#ak~Q} zV^1uPdyo-gK!5MHE^H^jN=ihYCPO8{yK>|=(dJYcvvOQH8%wm^<tf(IA(=p$&@mLy#fLoO%FC(=5i?3T)och4EY)_l3!mWvHlt^IQ2T>0+#u z!kw6vB6gNkU&Dw;Xrnc7cApT%$$oBRq4xMO;aL0WAZi+nLqWqGSm_pe@ucD||4M)5#K4 z>)eUcgN3%dbi6oyzgLnUiYy`u34u2yd~MXO4?mGMpu*HN2^%maz$}Rm7{i+1NjZ(^ zV_VZ@IJB%2kg+z?ZO>=<9Qt`jXp#NK-DZn@pR)3>kTCTTJir4_)*o3Unu1N?>mFUm zO>&dA5WD8nIkiDA#M|gJBWWBnfqY=K6gV93xW8O@+!A$PGOXegi75!RlZjlb}G)nVrc)2{xHo)jCO*}*|CRc+9N-j#(UL%I%&qC!sNCHGvf6H zDEhfaGuqQ}N4y+|OygK|o}N6=)jm;Y8EdOlT7A*rw{J7*{A}+V$#Gst6YJuE`88dw zx&@B0wo}0>AhQj%NXEW zGPt9$$J+3XB|_wyTXw}SXQy)NNJK zdtxeZsF?=zCfvHPK;sK5-yCe`i8b{Pa^7Y6l2%L8%q6VzQfEJHCGXldMXUc|8fs0W z9vrdpxSR+^a#4uD%rxfC#>syYdNiFsRhHWcd>Up-cHyM0N!%n2{8vc^xxN)@YSYu!?a*y*J*6$y)eNBFLsV_S21Ej=!( z$r)v&l)^W**tME$=XLhGk#pI*D;r+>&h7r{#77knYV)sY=a_QlJ>E8tys9Hf^hMfP z3c>jN-J|at(r1G}WAD`%hbUaL5L+{_tni^|!MjKv-F7(XIQn>XHIyRrs~zFGi);M{ z?hHH-#5{#Pu@L?NqXIa{XH~>nX*Pw>IJ}`XO0K=I1j#UEDqzN@r;HRWe(s}NK=~_ETQoHwXxAiXgLk0H>Hj@clt36E>eR_4kD(BqSWZu|O+-4Wa*B2uAOF zAoYL>Ljry&a%BLzXuH_)>@MATiUSQpWu?aNX6q0n7v&1=LVEouH##TCiSbrnKz3F* zyf5Ho6|sD`<2WP}>kyrLy!&R{8`tf+du*;04nM>BWv*iEdy*4? zO%P+p&3+?oH7h9297=)-gZkmu^~c8 zg7P#$zAC)|)~B>65^Ym{j<$B+pWELfscNfu2+)+k zMdL8p!lw!@Vu`d*&WV1!EVk*is<> zi&qubklmm4Iwb4kEA(S;A?DqMVEMq^Yaq4RR1pio#vx7#)EOAt;VP$=_HU2!Eq{}o z&$Zvt{QcJIx%c^*#@pnLQyuKL^Aks~RI#=mmXEFVzVj32KBuOScBcn2Ic;>>(!?Y} z`3q1X%EGX};LyEfKodRdk*Z0OeAlRXre)k`dgRfV!zX4njmGyvbI^ha4FTUKpJplX8DB9?-^)GXE|lmH8bjYEwWsWUj#u@0MEIHo#+QZJ+V z3-+NRx-&Bx7gyz^c%D(jot@2kwS3{5UEGoDv*#X(?>G+TJaH+!D`)l@H1--+=yry` zPj27EC>twnhQpJ%e_Iu^pI+jZ4@H=!dhBlZXbRd{bS7!k_zIQA`@DUTc&6}8&D5O= zvkD3?ZeKtjD7;jl@RAflr?|zWLX3AYZNu*{hwA9`AD z|FF%sjE(7B9RHyga8-qty?eiys}I11?O;}~%}^IF3(uXpMzve!zQo_|#62l+bsFS+ zI6Jn+ih3GFiK;ykxV)`nZh#5{Wy_tLgoj~OdKEyL>s7cyoqG_Qk2(UM$(S``*WeHM zO*_nvqAzI~MjCe_X5j*0Jt<-pRYBd4E7^tXK3r?mbJ^&zbDxhRerGZH;5Zy{cdWdn zy>)*L($VM!DmJ**4&Yjg>B8Flt)y0~ko8RH?Wvtt6od0tGMDY`JDSXgqP4YSZ10nyX%~#UK5?Vl z1D%?*z!`!%X}l=HNUw{{(>Vm8b3$n;Rgj(05X%*={dkvGeipS+$93&|EeCEpMt;_Y zzl!KAwY{uwgihm&qwD>{qO!YXrJ@>I3fc4d&&_k-X6NSSdYOYziC}hogubp2EIhzH zIsrHew-DQ?g`W{|op2~*s&Oo7TlR7+6t}nB7u2t~B-EL}QMB%QdNTSS|;D{rj7j?`cHsS(l3dFGPiAun+__$K2?UPnILp|HIcokE;H(vC<7b{OOyJplp_ zT=k_^e#Xn|p17|U%;{;h9hXyHI$Tx=*KyT*6ImT8*WD5i=YN8V8~QW|2^9k#imCsq zKFUdY>`r7@>to$2oB<7oZ#D~Oi1!8LV;?YX0}R1Yg)5fEbZfm)-!5){+VhKp8zq-8 z7G=c6@P+g)q1A`eZFMJ!GK*&*C9})4D0)9!iEA!y6Vd$bY=}W3m zvzM6m(=AIm{t7Z%lxIAFcU}vZ&MHzu%y*8)BT7rX%E>p1O`++uk~0N+3IwJHa0786 z_E?}*Q`QE31_@u$eC)RD#aQ>p+K#YP1*LOq(Ontp^~=nYQ2r;P4#3m*>l$?gHk({p zBH-uJ=U*u}b=oiX@DAyRJ=>F7Qn9_P@re-g=K#upE4kSs*5wYM3{4@_@|U>Oe6>do z?R4m2LCoFpgWt8WD7PNvxsc9`lh8S?G4hS8`|{ikpK?I5*X3~pW(z>82fXm^*K;8( z87Cj+c*n^9fa|DWL4`T?b!rk$fN9gLN)I%@YdW_la!V+Lp3e(TeK__EAx`gk}E$}{Q_+lEr2D^gN#04T*98HD!mXYvfAeG(PwvPQLl7#DEfPu08+vPQg3&NF3DwO zQRW7=YrNMD^eV{AP_=7Zdxn!w^f65r(b9)=!=7D9Eh*Su;rO7L@UbU0p}itH++TEn z%feNKi;}B^c%LImRLW9W=S75dXJ;in|McFH+?O!Hs)rv+lwR3)k{Aeda_MO!y|Q0s zv&t)3c%ioa*bI4M&paI{3_H~#Bj{-KUZjYfAfkGW7e^xs|Ui^t`92 z(b-5;wc*`sb<5uLU+y$1P4k`nZwH;5y;AVk_RrHT97qg1Bz?X}i=yhuSAn0ESb?8| zofy3V+-B(u7y;?~;zylv(cw5`7Rz}*RaD#Umvv;ztjF+fg5T5A3$`{v6|9J|i+k;D zRR_6~v_2fu1FJSecyN^NQ-f!aenblA*$P&1^B>grWsD_Q!q7rha}@Jnm){) zxapD`P2}&iV3+{w21z0loI6Cj2$}?2Pxf^EX(C$I_)g8|M{}c2(E;er@Yd%Pb_vtTp7?G zf|hOh&L+Q92&BH2+%CzI2pFb9c?(<~6G?Z_UG7?RTv;0vyX^mCT1O;;*!?-V21yoU zGah_Ng>h^VwwIJHluLl!#yQBi0EwRAb`i8j4BLiB?wH54a!-KDw{hMKesC{vxz@E` z;w$Z&=61}24L2TqP)QtyL*+?@x!EerNDjKaVD}+70LC%a;}9iGSc^om;=E6y_jE@R z&jCfziVZge-q?>`{VvP^&&9v+dhSrc>y3)n+uwdZha0eWGJ|rGq6^3cNST;f_UOTMqWg64UAby=0kEw1jk{((2eN~hp;O-e{`y*db5Zrq zM%V8{^KLZPJLWxO2BD_cldupBCXz6`Rq1^|HjP6kyPb)K_@p}1T*#M|%JSL7Jr_mh zaIujmv!ixtef02>ugVD$==9fB*0<~enom9Lc7zRU8g&bb5XA!cDri{+`S1 zqAWFWP+Z81hEKb1+5qbq&1ERcYd32#(3!b-hoX<8&t)|d6Wnt_!n~C3SH0#dLO~RS zBw;fVzuJSZJ76P9V^*j$w0$GRooeW(6VGN^lQM4X(l6O?OP4HWtzQZrj71no5ED_l z9v>=LoBuf_p+9Q&nZu3Q8*CZ{G4n*m5G6yPeYG7@1Ny*C-z}4BT#MTogveaB(v^PC zFu`V7GdQtXMC%0as)Xz3_D+^y!DbUPIE7jGlW@4aQiqeT0X+`R0i)A`2qW?BLTJ)8 zi@4)Uw_n#IQwBA(`=<@=q(6VP;l#Z?MpV|3*-hvwG;v|OTIn54fMHh@h4oQ|QDLH! z!q*_pVt8OvxlQk+7PT?la%WQ%CyP9wi<3!P%mPcXK$< z1e8198e*7xtuaNVQXx?geLz{&oXm(9BN?;mrAQ5K%gCKy!cyEM{-XerPynz{0`f@= z#QUUYg>qt`JoZE^4EG6=8Lw%1@NPnsT+oSY3nc8NV5Y1Ax;f1LHU=}K|nE8-#}>0~z=oF++AI$}-hNQ>iBuJhF)L>-a; zLVBp>nv|MiIE&pM;{SV7{sw(G>Bo9 z5PdpdV}1x{Xo@NB4mUKuiC~a5S-$cp)<s=BE#(+U z>V3~+p*b9GJ&l0QyB(7M&E}FAEne+r0#*8 zZXMFcB;i^OO@(2+leKpLzkG2is12U>TU1WW4l98(tQql9 z@0*c3nG~KikMV@?|BLIIIA#n)gW(5BbYv`~gfub1sn}OG@BR(H_aKO(Q|HDZ1z6>Y z^J4rY$!JUbIb7)8U{>`MZ`v?ocvHLFJ--Xk%ubX=Uc>Zwa)l}@Kb1e}_63gg~t0R_v3-Ug}I21a0NuANp zJJfLIQk*KYeVc1%%Tn^6a1lCn;|up}Kuu2$lp`5Dr&OZ_rAe9L%)}DRM1H`~$Nv}t zm=!qz3_bHbhG&`In=VlG>`-|Bp|3xg5fURA#qT9Xox4XP{$*mI4hi2d;+(^gPCzB* zFa9s#V)3tFuKmR+Ra>(k%$6kD(V!Dr*)022g6c_nfMpnNf&j4+J%*(-Jilk!fCsJJ z^^Vv8CG$Wn4ZCgm08m_yK#xSA3&XhsI@~hIwl-ha&~y$xsh87kVZ1wyBKhUG?K!QY z4qsEg!}=|9>-B9lk_@EX9K(YulK(Yd@evNaY4_*c%VpcqtxpR0ciNOGGRl1;qF!J8?2S=(h0<1cO=(^2*^*fWK+0h~LWuTlvO8J;QSH4-B9GF2i(j(@rQM}wIv@bfp zWOAdKg7W`{@ju0_^lvIwggiqcC*8;tqf?@zV?lB2?*3nk8?HqRB`ITn)Zxa|`^si1 zl(*nP9MP}NbWP-^+$apZwgMhh*=&HS7d)ZmcDN3rZ|mxj@^2Dg0CI>Xf+~V*0m=s4 zM3grjj@R&RZ}+^82zP0>HnGxL==78~LM7+Hd`aqegyib!Fs1wdXN89~2p$lo934~fNZOO|L}d@$DtqNowc0@VA#@b+2p)XD9_G1yz_Mh@4@l? z5mfpZSLK?`&~128zXWW(;y$%!Zp&#r*?`{#zN0wktH1@CB^igFb-57@F-d9ab-S3Q z3pGDtiBuuR0L5)LfcOeRDDLuFC0!Og6hDyxa59G(-Vm|f*Wk@2Byq>fdg4$;VNYT` zaL(AHNc-28lK~OK--nO@aSEtrBz*z&!JEFiCiS=$^cjTj)*TbK`y?FX_kx}rgzO8f zFQDQNf=f~-S*~lhcG96(g#JvgTmmfIGH-li09wV+(J1|2!1NxUF6=rZ0H*Qg8BU+Q zJ?>5?UT#0M^vTvg39cie7MUu7)feT?m$rcvL-urF|JHa(Dk%c<;_Fz^fq+GLW94Je zLG|H75&HCi=p{N}yZ{>6FaVeVed7>4EawejeRK-|ByO+Fo8&Wi*Po%LAeV$_K z?U=0ykOdDJ>{{@EPJ}&;{|IeN$HEfqEl^Fq8}M{pJm(~iKS&66nm~rt(MSuH3<$Yn zfL{>+sKZP3v7PaU+W2)UWas#F_Rg+3$?XYP_%^2BN#VW&+8t0uSoU%!{j)R**ITDE zZlKdZ>ww2Mw$prCDVc(;0t&u2IDC^T;)&#~tJbO9E}%nULOF0+Q2wC)T^d8z^a2iA z;)8uHuEU-KbBY&HGN*~CVFw0iD#VL6_BY{NLI3XW>Op_^FT(r~bfyi*buXU%ZSO=Z zmJ{Ir*tB(6y47N6OA-8)M>^y?3EI5jHk(`caiE0|37d<()yQ@i4pXtI>cIwGG z;(y!fe`+4Ng|+`$PjZWA|Czcidv^Tn>{*C$z{MECy9?qmk8}1tn4DOmAuzVyy1L(* zrSDXw${9H;qc>H);N8XOvAZsAqGUJ#mFNfzMA}ILfdEK)7foWU2p|wp>SCj_tbBd0 zTHR96`AU3TNcME;7niU$;Ft?>&NvC16C5L731k8xdQ&4&ILyaLG_wP~)lC*d?7F!} zuqz`n?D=$;&Whk2=+v0+g~L6Yg`)u}FbM!)V!)=a_X4%Oq#ib3cii|1<81n;2^qUz%!td2wYSV7>u;@7J{XO zxJSP;q+bR^UOv&dZ#m#(LOq*XE+&+-?b7A4-q|9U|)zR`WL2l2357yrk8E<0d(YwU?FV1ShYxmFagGGv9&sMVg6 znrU^!*n&;lH6`_97|S^ZBMh@RD|E# zXlp2TR+aEke115nvK!DuNd#k%i;EF2@6)Itb3~ODFnI5ne^tD$O47Z#H5$r#<5jW;`I@1Oc>qcWC|V#z{H4EFrO!d1Z(W6(oo;x` zVoC3TZ1%j2q5}6Naz>|eN@^}1>+<0B!k5Jbz->B;sV{0)ka?hfF(}tG1r4U(YKoeq zzbqS(EW5@@P5eL8ngvp1=e`rl%XaB_sWVoNuiVjJ)zr-r_OWN53Q1(cXK89N);&r6 zlg#`0GVGTHRs><;@TI*66eyR;oQI7o-Z~Y(fM|(Qe-SWHIaF0u z7aUv7`aCsgly>IPR-5RvY*w9T-`xH5`H*Mx^=kdeb@p@H>J`cS1@B&UpXfJz^P`^R zD_EZ@Z7)~aB~LA)Ji3x-cN^6=dUExr%W_|FQnmdz(U$`dkbp~W19JevR}Eny_G&Y~ z6iqIUg;A!Ckea$O<2-IeBLThm08eA{8kJzpQmj6Fqbo^61T1AKE(fOVj#^{achFl8 zKcfL&vM+~6o&V*Clv1#Nk9^|flZd!6Ai`vN4H69cvd_WB0oy@&1fZE z=Ih{%M(kDdVsUvL-REevn?&wv-`i75n>vca zIozTwq^D3gtxJTCSJ?g`cjaW4+71v2anVsIxqgpHLtOj)|0HRh-@XCH zfCxBmB(AlK=qFxUKX3D|4l25=$T7Yei5mO4f678!bTcP7RsHdlEo9PYh9TTIax zP=1xd7DO_{b+N+@-}*9B)Cb+=IN`i=)f5Y-ablcG46~f|?Gb(1NK?B@r;KM?matUT zwm&Qi1Uhr2hl~Q~kmA&Dk{ao%J;Ko(Dswu*J>pJDHj)(9)5xUrPZD=Dy<*qKnj7^^ zb%s){G@XiNTyA3y-wc?nHIe_cQlY{Ov4MxPA^ye4PJ#IdnBOPm%ye1(53c!GOfIHw`ykzu+D8$E+Vp+G9O z!{Xvu%IXXd4bV?82I37ZTQu$vWntzdWB5&}sGKd%k z*xTL`9~$6J+R?bh?m$G!EERL9w0TtJc{wFN z*4BNOL2hiuU7~RBSMFIISE>x1PDQx*_GtppqgR&q2ngu4kMm+5y6XcuzDeGjm=p-@ zV73eJRb_qrQr{p-))fhmY?9f5JMBh~R7$VJ`G0Hd)k3;uW~r){)0`f}im$0KYOTUe z0E^!53lP$UWt)Dt^0kL1Ei5tJ0+I^wx~3>_%ZgH6g80i0S9{n{1y~}xdA>Ib~{N;K$PtFC#X58Re)CM36Lc=LZ3hg zmIhh#D=?4w%VH|HQlgu#jNq0nNqpYHiTj$l3tN{Ru+|tp-4)no2mv*CQ8R52c96>X`^PH)7plc*~tM^}HCL`#Mue{*d z&^6x}uvEZmrvS=tWpb68(d(KB|9MtSzaWFHX(>I-+qTL=Cy#k|Dy<=ciuyt}w-CVwm*YX*O78y&_87=)a!p4(BSF8AaiS;e{ z^uh=*DC&u8WrPZA{+Knxd#Nz^rYiD8T8;|yxJB52yDuOR3}Q3`zAkdR2wH(R)OIzO zsX2Bz8p@C4$Pe{;^LFIXa(zja1r@s&I^UNtjB==j8YtGP4~TY z17vzd;I)m<$ld908=w9e;q+4lrv3S@2FcdRFa9(RaXn%Vwq0xLHqLMpREhuXld5-o zIx2R)R3@zBH8hUFgX3R!{tx=;Xe_y+@#W(FlJ77w15`4>nlB?@JcI6rRi1qQK;trG zcPk+D-_vT>EFAyaIGqkFHf^_Rv*|0p0Zz@bl{Got$Wj}3`t4|tnKLc60j5y9yp{Yi> z%XRDv>Jny7#wm49D&byDT}lySH0}}UdmMzmE0|jZWRRY)7z(@NA1Q>yAL#O$YJW!! zyU(8JpQh^b!QJ*}Ym16GmFbD@)tEUHX09LD7)-^~85TJIIf&`E+PBx^Io!2Dv$ zI3{=4dgPF4*T0Dy{myUU?*QY#ViN!6j}|=-FSRNK*BL`|C>WAd1})V#w)2NyWRmQj z?%PqbT4eK&g%{z~f2yo|PJZ-81*Vr^P4^Sq{>ty#a4p6N`5&1YAa zqH#jqTx>>(aEzjQx`XG+k^7U7hKOr-IEW82uB&&z|NGGDgMSaAQf8jH+geb@LnJmElS;pFMCoLYxf zabxE|ka56^)MBb|ObBZX^I($^=3yo3!fsT?z#NE`ZHucLXWo9AZ_;(LF$?M_stKw> z?2~4GM!Ia0AvR8Soh?txqZ99?LAle?!p|&2zpbyiS$zA7DlB9CY=3iM4ZSvk-<&)u zlMw=-W<7bmot^R6=VL6#k=k%aVpL2_Vb<;3@ZUYAWf(q7?wyQc>TvkGk3@w!CB`^Njx>2%xkob+UnY6F8EDDz$o3mIY|B##J3*@I+O?DLqt^4Cp+?hUQaVD0f_wm%8{(F+!8)?EFecaiqinW};+)`#R|E49=I!j0~g za*Hv442NEy&LsM=EB&(8iV5m8A*oH zE_9fC5l#yhza1y16=`2C+pWw)nkKF3vxCj-b^~X)#?D0CMqyPtc=T#{)5F8of&z>? z-yAEum@HgJW=bxRL$}CF4*!j2!*MD;D6 zWF>t;0I8<;-X2ur#H@Oat-OeQ&e?r@wjLX;#%NbT^Db{yH}clUBPZK2b7|16)H`16 zWlH&UsgZr>9=yp(y!+xl_ls#MIj6Ng9;4sopR7Q9bp1i3XCr8ZUN^oj%-wZ<7`P_E zq(qSdV>9%l27Mt;8-wx{w1gt@mY)*w6DyWb3Y2D;d5JNev~%)lgn(Q(eVGu`97U!@@KA zTWJi-Y2>?Ve8*J^q|+bRrXR&yce|eE<*E-rHC<0?g?nNp`v?4fL#z08obZOI3DPAW zGD@IyQ>)(F>sJh>yFE;b>rlz;eR6+{qqbD-IM&*y2VH0Wh%&^SEq+?t2?-DR{JHpX z#Oqi`p9>!bjPWS0_Y+S2Pv-MWsc^TMdWt_E-F~+tcHW^sG%S^^x`YmXir+q{+B!D# zYp(rF->6x5%hXzfBi@_HHufhaHO66a?ahZMyg^DzhXFyR{l{<6Y6P?X?LV#0CipWl zdT*UzamG)+32-v#tGJelaHCn5!FVv45xa}$4F@0a6V^&;vuKzCEPOO{Y-~x^&$%^nwAbT1ovd}uK zf=0AsN^r(|5+{_C{MuxLZ!br6fTIVi-~A|+IGuNS=j?K?p6K&V=Wi&8zOAjEd55fW zinz96#hDhWsde!~VQg6_p1s>ucjnX5WL(pEerifn<YK5GsF{IJ9lK+j3a@R6NFh=?>PM7KJVjuiejEQe z9Xu4n(??4M3xhKVS`~Vm5V_R+`ckbsAOc>4o4qCy{fF9K%(IY|@S*0hj*j*EbX8u9 z3EmKvCFb~h{2k7@%=tmfP5~tqqZh21IWJWQZ4Nrfr!(oXIC6-G%!*(5D*I*JNpx_! z``l)Zu0DzX35F)B1V8bUh*UBJO3fo%w3lC!wIWj|x=3l!w%BpP=xfSwYhE6HO7pwx z_eAULk&TPR^=XTn*i#vjk;YN!5y^6tZc}q-Vs-iFH+|VG6eGWsoK8i@^j}r3EYCBB zBGgNl^G`1i8@GEV@_!+yF72*Cis|wK%_}10+$abi4EfWD+|OT{gBvI9aX$Dpl_jaz z>*QA3K31?)W@O*#uVvAU|4mBt$?dTFVIH>0QKI*(i#jKGxl)8^1f#(6lYRK2RK{*d zDs%X~T4vH)CzP&`xkepmma`Ww>em(kv0>7CnqKI+>gB~hCL28#a?`*cCGO%QEMSr6 zfyaXdeNEOQqz$G@rD>{ zq|*amN!YWS;alAilgVY2(i!@E|07iAShlkIR*ZaJAETm`3O@JfH`L4HbY>#9()6i4 za6CzB9frS>swqjfb-4kib@`PsSfYW%?`9~@-D5i6P}4al_>R zmS;qNwf3TsCk2}Bl!mW8pT9>syVk1LJ|D0vHrhupNo_8DOU~O2(P_Zb?zk}ErKpaL zruEJ=8W`_5I_M-Q{<~hDm`-yKMll@-#f`Emd~9su;dcKD0ERtFWwhLYl9@?I6CZsz zT$3v3lPOt8H|H>_u8+knYoX@2U(0v=2EJ*c?sMHbQ04P_rPUM6G+m9c{^3bXye#g% z1jN^LkL%%+H&izkC-1!QtH>PGl)W`mw`n%LIUFjiMfu8do9&h5+s`D(*OE4Fs`=qv znOFs)rdvVe2QwnB&Lye9*@T2IpQ_Q?j0@RCq!rz&YPo=%BnU?Wl;D~sAQo*qc&&JNRt0k9oPVDPU-XGQEG&pYF>KK5%JNe~gsV2~pGrG84Y@przsW zL7(01$%CA$cFdLVIviNeESgVj<#;3N$|eQ~;9q6pF^;hf?AQ>}v}-NA+L3$Kba+Do zC(`_go3ThU?(1yR>ev$rELrIJ{W5esy%8yGgpDTOc>~QRQ*vCe7xt z5c9s1UbM1|C?!FjwraJL{Go%Qu^stiKFIr?$BWg!$`}3IXontyXN=aG`t{B$KX{bd z;#|Mxl~i3_Gj#AA@7I)?e}5y3F{NsB?)K&64W>T|88O0qxn)(=Lj?Jy5i3J&*(Rnb z!*+xR#s;d!7iSFaHJ@E6r?fPeOY#HPgT13FU)Dk(M#azF%%3W$*d3PLVB#cKVnm=CtGKMx4|gxy`e$D>1aC%wg%888y!BOpEkVlh&v*- z8}#QGWDP;~CGo#>knRSA2vR(Iq#W$=Y_K7iC9m^(py6nzwWGebT6T&!+u7xsDn zS-gP!__t_8C&>kjR*l5(Rz1(U>;br+WZLTM-3HxKQEv|B38w}w7};vp)KQ_=~ zOOKkX*4MMJ{xiY~KjPNv|6zH5ysDcA<_xF1EBfw1PZy%zaCTEV;!=0 zy#^$zkqG9eo|yXCKv&hoG5SkYy)<6WxCxQJjokueCVd6*@Pi=|kIRA>B`*C&9Y6k@ ze0lT!B@vfjb2i(LNR04KP_J6uruS*Pkq&HI-1EZ{0|fcKs$L zQ=>$$X2S65z~Z6CM3$sz;E(c(^(gej`gCZFhFyI{C^M5?xUim%H-7ov?AQA~Uyz&3 zKKv>qnXY6pokLY`d6!=HyoMPtd5!R=+1!bm9qO;OElg_=`@y)24Ox#2GOsCQ5({7= z&0tceh#;I&l+Jc9nBg)#aisaz760}1?vlCcLZ;2cXQ!9K*NCjo?l^15P&y8`YxGRl z+~t~2d~W<>KCo;sFQoaw>9SSz6q&|4NpjJ!F&P9>V?54VBO0>9PIjxMte;UTKt0%* zoeF&ru13bDsOiZJyZnrQ?Pj3mHmhGqg*ayJjdJE!>2$e-9N=jw$MyAvrt9U&gk!#$lDoOKK38_@6&u+j;JVGWvL92FHs}82+KQxV= zLu($A@TE!UP`uI-zkX+Pyo2ip`anVn45ODkH@3Qp+Vys<#YA>Fw+aRvi=k^^{Xw6` z|EzpZ6*Z4z+9GW!ulT$`=7St?CXgs6N+Z{J=8ex|j7~5Twdgxv?GZ_NXG)XT<96=Q z`?H_uoYpFb9_wTMull|3YdtF&wJfAxpi&|f_=9p+-PW2-@eS~d-~W|4o3mHTgkKlS zkZ0e>{h5WsFm=ojarVLAIh9^cE+QS?5C}Xraiab_e|xB{lG>_ANLdC!_DM3sVbo>$ z`#FjV?+-#6iV4JJlN@IDdT)zf#XlE!fk3`$vx>PUUA1<*0TB!4`Ay{Bo$23wCT?hk z@FShH&NJ|j93|(i1^>M4uC5#3yvCUqa&-TEP|I|*jf)GXVA?%^b5sqzb!$2<{^3Ub z;=xD1+EE$CJLjc{mK@RalH8$~Zb+jwcDyoc!^e~6+;u{siq=6bKhFG{X_LWgX*Sny zS#Y=KtG4@m{o$M(?5@umEjXRLMfzi8>I-4-#J7j85;`S2e~6QY{*__ni*DGFizp$= z-&SwgXlYhF`VpQPz+yx(eCiH&k$vw$C0n+HSfZ&DpJgq7FD4<=nzf_Y*|Q6Y*2WuT zBzT!2O@&xZ<@#wl-mlU9r%KlJwdbLn-q~65e}Mhir&$oXf6(Z}B$mPU`mUrAjclFK zeqOkNXrnw}n%W-3^uAqjDo^2NTp-;I=pUlAwGJWRvv@niVi-$88;sA3i=S+yIrJ`(vw$$t#7(vE5f^c|15S)H%EO~7 zLR&I#^!XgjPwT#{;E#`ak7gH}FAVPD4Q22Lnv)XQF5)tIUme%1h(a5Leox(?_H@>2(q2 z$z2E@=h*?8#y)NLM+_h%h}|R{eECA!4c8C^>)zjF>hGNOr<%If+{rtH?r{Prt+{`( zW9It`)pWVfuk`)pHjuB;R(zZ^8iT(B-{p8oh=@H{bfV_MW(i(A^YGhyma<u`jMd5?^+g4*^H{Er1Hs|A7eMUyN_E6wG;elLci7b_l)A zOOr+6iQrrj=hjD^zP{ZQE9}%0VuYagc5}=Li%1))4r#7IerM~PSk1)H+24Y?R zWP>;|EIzHdC5Pr@wkp1&*o&O4H@0^tnF1|s*cR8FWn0(@qulwV;jqNi~VL=R2&KN z&EPcSZ5)f@2qrqhV2oJSs4M~3pk!)2zo@JPBN!^+2jS+ovfEx!Z^ua zy$QO=N9Qm9sEF7fX|d*sY#y2}2}M|hJJSXQb@cI>YAwtyKvoLzGGz`^YrBo#FnE-* z?PB|8vy-QZD$&qag`7z9oZfy|Tu;xCQs{n%{mt0?4nLMsUpyt!sc}CA@xpG5^D8ZX znxUj|tSVW9kiJ)Ix}YVhTL?E6DLp@GTxys$J|{AH*mG1Hqouz7j4kLghyllD#k-jC zd?|c;k5?nwPy>I^y47j$6R3XHc4$xO>F*CNU)PKM1c-#Lg*fv;0Y}YHgg9laR3pY( z!;NA}be1sv%cE24+q=j452sJnJ7AZ=EK2#E{i0Dp9g2IGpbYjT{f>Pc(PhjvdV^ll zYA?I^c^wJllaw3oLup@J%j*`KlxK+1o9b*`qh12$gf4iMZULDR-Vf~=A{vc?#7%Th zmGMWCU1wiXP$wS|QBdNfnBCa7FL1R4%U_Ik{V4a+zgRPXX-tvp%y<*m{cUM(xH0FUhT@Xj zkEgCal!OttLshWi^TZ8<3g00rWU@D zkW(0weUA%i-8;};UQ4@?wpape@fe(SwhO+f%It~o6wrJPAuyzNE;((@P~saa^{gJw z!YPe-bYC8Rx%qp$A2-eIl{k(El_cZBkox_)nycon<{1W2l&1$Nen1##UP`-on;r(G zW+eOOSZ1i)B}Z=m;PPa;0q<8vb-MZI^Fq^0v7cJ%9mreM-l7gzud?Q;oN5FlajBEf zT!!_aK0D5x0YgmZF4iMeE_R}S4kRF2;ZIr)hWDA~Hr;6$mGFij%1M3j>G+B-L9?bP zZ~YVT-1@9hPpMNmpW z2?L~+l&TYmi``@$HQxK>zcV_>2(!xTJw8{-zut26?PMeHO7ArXBhA-0 zpRD*xKM+91S5j$&i9{yOuTz}%tQ>1!Fo72aeBg9-`+3Kl9$7jws`UguDQwlhZ1P7r z)Q<@_dzfK;o4CF-`NT<8Gc~3%^jFPbSN4yl<-3UtU$d1WSgwS9M;kRZK2VX(#@(_* zMcO=thmGpbdVbRndnZTnExy#>>f8^n!*3438Tls}5G1k|?nh1e`-CLijPM@Pp`_t{tIVW+& zx>ftIvged_{ZJ%VW`PtImh;;4Bhg;j z1+T_Q>hGNwA5(bHzQuWzL5a>ui06(L*mx)09Ow=D^6pIBinQXlK|=+(0BX@I_7<{D zJGq&>QiA+l;yOKg<^l%Jx@BRIZ$i{jcRH2PW0u*kS}e8??$lh!`S(aw&%%Gfh| zX9*LKq_u58K6VAjwAtgyraRb!ZKbTDdXGk`cz7GSJ?;Y|<#hG=&r=OkW2jpd>j=ZC zS(e$~k!C7PIze>OP;A(qRb%Fi))H(_a+&!Gs=Is!`=ItkE1|1qE?P7KMEMCYMR4`S z;cr2$d%jrxMu+tVD*#SJvJigD^);pAxjJp8E{)utmD&?dCp#TJ!d4BFzK}d)9{%1Q zBiqEX)*uj-0_Z_*Ut69Nq8QOjTdQdpb`ji;VZGq-=oWhUXDBk4KJI@Pa^q}>;|T^D zMN`^nhyWbCFTfAa`OZzts>zMro5S#yDI<1qs3tvlU5#L*)vfHVEDFK;oZdRzv+#N7 zAT1)n<498Ux7tWd0u{1oM& zfG@#~*UJF)(*EsS@-LzKMsfocJHPa5&XT=hA)n0b)dG)71j6aM*wlV(k5+r41-ejQ z^MSFD<(&x{P$s!yg6izbuZ~_NBz)ZM$dPE0OMrOf@~T*q*R)<(YJ9JG@hZ^g#)_e( zB~QOHIN;UP4Um7n_<|!J0Q?%(Sr5VV*0XHlfZmt2p2w{ zQr;pkN^8-8R7%2YmIGTK2}4r%8LS5?4++hQa+(c zkMV351i*iV_`+DQ{7l2i(K)@lJ!8|)S)tiSyIaa>Dd_z{biw_>Uvn}r%f!g-bw zCfSIRbzXcWXTR6r(5kMM>gZUl9LfGTx2=519l*EvbUdZsS+*9#}Cu4**NMs@a2)N9j+&#!m8)R_X@9D%2H+|4E?BZHd_>P4n4Rbg~Vnn zdx_$hOn3p6}@d~aSEqiU^TgL0}2ETZM5N+DbtA^5*ulN4V16ibnnL&JO9B%+L+_h0Nxq{?`Sr23kQTA()+GcxP*cVdrf?|W7#qtuTgPsLn7u-~9r729l3dQf z?;q@3JbK;Y?Jd4SOH)xtZJqpiZHLto_f8s<;QWN=PI!|?JpqNNcO_Y{pXs;YC2S{dC+-N=kUb58E`QI> zdW#VNND$Fdh!`*n@EGy?nR?TUcw@qfg&t({-UTSyvvljP<#xzyws&unCJ;1E6K{{i6LR3Bx8c}>24Dd^7~ zA=W&Ek=hksA08~0@o8|WgUJceZ`!|^UIrg*eWQ8tdK-UI&!)WN6UcC%8?`K+KRC4# zQ6$Ai8u7Mp1YJd=fHhrw>Xl0M7NfNGrT6dKtX)}=P!QdyuoShJWVx;MTm~h3G@E^X*xP~Zf7Py*!DtVrl31W^~!>m7em-d z>Gnb+S$U$5{p544z%uBPA0~eb(y#pR-0X(z^Z!QqfHMn>G6eK^qpqv5kn? zl-ED#iV}V(pKyG(NboOUryfF=y6yCFDhugd>3HwX{_$&_-ykePi0bfa(ZP&0Os-7D zdBKYs<_C%}7%YduFg^(-kMnvH8H%l}&#rh#dR(N;RjVBGJOrfmW3}e|UJNrFC)Y6D zt)?&v^a`WgXvf}N99PaZUuh~OOhPMv3oT<_L-xCJJw#8EcB6up9t(N4ke0lYD=Jm5 zyu^vI%xGLTuo)?<6=5>=%a{Hq8|RNBc5z!@e$o%waE3*ue1;uUx#U(*%N6HB9X1o7 z_8`y!JFgK$6`cw^1AO8nfUs$`#A7326p(e* z#SVOtyeME2Vik(?QEy$Ti8tz6k)5i%2Q_HkeCzqzokb%(R>$$-G$$DYm<7`7Ptfju=68+jPqPCeI4VT zv%baNgX?3d=+<}hKJ!4$@jsXr8uJwrGg$cKH(S!}@0YZSu2l9KR`_2v*f?`KA=?X`L7$cdoB?9`Q169(INdS8{E5ojL4>b8WBud{aT6 z-#e&N7KSvP1xU9!(V6BwJ--i$-v*i^XDRgz-auzefcu55^ON<&Qr5a6+yS zuA<*R6u=c6Z&Ow3rF7^%O@t{SJWvM>E3}Q-P~kHr3=<4a!(il(7AIctn|~at6`hPf zeq(y)$MqRfTkF27udL?g`3GXo-^>%le>g;4wpSNDPShhj_Kq)cT!&2E5;u^;DM1+t%t$O*9fQ^5(EOb_ar=t; zekw^l!-vaWu3MmDt}s$!49l+k_#L7Ra3cpyV+O`TY+OEVbEr;^*?NAd{j%&m%koqF zcLKy~3O=eKFo5Fd`mc=F>rzR%$WvIY;Y^wHm; z^|@Vu zs#h9t0z|HpFF$cTa9SNTCFG?^$q!YE-d{fm0B$y3)Z4SPN(eviXn5w9Hb(p%4=Fj;C8Q zqpdWF*+C4n?J)>}uvnw*Kv7u{OKlFPE4E5i5q}zluqEuUWJ%HZ${Pbcg6R#PJcW@D z_jS8YTr5iv<#-_z^-)jWPB!wi8*Ox9f2qh$Fcktpd!&384V$JFYMOCV&5*BMuX+XY z>sNSHyJpR)sB^nuPtxFNQrq>utF|>UfjVNKB4Y}0WW9x;QcNy^NJArcCgQm=8w%=n zR7bon+ademx7xb}^(}Tc67sZEkGz}n7Aht5%ON)~6b{@#;x}#)T##+{UPCXhto`Cu zJCtL$%~nk3Q!e!Bk!D89X|jF@!DI%NY%-59PTpD7$!VSn)-vYc8y2@Z9oj(G4tH^3 z{JiSJS3lT6HD*>_Q}bbrU07{ztcL>wOq%~4 zH`j4NlgEQAg03Zqj$~;wm5*IZ8d%9@J*O~pioK_r#+87aLwM~n$f%|4gQ+0rxI3q| zU)t-kwNt8FG49M&ej&TUg(RBsdczXiEDek|&ImMMSL#6RD?K#xk>KyK8(y-=E7G2<|A?9|k( znM>7!Bj<=u$*JlPbf1uS_kJ87k?%c$ZC)8~ZQ&5S>$7!@h6XAOg5!5>N)m}Pba*;+ zIP{b9eg8C}4Ec6C6PLR@Yic7~X1v3Y>TrG6Ur=Lt&*f+C=UtMasDsK4)y3Z?18!XI zD>b+)hIaYMx+^+=Q}C&8FQPvrk?RE$2=FWf z5}XtG!T3dXS5P_tBh^<8``t1~t}gv3>xdDo zJg<4=y?5yVxVa#&$=PQ<1xQR{$EEm2ftOC;Bmcq9ex0g@O?736kND?nXjd5{xJZ`2<}q}67eL1j9{||n=P*)BsqP(qxkI2ra|6$RQE?yuYXczk<};)=z*=o) zDx?1wlebuHc893^E9NgfC!pq?bsu;x4z{wgZgz)aA6whnGlA!(D>riION-*3WOq!h z(4KE6zdcRj^1se#Rkp@~*u%IKi+w2|5J7OkG>AAN9N4`>ga7lr?`R4L9z4SQ7Y3&+ zC+ZPG0k(!Ka$Vq;L}eU)dDdW6>Uo@A z&nCQC-H;TBGtoB+lf;7pbHq0%v*+$RSP<^@6_D(Fe@>x5I$KPm25lcu(z>9&#)!j~ zqurz=AOXnk4|YN59z0otDDq>j%_PbC$5-@P9&n+~)0qVR)r(DGmhDJa8R4SqLL+CR z-E|NV38tExZHjbx`F?%cV7_8fZo%aj_pG6Htt9XQj zD4iT-tqfUDu?r(!8rRDf@T_GcI9Q&p1 zve&x-3W6GM51TPHoozZCfeR(|$K~`6$)`AVYY1x9uqZJ>+Yg#?Ei3pu$~i7t*{z%q zz(2XUx{%;JHUwxbTFzY?OO-q}4_wPwbNl(a5;=mq_I2K|vc4hBjCyZhVfyCmiJ?Ig z?SA;dQNe7>l&nsbMNf?M;hu2MX^R-f$u{$&Nl-T?0mf;QiF`wdwiNMrUKCsXl zAZ=aw^}&mLN`E9&?9Q#1p&w@AKCDu|ilxgh_s0YTEyyGlKSpj6Aej|+qlq6{eKUFH>F_zW$cYp45CptWWGV*)FfwFxnpAh1aA3sKs{Lr~BI1)=eAP*H4F9Dsv zil6Fhli0s4c-Yo0XmLNra>I-QAz|4m;D@HXv|mv8F9Y(Io=Mxo5>Q`G_97N5clb}YuIVL&!4u~828iq*JYeMhbd2eqdM5f{*X9T8H=k7XYkLTk& zXTt3Wx@tE-ICaG3YF!`GvRFNYEuNc7q3a^lgTfn52%#kA067+Ch@-(^|Bvds`6 z&LA^Ds@dxShchuy*!6E!~5SOjBi0EM3(ep;(C(BWoTsVB^_JY!@6jSFQTBN^ly zpFLi*gxE~nu=88d__F<==iM^TugV~Em=NCJ-~L|)&SNQ*RXSnXzG=jkd%1hiq3a~( zCG2#$ZpsOB_3QI90&rrM@>nSC64j=cb@a@}wjRkXznOs&%ml=t$$adSJG0+h8^cf~ zxT&4ULLBNe4!b}30_%#c=H3)#a8J^-B`2-%pho~-;Kp|5E zfoR^P;3hI;3+bp$fp&BQs{AV_?tnw?QT=88+ge>JZ~gsQ!PRAIZvC;*V&t~^N@_XF zZOZaN9*yW3sMp!xe!h`m0~$(gr_=W@&65C_CurMHh_HhV-^xXDKSF5C%raCt17_Z! z|Me1lQEeV(0pX+5{-K)`fIW@|PagyA%4BM{4!|2M?2aCEV1{+raLPp859>swG=5?M6sCDTmukeXY_?bsxb59LoXBSMa3BN;SB4j#P4^{UQf$ z{}tiudAU>#QvfXc%bsz%zmP|;@R_X*yrB9YOZo`4v4H1W4p=D***A+ojlO@^CY<$1 z7v++S&? zF3BMqXS;9Le*hgB`ipTp{tEj0Kyj~toKyxEzC^l-?&F z&Qmf=5=0cu`8mQ;hjL$VQbjPs0w6n9l|&x-<+E=I``7=xnFfF<1?#!_n;9Tt2ZL(hC-1925l+}Qy(6_CQ~6I+^A-j9;{8Cz zJ#nx*dmV@-f!kj+^j&qBUOL+F(t-$AE;V2}oTpiVSjAgl#$Mv{w6so@39{0y3jQqLsqKbRG*JY@?Uzc9L^ zum$^kO1P@w*sRfU>54j5lu`6H?pZQDelkW`_Rp|e8N{)_|GOTr+|IAhfmAo3? znZ@efH~3TqiFuvRwj((j-|ftL07{knwC0bSLlVxQqX=XJ^Phv8sUP4`r%sKUYbKPFY=n z%0t~u#;151iKL9Y*zrQ7AwRArtXD-s9mI{n{?CjHDnq_0W(m=k} zbLqZzJ+YJ_Iaxgtx+>hLrJTF`ojtUp=)nO10>j1y5ZJ~&LlTNXQ$lErIeCl3r!Ur-i>U3>;c)J!m-`h4w6y%l8*OdT_Eaw1yKif7?F<~vciFF z+u3^;3fk%bc7Q?dT)ObkSfk8m&5L1jPJlW-Hdf$du$ex7w_*O@(G4__M?hJ&2;b%Q z0wc?G=Mr)z!dOOdfx2Sn)g{4wmC?bSi@x)MY(^nZHc+oF?nz0PnY8X?74v_}D#B|( zZUPb?FRwuhOmbY);mHH!%K>tv1<4m0O zEOZb^0OlW4po9Es`6?=Tp;*(#|BpQ}fiIe4EV+rHghZl_sQn8C(#~3x;U&le4023z@}#0o}WEUlo3IG1bcM z*Nlo53*EZ3w3!HyPzzg^6lJDxa~RKG_j)e zyIX0;D1@Vhk_=Q6K^LxMln$L5M&Mjjg?f$KUmnFWbBV%MUU`|@CmUq*^YDqFscoer zHCuh}XaB{%e3p|mLrC%RyN*tSVND-F^I9BP*RAFjEujy)1`N-+^pZQ`a@c(xH1Xz4 zbaUt4-IlWQK^O(FVI!i_JsY%47x%xPv_}lQo?Ot1CyEIg1((S>{X$>o;%l!E38ps~tJ9dGUsHNHTUPBJ&>S?E3P;8-7-t$S!H9 zI7T}Qx#DeK_6jm582&XdTVRgrik=aOoD~mkQR!i zpIl2R2~EGf-y=x}8b#Rsm?^gkjx!Xp+^-V=W*RhK0P7&cyA*71Uxp;vdz%rW2|8}p z?}-jK5Drlvohv>JFrav4`uU)bLwfMf#~*e4r+khbielw5x7M2WO6viR(h35<*?)*Z zUJ6aVfBnlqg`)qr#wM_V+O(YKH>dcOy6g9n{oj{ILZ62G#Q#3c4H{=Cz?iU3x21P2 zVQneD5$@FulG)1?KAeFx8#)wCtdpr<%miq+-I%Hx(Gt^ z(%ih8TtoO(XMe?2kLJGvnf_vD|4P9`Pv39wS1LeJZh{A3VBXhUjOF)Lt$3u@aRPIZ z-v;SmL1r6EFZi{3Zw;4vPHH#QlwLOsY%dN$$6jiwajPAiUOn>)utVXr=zv<&z>6Do zmk_ph|BqzwT)_}RN9C8k0%x))bHNgF19rJG6Zxyw+V6z4g}&B717B{=)UeA_f4)0i z*6Vyg-h_GLWna0H8dAAUQf_K|^Hfu-d9zWG;#W2)<(htuBx_uvVs)|I}kU#OhkEw*4 zSB^51zc(oviwRwx3?vIqT9Hd7d+Km|KHCXEur5&NCraDUv;VF^XXENq6rCl|$naZG zi%87-@&`XAlrM?(0UqJl*Eaf^G9WiXtC$Sv2f-KwEdFr`^nwBBfQI2cyj;Z^lF z;u65q_SFMIgIxvvzur$cmp?_*Dg}z^gTpITdh@z!h<&M?U$tdDm$S5g+l3-8KpaWo zy^`$TUWSBCm+Q^;{Cwg_SI7;f*eJ!O`E~(w0&N*I zEEwoQVb*Wy+b4wX$m{vTVtHS%2?8jX>)yJ|2w?WR7oUT|t=-aew!!VW7n|LJLG)di zz2P5eJd!|#^{5NlvsVg1vvbQ0FZNzC4xE5%^Ogo&BiO{!rI&?W*_B5*`FUfC4*n0-;rCu%sZ;1{kb&km+S^ z@{2lN3$}sm6ZhxV=rGN1^uEDsS>aMTue`A)A~*u9)sFqjx3=W_v=;xZ8fC};BG^Po zp$3IF*jQ{WU=FTADA}b0%I&|cARl?8cdjvEGmY39Hy_<<5(L8p;jCbn2Dj*wE>*%n zCtV1%I#1u~6oGA)Uu=zYz>Fw>ecWn)cWECq{{QMsCwYb{ZcmPB_9$r@u#hGOXr*j< z^;Cj@2F(n|2_cd~Pcg=sC<(p_1r1yGOXk8%Wx?Ox?3xgFmLN$`r7}3OgCu?d1D!3awzzamtdllLm zYdYLaJ3PvB&`;H;JTJlWjam0y{o!TZi+I;tfU$F;@MQO_G3)nA3BtpdvswL8NDKRBRwf0!B)#e6Or9*s9UOYak4)J!&+}j3h`UY5rYdqfk}v{LPvYQr=FU# z}*Qp|$%7@^1peVK}=q57FSIHmPXqR0u&;TA*fUBVDx9PuFYf$3fX zn;PwEjX&xL`lg*ysU-_!u@)zXEW{L`Z! zwYKa&0ieL;S0)s#gf|(qe=Lesh)!BqmR%}O>)4SlW zkUu3smhJCvv)xuEK!bJ6M1pxaYY<==S%pA=^~W2C>NMJXbX;(^OVjzf@!P{}Oj-&c zUVA8Mi+73$UpcA}&kRT^cfi4=)k~88sf>!&RX)3iePXEs> zrU=vBRqBRUA4Xv?_T@jEiX)1AbM0`}J98t}2X$?vLo1Hb^WL~zaoIUZ3#Z`1*xkzm3Zg5tgRQ8>T8%VSaX4U&a65ot9<9qWCiU&UOG#mb z;fYx!Ma>whe)q&KU(nlnZ|bzSMSuBPA29n%hUu%(do~lEp8|9H^4c#h-h7>5%5xrO zM!_@X7DmoaoUCi87Q`E$P7>v>S+Q7N2~uF?BJD*os)96s=!;cfGv zbsfm}a0s&|P}(Iok9=szmnR+F`h}Ed1VM!k3ztKdnCd<8bwFWu$33`+|vrj6}U`Fh_s}CEY z5UBg*H4oOR1u2jea&>1tAg|sjS(^3gfk+VWsxXLdDS~)Ho}_wP-UKb`oOY#qREqU( zG`VbS&qBofD<$ZZDiEb>q>`tWWYdIC9*cDE6;AMn#V?$hTK;qb5>iAHWL;5(8bsL`-wv<0|$mmgB3yO&^wo9c7x812^Ba!g6D_@&k7y zlc!#lo<0JGPvm&iQqe>plz&Upyr4P}VNV)vtzp`83lfY)+_m0pu`Aw>%-&+byrn_4 zf;J{tvvcOBmS0$)uxd4>w4BG*={+f}{l$IZ_@0Jm%HWShC*4Dz9bA}q_x6-6!ZekG zaj&T)7Ces)Ghlp&CkorTU+pkP2(-NG$i~^>8gNDiN^$u@Ss?Jk{Ge+w?{s!X2-EL; z`sk46XO6tR;pKFiHUr4A;9sj}2N#vCx_-!xGi)()!eXz3!%@9Zn3fx*R02adY2&u(TtZGTqK6hl>^LrI?2AMx&X&-@!AQH zA@|ft%v8Zb3Rqx?GxyJ~(1<>V33pI<<<0T=K zHC*X_=4{kq=emnrN2-EXVFpwo$sV4BN&c8HRR}%q>5y!F_)t~wMA^&rS;5fPFS+&+ zS-VA+7d^XKIpAJ76LXOa&;I$e{Fr1b)twL2839J`yUgWKUN;5a-b8${b2-~@AIAja z$}rf;K+VZ#fJwt1-6p+pB|Nq=I3QDaN5$UL-d)Ohh|r^w)XSWcF&?PVe8~-f3E)) z?yd?9hx~YaH?ntq90gBzkevySc0Bj|qJcy1=|3J>#G26pTLQkv+eiWz z$w+VUqhm}PJR)}>kmThMr%MethjnoJ=KVQqD|9mw$gMT^XotHp{M#tp!y1h!R_)X# zB?V~#GAV1A_a1xo-(y}we1?7Ob!@X1%!u&e_|(amJ~*O8l2|82cLirPRahVZGFzj`+g;m zd+<8a7ECIPu|+za=CPr9cgNQ39Hf`eHdDbw>|$Bbe|-?Noj?e~d)j6{$eExD$~~*d zQ4^IJ>Y2N4>l=H#z|GzF3LdZk%81pP#l4j2yzXS)uV&rjZt8s1Z&KkQlez9m zqc8(OAHmZz8UZ|Tb%6U?j8oQHR*W_fbD^gbNDKRRl5-A))5 z%wgJQjW@vHPhW;gH$^m?Tfj$=Zcg8jK%EIAB>&!$f+4u2V2+n<*1NnB-VTh0c{Ai_ z+E+NEO(#FRuL0Uo%ix9!-42b!bC*-);=4RBGu$#k7+!0d;oVmJNeY$R{u(?Jl>Vu? z!(mP!tmztQ-XA$~`i|W3mc$`TVu>eP9dR8f;4QNIRQSe{QRcvJ(2RD20 zehd-N?VD+FwO+!lV)g!f=&O^($2-Y5!akX3d^{$4jjt>pLkd!qyuJ_K=Yi2{ng4Z% z(@^jZp02VvRChyv!^L&c?ULiwrXU)H%l*RITC7~`X+P%t5-Mp2ge;QJJPV-x~ywRthsg}tjj{>Id{h>tskBUqagH1Jq={bVsLx)|h zNf!aS?7$y`CMpHuT7sq5j1;WJ%b%)fq}@OyzA0k#_#K9w$@t~P(oj~E25dUQ>aTx; z2H`{ud;(3`1N|2jEL1-ygu1cVl!mMa6nB%-@?qGl4t)UZ!~kiwFB(x7x4{Oai&g(@ z;BunTCyk_PL~(A*y|?khW>LLDmlwPF}iSB;s)Hzj;V!NfT>ZZJB4#S-wnPzThDmDzh!L<4txK_?1~*O z$P;K(LBPD)+FG_093V)X1cs~qKiDWp3psH+&D>7Z8YtGOQSi98!6b1{f&VGafJTcA zt5S}vZF~(|GI(}tedKS{>44fnZ#B6Dn65VXR-b?3JDn)4zHXu*E>^yyj{RD$qKW!_ z1;}xz$8I!Wz|D*KasC*e_ch=`3H>lg@#QLhAGB(!5!H^5m}-@ETbYihyOzp9Ud`%$aA$dTAzC1?5CCsjk$Y{dQntw zb2&AWCBPT zy0Pvdrl5Vr0)CRO9hEfbXicq_+1z3TG6!tISIh`n@CJkcDY*6T&d!w!cE}vS3#8jd z^jaJ;dUd06+>1&P+qBv^$TSS~pBY>kSC{AJ=Cl~#%eK-N0boY~euIlYM^i!YSO&$H z!QDDPQ-A+AznDOZv%@ew5yho|-A8b<9G!WIW1JKyx}2#ExHj9QvMCJ@91%@+^*@nk z8Dx+KH+B3?@m8LEnbfP~uu(4gc5`bC%b4V~S{BzUpxpLjH3hQpll7_2Y&NtY@tr^N zo_+`9EpM<-QZ>-B6Fn~*eU{ueN2ovx|5YN#HnM$2`j!I&S-X1)@=c2J~1exUKLEdP2#?%vvg@ctw_c)aV; z?OY^E6y%Onc)%x!2ndYr)|lc=wj`$MO}&r7^PlrbZcTpD_2nmZ;ad2Mf3APjtox*BsI{^v2FYHx;PTVn8dRiAI z-JVuNWiNUjj_^J>)Y-s;8G^aRZJT~mpjVrd6I5vpSHnR+5j2XSb`h||J0bdGz#CXSH=L8UG?D)^0 z%ei1oe}CrT$qpSI!m{{gX0(zdTdhb#R|wp>b49kt3$#>!8MyYnez}K;JKgD9)T}PI z#dDNdve-*cWiLQ`AU~xb^EpW+>cVp`RAogDb_m?FI3$NtV7E&mwOc=a0Twn^#cloF zpqMae@E@yOpQ8CI@70rV>3I~LJk6DITd?13ttG|l-K^hL8$|9C6N6RQH9_ zJow92tFmX|irwwLotmJ^2}@_h&lWO82bcW{`uzYSz1L%dZJuBU?c(LxOmxMD-0SDszqUS4k5LRlEvc2+yiW@moI4>*rUFioTkQRD{$V%-6ywW=KRB)W;Pg zug=g_%cjDu=q<2W$UGQKW>#K%_39EHy1Z2M1q^wuffrQ{!ZhN3`h0#<) z!Xx>&CO?f59DF$$`?OVC?8Vk5;($g`PonO?%@e?kCK0HpAhuK)VG`U?S7J@HfPRQ? zZYEJ-4yL`)F;rYxe;y9feW&Q$zL8zm(b-Cy-u^GSd;aMf&!Q@+)shnffgJ#mKe;l) zOOkMYeQ(xY|Cbron3jq0M!9_)e2S{d!B>weR~B{Dy!qf~Op^uRHxYw-h4>U5_j5GH zG3D}q23B;b1wmg+;g7`6u>!^;(<~&;sEGK`YznDCvt;y1U9Dj{(Rj=`FY%ko z+C&y`J}7$RmJqOMV?m4|wEF<649BthEfXc^0@+grPNt@0BNq_QG_%urOF^5Z@QJ?i zq*s3E!0LJ?O?P}{UBPK1Mm=~_tqIh0UuU|6Rl+aQ#%d`#nP_g0Hx%Igv#6+mz--N8 zU1>_9 z3>3x#M+{t#NNlEtu%PP#Kz9esZ&BLL&Q9UC!gBd(`N5P{Y0a1K@o53w^sI~rDedBU z63@8!G@93RHHV|~98{eZ7jU#|7YWJ__2DP_dQlspx#c6^`bqw-CqvInff+Uc;dOwn zCfUYLk@hqYB)H1qCJJtaL*0=ajD7JcdHq$-qDW!6$P+OV3K21&$;*DAR#i&VFLAwp zff3M4>uQsgY?(9hA=Rt$Hym#`i*9U!Ho&+9%^->QzdPWb7bg1RrO1LN5XprznpNv5_djCz3b=B|Jn6X^aKDYRMrWBzQ|~ z{k+?Bk4C`s2SV#~g=&n-W(bw!S$~)Dla}@HPdUZtm)AT5-E~Ho40$X|=>%73ehU{Z zWK*o`b0>Ed$UXMb6>_tq<-gx8To-Egyk~o7``46%o-cTzIQ&LM?H!M(b=;C}4PFC* zT=#?7WN+w>zBfG`ZJ&Hu%V&4G!&D-V`9*+n`@o&d=K!`8je#N+!_QEQGy>Ydc>}TQb3A1Ho zjamo{H==)h2t=MyH~Z7a9uE}s=X#@yvI*cb#l6}KeZSO_qb>r4nI={>1egG?8UcKQ zGpy*=i#F?C`K4gV219;jU$q*)SbmO1kJBpl`pxo~6ODQaT6WMw;Lc|f4^nHH?3?N- zkUx$q9wM^5lXggxVG_ZYFSm)-V!yz!X}cD31VD?T^Cd6I!5A0}_5qaL;kX1y=M7$> zXKy{rYdsjBZ?i>)CCLH9)aUb0pc<)`|2}ZaO_k zT<;{ixqqTwEx(Co-S9SBmVa3f&bPK1Y`N@lQF<7V+sOoe1)?WS6DB3jt+;xhGx;>% zt7k`y=6pV`uPsFs)1Le+#A9*RQT@_rQCneO&_t%C8V`m5zwH+>Oj|=)x9hLA%x-$% zsRmg#um|F@>XDC!XBP%e<;O`3lsPCln5g3y zOHQmm#-DSx%}QxC%M6uwHEwSMBn4ZzN5rQ!LUVrU6bJ{@Vs9- zv|2Ggcy`XU{5SX5I|{Ro+f06@GSnAZ*9{YbqNMq-5L@9z!NbDtGq*fOW;UYW(YRJM zb6<^Il}`JWJhopRmM5y6Qo9NR?)cS^sko}5b5JzlfLa~a3p%he1WY!*ea=CouErZ| zZs)nHWtoBvR`tF<_blI^82dzjGH`mZw(thmq0zH)SV{0K`IG;!Sr=t^*%d(COmyiy zRTvw&vQpL`d}^JaUk?h&>HAmB!YL9ol{4|d$}_TqTl(J}(*n}pJm&em=*8nIjlH=V z&>;Vi_~W62MXADj8jl_1F6Hr55@$tXzIvuPlU6tC0U)sP?S48u8;bgc0Ul;OJ&x2x z19=P>_6syk5!H4_4_-{-l896t%@GvWS|DHg`7lK)v06%0`|D$w>(TieD3xz^W=#pX_Lw6<@xAsQ| zTo&Zqz>E1L0$1>1j^JHB8Jrn%iLH}rvQU@BgQe#9Glmv@1ui- z#SeyNX8?DW6V7?iZ9S3YsQW8?^0214NmdygyG!+nv@{?q@!5SkOseEKP4i5p`BE*M z1g-WBSYwVsn>FDL)Q?QvIDVF*295Lk7!qvMhkE%;a^dRgt9sndav1x)krfFodHu+A z#`XIkF|7TZ%P4p$eP>Ae7(hnZm(sW4P-oxZE1F3rCIl)!R$HWBUGe0>*Ylla8?XJ$ zZ;1VK*9_T>Eml={JSyQQ5P0X2-!=!0u2)xUj@Hxp8%37QO&kwrn4(R zU0pl-IMRh18q0_`Dc?63JOpplcY&OT7|_lJ-0luJ08CrHyhjKHOG6*e#mNSSuv{Lh8ph!}OQB**#acL2>dj``(53Ja=t{zr|}d zkMSyckvawfG`eZy*;~vp&<is{)-a4wv z=-V15goCt5NS8_rQc5=>NVlW{(x7yA36c^b0tY0dL6B~c?rx+HAl-G&w-5fteeWIP zyW@Qw!+#u}{XEZ(wdR^@uC>>v?$@LR9BZQ=6oPI7xS-QvW$7}%4mmC5+mgQdiEG07 zzdIWPY7hF72MgG?dx*0VNa|8`r*=S6Nj@W_Fd`pV*f*CTtcw=``4f~WKmkvYYRzF5 ztkA!nOQ`v5ki+in=qR)BOcTj|W^;9YRhyqs#Hmv?*1H-`mjUwi$@g+=N5>1piM<4x zmQ2j)cWtBQ$>Q^QMLdg<=e!bx&z0?upJ$Xd7lW{P_daqH&!Npkdjg%8e5IEtKa(%@wp^&8?%Jr*?uW}w`UE9j& zv%c0!!15rl>`gYxKU1|n%OA;gNnI3ACjd+j%0x(d8JeDi8$X#MzGdzyu31WYnMb_4 zflr=0)9x7tWsS8Sa+Il}CAsV~q#Abz<&gx@Bq>0fO=KbA`u^EeTLKT~&1efL9i^DW5@ z1+sc5IoC^Ta$xZ?9IQNL4q`1Ax$^J8_zElcB>?tSvlKk6DZkb-eIs=|eWQA;t|s~Y zcM9|V8lH-lKoW}_Ta~l#u=7057QHPWxgp=T1??G!a}Q@AYRuxSM+uDe2!^t%Yh%#fVS!_19{PghbZ|USXRpMh}Bx z#xcP`FH3@kDzHk57k#i@{L4NIWKJ5XA2xnTs>6#5Eaxr~NhR-;a#zV-7Fjgrneri$ zesuF&1~{#LSgYJ^)Z3ux`c5;k;H|k?pC&Rze`m8#Rg`B2natsWfR3MWfb@Iw+m;I( zktsVR^LvUv*r)CFPIw8t+59{6>ILbEWoNA##%7ydn-9-&`IaysK0Kl$wD!NxUjMU` zb%4r5CIL`9kn6HU!jVCShdhp1BfrqK!DV@ghyiu3iT<+xP3a*HN1=5esteK zYif&nwP2DeRBq<1cg&O!!{8-8fRdU`Tt``V`w~*HG6C+i@)p=(3d1 zM$-x!N?20?S5yjVKQX{#QNmm>CCdLwWrs# z8zfj@g7|{mi6f8X6UQJl(-YO2Q>Z9~pkohG{{5$( zly>a-fUlAE6d@Ail^j%Z3@u{7e+To9TY#%#(;08zrFnyu&uCAsErGz+{i6Ep?LTnw z${=oBbBg5^a>n*Sr))xepkj1^ojFhAvpG_RHC96jH)0v}j3yFp?Et5*^)}BI{gG4Z zv}^b-Y3IOKE$ z$mY{OVsvR0b1Z-p3&wU5wD|&0TKp)+zz<> z7r;8+qwh0~m|QBay#fs=#5G^@^lW%l`uQ&J&Q3$hTz)u=>40)`KY9Ry=z&TLc58#M zi3dT^zf4hWLWHo(iI5P2#nkqIMmg0&yS8158wkSD^2!@wdbkYnmlCVjRlM=p8Kk-?No6zUpc>f8%&1F8hpB zoA#S7Br_I|a_JOPUby6u`l18a19%l=Ka>a2TFmc+3j1t-#-|%Bi}5{Hzs0xQ#_Eqw zVsvUbEh;{Xl7SUQq2mD7nd0?_lpSfqWEZe$rbuXKGecnUF=khUim==c=F+kpjVk9C zM&Y`05|_Er2yG1!_Qb3Fk%ei(EO5F3sL5#wpG8?;rhg4fsA(dqkk5l$3ZwOsS;#6@ zzPz6`NK;*{b)7~r%t(#WAh_J#rlDe*MM7S+wvRF;wcoJp_Ytx|__N}``V z#9Dcu4=cV7AX@q+JsIqNSy9)-fY$?Fh6d9UvD9(&KeFdO47q+-j7%7pdh2o0u*I}_ zl!1qg&jf&}S#onj>iE$t{=*~Alz|{s5V?V?`b1(v&$5RsI}|*pE8_zwwtL=NSAn8Y zXFeBHj7`4#a9lNl2)1mXqT$`!1`0_$6uP_Mt^;Cll-yn`7dm$t6y@9ni(!Lj-8(yy z(ezSckkm#ReC55Y!5c?Qz9vJglHXT+QOGK|6!Qr30z-rgO9hN$iv382nze$!8{c#q?2+1@qI`$nBC=-4Zk5a z$3eTM%Ho*>^;=p?+(gmRZab>so>)>q1xPp9AE5q^-%K=1Rg|(hG67=502$aUB$0Y6 zwP<4VWj&tF!WubduP51)6i0e!P&6Rn>eU(uOeA~eKelk|PSe~8P8F%%n^=~HVYK(e zeTT#Y^z&BpIJG4u#WX*ozz(26;$$5XG+tPEsJZYNt}(r0h&JBfO8RHXWWWo|i6vR6 zav0Aj<{do?=AMXOuiUNH1As{mv40DgtT$_PK&F^Ixl>DX^ZMn}db4nsqT1cuv->FG z+Q9HY1%k{khJq47H#-%Glr>47L6vJT8|eA>Wp;Dpwd;MNTyWv^n}~Dg8N;T}2q6T8 z^@xEOgOA50x*)aBI4-N_n z1voDTLvJ~c>nW_m1@FQ-+4!OK_t7g9Kyb7*v7`P5XD>i@U*-#65%BJtfRM8;&B2xU z+R;Mg3WQ7-R)>kF^Dt_9Ri@%>_C)i%L1jObomMp7y@L-+2`9$UoRoS#`Y3+S!TgfF z!_0Gn%Cs4Ruxv)kuaaq4%1JAl9sM>>dq$t|k541LBqOZIx|0*|=*Y&yb`GcVhw#AW zx#Lc|(8p}uQ6h=gr6{SAn zt`a7hzATAVas&9bOylrS@Q6sB(>1Y1p87}DJx+RO-;juBY*Q16PrGIsJzZbOjlDc5 z7zw}xJwwZuVnt@f=E-jAhGfw;ANt`Bbrm0et0+Hc}+k%#wgx&r88GKS(( z3bsr~1q#Jp8+s%4h2AvC0FIdgD$Ysk4EcR!lk<1Wg$j#OoSq2;@daN|aS%e)0S`Vp zsIwdeq;jCqX-+JsYf`9r1JOAr0-3gIu_}u=g-zk8DgDR8a9O|ftF-X>uzRhUw&NI&gP(i zg4@x8D8MFfUIA!$6hN3Palb_LMy~Q`4b4~J`w|Q7>`x76oY?kedwN`_Ha5BTjw;;z zloaod(g^NI;)CiagH*3chb9w~J}Kt7-+Q$P!@CVefN%PHN-oE~4g?=7Vk8M#tk zXT_?nJHu-xQr+J89_d-jKkv~VGxyvE_!C?dZg%wTrm@pCsOpvcD;E=kw$_SBG^cRD z|N8yBm}t7Tprx1CV*QO?a&NBv*jvSUF>OlZjyPCO z9=+K^x?H3#k(^#!Du-UUEszkp25M|*ku^4?7YC7nzY9o<7vI0nmRksQI=4HHiurNB zNBJ@E0w7HvdTcPfNfn8Rz!?=XY_)7Puc))>ayuw(CQD^MTj}=xFId`M{EDAMOwcxyDMD zpgm28Paa_T-v6t(Kd5ajPse(ozqCh*n{PS`24jwXYa=!}^GJ77kUHlPE@-RyK`N4A z?XbjJbn9Yt3=_pu(k}!T_`v<=Ihe3~c5wn(KYkp^iiR6xj%a|kMlGE$yQV0`RxL8w zUiMn+^iX#re}o7EUW{uewRffD**gCeATCjaB)~XNdFZmywdVMflUEo)UQISKM8j~f z&KPYNA?gO;UaM{5fbJB4R#UJba~&k@;q#8Gn3n-Y z1Qj`VGN3&e+RuCna9&|fTCWi*HlGx0-StK~u<2=4Z;y{z)&OviURVk7Q`5{6?eLCR! z?Y0Njl5TvdMGNYbK_AbOP+RZIo*EcM;l`nib_d_|~D@35FC=N^U4D0f<3$#EWRjY5GSTkarO@^F#~DXag+3W7wFpf|U3mL#ft-r*NSNu`6>*8J?n zjr58Y5`h6VK(iCp&^{qe+K1UkI`R(OG%xR|BI%wZ$eLB#*VYi&(Tn2iQuk9IqXh`w z@Zwe`$@N#Y+ssorO0 zF^dd~1G6azygR8*-wf?JF)VM<$?W8qxvsYF`HNDI2jcg8&TE~4@CStl*!}>mxpzXb zzCNY^APeJz7orslmBCX!uCnhbti&4j`2K-VBag0Vi~~^8OQBCnTFH2!=w@ESiE0Un z?oWkKzJoE)Kw#r{4=~3rX1lAVNi0Tq?RPZnBSW=5Lam&N1E%XriviB&{Clx|1Z2jF zKrdnTRA>gtrx|(QMX3O}Mx76oe^FiE>&dEQ2NX;zjWuiRuK)fLT)j5&fI4S<{)Gf+ zH&#<5bo%aEAN$$$04GY(JjgaLP}W3s%*3Ids}YJTU=78sEP%Q9r&Ll%-)8!^OLTlb!Iw{Il)R}ZUiNBq>w&hhL8}GZiVqzrUieYF%m=3!4oRRD- z`{2;_65!&-c5${XuQ{lJP`(*>*+-z?7)quUKj8OjaMoab$a4jb5C4)a*UNOXe*UEV zdn!q{tG~5+l0ay*jaU_YOB>^X=a4U){RiNj*?p`v;YB(!P z0NTBVUR(hUG`M>raF@iQz*_9r034L*fR4qgOm#ZRdME%oxqU=agG2Sf=>EKWlO2)RGY>R4N~r6zRlaO((Gr5UM>8@3xFE{1 zTlN#^Q1VAc0T*~dC$2yTB05Y!<+yc(&qD7NGQ1p>BvI#_hbUF>awqeV*h7=nMsWMfrS@`GL%i6H@UK#&H=2|mUG@x#~6NPMwF`|`> zUcEpOHq5gWBateqT`=-H?Zmq8mayk0ElF?s^*o#PX4~BJW-JNi?_JcHj@vku4kI!B z15Q;W5{SPRpY|##MW$2_r&D@;!O2fQlR)9dB1ymNwaCaZZ$nG_%%0C;3X3(qB7JG?2D-gS4rydCtjjmq+YRSWX zwYMG*ZL{V_w+ps(AV9T|=6)T~e4)*JTT zGA2YTM1L_+XF@>NYT0vY3(w5ozEeu8gh3#pm7V-5N$+k1#1bI1WP*o5w`e=E?tjHq z)=W5+(VV&4^Cc@Xy0@`+5xC?+0@Rsz08OJz;UQA|6Kd$yUwf&nJjbAq{yTm7vzQ&k zR}WjmF$D*uHD5Eze`zE|3L`;W&<_A~3@K=~#z&JGY?$mRadt93{v_LC3;%3RywcEZY zsm0{ju6**o02%rAU=-W?*R5e2X%cUlB|uq{4+$q3zGgr)SkvXa?ZxX$aytd$`P;w^ zwX3(Yfo!{nC@W#MHVJRx)8h8H+-U4zYW4?dJy31%kNpPa1fq>RUObVbByC{lf1nqi zMQPG#cHQp4RtBYu*xuVUuo@cP5<;+r(I|OOexI)bw8OqQUU`PD*8M zUvX1JhZ6too0EmgTf8Z z9H=|;PQPa7%X@CfB3JQwHsDzZ@z5%Q0SoV^5d+O`MN}G_*$v^|>{e5F2%Fv&VOgoz z(?)-$4X%((T=>!k5~QGE`<$#6?579T@eopUGdh*2m^uFEzRYH)pn2+z$U+dgc5^X z`qjpW)h7cJUfSUN3fcIw?YO_(M=<+(RuLi~0L4eEkOA`tn&^TSm@tKu|47Y%dF+PshL9)}~rDtLk$_Z^Ft0~}&dzV8-i3fSRs3y`zD z2*0c_K_*Mvo05FngZf1&2#Sa#S{}P*{7u!>PNXZEn*b845^&>YGjqwOVwdm^N?Q=% zpP1cp?{`ODe(Wv>q~KL#$5D@KWs(+n4yZNo2Rv++k(vV$8t>ew$J-*Q-GyoCG>t@) z`<0dTc>KdYR`WN+R<|*niG9al_Md|lNK=vuL11jH@2~|^qyR9zIiEHnqP7=@++;N= zXdw5MBtS}zWLPE?aAG>581+If0KT&9p)v1Q5%>M{nOO+Pg}XLlSdTF3Fhq$JQP;=+ zwuS@x%ZVCGlYqRyE6jBRblFPUFRu7+G7okWWzOSg9!mbpHB}>nk3fj5;!g_V9Z<=O ziO_p=+%pFl^`Zio79|S&eBzf0E%m4ZLZ!v*RnE%hDJ)Cm@KJBn68R(v&6$_HIp&7K z*;?5fPS<&r9uG`IQ8?(3nVS#i~aE3#%c6!doDV1X+#<{mgVpG|B?8{b^?Gr;S^z z2UuLj)!K^%KHS-?JG%)a5`srG#q!azny*Q}yvGJWs`(`|h+~1GabQt*z8sWrs4_(~ zT>L_@DeiB79m?EXZT5k>uNI5bIGo0ae?elUROQDl+ng!@q`J!c`A$q4**o~CuTenC z6ch~%#o#w2@=kZSNOH1<5OPF|_I|a+&(qDqw`QpJvwU4|bn_fEhXF<*{B?qoxaJI? zH!%EU+EBhF{f+ySz82`T1Y%3-%ncWK4b!YuUTE_G;0NC)2PoVEIj^zxf4LaICo73W2;w3NP{WD=(icu>!q_jiM=1DX71c2fLmlRn0>v8@$kOJ#oPQC=~W(O62{<|Q75t~dRQld{|P&Z(^|7Z^_ z3+D#TeG^1%9j>pr`Qo$o0_Mk|qtAe`9XC_#)qtz`C$`NgiA~m~_~lo8wrGsZufPE9 z>(M|(GxZ-=Kn4rGDySPA@7EmL$WS+SwtLwix*Kc)I_HwQpbZZNd;*Vu2;K%t_1*}n zYu+|gF+|M(1H`x^QnVPhv`qUy`-Wo3E=KLXf2JULAf!vAzgzpeZmyqb&mq+I?-y{9 zo@K%7+9KF4|G5VwBtF(SvJoJWpt659?Mx^=~h`Gch6Thj3ZJ{bPA-Loe-I z4eUG&T|S=HFB9$jKBY-AAo}?`&m^s~&^5lnfrfcSEDgRmR;Ij?8hORubJ5%(MtN0H zvv}atO+MJ+%T9^-;BMeGRr4n?Uh@KRbogO!#@SFx1Kdbl0e`C=aiFZ0ik>@lYMb{{ zW-ufX%V4}%a*}y%5k>9ZHIAFi7Pgba#P*YJnphj5!AhJb-P2F%9@hP?t*-vfqUS(5 zqb`*$ppGBIl?=tlAjhA&UW3@18_IKiQM>F&pV%r)=pf#OW)`|`uo{)@KH%9`MjD) zmt0ixH_pka6M319Gl#nD@P1`Oj4rlxz5FYIDa6~-dP8a_Wx8*o!$f=ygoNxCP zO4&2+a^FmgVaMu_^_ORKpY={>X-uUg_({s#=Y;J@-}l}(7~@#EDg4_cM|9b~qs0+A zDcrw~^6|8HATR2V=4>FMpICF*NR7+RthxjK`?c;{N5K`b&cON%yp+kp*|Oz2vS~5Y zhcB-w#b17SG^<;sFg;jJk^L%5^`|Ht@6hA=3F!8REluLY>DApk|Dikf`@Z0+-%MiE zl-6PE$AXGn!grq?n06GadUrtq($6$kp~OcMHE(?6_y_DP?S3L!B?*4kX6H~^)@C%O zAbM?$yhMX;aNhrPn@UuR%`F~{rcrrqlVe+q{sZ;f8}w8(lV|uPR1Qnx<)f+@9|+va zOh1345_o%9v(}(G# z+bi=WL30qlFV;kTbllQIxG$}~ z@0h3{MAT=iA|D=jMbI0Q!A)t|vW;Tphga&a6cD>DRxHDhqsW+vr|csC1@9=rv|(jw zPKB)gbw~e)@lK9$-zILd6mz$Xm$OYz9J$`wZ#OXzc$TYkw66Ao=Pw?J+B_Fi|c>SBP=<`P#!AK87G0yJP-wn9OO^BcJzxGSDpK6 zK2#?^4Zn%lr|E1;s$-0^c|7sS;{1eP5aM~m@1&5dkXtfouD;1XN;HW&hJs^^euMUX zf}psD#U|CLZ(fhQTjML<(b3SLj!>qd3mfs;iWZFZ<_EUu8SdSbpGQ}5DM}^V4yUhm ze7H5~;iBJmxC(e)t#ZolGG@IITy|j`eRRqxFOJV_ zG5urb_aJSAm2^ms-77G=RMWge!q7o0RX-j$Pwt>YZkp@&i#E!r`CUOgm#-t1j$lH8Pf7I5{XO}Q%?Yr;Y z-2UM&u|-rPpQrj%?UOgEObuNcYv-<{_w1vI?q$V(jjVc(DzoByvnXLbFptaDqLha# z0R7TT<6G}>)iIB4`sHtA_XQP`eoBZwyOg_X z@{Q)}FOkQ;*f(DO{d~?OKsWT_eqjJb%&RGJ9>+6f&eCI8D}2NLTd!gcr~$nH=M@xf z8ppuWp!nuoDWNvqH5D`U*l?!i1RgeTACqBspe*1Bjnn=${#kEOcS{gMa99}5vg#)p zcUft7$w8NKQCXMTRi%(qWu9`^oA3o?4o#2yTZQvk0$SlLqmo`T9`A`2u5N#7J2FR$ zD=LFAzlTFU=pt`swbv49k{7QAZiE!OH9B)PU&?k=kWW_lOxrs&y-uex+Ynd9A?QEU zcX4`S6ugj`sy2Woxi~YHuYdJ%r`PrOq%^zug_H)+jfU<-fFx*e3q*_VCocCnmD(>e(KA_S>s_h`T&La|SEp zh+}9yC$F&x=2Wnj#fD?hvA>+aYptq^7xJV-qMtoH-ki?3aIH=4cJx!Ce*+7AKC?fX z@vXD!n>7NKagAo=jx;b3E>_o6s}L&ny(V@jN3rN_7)WR(r#6O^mH@z-aG}V=M`gzIZ$&#Da za3dyjgTL&GDGRSk!1k{S_1VCCo-m`i{bHOW0R)k1OM%r;{DdP}osz#CAtF%!^I>#^e38^W}!oH^y@7D-GKMO9S-yIdNZ5b?|r=F+G)t zJN#U?H(8i3V$A5;pgd2aSiO0+D&>Wy4i$G50a&7_rOXC@UF;5?XiKrD5BMO>_0Grn}*dDc|G3~=i``Xeec#*R=s0ho>$kA@U6zR z$Cz9C`e>!k-!8#3a_3^JS!I%?6n)v~K^JP&5adIsXc*%dD!qj|di<1l)n&F%I?gi& zQ3k1pxW2ORzlMwKp5`kL`5_S}I&<)y7#v9BW2yG02e|3iBw}e3E=wgg_@t88IClk% zd5$F{C1_1~#!#1-jnK0e#G@B4&1x`0-{C)$nzJQ}IKtNmJ)G}2DY@BHon+yfZIvn) z_MH+8X*9q+;G{9f$NeEpz$~y$O@E+|s1{?&Rr&kyl&&|kRXrh~lX@5_{Ao`2 z@Vd0e_v$%+sOi?Fb%9bR=MCRiu%-@Aa+n*-34=&lq6IWlKm2Y6`vq{rg=bufexPFPbK&G z7+f?%8;|w_U0x*z6AM8Go4(3%zo|Z&r8W%R?`kF_bAhB#!F1c4WJEeIJ*ZLOyfyCr@4FK2?~n z89jvPu6NAOA;=@5Ex)*|64X{ZC>eEHs%L9u$!QEdk*p%VhxexQJ4ZLP@Q{%#po@^Y zW+M>TM}q~%hl;{5R3Pz>o$&}A&>J3_`V8z zv`8g9Xm4_fLBA_bn?-Ugp)5{46dunfUX91AKyexWvK9)35b!EL`Sm#I=I_$?(7hP? z@DR~&zrS~-qzQcDOL|tLw0ZZSgkx1)7#3I&BpN0`Jrw7}C;p@AeG}aAL}JxXNa-?T zvW}+?K699I7J>kFv@Vu@*+>lEW5*J=w8jOz_NXX?`B-8`l2#guZ=sk^LDz?Q+3?86 z-k`~w#3-tm6Vd?Z#h=n=3)DWdd*E`iiUp4ScCUnqUk6%>HTnU;r%D0w41y7wOS&=C z`IqYGLFY8Er@r__m4{RI5nU>wSs9Doq<<+Mf8=zxEEDbTZ5+4jvi|N`UUT@^9+A`c z4Sf_rC)JK9-y}lB57)dsn*_cRX3wup@y}OE(Z(~w0*QkKW0-%SqAfN0r@0!-Hh!G# z95Euw$N0T+r#rcOMYe@1O2KfNItizS49)|6oz8RYrPenkl4o&__g%v6c)EURGO~Ws z?uD5-BI~Urxwkcb@kH6%W*KnTIyfHYF@fRsdQR)&wY-~qpR1#f9XOq8pq@*SH`cx$ zV<&?jtDc)04un~Jr~l|X7zT56ABbIPfVhsv`KtYb-r3!vq-gGt2QC%gLEHcqNCfeY zsa1g(;_`{J&pjK$e$>Arxs+NU9i;3p&nA{9W<{H-w^BSJWFY{XDK zSpS-T_aNP&3-uy{K%V?q!a<5!j(iM7wAv1;*H<{pdAJ@-(5m-X0W+9eEW$)BX9Ilx%T^o-zd{4`1R@lEkVbopX$d0Lm3h@ayI~wtp=26==i8XJX z=P#dJgWQWRjh>Qain)`{0@Nh0V_szs`V-YC`10qr^(5OA6Sp_<#h^O?OD%dVaVSpB zMQi0JQf&+Ew4+jWpB~0g=u+vx*?yHMk5PayXwq3BxAhh@bWA0Mco%ebj9R0ghVHRS z<@|gcGn}s<${)BLU2%Vx08VV1u1wU;aYjejFWV|0YfV&PM!$f;YQ=?su`e1MEMj z;A;%MgE&fQ{2CfXo_e<7WTRKr z!HpH3(geD(G}oKiDF*;l|04E>+hk2y`)7n4NU0lsjLulvJP|?2*b31^;F3#)jOe2u zV%upP_6vNc@a6nXHYe7LxOrL%zx-Sv6r1r1qn&wsljmXS{Ia{v6TWsaqb}5^z>TAO z$2?GhoJ-(wh3-(oXe*=Wo9f>cJ(ePW@|EY!*CcQ2ukuDrT<_Y3tk@8jMG*3yIAK}f z6Bi$-c!pKT2;tw@^n4Qe%pa4%dtmfSrJv;f>jC{u!R!#9-a5WTM>|g(?)b+LwER;` zx>j==b+iLc{8bb&Sm3!7Z9Bo1-vbqNwT@G~iih^o?;pS7dr`EuqIbu^mo7x}vSi=B za(3!*ZysxtCrp!_YF`^Jc#Igkb6oGfl z^C8GIfwMUK57h3@U#V?}&EE97cKO5Oh>~OJZ9CF8G1O`-RE{^ki!t4}cgK?|#9sV7 zkDc&TxL#m@EUl#1qt$6{j;n7Hf~{Df@zeNjP=8>qxP zo^>?ZQ^L<&aL#NYI`@f`;OpQ+xF>AK8^Q(^eSNrzFYx0zBN#WGu6{Ysp;Jn)enJ2! z_Po|_P5jLna>4zIUfJ&;MCUM=1DqzfUEb&%~)|6um^&kWDVH!uef6n6Xvz_(W z&@PqsIwjc&-09pqXH#b+Db|Couh*3AIu>9c3^go~aDEX_b|A!*{^HNz^^j4Fqss{% z_4-#dnc_*Z)uH5i=|0p=QAp@{5`jarJ}ht*z!I+?;8f$eHS+$o$nzX8iL58TvRCIP z`KT)Fnm3r}I?wyD-yiGh=DO0uz)IRE@?*Yu&Tese>w7WB9gX~zUc}vZj!PH)o^6Pk zoq`IBu*$>`&km~3{Abu1O%LhQ_Mt!UIDb7!d~ym;RWoIsaX$Jnns*t=sGv+^>X<OJT4=c7lhkzuDctVG{smpmHQUCzB9r$`Aq8Ne=M zGTz%SK@X%?!WDzbTuw|C9SC>u(^Odp71}0T7LV{!+U~<z)-pXT#`MT3X z`us)Zlwg5W3iNR9k*?Am)6xX$0M% z#X1JPsYXH+W!?bwYSrYV{VUzh^?fR*RG3F>hKg&th5qpQTlF`oP4^6AsibSSt>Oo+ zMuwVQA~wnd>QM~XYTubMtKmP_vAK(PP=dKCewaZJM|%m42N;pos(F-sUL2CDb3h}2 zmB6csGyeC=`)Jd8ii*g;n9SfAH!WqMGJNKGUquM02)VgM8w^AlxuSAmTAQ|uch+Ch~KFZ6z7sxr7HFCpzp_j=47 zr+L_AYzEgyMjbDaHP~+{urUr1!(E@p9p}E`vmNMGnPytQn2f=d=|+V_Jf)|Hj|Wo8 z2_8#q0odsD1Kmmj@0_-mf9N}cN-dH~n#D%;l9&8l-)8AD8NkTU?H7}=xH2!Pj7ZH} zFW!yHT~-psQq=ufth2rGkEBnYq6j};RW~BFmXx?Iz!8XX18*EC%6tIcSbCBxK`;Nr zh867zU-M7AV_GJyq0aFLhe;N<-m4d~WlytE^j@fbWr9TTEZw0tQff+9`chXMxE1xF zy(31_h9kJwEJ?_ zaKmdcucnlbQy$o{&v^$d>dW%D-tNx#bcNKD+c%A5yX&P#O-@m%g%v+CQ0FFQfZPfH z)k%o3lESZla7p(ogTUkI7^-syrcQ-FzF=8^Xpu?~IQ|!CnwS_GJB}g!Eq9zmj9653 zPjROo-s+@k^&xun$UTSDQ!Q z?Y*GQ!pXR#)1LbfDhMSru=d-egf%P)&3s1R1JlqwXBOgGGO@>-5{TiUvF96J%tL;t zLVN2@-tseaDnebihYs#A_l5{#40dSqO$8M3oK@Ll5xKUuBjTR4h?PCn`BcQ`;3s~) zeOF-LD03ARI2tIyCFdCG4NM1}{Q{TQyh9+bZT5S+ z3qNK`Dc{CdbhLJwWh0X=)C?%WPx4DB0wDX(c6`lac*oToM)i{T^+L^$+D+YVMRiNLdy7Hq`!EJ60{kECyrv-hw(R|crEYH3Prq0 zQL0J~C9VT^Zy`Uh%K-9kYM{RY9@Idj`|7S=%jnFL>x9S_S)2Kq1@~oY-`wJF%Y`e8~yKWt{yx;e*~r(Mjq3l%;DIS3XF1C!e5l#iNY3(eiR^!NEFG&m@N zeA1Whj%JC^Y8;v| zB;=Quj6(hKZg&q?j);x$h7cQm&!;fXFP;0rG{t{Q`(e2Y`pX%K+s{jJU< zU^40Fi2vMVSS!po?7KDci%`4?xBPaU@{q4Js4t@FhgZ{;AmGYNiT0wt1ij?>Dm7x7 zr+V?N)Spjhzy92d06$djq=LF_fS0(1a?avZf@3I0a5V1|Cm;URmLK~2<7+m!RGKWS z_4soOwJmJ;VBG%l_YX9&$8}mdn#t=(=N$ZAurt8vMX4SABx&yuU(!8Mf!xWI!sD_< zzvGpJZOoGAUdJ%{$#dFy)9Z8_+;3&pEu4_&?F`Gb z%cD<`K_Q6imeHKW>A>rZ@+0fxk$+fu%+N(l&ayIBn|HcB(?Eiyj2_GH=w#pQz#@g* z^RZ(jqF(pNz)Xtp&W81J@7od5FkiVaCFG6?I0vu}$5~uBe-cHVe@Of7lgWn=JLLto zxX~*#$^ew-Mg)+E7qj{`B;9=Qh;>$z#E>GKE(oEYtSQ~ z9&-4fUxDo`E)Kqe1WXGeLw5FkiyR)TbZMA@?%y{RRjTP@w{okwUzRB3BR8G^X{1B3v5_oI1oAieb>T zQYFXZdk8uPq1!cOkf6O&TMkD1=`XwNC->LRbm+Oi#otdak&oQ1mZrV)?|%qBJ|MSH ziJCtMJBJKUk$(nHytjn{!#yCVEf;*OI4zF;ZykRO#N#<79_!kd)1$b$bTTf}N}HI2 zIg*h6fer=73^uU!h1VLLx-A4{&P*xkQ6iqL|9_1bJOAOMFiI?x0Bv5E`ZHLD9VHFF zjisUI^l%Ag7r2t_bzs=vU4wwuA=&ct1G|OQ21CcoUU+92O_y37rT@mE8vLlsm`kzv;%^>!z{=n zL`eHD(0Fk|Vcdf$h@>V~3IBeb<~&?HqOrk3`{N}NpesD{7;0r-eBise{#)M$E8vfp zVu0@dJ_^OZ1r&D%7Dl}$+oL^1_&iGI>iRtvmwNe0Phb;Xr5a3It4;1@N(tI zKEQY~zzF|+m`uA^d#(x6Oo5ZsjOm1LgDt58#hb(Jzs$>mJD_24K@2HQO&E&L*IeHu zzHw}*j6avw{NmgPToRNIY}Ni+$eZyl|5-hLtiazHJK&Iah`^ET^yf(b`!0CTH~e@= zZG+E4pVzJ<&-D-_10SZ8L}5IGS^MGyH5dHy{yEl*p^qeRU_b$28;+!^ZZHePdI#+I z?)YWuV@TtHua|&<@1HOO^kU%o{})3pL+FW6^5DONzYCJJogvLFj8!l2$Y{Q%7Gv`g^rRE$r~>O{1&P@2kxs@SF7}|H0NLDEHJ2yz1qzmHQP5{2PR=*Z#g ziy_3HOO{-VSj`k4{GO&_=kh)adh3+h9dl-&eVGiQaGlfS&~QW*cpr@jvsfAZpeK7( zDxeco{M5jjdo>N6{j^&0dK)6J&pXl%NX#G=?-;h-YANcWh+@9xV?3v%9ue4m6n9^^ zzr&r~)K{F$I;I_IFQvNtU0YRJ*mtY9RWkG*3SiwsG||Ab#V7-1rYLY?|IeruPZEY8 zo0307yGUH;z}A$Rq%iI_hZ+rN`}ZbQGc{Lj5H(dzJ$QAz5EtcSP}5`($eL6Vux9in zjhLi9A2Sxf*phhr&I|ix2?~II*(C8Fu&)RColim>{!9-+@(8?#%E7P_8(>(>%M&#Y z9|p)hqRtQJ*Nyh(f0H%hZvy~=)Ws_f^6>Ya-4<&3zlr%tTR}c+lkqsX`pQF))u|nc zC|lQ!iE4A4z%7npb;bXlf$s3<0z3oHd*~>zgUix9p&C}jeh(AGTD&at4wwRAM2IN+XVF=%J>a1n!ORpvE&qSPR^zPj7UgZQ zRq0Q2IrC+Hm9BO68FS}6qzpCnAOW96ax%J@kvu$(w}pKm=t#BU9;8bm{yf(!r5{}M z@Gn3dd9K>RJ`ogfu1)4ZcL1gV;;pg_rr~4p67uLzYuwSd@-w5f$d}&b&YW}4q+$Y_ zFn{sTu78>;&aar#K#ZF>+aiqANSP(6M3{rBb9Fg2>af?0=&X6I!GJ{Mkzor z3fMY96?Ay-2wsJe3_>otuO_K9kC{qnz%K3ZV9PLaiYhIz_`U%rH!;hbx&QDABwdCv zjYZNw);G_yn`Eyzt!88UmoQ+jhxr(#GANix^(3XP3s41OyZ~VoD#~o80$B~E*ymMv zHl&doKHnJ^DECoHpfc!2;3hCZH9K)@%);LD?fCF=L6LP(sL( z<*_F;L@|ShNHMl7MMJhIO4(y7yX=I@-q0ZX*aqXh^gPG=JC67G{r~$9kCx9bPAfVSbsInDM8F>%xbtu8K@;aDmk8d zQ908ng;?1GA?Sgy0TL+7+VEsQph)Sk8>CGOQDD3^dNbXN<%G+6Q^URi{mI6x8I$ig zj}qs#haRx$8G*1gIa@M(?e18$p%(%=nNh%9bm1Qk64lo4)^kMFGN!}8TF?rxs;=bK)Scpw30UTi%8K7v1LSF$z3r2}}1r#ml z0KO5^6j$NE-#D(qow(vLsb1Ft1V|tcI!&|(j*kQdu)M|m^WV8)>0i}+6$7D5@e2ryQj#TZgco?s?%rXjjbp07X>X7GtExySVmf3z1LyvR4$#v>2nTl$iv4I;$T%|v@^7uL?zD?O{~0lz zZ*t<(mjHeKum2++n)&hId^ne7C-g?^zNLUtilUX&3-fB2H}ep@I=(YyF4l;hY2WrI{LKrrMzIq_&AaV=j>!yyHJ#inqEdra%2cqvY%(c-g_qI7?|GJIq zX~y$1b_NL8xCDtduN}{_TEkW5{FpiFRr0KhH6!qR(Dat8vsB0~|C*G5UFr1~-$skq z&o8KVwopg8A9}0Tm3)~k>Is~bF zZ)Ca6awXY>{?JI>f~|@|LwI(aS2$_^AD{4)%z0#<;ckEVGaWyNG|!?_jktC(keNY( z?t!+kV?|v|AzKq5!SRPqZM>~*GmVTD8ULxBsGQXDI2b265-yY zf&8X+Dh5V);S}OGwsZYrdcab@29R9otpzm1Y|%A zz+G$$Au$nxqOe5}pdd`zok+6cI=qkxOgyV0*UJo16D8nj6^{~zF82SW&6-q+GyAJ6 zY?c~3iLI*V0cFdhF5X(wSnZ5H?p<{s=RPJ}*p!Dx)J4N{r3S)ub=W!o<`i<9J8-#0 z)JaP=N&}KX6YfAZO@ZzW{6+WiDtY{=_};k@;R?Fzf!p0#I6t~P`qt-?UH6PNYF9_Y z`p?tG5h^+wH;TCe>3efBaEDI>X;E@H=6&GexZLFf3xs$KFcmkr`2$#TNE+quLg-^} z)H935s{(dB4lC*H&bKXhnLCnAyk~j~Ry_{?7bE=}%B;X5YDsE%;N&?0J~4TTcuk6p z)r{91Hcit&+eZIMmd17R!cWCHL-!OHou959MZCNqshC__}9v#+Ro(8tyIM)D|fI_p3aM8FHOp`?;GYcqIwSZy0|JCb zn4c&kpb^3~DMt$-)(K_IN2W@6BA-MGbz3RFFDhO(=64W?U&{ zCx281Q!&$st^k1uf3JdSWk36MF-6Xj_LY_^BOvZO;M_BBR0`?>Zc~lqQ{KIASf}iR zTEqAOIH5sB%j4CFXJ2~a-w3(2mxklWJEgE9bd-T``SJgSLQWVa*0>D=TH*{DC7#W3 zl@G*&wuosWRRu)>bLIKPM`wM74v00NR<&1KAKQ^o!53z+*vxQ#^or?2@b!UP(YR?) zM;!?vT&1i7DgnqOhF5Z!a~<`iuRXt>s5wSb4w^I?oQ}wsjMW8g2W0XXQ)q7P4R*qu?8plH(Yg8B$${?z&e4^=(O=w5 zKlpx3JH;LGP59Dk!=U0c--(R!10=~&`FrXTtr`DaC$0>c#;_vKOUCPg;TS^*dSJM0 zXLdpW3qUer~h+_Q|P}O1i7duH^2;_0F)7_h&-ag|X)<_}{AgZ7a;Gv>bK^+jcs)CAPKda)g zH<95PC%=Z!8Ht=~2r78#K5G&757v7)Aic)_MqBz$J{#cGw6wZ}DHeG{!ys~^YK+4~ zIQKuJV7CE?bDoM8&W0U9KNTc)fb~VZ8m-wD)X5( zjpc-^TvvN`IF`a9--7Bkp`@QE-iQk)Kr+y9DhPW)w8&i+50tnYDJ)JoaG%O# z6fgH1M{lkkaW1l9LMG**Hnc6RQ$4ln&GHt1*%qJ?b*TZj>a-j;g`5kW7=33@lBFKS zh{~*Y16Y^r%Gkv5nc+$7k!xIPEXF6n15F;n<6>QS0#j{r^70E~)J@Y`!C*On7@6Fla9x6CXD zk*JKJeEc$cY&MBBm2r%nG69@fMIPW?Q9?vBZFas-W$5eB-|Ks&!nYL>TX($2b-wLj^Dd)OFyw zf0}QwLmW;2t^20Ku&AXetUW{Q-X*cXmb~!ANO|6lD_h+lV~Jw$u|d$#F4r4cKcvDN zH9Ny%_p>$~_I1;(uF;bq+hx4b;%{+nr)z&Ep46Yjikz;$m$1i;_x5^pFuOKzVh(2K z@FIFEJ?2Sieab)I)6F?r&z}@l?>M}&0bG-|;UG=3nvS27i( zow`$6HZ(8AT!UAe#S`(R<_zu<=jib61PGCViY5Y1_#a*T|M9n*JhQQXdfQr{h}jUl QB8`Coqi3vJqU{j=Kizim6aWAK diff --git a/docs/src/assets/header.png b/docs/src/assets/header.png index 6477eec0d1a4f04427227f2805713cb4307c3be5..7ea7792cb1c7e0d98160a597e39d77d01f0ed91c 100644 GIT binary patch literal 87351 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 z zex2*0%nc@-J@)LE>e}vmixLlNx>?#3$DVPDD#+`E&ftpPZ1_{)lo6UAf8WX`G8R1L zEpc}*bGHjPb2ETZvqhgXN?TqMoh|!2n2kcpopMQ~7qhmEJzNXxPYc_w8lPJ4QY8 zxRo&!cDV4#NV8j)FX%%1MNiwDMS-KWYTAhy2fN{+RT3y)5zR8K%kJlI0m~d!e|+R4 z;^lCRpHF^k-oa9~KO+mOlI|*q7$k6Q(#%(`?0I~+rnD2jl3iv$=Ad&dajLb#=}&uz z`&yJ8N$^ExavGc-M`c@`(2(C;Ee5!{^3PDgHcH8H1ptL}d~mC|MOHmYr_Nqv>SQ;K zn5m^L)<~4xM)Y|kzLzLR`<4-GJz|a%2`&s5@!kU6E7?U|?Pc8ES-6_8uKlWH370t+ zb15DZo+HiuV&`N&!?JhS`r|q_9R%C>8C{Um(-ZVtR+$}Ua*Pv!oek~t>-?=HXJ5|} z@R+^w)&jd}`$6K%4(tn5#GT0>#O_Fb+Mk30V_z;JbNp1`#Uy`hEv}AIDVzA5wAbd` zJ89R2UR$(-s6Ek+$C~fXh?SQKEI}1UuW}a>r5IJV+i>cmQo9oa%#mdJ|m zHnP*wA88ClGzT`SxR?SD*ynDUc6Ag6ew%i35s14!By(l*kiP$TZ`t{8QUuAJ>3+_yI3H1_^Ld&y#Q5#9OKc+ z*>%d+$@Sm%Yy0)|`8qsqe@T#drp@PF#YR0Ut7E z L(J<^+r(}e|IVUJlZJqy zajO%Eee&(~`3O#pq?%T+xF0KkPwhSW`$_0$l)Re!X!(<{j_}^cGsxr3@f))vviO;3 zhevd1X7N0tEfq?=y@&jYyW3LM4Me_Z+83*`R{&Mf_#SC+v0Qk9q>4#dT z(KYkp(0+VP21hHOx#4iGVfnpD)VOk9!L?DFVz||#8}zc;!H1INMQbzB8b{ZnhUE2x9O1aKH({x?8Gr9XE`(T&pCB-V( z6PsA!Cdd3Yf>y?z>{r{9U3iYJj&QbHJYZ+b^XuF$ z8^qVQc-^Y%y82s3j!r@Ptl=5GX^F38HFQ+Y0{7i*tD}6E(LE}vhB5Xa?>zizSlnvd zU9FFcug8*^U2m~JzM=_VX@6I?`F*}-p@jEP z-lt8brG$8|I(s}*8?*DnIlE&>v+2+1@`3K$)na#MrF_x>*Gy-6OWbSY3+e4Eem$N& z>+z0t62{}GK)>K9ht^2en7Pi_O_Q9pSXaZb=th}7%=^``^8AA|Bju~Ws6;3G?>*ZG zu}9AR&yROcr+baD#n2ad7gzM`)ogZ4RS%|Iw*`lJAjGJScikFh~P%)&&i&vtV-U3rY~-7vI%zRHB?dJ~m~9Svr!7GkdrM|4u{X#Ef-4yqh} zRc)Wt6j`eIv6eI`>9(j!nXdpV^7JDhuD;I|dlWLTkqZB_c8Dfrd+dC3!>7(okJLD1 z`u*HR^+z42ACSLiLw#bPmZ;q|GNmct#CP;<&iBZ<0aPn7C!sLBQkWj?7SR&D18F#G zbyzE$Zx%q0R;Htq?gmluIJo}!ac#}C3@*zsCe;YZo1gC}HkSGF>TKD?_46^%d0s6n zix-?F^wA8}{G!-;5_0k#cM}jPxo#wRNMgl$d-kPgi_Sg!`K6M(Oa&5s%s!8K_3}RF zG25}wLtkV6m3FoW=?$Ms=h->&-zb;+46oI>u@Y(vETIey6!B#zWt{luLR~aX5%$WP zrBPARCoV4)J~;1H6KZqSJ^HmRTe72hAcJ#R<|}jIKchZPE}yO?DR3e%{O9d|oac4K z+_#HI%210u1+xbawcCIIR(hb64 z!$U-8`(o1aNbxZwq3|OjVp6^I_h%9S^OYw7fLd;$bV-s?3ZowBt@XjV-;W*4hVo1S zS<{9k%+kbA0|2W(fe0@ypYUD^k)$nvSbXFO6fcqg!MZX%KgOxYbAJQS85xzF2O9hE zTP=Pr9vc7+vznq{O2i<+zd{7`pZyqQG3>h69HxD2YtH($C*iNCG^rL5X zIyIreE}nAF2lI@5Homo%s(^0{=OxRp zs{E-x6}@DBADxi=#&Owq-(B%h>|5SkKtD$r$veO(1`%mOTidylcmwXU z1CR%{w&jiw*sN3^ELQH2UcNc??lrLnh(MHu&a)4S6+l%i0lK>xn9WlgxM^t3c_f}s zHH7|SgS2xitfX;(tC$~UsAeTZvUd}ZSc=Phcd?>iTe9ZjQ0|xyLBW?ErU;|HQRE89 z&e;-kebNdll#LV|BG?C-?=j)^b)_>_SPF&)_j6#ni^BcDIJbVr&h|T;P%lu?v{G%F zWoY9Gc)0#8vs_)=g2u5<3&VZ>L!Ry>LIsoMMC&ADE+>Hp#Q_WSOfekqj>+#f!20IF zmNDR{NeoIDc6Hw*?hEKrD|rZvc|NMyT3__wd}VyI3)~#c?*M~39UmQfHOuA?&+kLS zAe1Sf;*NhKcq#&i%3cAX!Zz5nS7}%7g~J!|vwsHv3`l&os(yJcp3M4}uy{&dEQNgs z#Yur}U$XNqA=u4im+ZQF8XOwA>G*rII0|_pO0qnoR4t8u*OTvW3z_eMplbbD`^%py zqQAo9b%ZR8B|#`ln;Z9B)-lojE`Mga-jP#O!jSUdYr33R7}XvZXQD=yFMcB&Ztob0 zj%%a&&A&cUSGQ|7sX@JRAUpIZN3W3Va32@&70S|klT}BU3}pu`v`&-yoj4{5_>Z!9 zX|D}e#Bs#+ZgR`(J!uiLRSQ6Og>J=f^(q;+t}7k7h8PY1mhkm-KY zi2Bg4CJ9cen`-;p$C7@431b0MR}TGIzbt52@sC%_F{%`jA3SCYEe@n7pr52%nCA>o z5YKuqG4%1qqX%Tnvc8>le)}_ap6(Sb=9?i)hh-Jx8^XnDaMjo1#q*1>-fG$_?j}z> z34UGM)$z(SZR4v!<-fT_|M7pHe>Ew!xcJt?Jb8W30nc}u&bc%2?wUYT-EbT!O7A92 zS9b78N=nA>MI{FOCH7bY`@-jWh={w{RWzMOLws4&7s?hGdW#27yz^vmC#!ApN*Z_~ zdTaa=rl*LADhX>(^q9lGwbsuKdznZ@cGp`hA4oaf zHoGROeA+LUB|mN0f^MF}GE_;*M1yUQoCo!k^m>`U22Fhb9#^4+x%+jAKboaBgELEE z?_I9+{^obeon5NyKN4^32dYApibHi*Z;(-`y9fxZ!KB;Z;n6Jlg%yJ-$e#-^O=^_0SpJbm z*P$H}^-_4MW&}pqW*~E3%6+-w&Y(S~Mf=CNrfIGyvYMEhwgCFj|;xQtO>hK)}IVqj)Ih z{1TGx%fn*LK6QTXOjM;0;6^UBU7@-PQ~9ZOywu-d+*P`NU|qp9r%p=&`6qgIByVI zl=hA6Na!!V{iHlr%Z?+dr%8xi?{V6^6;1ys9*!hKVXRWxzPJ5hP@DY-0Ar?XDyw#q z*7WqK_Q#EMH`-S8O7+F+buKqkH1fOECQ8PCU9r02I~Qw3djR8zrHDbhBp9Sf7lB>q6ywoV(Vw<`UXD!&4}lBl4`3VOu++r7e1bzP zUL#qSF>mobVIprIkap!F7^mI!nE3gR&wCDn2Xkqq)eG&w4Qm+~uf8E6JE=rIgcNZPTJFvQ~@VRJ^HWcX%fA3 zCnssH5IK=a>{&tvy`PlEfe~Ie7U?wnc_{a#{B{K+g~QEAeIn9{OM%171H_#b#GOs% z-tz2<0}eI`max%o$7ESQ$sO$EWcvu3Y_Q~6KP|K0mZq+z>mD{q8nA|>IJk@-0IC&7 zzaJT;(vTL!1F|7tkpvHk@J{r5MyYOVV6%hi_>Cg5mCK%fGQf21Sx(mZ4Ql_Q0HBKS z0wWZOQr~%8XRdzfC^Y+K;}uRqyiXp)Q_atiIXS>e9m7nRH0JCRAibpYD9L4_#*6JD zqvVzW@B_%zk>Yt8r%t53{8oe%438SfBkVP{OrO9I@R%ZX;`4}K9E8J{4~I_`VLuCf z!IcdF{v9LD3?3#=)?Fdvt%p#s(PmXWi^`Ijx>Cv9x>q{fW)?HZ0T#=|w<}4GPiD5J zi56>-vsnqauO9`z_%(45-CkW!Hq-U}oqO!JGS_vQ^V>2|iK~C1Kke!Rn&R=cV=6L8KIUkhmJ*mm!JDDcAIKeFaM+) zNhGZfNhB3(Hj=}SP7UJLhROkgy_6HyJ zc45(Uo2+-00~DBU{C2>7G135KeRAafcFX6qjB0pPmWR)sBCdA$rp zyxA(*&;28MY$9BsPJG}_Bma#rPg>q*8qf2bEHGR`gfq%@_yg=oGgzG|N zf|o;bVxV!<0`ulpCU6pbvGPr} z3vZ#|)u9(N9?$VtM3Gry&4>8KzeWCS`BpdPnzvJbJfX^u&NC?!tn;dxS%2MJZ6`dY z%S=D>$YKhqUu;QZ45wPE5aGN)U2(gn9VJlz^l)!m1TpyB+3XJa&5&!j?%HRG_gB__m6?vuXN?b@kA|{MExx7UHgN(N`W2yDQb(jM}}8>n{H|7 zxJcV8?3sl-t#05hC`dV;)a><%r&~b=p)~!=U~$B-m~~KD!j1mN?r>p5(R3{;1xuf^ z2G2akZnWg@1x?bXBfSmME4MOj0MOY>aZm$E_Q=)MRRZy*!ZOtuNwuPN^zx;>gfCvJ zpIsx#w+G-&I2t|6t({q54Lo4Rp~KIY(ga$iwlVOmfUcV%9%inSSAV8==%!viheLf; z45iFII@r`O?zr3X4341%oX4v-!d?zJdMU6gToq8-F7Ve80<**|2?wq+e9Y_t8* zJka9OLLVjTM!x%uoylr^pGt^8RLq)JH6;^~a35hVXeM5>!L~V!W&~#cxR2#+CdVA> z50`$Xs~DPAIx7)N;NP4$)eZ7B^CPA2S>2_B`8Jv(d~V_tVu0N)v|W^YD=6EqoBO z*PZbA>PL5-WRr9(>RUItMO(J<(}Lx?O5a2Mx9=lvB~W#j*XSk=b5P#ve$Ph4dQxdS zztHNh^Y;EJVeDhN=MM^0b~IlO57`eY%MjFMFppqsBQ^9(H?BfdOsrb54hyZ@ncD9G17EZ$>h0%>1sO+B=ba>Q~Qh&S3kXa z2_xPsm)*K!8y@QhI=4Nd_1esz2s!r|-b1(sZ%5$f`xONv$E@E*(()PDMXLB_RoTCV zhnhKD`TNTCc35qpf`bPchaUX_Gjr zdkES5J+z}&IKy7L*UCfDu0}eap+jI62^`G)E6hP8P}g0$7T-tA?YSB*fIC#cbtd9b zhoUCVl&$2y4Q|BnWsH$NeBGpH9_%iCr=7a^)8gu&ol%*-lc2g#h!~f%w-Y|xu0juf zk%4-$tg*jdRQ;AJrCeFOjxKrqqyV^zDQT06F*L2Ue z+5I2KfI{l9TBw-+Kd1Rk;7IchGfwc`4FXiEo0uzS<;5s2F?ft9m7e5?)BVK!Sx-t4o zWXBM=D@(5p&)((^`6fbg;Vr$(sW;2}&D~DI<01QPPAYjLhi*d_Dd*dqI)u^tZpk*v zzQk1|ZtuZ&=QOiF!sWDj&V3|&)^9*;(svU%tnXE)FiWY0w)3Ik*1kOd!wfaE?s-9W zXZVS*_MkIVrbSNon!7)K6T}BZA1&;5!DkPzk0#!R1wL}QVaP>DFlvQ=s+##+fo_gK z7g<2u4N3LF`2!1<{|Cn??*8=9;XnCt4}s{u;LkK8~N#|m=!lZ@)^48L!l@Kx3I}k)Q6K~4J;c( z1;gju*^_8ggeaGtxj2I~Rj;9}a?tJfQvdnV7U)Et=cLOCt_eyB)ue11@i-5mM9~Za zbU_^E;v9C|%wH>#URSN&DS7g0Ae1f8c)wZaUWvdf@FM&bEoOA{5$+A6p@>K7hr1rBXEpW?O2)#b>^K*3HSPs!_rRm{)sQ zHFOL#5F!b#$xC$ohm$54nLO;FzL7bFTzvl`^2Vc#P4ogCxSokgD$6N38w2O=Y6eQ3 zuBNdTP4AT)$`~-XCzrCA!17EwRqoT*_WK!?##c5z#auHNE@h^U7>r~wARP=? zS|y^SzKx9NN{4vcdHiV5eW!Bw%C8$~))zOb75`{F&>`E@qCMb@Dr;I>JH=G^x-f+85oUfC;d8w~V#cR}%p z6y~d(JA&c6A8+X&sUy@_t*B`Zzh-ya^0ErG$~sO+E1=BTVfR(P_`lB1Z4^TyQ)RCD zfdYIJTWNnMse_Fw?9wg?+oHzLwwNUM`84R>VuHtu)+?ND6`SzNL*pG$Q zDPUJ-jrXid)7=7|XC>XEvm1>b0eYpbbM}gceKJoXezi3|kf^>8^&|2~*_g<91n{s+r*E}a@P13Zd< zmBj0iv&CYx<0c$n@4xA&An>BW0l4(^#A^2=xY!hQ!c&UV>QSl*Quf7n+FtSzPeylc z+=iX%<}GHMjEeD=?lE5k?S^iDH6dEB=s>4F1J9CJR;uaDp@1mQtMfQJPFh*f>JL4W zKTmc`wXpe$y8akuO&^p&cy8ZF=A(=ngC(<%&op|GW`TzS08P6 z6|^XuKV|xwlq@sHN7&$UUGy@w~}5Q-Bq2N4Fca>c=$M&RL}{wC~$OS2>I5dk9t(-ce|wXHysU{B6P3 z)RUdc3RBFlg8q?qAr{X02TM;|v**I~zZF|P=+k6y{$2F$=P~l>7V>RuQ@9zbqqUxw zqS_BM7dNRwtD8h23LyOA2D2W`zd&<@?vXq{#d$x?UX+Wt?0~I1aaKj>?qVWi+kHwI zsyDkho+kB)0Eby)d6g2|`m-|@lh@p`dpGMx`6e z*>@xKu^+hoZr}7GAmdZhYYw@~Epqglo+YH-GP&TIbldYCR&mF)6M4#bP#r-$=`XY?|_W12ryI#~kLtQGIu@uT64gIjHB2bGp2q4ITw$W~CiBTR4yWnTX8)%?6qq+7P(TvW zs)Ne-?E3psO_9Y6BkQGq%O0XM^O+@kl@Ei<(&=?`^w!IUN7l!KJCkI5T0w>Z+igdy zzUIIFmHJtl(=OQy!+s z$9v;e`Hm@h?q6HRqt+%GIZMl>6s$g11~Z!fp*wfqD){z&ib8$A{N{1f3AG?u?X^Ec zf`$6dSS60fWen@Xzr=k|eU1FN08m=$?$9KD!`3MzJ#nhdIj7ly$-J^I9K00!XM5PmKWeRTI=I+2eD-cwdtxI zhA#u}O+e>SaPmivHxjtw3>4E|||8Q`S@b;m*ISY4ftqFuBS1DTtL!pr86;yy`8g6!nN+m zZ1LcgCd+1_PLCbO_nuwl!cP45zm(f*m%rvLq@89=zO%e0v2OA|ysANwB3u3U2h@DY z@lR$tV_m)jtS$+PVdyTl8z~|qA9@TEN^8~^ObjMDrwb!x9=i4vYG^E#?@&RJ~ zLINQ{0!-MRZqS_p+A?4*&8H_vR&ZAhuwN@ejyzHp0&KImDb2v|#77v4Bf@2TP?;g9 zZW|)wi=sYbK3qyL@&z(MvPP1${#``0U0W1;<)rr#AAaA%FadLx$Vw|R8O=tye*rHHKB;U8%9jhRi__!uHXK@4{z z(d$LQ4tCe&pZSJI9U3J0X*K?UUVj>@oF>V85)~-7SV(NnH9aJtNab>olZcAYh8c-F*DY7)iQah5-*( zVk=5uQnQe;?cjkyJVlYm~igR#U? zsqrW_7qRUQ3 zt?}F3nyF1<({=v$5xGxim$nieepwYAt0c=FHiOvKvBW+yE4#Umt2obULL$l_<2`_W zo(+Ie+OYYs^b5=lWrI2+FxJZF96A94>mUv85s~Jgn=$F%NnUa?pD~*ob5R zv3vjY*j*)PkSZmmAD{r{@}l2Mv`}^kohqyWreRr;bKk}v_K4tx6;8j<^S;$azYSZ} z180lgMIg_8aI~8#de?1Q)mJT)7VzJ`E1F>@pXEY&qO;^iTwxpEKQqc&pH!dvJ6Rtf z!g;oOrXhN`BmMDWc*}>+EWrmJi<6j32z;Zae?@830sdH@yw!RdZy;fPY2Sd|^YcUF ze)&ZMegDL!KfR@{mI=I7?*%aekbiH?NuseSeVn9D3H4;pP=}lT?(Qo6a?wU%=!(vmx^=ZqPx?ck zn%uUP4KkM+gxtM0_*s-(l9*%C!IL9-F5o<;+;*m*FgA?835bta~F^aCcP#|ncLAuocz$;sV`dGosCb9@rMxDt z{&Jp*!@R}#<%Zwx z+GEFh&T{a!NgI_|_hA)B7H#S5-3wI4O+^NB)T+F=5$NkC@8@K$_xOP-t2{}+9Hlt+ zi*NPoIZfUz7+X`P@loFLo30v^b6@^MGmqHN&el4hjJ4H_1J<*(F{DPRwM@c4NZ5Sa@TYVK}zeQYq?JHgKQuei8UXvQ}h~3+V zD^R^QLb-|PZ+~kwy~LC#WbvSspeolZZU-X*9((khoL4N^%RfCU@MBgWT$Qam8o?@! z|2-KwJIU)y4(hHt&b&|J=7vdh$++WhV*WQAJ=Mc)Yf-4(I_J=Gt7h2M%FBmILAfk?C2Csc+}mXvSR zr0XlE@$5Iw#hrV3a0UAm=WSoSSo_;}EZjP~$_jfSB(|EjM(piknyZmV|6V3oAL`4W z|CX0nTgOpnLH#8Vc9AZn$)sC|AI8>&x~3z*oNk_XRAhTV9DW?lZ! zp|nh_kj1DlC{l3{!&|mL!@!|hJ6`TMsiD}1mes=eQRjnXxl-Y|J{^d*IimrTg-;i( z4coCeF9fRqtl-^oPbv^^l=lBR_S&xjQCSys-dWMfl-C{6oIQJxuH@3umV(nYhU-<+ zZE+$?%wSAj=OL^-Fl1CAFrI1#VD3;sh=eN#ab3M-U7$M{{Wcbyho!)6GXnw|}RR(Qp5hFL2beUd7Gc#o0bv0EX(Iu4TF( zj5EMd4BE*jDKqcwJ%$ICp5)vJkjm7))Cqq)b?4oGWh2pZ7@TL-IG+#pVuK=U|Uxo!R(tH zdX11XJlm0c)xMzZMjXKYZf8l52wn;l{$)~qOW!MUotIj{UtryDR-inW#i~?DN&5M@#5Jxm)_MOS^=IKn(l*)Yl~dQ7lXsV^t&?H@%FpbV3U z&Bw<9T+hXT5AMzq~+k=|5al*A|yc)+I?p`k^l=dEgp5oiDZWl z>pS}qJV5*ZxlBSi^04_}3H{3(RuxEIbn(_9ZVl2$;Yn!d`?cx2z*czb)1Eyh;LNO0sqz zbsS22M?2rduN5lJtZF)J+I8@S&buCg7}EzuZRkJW!lE5^!VCj{f7)ti$jxBs9YDj# zXy3Xq49K?jvjxeBZ(t>4PXCyW&d(61u5DkL}H0|*j zG2$}~BQ?{C1w0M4Yu`w|e+8w+fI4^g#5wUd9+$GguPz74$fg07fLs9iEGv#8;4wIl z@7%N7e|M#~Hk``5|41eFTr}$BBO*iO>$T1*ooOFKLEDJg-&aJ|GHfF|eaO1JyJ?LT zzAx0#PS3~6R-0-)lckHw4Rp9$G&TO?-ot`NzQ(wQxU76Wb+)l!pn99T_GR@PQh#+u z+be%0VgGWtwS>vf8emq4>rR%N z#G0)@BDijfa}5qkJ&Zli&k6>Uz^}N~Uxw-kxAoS7ahM+AHPt26CA2Q+Otnx-_5+iR z&U0WcdGri1(6%{b=t!nlZ24|79|MEcMtts7SYf=s0)MSd7@YfdL3#W7B~NfBd<}p< zoQb9CY50wHUvQ6h!v=|2tbb{p0AX<=>I%(r*atAxKS5i^!Ty`8LYq%hzg{>wZtgxd zxZRVy)v1YKYmIHFd0F^PV`gtAojigWWpTp$ZLEhhhVX?18IRxI2Aa7%qLl-Q{g;+6 zJfD8I$2lE%(2=@O_L3B@QZy!e69!T@Cc&hW+yU@izc3NC4=b#VRp99j4*L`u$IMdS z&>DYu4BNV4F*3htT>?P_cs9e)p4A+GBnj5G?$o1D_MaJQJ_PeGo3=<})8={P7%X;< zYEy&RPE<=&M=iHcJ=4tJ3uN?cCpw(qqY zSf!jA+}_U0z7F`E>K<-aEclyREnz-a^eVH5{f?*x(&-(C>L;_o&gi>BD=umfU}DK& zb8FN4EOkH(Y zRC~0&*G3c-L_kH9l$MrOOkzM{=#XxZ8X8mt8B*!)9Lk{^6%ddHX<-yWnvrgJ`*^?i zzW3+#Q!k!#e*3rf+H0+S0FSBc(CdL8Pq>I-q+%SYa<+VA`>lD8fL0Lm383OW908y9G{YKDJO&T@;WsL%4KRXrqv?KEIg>NbnjKBYwe_zN><4~s49R-~&Sze7)v;W6eZIs! zLr_6ypQt;7Ir#xvDqjJ!o*xU>glwkB(b-2~cO)kM4S4tNovgmT{^{noO+E(RPZt|( zKq1~;?`^;~PA9lLMI(x_a;d>A3FcMXsET`Q?b|b5IyU)WPUpn8wc_W`Wo6GOh_NK< zlS`}Z1&05&G!~ zgFUr{{_Jic+_I4HT8}$Ol_GD?FSejAV4BnN=mct)zN8&^%7gm2rV9o`h2D$NDnLPu zIl!-c##spVKX~SI`hpko_eGbeTezRkhpN;A+{gK6PRbE%==ng9XWWuZ-W_Kco{oP?kFS*#Jakz9%t1pR zJ~m|N)%A0a{GXEZW{G>DF~-*dsh%X#ycFi2)oD-`2|oYey;j;mNhU$GksZNSXbRzvzx6r7Z+84SZ{xKU%lA-O8aBL=?S&j}p_MYc0bjmO>l!;o^}GA3Da&pD3@KF+ zJxSUM{`A@qgKKFx5trjH9+y9o7QfIkP6SP<*ET2>JJWHmZe{>o9j<3o%{v)hM7>%+lHWKtDS2-Yet~g zXJeBwO`e0CmMG_GMs}#Yg&m+7nkF`sNrOvAAO3J399XAQ(^Fw#S)FoBx{dDsi6QPC zd?2VB#aYFG&Mrggk+Rs~_Ah&>xQANRj^@hv{y}GP7z_snkzqKIW-{b?^beBr=MQuv z48`I8+ zwDh}1Eh&F9ZKw3=Z+(?5ZS2DGZP8!mAW#x8In!i&L{)~1$ihzC}hL8#O$w8muAZA*y2!QPL6DLUXEOR zMs7V_baCCjoXd|&unugEOedSO_70vJ=-SdAxv`G+JzWte!DuX~#>h^L+5dx%AYS>= zH*$L3W{k&*c8XGJT0H%$d`exYQmSaFsS zTFG@`D8}Zt{pV*NTvmWQL_D29*#cm&T|=)_n@Tv)pY7UX?es2#?6M0Zb?z1WIti(c zM=J&(L=VkLV+E0`&U#V9p_?4q=}xU}Xgk~teYt65y@6Lacke}VGAx%Q8Dy_Xtbx*e z;?G{kv0ivs(f?j+geN3(n8cY~WWuHZOo+SCe^~+@(3+Oyq|u0hyzf1+ll)PaA2UYe zcw;YUKi^CCUj%79>joHNJe1())=9(tN(#P0tU3hI&<75Ni?RkjI$0dUIZ;*-zMmDQ z0g7P$LXq9|c#n+PxXu~Fte0hOBadnR#`{U+McMgCOTg!506)#{qsz2gvZzOgQtZ`G z)b`lGx2Ejkvi%JT8SSQLn=Z%@sutilsB$IVJT8A6A_Q=JLG~;)+^>wNs=LCMjh~n5 z9s%;yq#$U`*z=1#a0%GfWdtTuj|B?+t%?zC()PoY4^5be%LEf{PCS!J4{luj=WQ zCgJzDd?>CGelbN1meb0n?F!i)I&yd3p7Zej!M&UF@J?E2wNJFbb=Gy9BbYHonVQmh1>&=zVwCM}5szYV*9xV4&jtb)tEPy4Q~xOWf7 z=pRkRZ+*X!JADbxn4Sunea@p`(+~TQ&c@{#&{jXY9hXMYUVeRc2eta+CrPh(OG z;gkj=a9aScb7>4+1-;gy-!9A1EmN@?j~#m)oaxL1h$Jb2;UDiB#1=OKp~ZAGD>vq@ z#LCDx!UHYe z;h^(y{r^+Qes!>(dwCze<~Rk&GL5)xA$b}e#J)Zdbw6h;H6Zn}T>wl+r;09_+y0)mFtPH#aPTUx z7NHK=g+vGT*dbyLZbS^gNg*=xE>d-psw04OL`1b7@9Or1+X{K7>jHCGluZ;%3O{uSPD z9V3S19EL;)Ad~cj@ihfH2}w1sk=qrvE!J%afS~>2)ZL)SHKtB1%U77Ll{6N$dpcAc ze4^&qH|Rf$h3^bcvx2hU2xM3jSEi+)sc;`Bft4YEY0@EE!C}c2l60ln&tT1+wzkOtK4l)^<>RY zRp<&o2Zz)+b51!ou#IMS4T&?f&TyPgp0W?Dh|+Ytce@q0mXL9X@|$jwPqNgJY7zkL z66Sa77S$Er^*X}GSI6}(ik9fLizS{wlYvq+e*Yj)=%Gb9%r+&3LDIwMy&TJL-p62& zz2xcH5<(lVacMCOv}>+Plqe@e-;Oi$hvq}PFhHbrq!2cf_=S6OxPu}aP-itZ}Skt_p~t^`)eC-ZIvn~ubZ197zAcktVk9&qJ@ zkkuXC`$9zGf-Fn|#-6K!rkIROkp0b%Tu_swnREfVPHA^_>R<~{R zWk{LvLfArfJmot5Fy%*3-2@*|h_dV}4T`#~0Bg>r4hZEv&~E7Kf>ts6vidDK+EvB- znZB8H{9sZ)YyrJ!bRG_aaCP?<^F>bg!bKOTVyxA_p|96_6$klXrfx4#zkayid;6!U zyW~OTNr0Jx7&JCed0)@ZF>7%iH%n{8r&>DX89=`Mjy?I)+4u}*m)cQlRu{dW)GNEjD5TF4NjV49i&L{d__x_g8oyR z2H(HAQw*A(aP$Z-OyfAXMzat;Y&MkktqFI9uGQ?NT>%*HwG~NjLD&E} z?JH3QD2%(g#jNmmVl*j(uOvobN&$`kHpt%Ns}HByt&ae=tHQ||Bi;c~%V_SSd0CtB zueQyr1m^+xvGE7af<-G@#XI#U?!85}7*)7gtRS&!X4s3dN|37G_*xfMlb^daOc?`o zLWSbY={m+$GF>EL&^~cb3W+ls2R7~chF7yb{QOKr7$cgwz#vIgFOrkT=KI~m{#Px( zb2Un`uK(k3R>z0XF*?l>>_e<>yeD#;y8O(L|5~2qJEa9rmQgbewBtEDFKq!!Z4drr z(yGhDVz3Tr<+@<*q;*r3V~5gNLQ09V7T)0+i`o1k!jm=;2N`TW)Kj1s*|?me*y`^u~!KWC&#E^H9{~Ps(^p zg%uMAM@NswI3m_uK8JA~=j?TgAJ*s6sGsqE9(C0DyKK4Dd19n?!cdU=Ud4MISfd0< z)$P~fa0Pd#oLgbHaA=g?<$FbN%OC9l=lzv6xL|wQP0HmoH%_fc;^87G;Q}Q%yHd=ru2b`RT%4A-xTD_U zSs-wZ(cH=>4EV(0A*Eucm{yCpBHvASb{=@CZR_Rc#>3CVgxI5Ahrg;~mA+e~dh&S! zTiYjE&^LAl^ynF!kjiP7O|Z-}abL~zrkK$^r5AkTV?by@v`NHP@UX_t$e?-H_b1Iv z{QT>-Xny2L9nSvk^4;QrefQ?Th%CQF)RgC-j)aw9G=%x8RZ7hitHg@tfSIvv6^NEK zaTB{ilQWnGD0Tt923K|T`2o-&R7Trcc5ixxq&94Lb zi<^0AnQ*_WN>QSs=^q6&ns7c~eNYc0>u(!1M#`o-aN}x_;rR}3z+XEeh2}>A$-IS4 zOx3rgd7j9YWAPdlbLT$STKit#oA6JL52BwT8pmqO5A631-d1stV#eEq;)ha)OI!~= zTj{c7TQ>n6PPxAC4kY?I^yNNh2+** z05n=H+Q}Cq^ujX8@K*}$5JXm42BG@;d7vEfJA4!n%TE?{!tHtMpZgJ_kLF>ah9xz` z`zCUJ7MSEQBlYx8&U7M?>6ND~D~<26yfrLtmhE&(T=aY3sY**ik;zB=r1(=urPp^S zHPtC!+A-SIyD@I)UO7snOl@fTbLvF%L~kmWG`z%P_r11kah`L!alPdw&gLE$uHQcA z-Ed2S@Rew)`tfT&DAUMr`*icp{F=*ek!*mh0Fpt(4%Q^!K4YF|x)cUds`qHh&M9dS z4IJgJ9#uHg{ZYJZd%T5Y^I4|QegBu+rzsy^JbC^p{+~W~?!Nm0{%IEjWGEhBrOW;M_vo1-o=Tp$JP}(%;urSr`%+ibo+qKZey`(;WZP0#SETE5>`Q2N z6;-!-H+Rcnu8`%a=-8JbEe`d3FA7p*xK#11j+|{VlHP|KCY<4}qQJKhbLhoalOv$<=rWinSCpT_aopc)K(hq+P= zf6JsobK5GI3BEGvI&EBP0d*PS3z)}jR8bG!efLc%O*yK*gI{C7vr8^uurGHNdx0^V`+U$6N zt(gg|yaZiZ2eB1q=Xyk9E)M?yx>SR9xg@cwl3@+I8)7hAiKIJq*SE0ELx|;E8+L!k zL{b7J&8N!v^Ca3n_;2c|8N)ra_a4#Vrq?qH?@r>?BcGbKZZjt>TnR|jXydOi z9GlmP(>-3}%i4Vs5Yz}4#)MJb^=kwxUp-jh7F71i0T;5eG&p^~Fakzn1`4yVMc|yn z!y7dx6tr~8Wcwn%Qz`?cM!`nb3b#*^O6nZEyOJUhf@E>ziNfeEp|`iUS*70*xK-T( zseUufu->&V*KF67@K>O(iy-Efde*~IN?T<%b*7eYxysYgmSy6?oW= z4?&hdixCUQ-mNTXrLt7Fg3@u4G%K1P`Ru1!?E%tlqKT_ zjR8A$+?t|>Jipm#?Ly&5mW7&BEmjxbYnt7HUegqI(_$us{xkeN-JoBU_u6kPFdqic z&(UFf0xk>?A4W~vc>ekEX$GD{!O}HtlZBpCpMBMkf$+yXNM2-u9KHigW~%!jbZEPJ?eXScS%`O)Z(7bVW)xV&>Mytl6A56t;*`X$4c5ogVWuH zB@FC)W!vL^LAGpd^6nd4PRl>!yh0VFds82r*0|q3dm=9eZWvuJR(3^jW`~|5ArVfC zGdY_m?vAmfWWg3rrT(4ZN*h-}e=2O^l?e~82-4GLjwwJsCQ9qe3-B!*G$AJsCPJ+Q z(>P!{rzu4Hi%>u>ZU*4ndjfc{G!h=$4kCFNkl#M3_bT}YaI#TA;`imE`rY}flvkI7 zg(lubN|goEn5gL>{-$4S{3yV1W#f9F(iqK9)g_rK^EZWQFE?zyGWM}x83WGPA@3q~ z4Lr@u4(WLqX-4N;vq7tzEyIID)dNfOb~@otY!6>8In)%^=yontlzA6MN$cv>Jrdyl zD2JPm;!wDH2IpLL4?3M0Y~ncc9WekON9KU-^%))qoyqu|z=`lWrfoZ8D;_X8T0PD$ z3-jlyioeGXdV@d}JcHRTb8Q}l--&*@J+HpFepY$cE z7h*d(QJ&@&oiJQ_-t`F9k`8Uio6K9D*I=D~|K!Hb<2R2tq(irb7I51kz~gMC4##>) zwley{0Ati0Omz~e0Wd^{{q=t~phbyBr_LcZ9S3;A z0HVTGVAK{KHH`tuf6hi=G|czhv=&P@sz6J2UJ-BHWEd6M>nLu5px6%WU6q9xeat`^ zu!!H`i24uVBy*pUR;|jYs}G;O#Jsif@=1`jBtq8XL9bhgZV9sn++;&Z?XjVyK7E3jqpZ%!x(ZlYEXI;alZd7LSI^-MAFU$e)EjZnq2u z61vXB?;MRF_D&BYdzG9*-jvEW8gaMv6ZrlWVfooGCfP84zYdVHNDvoXmbYrRCj$*t z7Tu5s?1C*q6s>dcJk9cca}|b~>xH?&KPWFSv3!dYt~h}Mz5=*)7u31Blp$WYAhN&< zv|dtd{5r3Wos`q*53W8s7|cRls|tEe8J@=qV@un>3u<9(QvDB0x5YK134LO$ znM~66_sM9(BQz`&c!Jm;lUwh^CczCR%e8QMWZ>L`I zQD7%-n)tI8PfCi zgl2vpDYAn}G8|Admr~c*(QeBIyo^ zY=SyKpBWWn%e#euVj9qEj>-jBW<2}}p1{41((d(U&%q~)2q5WJ2)ZUD-{lD)} z6}37<^?KMBJ48Eed-`3B@L8`<{IY)noS!G%c$BWZ|povm^lW~%HG-u7aov{ z1FN<7;q3c63P4k6ZOsp~molkHFH1dps%kKViq)>r%j!kjKAgnleX(kv-MjRU zB(-80JJ~?Z_1Sjr29CQh(@=Pn<8IG>D+zK!T4j{9)S_GiT?n0I(tTg-XoL6B12%p%oLBk09wjJxX7tDleaz@=JyQH=jA{q!Ty+T` z#fH4B)GUSMB*Ygw%GTciN^3e|k38+>r_!ZBhnZWjy!K>Aw{P6EMl>&l%#xkQRX*kyRb!KT&@V!fIJ zcm4!Vb>A2i&X_#81Yj_jZ9}Pf45}^SUr%vWPP{%`_}s+RMp;uht`gNQK*~E2E7XRt z`RU#V%iRLJy_SPx1o7W{mtJPvskDGyrq050aLY{#)h@37{X%v-#5vPoDnwxT>vp>m>2NL&M#P`UOKPE&tqG=;+IZ-MgSFMme@KZmYVHJ^MG$o zPK9Df+LAnJ+fy@7o#~$GYWVV=yejAJGl9g9Wkd8;Q)LvQY7>DXH{z*=mjsQ48g{ULfOd|5)$IGax zLU08nKTFN@0^u~R15*;12)otrdWarXdeKpws?|a&i_`F~c^_lqz#9Zmd&)Lv#R}Q# zszO`18^NKmYDyVr1Ay+QL3Tm+h`zKWPgeVD`cYknfgDA{sZfSAaFW4kM0-e>e7 z07XGT5&p>c&c!wz>?&y9(~;C|Nk!}achEVC*0QUb%raMXn77i-+qW5UN28akY2n7h z9yc{{%X1Y_|8Ct>%`4Vk5!if9&B)(cKzu~^;o;wk+s4?vvUpnltII#=Hc3D z-2*_n3&=0#%Pp>gRx-0FfRkzB-YiEQU2-gL3q9RLWX89PO*n9r-|_A)*(PX|smv^$*mp^gsx7y^jZsZ-P;L=g(Jp?rI7RGf zRvoB$K{`UU38IvWa@yrN*kCEo_2|kKSi58eMTlSxX&Yx&CboYe=D)i43{RrMB}GA) z=KvE0-MIt06Hk=|l6s)y8A98=2FG*aW8bW=N#c8Ul$s{c9En72hZ(4lCldf}e$zl+ zWYal_LX{x=jX;#vr2lp%E!p}4;|^~wtN>w8){|?HfDgMr>N4xDHa84mXF7EIxLG0R zF=vgZolz!s*6i$xdNo|M3&7kFJ@X9uwQF5gBq%@M0|hmc`LgQ7P$sC+TwRAh=$ClB z?RaEQrH$fjxh-qRJl>gEGf5#ChSga)B8_Ho+rhc&)CsydtE@W%jv+Tu8YsN0LbQJg zWBQ0)7)R++r4|Z3z`nQLb>q~jR$<<))I{X10Pl>Vv@&EO=Rbm4DI1rS2~()8h_gNv!tH>sCx`7{>@!|d*96_c}@=SzKAPI-E7HQaXTgETDYS*TwR^~+u>Ff z+pR&VVgqb>rr+zJEgy3`f*053zlnyuLrbOC4SUvU^6D#Z?sj|wes39tMQT_oFN!(3L`O`%=u(ii4z{DI(w`E|3D5Vf(@2)Y0)846Kl?$Ucfh(f2 z(9+jfJz^l|kh(3cqtEvKi|ypqIr#)RId}u4-8E4Ubyq|k)n1o&_67Y3 zR zXqh#KLx}i7Em;4xECVe3mE<-%ONbaUdc#3$8IK-Q0xid&#$!g-g{c)0o&sDBem13Y%OH_0@HWgPCeWzyV%e@NJ7aa@9)Gul5JskAg37Vj#ggg|{OKDu)ag@KIJO)N5K=x*O1ZhI$w(DG<^(p=s{}N^1VC3S17~*6BOMa&G;vhSCXfgesgm=cLzGx+*jij)u?9ra z73I{q&!0c1p>~& z-aZzvM_}0?*a_+h6dlxC=)Mn*Dou@}dL0pqu9^)JKsQ+68^8%ySH>~Zu7qCIQwPjEpnlkur);E;V_7d{?s-_1 zvl~0(kr6Yp_#C5Z?zs1ZiP@Uh9;klm5?u5qsKdO|4Qf)R!8colB}&xO_bE3UV@f=mCcT+cH+`BYIS!jIq$vQ zK<)4K!}@o`CogNvaif%P=XC`6Va%gL_#qqQ>`8>U(g>Ag}A|+A=`V-lT~KI*#P#|w`eP@Y+)2r=bDJc zV)#2elSBt=seIYyJ5|XXL*WdQ<=buA_7pQE?`dXK*6JePrR1$L7iM-noZl|3XTI#| zk~-XWSU@^Z)A7ECS^zaslSV5f&$CSU0{FNjr^g<-<%}ug=HaRlAuLSXGaM+qjF@~? zDR+&b?620nE1Y>91Ne$t5&siXR0@`4&%)UiO_kz=n&6Urmev+1pSmV_t>k#{={%#< zdMsv=nB4FMLK_TYp#K3x6?+l4ga-`7kYa2a&Hzf6Y!$Pt9*{9Os`4ZdcNhAh$Q<3& zi-rnU5^MGrd?JS{@L6EYK&FV{sgC{i3Hb;p0%+zVA$EBoMN;0u?oh7-5u#^^^glPwn7 z8EMrU@kIv8{@#*@yglv(l}8+v6*ete)0{D3Qu$)UINg~ExvgOnr(}bm&*!fS*@#&I zdpeHpmvi?y*kFyyi7&& z_RX7&r%1-Nfj4TgD4=ufik9|R4V7fWjg~Q+ZNh{@xA+l)fzpP#GUO9Am&J=YCrLry zdY~C(zPdGfgXZ>&;Fr;c{1LTf+B&)H!nM-6ysf*fK6w`BIo9HX{uO$LE_Dm+Tx6p8 zwTHGMJ_+_#@v8hMkP`MZ&jC?y)O@|&pDNQG00g-e(@Q7s6mPz6V5YTfLE{hzw+|%Q z=KO)P!Fe$?>H^gyyGl+^00;%tlu%D#_0=qgU_X0%jQE`Kr#DHP7Y3V!zrFuHU2bU{ zJ$2RkSD8z`PSYmVB2H%i#uCNcDKUw}?nG54KBmYn2mR?fvyBBNhS|H`B3L8T|XM&k2gh3xec46 zmRTybeKGvE&FPL{G`zJ2EMbS2M-mwHF5ALpB%1+2Z6G!tLmF;(#EFKnKd?oEiV1=f zHWG2xSTNjq;9-VX6_HAo6e_WsqXf6J_cQAUk+&5M4#7*2mzyoSW;W{&nVY9G`Lq9baXxS~xp+@h@_#_$A%&ZvO_ z`fJ>*3kM`WJX~STJ6<-dLE%tW-3r+C(4}Gguag6%0W*+tQjk8G@(en2=ccaWuze-? zpex3h@Un3do^BWL{lZm1MRbW09iQPT+L($RxfTqrB)0Fjkv!DmE;BKm{643R`?{LR z*GwF$);5ED9TLho83``@T;V(V7Pf}yjeZZ#DWit+X`XOd=Z4GbUk1G~(n^oWTiucN zT3Dr@t^9^}2mOr_&}Z8kw82z_XneAOT95RM1O!31rbxB>`uXXqq>e~|*MnY?6eRrd zf~$OV)eY!eNMB zbSoB#I*USF*K%x4)^NGCl;{}@71-!huRLDyzIqO;d!$<>qQvalX5HmZIIUGiQ~3rr zI`DC*ukh9G!G|8iFcG(<%J{8m1=%cW3*12+lZ8(+lx(el#LO8_(1xPWR-_`5O*PVT zAi?%l!~e=@yWP*?mzI_$liPC{;KMPQJ9tsPqR2{lO$wPNVu=`u!v1-Y@R6yFyuz-M zTt`VRrXCW#GN)RZ^UmiE7nDwDRa}Z_dpWr>FRvawd&#fvlK|cT*X-sqAzfRqBh+kZXUw(4}U=89h#d(mW04# zv|TYQIo?8naN|)3ybv-3RKTw%Avn1h{7D7UK1%=5Kq`|-thrK+b%=P&Ke1e52tqkS z(N?hl$JHoB)x>@yS-At-ndcP1?dZtCKC1LUIYU0B3~c^rK% zQ2kD-sdV3C5PLp`FCtzf+mGU?u6~;s4{s_KVsIi+!L%im8z(y2=rPcKS8U4A_BeIWLQrBQ@wcIBXH)I zuK`Pox(-Lp+h#+ZA}PKquONFLi0pd{>p|G&#N^;NuQS!72&#m#7xF9AIV9qpgJhG5%yCdtX zIVZCWM=+X|vIoMXw0}UJeXnb16C!z52K=#q-WHq4exqc&!kAJ8uph8$TIhTf%m>n% z`2>Yym?a$wGKL8pRn2|Ggdjm32Lqp;-ZbyzJQ=`@ym|O2uJ&MSlBR z4Hu7$?l8I?ILr|gCULHvOKT7Qh4G(z@qeV6h8f_URV|BAiP@_2Ro4yAQ=aw(7?r;b zz58^daEIXxZFH~OBEF@x zet8U7>62)l*2}AeB+$UUrT?~bl`Ta^9k~WmN{%T2wxCB_Rl?3Hek!DeciUWKO$M9Y zyIYMk@M&qm!9Ra=t^{h%FPQ#`D}8wW={Q?y2l$>GAk%qUdVqgiSwY-*lsp2Uh+P|e z7(&?=ah(jiDNI;bP+y6&Vnp=Vzjjm1z~gBiSaSk-Y){yCCL?z+aQT>2wNKGkk%ln=Q;5Cd;=fdTL zp)Tn?%`Y)tJwwAV>52DoOks6)zvevbA|E5 zh{0>E{qw5m7b_FCj}_!KU(gm&%{OR?T?bfDlh z@^r!THv6gEY1Z=$d25mz-;_xO)EELNU}+n{RwcpezpX=*3d; zD4=3IiVO-I(aYq>?X+4iC#SUZQXE`(mWb6mTSfV_0vJ}t@`icSY#;k47S^*y8}VCb zzCq#z*fFEae7&bRwUpM7l*4=}9jPZF*LPeIBNi;+nR0dNK>z)lg{()vA=|=}^8_bJ z!V)f32Gg|jT$P>Bbe18P{pwAzj`8o@vwmlFk}p4hq^Q(7>XXzTrGa9AZSzxHb87fH zI)TI9+)oW9#Vo5J=yxrY%(jnDi znKlE9W#*OvqNmTv$??O@UB0p6?9Fv(Q-HqA@pNLne(=%(K3#`MB{}O6QXh-NxR*ih zP=!jF4;DQ$E>8?}Og_HU?G&W=DG#Iq8;EM1WxK$Ic76xOD1id7ltySkK8VurJqt*= z{i*jv0VA0Diu{gN({(le0SL~CnX-B2(oj`oWfz}{s0PS|V|KvxxA)+U=HVvL+}vZ( zOR+;M09i=;E6@?QTHr)(1ZIOUo7kNwI#kN`0_!SEE#~rJUt5E!8#dGiRG9S|RKQpr zF0@s+^}Wl^IE6mJxOS#mCjdtN56|Bk;P)wS34>k@4P(Jbhn*-F0E*d#nq^;cTTMxD zSuW>4OZ|L-l3jJb7HFfwm@$ytKlgPecsjp2;}m=xh*ao4T-^U7QtwT3-3^(;>iDS; zWMulHhz%s$6|st(9TLDJZN%e#4=h@$nTRziEuj3(GR|5_tybDtqi_&+6 zrecf+ev#x{4gPJZzx7pEll{BDgZ@t4>^+`piWiM-%(?V7$_)}C+B^9@-6UQ#%^#~jtv!PIUB)UKZJdNq%m_v zOO(tznaPn;)F?ro4w}m|Q)?D3=MnSE0idt&^^*%AYVsB{{BkZY$|#iRMu+%ZeBpvkl#Lf$+CfBX zV3P0cxDm>-tT{5R?GCq$a)me4N|iA>k(N^>EfR^LOerfIpxK;+Z742TphDbhDzA9@ zo_-C9(%aFnvsdRSbf}aFGUNf*qW5GM}Q$R)P*ww)O_kiL_5n`&aD_1TmP7`Jdjq@$i z%?o`G!MO`ufmzbUS}UyuPR88IM|@a2vGzI~gKb*G4F zNwtRgkUMi*vg(3dpLcenD@EP1=Z|IDf(DP~FoC{H+Ml%!caw(OY#)uFl5+)K>Hdm>axR8QXA-j!}4N3eD-seV6ofpF~1RT(dF|&bikFt=h7hHw36QtVXeWn5#CZ^cor^r-oy-3k8t z?1x(zIT1NB;?Bj;Tf(wN!gB(zr%6P_S{SvoldrQ1YBV?E+}l;LkE{J1Y(`?3y^03f z9SI@JEAo5f#X*W~Canu+c3hiavd2mE8 z#p$^=Vw#+YP~u-@^!>skLyS%eT@u-qV24PmO~9YEOkXlGt{j~C(%lu_=m1~RV{k}# zepb`-6i}g+{RV%o-Vt)ZR2)$vwgk$Vr3%pf){g;CR#4w~XsGe{?w6lB_{gTN^#Glr za|!`6yA4$IhunXfxL9wK*Dw-`gQK|*`D75c%+A4}_~hQD=N#y=yjMlWqUXO6PKP5) z3e(Oyts#pqRPHcgq@mGEV#KJ{&#kKzYP-hJQq+J>JXULQ>U75^W=DV{!BeMWakLi& zSPk24cPnFRv!_q94@J9Q+RN~`{X*Mn^*qmd<&Fr`T%*DYVf3fgp3Tj@U0uCdy0?0y zwnyOGH>5X)P5ZubJ9}ZA+N`*!rh-eXh3=i8;5!{ z3+6THsJta8Se{_P@=%K)2bFyj{1FnVaejy~%^O)#bT%jJ8nPF&Y!iGBSmqbrP)IXD zIbW~+=DVfzFPQqYjlsCBURjE}NcLc+4PugZVG7q)OV#kKinN^SJ67k*3Nyy{#3Q%p zqPXapvjeryspJ2f>4k%OcistKG8O!iLpc9)N-wZPy$0}bxe<|(u~If?;$1s>pR+!F z@bNVM?Vl_@??^Gw)4vwf=)E=N!jV_X=#u!Yd;25D3tlW&N)y*gLp0rs>fGw|MK#w( z*sMKstZni$46}_p&W(PRJ(ECvVKDE`usRysgETtwY~_j1b0&OWGR`?Y1YMzI@*Vxp z7cYHn`}*7ywE%<0>3ftcz$kQ1P>JGP7*TRJ0TN|Mha34)>OdM%Tg;-wdlg73V`Ik@ zx)*S4{%JzVwuoB4W^vi9ln z>jI7U!%liQcNL>b+NuDfFx!1&<6NUZOhz<#b;AHlzkPQ3pD4%|eLs$0GYT6TzS92H z#rqheo-ST|p43|Q&~ugeMjFO4Ix@c1u3+d{e-+>(1$UpOcIAsteTNAE_X$sesCje* ztY@}Ye#NR#=Su;R)vwz8FaA02nTqHoc?vFVcCE@KCwuc_!IbBuG4I*%kAI}4kw$foy0qbvF4oenE7ns+Wl>&xxxN|qHu`{=0FSc9eWRNZm}>$;%s1~;pfmIKfF#~VZ$wOS4M&~C>WJD)MBzt0bBW_wqmKhU3bslDd8cF; z2)CK}KCzocsqnWK4Aky|kU;v^yT1U`IBj-z_Bz`)&MzGolok;ps18h$LWxPxaY&}v zD#b0qT+3XAx)coA7ar6*T{#zipUkeM>3m@%C!=HH_qcoM;reY{lUFq&-`SLlGQXOT zO9&)qbG+u-ApV1twgrRLA@Al1A%EfffQ3ACr1+u5O3f48#UtrW2c?_T>F4amEH~%# zipaKs?XP#fvx-N``ivyiWXORUZ!$i4}oFi%#u5c8&sBZMB$D89AHu)=IHP2;9 zcZ*0VL<_Jw1`DbM-43J=q?A0SM2$jr8^78#>`l~&1l}1T(bcT1sUGqksKtPKCfIhP z(_td{9})+tztS1rHduW##h6P;m*EbHPB&W$Qdat8x!c%`RaL!L#DMq`Mh;Z+_DX8X$Jek99@8u0&=2BReS%ImvWY*^sW!7Vx5AeSPRQi0m z)IZ$p#jO_AZN|y{nM^qK99mf~%G6s>q8))5^XN?%z~?n~;MhG;Yh|(f77@d3LLr;7 zf6kJ`UDcm>Sk%z1cY{K$)AHv_I$PIUZ-4y$@Zb0Q8njvMzIui-9d>B z*1}4IV7ZGQR(%FyfaxxMhPR%EX~3-HKf9p0BP#2E+-9z|ZY80rO3;2C^R1XJ@|~%% zQsFh~;_D2rLp;~6ccTnE2 z1SCc#OAbHk01que1y4Y#XUOo1?viQ}JnR89o`7U1J+-o0qz$JIT19XM`qsW9bdxn` z7p?!)xx@ZlMmfMX5|Lr=je$4Pi1+jUqRaWnbI!X;8$g2?E78wJ2uq9`B5V6G84WHb2n+3Owc&^lmOUz|fKmE>H(wD=>rZsGj6}hWb zDb9XPm>&C{(O`@epd4r3=yZmW2z*)~$Q(wrJT784BqS*g<^aG7P6Zag-l|?Tpu0yh zYT%gF|QK0d_Ip>T@$kVz#84 zStnd)Xm?K9Cdww0p?UVBRf9sY%t|syB!${yB_ZrKE4xXK>*cQ8qrR><0rn9}4r#cK za+Ujn2{PEb>A8yrk28o(FF2#7u*2q7`IE94XqpMl!_HfwWY9)Orwg0$jr0 zd3Wwx-0&UBJQUS}N9({Q&kN=3S{y}9M(Y?8#y3MQ7sNsd-xZ8@G#AflCiQM*$49@; zln>rM$)&KiTNF3c6;2A~FHPl6_A|ox|DN2Uym2XNk`=n5p4v~4x<<$b$aFd{3Fb!5 zXgtFdERa&5JjI{@^J$|E-o_kk*l~kjsQOO30uCzgG@*v!*Pcopdc{}2&dA5{zjYY4 zS|!+d>g*R3f2Qu{`EatA4nDBV<&%tv$>+;$Lk}QXn9$VuwcXu->kg#K&i5i65k%Q6 zbAEnKOiuzHQQ^)!=^F%h7lQ9#N(ois3LbgUXU%v1##T|4N{4*F9_=+8g(ut1{>as> ztJc0seHG-J_nB`xG%(#)QtQ|THSq!#Tpa>H)|WrOZ!i>+5NfPlIC*VWGm1w(vLabH zhD!@)LeGEu(?Wxc?ofx@?aAbg!}g&m+sY{Vrtw_ezg0@HlRf5c?SBu-2pVVM=B@x+ znU-3(_VZL0EdX#@I6yw+cbqvEPR`*z2!Oa@E}x@Yw>x7%m2aEWfunz>ZdKb>5wh6r z?)j6}uE6Tv_qX=u7a5bCc~MM1K0cfjtEuiwcJXk|$Cw@GkzZI?74RFjz`nbXYyCf5 zeR({T`y2LjPMcOtsDvy-5lTsxDB1UI$THM~vZd^@l_>i%6GBL`Zw=YEgcw3dV^^|o zV@>w=ess?Hz3=<{b3UK*>0_SfyWaP8U)OcZ8AXNj9y%~IuT{Vo-6uJ#9HjZ_3Uqfc zq8GU73jIliTC>K+pvdaJ0dY=)CAPXp{wiXgtA~iHc{-1DA!>2s=``-)^ANYZ=p@f7 z1WjwnNu0VBA-O223 zE7`M2@%4}URx3bq%=|W1;!&Bhe9~iM=v&we_J!sbw`q(C6N-B53nC5HS4`-m71K?f zkZ{q^NH~`!SFq^O>iL)T9p!Iq{SQ7Z$*nyIr+k-9S{&)>Sn#~}Xf91p+K z_2@pWG>ybT?7b_JI{7+z+;kV1Y~)JA`Z%G>;VeU#EmNwvpE5`O1$g0r1_?t!Pl zA|xxYRtU!S9)l9MatB}#teVYW*G*p!TLU!QSrA{3T&$FcL191eH6(5c}njgz# z>~foU0F9|%0>QjcisAR@yYZ{~z6+9>VB%!#j9kNU2UJ&p6`iG-$cMQ7iNJdr1r!4- zJWq^$#qgu)GI@fxl2d=r5_Bz!$n_OXC5K6Qd6w|X=7sm|X<`{*FjSm=&+XKIU-Z+| zIbP{b&qoZaA}8X%CwF+Iw!DwI4I{f$>hi073}|1B9`EA0PDVXY{1caa0JtqbQzH}3 zLK|#iW(8<@*!<%n$h%lqcPW8kkW*%15~R1uxm|mDnR$?V!>sDU9yF$UbOOp(nYI zo0*Jz_w~%6U673je@DM4NqIjFO-Y9I%-2E239A$8CLbem-{{d6gD$UihKI2cN_f5J z1Sd9WUVT3NXX&C4;uQn%soGVvjW1|9++2*$-bM>r)W8)u4$5fLK93o%bPb} zq9aX(RG`yhC1N3Wp!1UN+Id~>TXWBJ*s3zh9%R2Kj;$6K>n_(CQ+(|EWL|aTl2!~i z@V1utsHW8dnU{Nr8)AJAKkNKV!YX=(s80vfECyvaSbgvENgAeK35`(v8e&Aa5F-0C z;nyUN;GQ+Pyywo>IMGrQ<`3GyhdOE|%Ma8lU@zVog~mF1HZ;$+&Q|$+bB4Th;h@X2 zz>tuZMCpsJ1N1sszNI`keKQfL>L@^+?pK;QK}Jqamr4ASy$2q#KMW3V#5OGM=-j}x z%t^XHl>#ToCY&jK$ualQ7jJ!dT*s>x3HpqZ6Ewy}BWK~BedBtJMjvWiv2d9&pObEx zh^vE&oXoE(Q_hluk(&Ov(#Sh1TKFiIV+Xtx1W2Yz%Q?Rz3OBN!++kxC)YIF^zf!etd9fZgsg0OkOmB22C;K2(}%MKohA$VmN15;rU_v<6Np- z0vP#uiPo3DxB0VPkAA?B<(Y_g|1SJH=&Gm>JTNg|UUgw)xrIr5wL{+8 zBRz~)BYu*Cgk|mxEd+hL+Hg8;+|f!nw@_!%j#dPV5UF!eaiaFz*#`<537Ei4Vi~er z8bRtFudAxu=SaaluMcIjHKcr5!JzQ~4TJr6)2^o_lOTEX#zj-oK(ozJvYfFg! zu00pzFq4J3oIp*iH1fSaN(K$SGo;~7B7h0#Prh^#s#c!bM3ppFk<2T&w>3Ttwv^ zTv87uU{pN!80HaZ1}3}?$pEdBm$&${dxT+k|KfEjM?BgzX^e9=FC%IhL&HmLI$hV< z9`_lsG|-R_4b(C{&B;dRL~Qi_s`vVANA;;P+=zRqs4JG~-*>+H+#QlArg|#UDm(V% z!B@s4rLCD~TnGK9POrZsw)zgUj1fChYrS&w9|gO&JjCJkPB{+LoH}n_Q!OKvWEo}e z8?eZOUOZQQ+|iJxG6cMRW3uvwzb$gHQMLe6canVY{aW#c^h@fy0z^Jqf!wr@UUsyW zt!yA3S*x(8EZ2`jXF@F`sjek!anu67AQd_-PV3st02C6M0YPbkilv>HI`kP3frc=` z-(^a`%lH53UV_c=G#xY zI3wvc5}_vt{>AFtJ_gdBlE~G*YEa$c!J95&;yy2H#;{LCSDSdJbpKOP#eoi}P8&mm zh$XA&rrz)seJI_S`j+3inp*Vp1lam8Fs%Cy3*0Msy)CAH{hAd%s;d+`wb&iB&?f`A@xX+b?N$k?os=+t;e9_-APPca=NIW$~L^V(6Q7=e@8icwd!`L3n zbcrX*Y~cpD2rm9OV@vOrLa(BY*iM-j>_a#{anIA7+pMA`$D9`L=u(!Zh zHkN1GAM=(rR*LfBhs@v`%c$$MFD>d8G`dYAEEx>FFHDN9cA?!_*wOJ&(p@Or-|rAI ze5cz4aMhJM$#Y0dv62=H7sc3(eS(zXt5rKU&@VXq4tMAtR@E({7r!_l_y{cXB=10a zh}P*9f?T6>5kEHku!#r+F<~H0o=NT5CGNUlD$2|w=W>8aK*D6YruJrOy>r7|pyk>r zDj9AyL%G6;nVH$G*Xk=GpoQWCp_N%~k$V#~R7<$d!q1RGStTnH&CB+)xFsY5acwZu3E`-xk+0J;rsI7)56ouQ;{YUlh%Tu-t*P=GRYk+ zFr9nWSIJh*E0DV*3GmEIv(r<7C`>)Q%Mq6Ixv0fF$e+O<*f6up5qxmkhq8+XEP16< zt8One2rUf-o3+I%CmUW@bASe9B=VM3>f$4h6Q6ojKhP>w+SM!=m zlmd#k?kd2B?~IzcB+2DlWJ|6Ree7vwP8eLSQilp9ZIz(EYUSnqqenAt)3!xrW%XdZ zw)qu1)e6mL70Vl(*bjz_$w(Ag=zf}p%{yJceR)4EX>;o3)teb%3>q^Z{N zQ*;m$XFS!Xa^h;0Wp~ay7hEeEEMHT$*`cjCAo{tAe?~4gjsiX6z)i)2groFNg)<;JBQmm6I%z z?l-q^Gzgml2&#!I`cTv^IuX6Zlm_yf2wq(2dzEpAJ`e7MUZ6R|RDni^H2Lz!uuw2U zOcO21BHa_4IfaQ@$zK75gx;l#>_(pKNOyC)^8MPmSnpZK^wP19L1`(Lq4cu*44a()|wSvu|>RrB2pHRwkUQ!`pXcE5&r(TKKC(J0kOCFmaAcQh z46?h0qiyklhIVxs_ET5Yhp6Lc3dPk@>eplWH{Hx=Sy?MJ^oEqn>-i@woq` z8TnyH`xIA8FTaPfL}dC9>5`6WK4zli{D5%b8(YKn+)cB2SV=PL32noxv}GH3L7s{k z7qtzR8}xUUeh+Ov?w|EAVd_q;HD8|k`(j;xlJ3>ZluCJm&UQ4Xbmm&{4+iYawII!! zy5pU4K4Ptz{Pl93_1?FGlzvU^*T)%o&@?NK)vde0^lun~D~052M{1~w-$SnXB0Xa$ zpHBf>YBS+p&&WxaR$DM_J=%bw+XoFqTb;WMplRFI60}_lQ{LM1D5TsUM}rx=nGI(V z4veCL`p=y~rSmg?Ht7@|4fJl4a2p*AwK@@BI>T$n3vguY3+=*uUsvIFij(vxeQ(*T1o-Tf zC)C=6PIS$-dgKlDv;r5^W)bGBX(hkM9k>ypUSQndfwodTY z!$O@s{-n3_kbw=-{=D(1&7q?txRnT4EXx~eA-XXA&Mt`R4Xz-R_vIGn0`=)4Jv&NK zf=zSz*z+5iGHDmdjq58R7Vn4aGPjK)tW*sN-x*AIgc919rU;F;5e_wCi-oBf`pb;5 zhEb+L)c;ZL2pmA>af2PQ=4UxM1h$A;ZBVQo(D>Ff0fb4zV(@(t^6zY9n#zekrqlpJ zHf3~gtX+cQW0V;UUf8Wuw zu|>OH%~?r?a!K47{k-8;eC!>{;`&!@b=9ssGi4mznwz8q%;U7A=Y|Va!Y2+u{z5ZT z(_!%pi|20by?V11D+5i?5$Du0)O0?1RKAW=38MXp4TR-G#@_xcCNfaZe2;$O@vgsl zkw7#XNC=IB(Jwt%atB*sYH%Dm9go55JO0JYa2kLTwct-Mcr0;nMIQkJfbJ}#+m~Me z0dwc^i{>h9%vV=%RnK67Z^#+dY{}_}A9x|5jAEtj=7|-g}g_Zxn7&I~8wbt>MN9tA5ZV z#bZ_ZT#&A4m(vH&+h>A#Gore*PlEa)BSIVA$G;!9kQ} z^!?csy@(>mPgt(>mTXaHzB36|Q!)4|`qKM6v$n#M)Sx@x2CXh7QycEj(6cA zJ6l56hT_t)=gqTQ_nXiV8s@048f=9si}g*gGDsEimMF*93*gsfgmE|ei8?bvNEAu9 zLqBTDc1&C^NK+*E*i4y`Mxv+@t*=ChYfxxRhl_8p?5h{P7@=w=z~Nz{0-{}4 zQq^g6FydyaVqMP$&2|{%bUhxNj9zjCw_-bd6L(=2xF4(Wp{t-nhhWhcxS#vo0AzK` zg${I4eNEfJ5()VAm3X(=Re5VYQ@jxjnHstE^jAi{R$K5%ih@&X`}GQws0<|2R!70j zIBY+0(V%4!P6RKgsOKJ0%)VvHgY>=2hJ~#o?lgUK6xd#O{epv=UwfJ!SdB*PH(Df+ zP9Sw#)?i=qixEhJp1>_E%-pWMY$}_JkbW5r%}Hkdy-n*kHhB~yVa*bU;;#^(#9o76 z-%0{zztUy{EqL2o^UnUb`?cZ~QnJ#|0R^Yl<`sR|3XYma2^SwyCJ^7GpAc2N9E1(4 zIw?idfWWiBhP(4-KhZJ4f3c_lE|{xeN^rQoc?!&SsL8;)yi8bm*(DUP&QDwmKRaw6 zSL}4RPFR9J_cn3?1*}^?(WHD)fr!>#3@lZ~Z>QCAhd1(9DuDwgJz5uk*3{1JztjE^h=iw9GuX5j6E>+>?G>{9C${1|4 z-;7d;;e&K>2)^dic2NB>sAcIeayiX3tls=I*|{dcGx&bptfg#_BJrzC#J}<0E{wAx zx;Oib>yH=C=`uEB7uS1w-J5dXKL#X07U7tvd>z>5z3|EGx(zkZ41f4}8 zjj%r;gJ~l;Hl=iRbq!^t2fLuV++d~TUCQJ06RB~mjU5t{z1Qg@8vx|XZM(H43w^m0 zs4({)ZaGdPG1sGAs(q%F;m zZy~1`l4M7p{jO*aYA;ba0BoX?YM`h$%h()?)+o;%L7J2_;ZJQKCau(OIk@$ARCyF( z5=_GGUAg_yCtm2G{3Y9{@sSD&C@1q3`-p$T#AQ29Ttihu7WdNp`nKck=gxI4Oo@du zT%^^CQ+Hm8Qawx-yNunqofUPtK3`qixM5~uZE{JsK-;~|VPa8FV3V_I#OmqpTr2#+ zn8eSq;}P5)e>2Cr>)y_%(*8x~vja==oyf|#+zGctC~TYotZ@H_Nt%PLAhk4V@gI!& z3zbRUO-q`{I5YHXlKpWuc^x-xx*S>2_q>>ek632vo%p+dLD?XOohnMwENF7qtzcXB z^AtDvh5Mv~GLO0P5dQ=iIg)~C4by^1WQ@DOeQ@w==&s|pfbn@7k|h_(%a?Wg@Dr_M zH+~>H^Fh_dU1^gCb&D4Y2Qiw=X{aXBkG-JG;r z9+Q$Pc2jlmpwp^TuA1sBUyzKj`N3x!`JGwBbAS7vgZ5CU#6rU)0tM^xe^uHT5FT2I z)K-;;_Gw?oVNZxKBx2EwXXC-yTox=eT~&p5p~$aYIR-mBZ=gO*WU0*3_x(O~y;I<@ zOjSX~BfV1u$}SWNwYxUg(fWzFCRtu+LVjNjeObBmbi!g9YonV4$& zQLk|0=r{W2BX}aE`cZXw9xrjibZ9v3Z$o?}S*DT90!}`ruMQ3~7y_wUap7T8eJB@T zMZGi(mdj9~9@9)rf_N}3tJ5Fny>Yt2HvnGl7y|=V$=96t(@~z`Z`5~7p&tsd3}Sgh8^=5K9vgxkudWm@XK8GB?Mm~1BCwiWIb7|iSH>$hDtiYvabe?zZ1 z)1}Zicjig@YIEuonb99)V_Ssk{kc0oX8m=J-9WzRT_QrIiH zn#RrP$Tgu=a1dp!wz&AQ*=SMX_PlElTBo&)Q7^76THachJJy1|W%Ut>#D#%(zJ-E? za7O$b)A2K@FzNXN`s-c(o2hpLGz`71vyFb@2b;^%K!r> zlQ%wm;!e<2m^0XOF`~~*ZX{zb{vzjX6>hxhitjVAYj%`4nEhOB$YG^4RkNWF*cCh? z7H9qxvIMFHuXhmm2ymEw{0sF;*^qEwMn;B-q`&a$AWDHTv+~0aaB|-^!rrz!7t7_e zr(fvFWl?JN_#=+kE88qj(_4`hA_oP;XQb2Vcja5^g>-Yjjft*4A>1C7-O$(^&uvkd zC44F{&|Pa^OowEjk!HruuZ5~m30CcUug5S! z_;Ap6b;=D-fj+`I|FCv1#X{T1n*iJw25PMDL-flV^K(CHTGLaKmcW(v6YTC3zc1}H z2j`tHF?u~e(K?0t{wRhAB16In)Tz&nljR}X3vzIx4}iMs>YEr{ns0*DH*xx6T|gPG zow`aWhmUz|N?1MoSo46Ns-bsySLunkE{v~_&lTRW)Xw54FIw@{U|Cl+hckBf#>i1R z?uMP~k}G8@re#vgS7&7NpLRKH+9-158~hZ=YeJU~Z(dQlzwdJWIcBV_=K9$X&S-xe>U))+pI)QWtdkhXyVe`AB~iD^Xspo zO$kwbk%tFOm!JEiX3s4F-GTKDz8;|+;Ys-*yPE@+((7boufFB(%Ud-_IoP9Uj=Gk& zW7fvE?@EaK{Rl;Vj`wR7T3@(zGBH>AR~H!X)AFvp-k?X8&SNfEJG-L{>gP6XI(L;9XDE{J4k^*-9x23uZmD z-`nJ&(~y>_7Si$w1HzfbdThrpa97)$02*Vq@j#6>RL&AJCQqV1fPLMCw2`2L!BO|KVt9)^`-Sp8lmIuj(8Lp}`c^NNPcu?g^k>^$; zy7Vu*l0Ycb4yn9lR!renxXwZ#!JgrlZmRMh05WP0?_ShzcIibz5WaWn;4YNft*67s zqmQ-AT{RJ{RwGS3GFCm*beazt&J1T{rWKE!3Jj}$fbhz|P|K+jUeU?Fxo_lnge)~T zcVR399jMcxz@no?oT$9_Yk5&`YfI0QQ=@m8ylEQAi+yy}UZa3$+O}_MajRt0XXA8E zHte-*&!(jZYsV5NsQtgk1bMiP%bZk05<-5LZE{gXsX__2G5M`-=~ErIz`>(IIVrA9}OoDt%&2(KM}oNsj;(;z5R7D zBPiUJn^WYhPQI$EvH;0;~J;+!+O z0bZCp#3J@S9`>Z?7hFN$0S?q-R9D4hs11GD?p82lJCCb_H$$PG!wMp&MBaJ95a{qF zp=*Tj$Z7J`gvy*{=9*ldFbl4YPFa|D;b9>g#ZrHw^l6QAW7T@w7#lBNNE4T!9?zpV z$w!_9_h~!Bt@+WcO153qNtW0tVi1DUCEX<9(K;P=P+6T?s@}(@f==Y;=7ZCUk`B0S zstz;id%_03LpY}%E}L`Ou==lC=Vit5N8Q!&3e7rT77MImkxpn!J*d_B>^1#o{g^iV z5UW74H1gj5xAf(>0+j~B2mLxU3zWU^QSW}&B=E{_+qsi0Pb&821NF0VbS zX|h>l`Kw8&v=_3m8er+Z$NA`bU7?)guA=+aWjyiu zw@uK_BxBL2?@~DBW3D_gb#iu0s4G#p$b$T4`+(of#*DqE=z4}c2p{PiXu=`}O}$_5 zpK+-0J^*b%;IojW!WBIV$_6cGd=&G@*%&kbu89n8%=)J}!5IDsvZ`l#`&9H(AsPYI z(R~JfDRF$a$@OBBx zlk#aE4(O?s!*T2R$|^DeVP^?#|`&+FtDb z9Ixq%?G;p&%zmfOt?2({R$2HFy2sS6qia;T>GzRj19E6y~OyK zYKH5sBf4-Af${BSA`=j6_%OfL2izB%#h`9_*5LiP4^)L)jwKp7)m`?-!BiQo0ie`q zx*K&3^|khWP6jT1Zf?#3PTngo4rj8$9aQU?@W}XLoC-I(N?CU*uVek~6&0}x>**gSR1gcE+xZnTiE?}$9=_xD?0A~$jaOf{x%u=XKrTm9RYXt zr%E~!r!Ui&FAWK^BU2^=rnZ_%?oAg8mkU(xdf=mmKegim#EQhwZ_W%EluczO)3AzdX;LaUHvGyLWS^Up8eAjZE#h-y&~ObH^Or<-k}8+4=^ zRI7tSS5`*GK{K)YrS)DE6HO7NJ!rl^Y#2i%$xJ)HiP{+aq&`k>c!REY-h)tU7qoTu z++}g>8~X}i`i1BqU-nr1!NZdW|4JsSJV(J~- z2Qk;hksbl&%Cq%b!Sb2@8r*D?<4IeDP$?n%0S8S-Nq6=(OR2olPLt;?5sZobY}&8O z$GC3fT$1|Art4Hj4HNe%+E~6yBKk|oO`$=;y^HtR)rRD!Bl}jJFg$vAz>rG#p*(0v z$H-V%41~;jcd1gaan82`7SiZ4z-|Nx2Rvm?5t{6}9}+l1#*(9qPp&qL43;PLz$i4( zSdqwNTb4W9o+NVe_Ab=y?UfbzhvihFDN@KVo)KyEa3Au}q+w{hDc~#Ey?Is3U4pWv zxM=m}*4PC2Y0N;GogZrhBZBgWh^#0XI7xY`LmiYGBIOJ9jLtmH{O(>Jl{duI&e103 zOqKoI`nvMob|<9mJ>OB5>pArG$6~Ah7dl1bJqcd-bXR}Ls;?dCkI%9$xZD3DCSzh$ zMvy8Re*H-(P7?h@T+is*`{o90$$!m zYx9DNegB~$JS+*|j{;+qOkRg<%A=^Bgv-kJ4$?IapJWNx@Yre`@1|z)zwLQuF{fE# zqSOA0GtzRyW+oxC{*uwTD7=b>ubMgwF;wyX3AH*inU^e zbmLtKxBz(aI;k1tT=zV~&ofhjD9nd9oh$e+^LX52xq)Xw9hXunI>nIslTn(B`Q}X@) zqyh`ELtoP7c}7G6<63;uIO+tpKoKs<4W~UulYhg#ZYV^Aw3*Wzf?GuuZN+nD<}6 zYu}RHwVHmX@`m$e2<#>bqx8<Z$wFHjGpyU_k_^A&V4?4+ooZVMjnNNM8pc);E-@aDulUch3UUg zcgSQVQU|;jwhZ-Q1acy#02XTK(gOEq7)I9RHH^yih*t0tb(lD2U6tW22df2z`pyIR zin9GOcP~IWgF#(77K6`{2Gdf)t@TTk4MZPVr3`*!HQ<-Vb>4ly{KQtOH^#N~=yS`! zFLc;)Q0FW@H412RJ~QDB>c9B+R#S%yO@sw`o%f^y9OvE$^b{+cmVutIY|dm zL8;t4j@TIj(ap_+9rdBPc2QZLlvEndYDd1~TAAp7Ww5E1o7h(>7_ zipxssb`t$`rAhvN&hPcL?<%u|EQQ~E8e){dypNHVvG+S)+MGb#uS+=`YPEtV@>2~4 zAJhi+x<4mS;n>KV>3yK1YfkKYH9m6Hgq@w8azHY{>RaGUz^An%Q#b7N9=JhaRtge7 z8!I}YC$|r^f`L@vWs7zh!@tg>cAvmCnO|5vgsS!*Ini8W&j)V^|1;9;5FS8gU3zi) zvipp~XG14Xl5O?LRw*~auS%V2FYSv|Sqt}f(*M}rv|F%Ou+wF2+*i?VwHgWdmRQu{ zqe>-NIN5Uh+RaouRZiJ06M}&(#k@J??3EKfX8n(a_pM6EcPiPP&b8h<)Cwm8vfGGh zjr0&@2i;ycf$|PLzOEnNc8bdhNsq75a+L5Xq))2kd50cpQJkii*77mZzWqgu!rM-1 zf0I2)H0bo)UhNn9F%iE`jbyvhBic=leeZC~{&U{7R_&y4!TS-RqFFM(qGYtWU6BK{ z_Q}PIW(3Ok-oW1Mkd4*r;D3a)KdlVty6}YVxGi1}piD*NonTkFb2}OEss;=uTTRHL z9tSrJb4L4cNe{4{s7ExLJ^#Go9D51h{`6s5T+^&5FR3Z8PN`x+D%L)yYeH!)+~Z*} z1C4R}6xu}JFwJ_FN#@>)OltAsS5Kv}h&qqw8;e>+si6&Af+c%og>y40a@3H3Ewy;@ z4A*KEsIB&O0)23j!}PBjDfqF+WR4}>8A9uGWFMXGYT$YchkL7R!+O#OS3V~IGi}o? z|3;?Ld%wlG>vHz^sIS+#L({tGDmNXJeXmX($<^bf{^;Ho7a88iF&ODVH7!0rB;(qBC{a? znrSS@lK3MdN~TLV*z(bY@&ag|1@VF`htoM1fUAA-eyDzTt#uhLV z<}1JzA88}ogY{9l#nnOtUZo8j3!(!J`Qm|o5x_tI}K>Wp|@q@Fdrs91ED z<27sF3Vvh~u6@Dle>zP9{@tpL#ZDM7`o2~mm)4H;r`5b{@-j3luwICn)EJ)2=~~U? z^zzgw;BR~Mv1u^VR3a|4pKT%jmq6#0lAlGp_&blA{8TsYJICgQYiYS)0kGC z`wUqIGr)!kmgl!n+_|_=kB4(^J#^8t#*jK^Nzyx5X*aXC@6SRp%f*z(G$3 zLg-cb#2{hQGndP_MO@J@TH?yDT<1Q+zcrUCQCaiEEm_{b2EfSs7D7^Aq)*v75-3&M zM!|g*+-u^ltYb^Yh7Bv6AG`n_@G1jF=u_E--Jh~05I>(TxHPbOHYix%92}BpaefBv zTI$JkX%uScm@bVn4D2fr5+5Yno{amDkwrlqdJXK#qjWo}+kjAbY_^o&Q5A$<{5=_! zRwa`j3F|m+k*i_9DlfmWSm(+eHwh8E{IgGZ^}VzPc2TU5x}+yW=F6KW{X|>U(gq6ahHqmQXXcY}kGP$rV3%nSP|FF{UAmnO3>9Gy> z=F)+%ei++fy5do(B)4MS3U}L1E z5I`Ggrt+bwKVFhB@x$S;Oj@RacDR*Z?%{+UGwg-V!ad!sNZms989v`?gx7U2bm3Ly zC0*SFgDZ&0uI7{FLUhLH@{7z&SJ&3$zK~5%%gdeR-*dsHGYH|fnV@gK^Ssf&h-i?= zvFGW_P}c-SpRh78BwL*@3jOWDf<1)#0Mh3GGkhjSI-2&>XKZh#e^%wAhws~Tzg`WI~%NhrNyiCNbCmk8@d`Q-@CopnqU68sz-km-c_%19g z%mdFBL}Sbv@s;6|P!RI!k88vFMzsE1w{iZs5R;G#Y6=0zqypoZiCTv`EH|2@{Ngsg zC>nZG5_;7e8Z`+h|`$%jOl;hiwQz2cb&vxa&-6z1o@e7 zTiGABJ1+nW9&J;BUxJ&$TzL2f9!+JZAXZ$&ODI$zT)_>3il%^B^3-ovRMNuhpj-6@ z%ud#EqY3>n!y_IE$Mmw5CC#at$jhQ;AMY7AlEYLXyV21f_t11G5P*PZ6Q_wrI@2e) z<1&4&ylGXPoSW$wyCW#cFCA@~{?m9V>epfkLU-L)#6o1K;3`WU^F*7ksOQ`LCZR}R_OHd#vSwEWwFVM#t<+RQE8xO3=+d+S$1jeYZb&H(H z5T4dJ*EIgu|5q-FXu9y}f<^juJ%OgMgl!mLw3biQR+81+GCsD%4IS&n=JfE#JOphGvE=#baE1#SUGAKuEm z^(mGlDRY!GNiph#+4qSSd_T2%V_+x|LYa_v`Zrt|Xa^a)6g(iaeA{1E@=xBYTvId0`*CGzu%cT8uy`g)SW)bj- zarT5MFswZpko`jJEob-CBcUi6>7A8#Z6BfRl$!k;1r1Cq#swVyot+r zCQ~m%@G?ug?fmnpMVW28kKZ~G=aKs$1m-V?+u9rf+lIjnr~x`ok`GPFlcURvZ?_M5 zZLbdwfS=da0yLLWaYYnS88CAD!il|bN*4rTPV7Pzawjm=2~_1qaLDc$C=Z;5npM() zM&{O-?3=&mOKwy)i{2=#|?Og0J43&Se27 z_dI39$vv&mtkOEa{OwrKW`-+hGs~cLr{_1spXLEDsxBdT8Rl2|$kxJ0(+c!hXyhym zw4{)vAYd53V?#qmAzy3woVwJFx?mrrH0OUvubH@*_V>BJp1=^7C?jgw`| zYF!`ug16TF$#BFE8|s z@V-iqx#y%28`qjBRX&EhFYi>>LiA7jY3RX8+y&EK{wEY=@y9JVPZ+H2Y-$()Z$>ii z$Qz_OXyI_0bnuymM}wh-0`Pr|A6{}DfV3~)`%sZw(@wULs-ZoPvBGeO5_GOYx={!V@ZqJ^`_ohDH0aUQ2#=|C|8t28hkeG zPGU%~CQpi6S47@1G2m&v{Z405Y{`pftjX${upoSlt|!SNy$4eZ_bgIw{PTR^Vz)fX zjL=;j!^pI}N0fv_5nQll_p&SQ{P+5IHQUa1mHQo+f3h5XTT!GMC}?Z|%U>kr2Z1Sf z%gxbezhm4DuWm3pxN{?IXtTJ)p2_wf>-Rh~K?xuuR z*Ohhej2V}i6s$4!ol1@!$NNpKU_7z2qeq=uX~3=7t<>}|BZjgqgk@4)0gePjdqpvN zR&b%BzMIEH?bP=EeEB`;5dmhyFJ8DVSX%~sEdIeG$M^6$N7o1V)NQnmW}S|@qGO}? za`~5YXxx*YEePAy3DlVf7#z0D zltZ71@7-VGGWO(-RVZNC$s@#5~C^O4TCg zz6>OqX?a+nY~A^#=GiwIxDe+!3uf6Si+UmHR^Z%t8=YR-rC)lg8v>&FM}I#mu2uw z-a8e8z_@8Iu?9Db;?g3cu{tN&J7z<-zR9;!7*)mfUJ)p_zec}2h&HnuY`@KHzjmZo zI};93!B(pf>1xe?6x37TqqZ}AF*}U=R8CS88bCPBKUI48#KZ7W7s0@SD?_pWnaYDO z;0d08H5H5S+MWQf4a0Y6e3H6D$aVyEibz@^pGTWD@FKUiQs3>5(;zo#l9TTkp5wC@ z4YxEtlGW!ZzEG;s3}D^eZk|H-$}c+qJNBC4r#Sx?D(!ur*_OK$4;e%elywgnGi|N8 zO_%$zeQx?ddIFbvo-T&o2^|~9r%EQN>FQWXB`-D(!P599rjY5nbG1^{0UtP@1Xblf z&&|g$cmNfYz5|)oSfGX>$n|c9T-c>E+ujsV`$;~*D{VS(Ch${6p;h|iy@d_2!~i|h z_&54dI-Z%P@2O!IgKR3ZK92-K_Z-+~=Vwk?A>T7F#raf1-F&swF8A({#^Wf|O+gNh zAu|%$ve;a(Ndf3Sf1Y=!h%)OTfFYFdaK3mGCIiJXRTx$sXA&H-)0TN+F)F;}Qp*)H z003iChJTApelNVEtdo~;=lxc@UNaxC2MS~s^#(O5^Tuo?EE}u8@zE&p9RcAk2uN4! z%$@K|fTRC;K5%e3cRyA#4Z}JjCurf@wYNn=Vca%xkut~pB7Yhi@SwwF#$P6%U{IR z1@L@WAn;~bR{`hPofA=+$KPf5P^GHYp=MWzMwkQkJQ8TeBO4bIEcXR7n&=o%-zT4} zvMzhosPStQyfT=Po$`eT;+Dj&6BU<|o2CAOzFg`cEs-EUgJYJz@O zv@_C9V(5^7Q$4N=7>0c;`fbRG+zIfGq24^?@x$4N3T}M}y8I#T&BwYl_(z*KmshS?TcfIut9c}j} zQwBVosa;HcZ`gSNjKdMEJ@VQfBJC8RxN@G6cCYJk=f7I3)E$PD(~_i5t6;TDRJ%D#d= zmW}g;tL;KyBFdTTU$}l|g{YsQGqL>ndgqZxj9lq(8F_`TJR7J;TK3VaTw!VFf$r~A zf1H;|lZMBePf}vH)Tq>hEWOT3x{+3Vm&HwXF8n?P_en-WRLQ&JFJ7JkIG?>Ly#gJRh{KJfGYEu3wo8anQ)iyKtKT)5 zvs(eU9gf0(AMZU)LNO|sqy~Ry7O-;4Ot0k6JlIf~bHmW_=nYpSBNqC>kNc+6EYtBz zS(tT)@$u~iS);OMRs$h;_o!uWl$0|@FDB>m{8MNibXa0`6VO!B%XuCF0R--sqirpzw_{(y9jkX>;YHRmpR=91@qit#G!63VH`eOBB z*>J%boy#i+&r%Oqz^_0RWBOt1ZiJR$RwFVpw}~)W{(1VK?>q6H+BAVfaa#Ia!=h=tHEb{@UG2a5oK#CHmZ9(g`HjgT)hMwCx-u*3JWndFnWF zlKuM>qsh3vNI>?o%R+UU-mu8hBffXc>aXg=A9HrSv!y&{OmvpYa{RJ{}Epw99XCw(k}JN)-NI8P`$($pg zbYn`mpOWn{DQ>jCkmQTPC--_p{TpKUI}C+h>@cJMg6JWq#ixx03;9m+s)RSxV zylcbW`H4kmdI_{Za{IWBx}qO%tu6L_y_Ge03}gx47mr4uo4;p_3KJ}i|NGOZY2V=- z)Vc900Tsj==?{BtW>I)oE#)_HA+}C!Y{5%5getYk&{T#|H(L0Db55P+h;dRoxxl@h zc0m1l(V@EtIpz~~vGJw2LWXPh3U)DOz@r%rOuYY|$8`#`2R`iNq-s`py?v2)cGD-% z(q+>aS8Y4IO$i7;WRt3EtPKfD@uY^6`oaR#b}D)&U#qO8i_}Ji>AiNyVUq1w?krbh zkrct?#83j%3&YB3{`>nMgaEZs#6Gl`vWkYJ_wv6lHkr@wt`G(He(=lhVPhuIhA~PR;M!z9;Dc|d7 zo2~ceBMO^=Q(3wBb?xRU4d7TN02ScBH-F5^<%}WzvtUlI8e8jKx{TD3WYUDIr~XfK zUmg$T*ZrKA&^0=Avd5V$64?*v7nTOuVt1 ze;@6axqXg5DUZ}8c86)1W51dhY`KXEgcp1PXKA+Ju#<2qcm91*=c*xG`TtxCJfu3F zTKP-&g}@G~au*ujUfME5g#dioysZ0_&Z>LP&@{xdMxDB)=nB|UgcuB0`8HGLK@Ro1 z`NAc!33>lxp2dViZOTwe{mjqcucAs20T<@fR#qdb)rs#BI5K1<;Q1`gp@n}K+q;i- z*Y6VTcye1AeNH?%F?U}?osY~yGX=re z{$d$0z8Bq`aAB#xPxiVwGHWOArMQ%^@= zMh}adXV*Tyk>K@B*DL7gZoXW9Eis;-(QBdz(e>r#KR^owYP3^pMd=QE$J1K=ce`g2 zmiQCXuj`5;-?&OsqPitIhg92(z)=C+zuFyTUU+jUrcXF4 z9|Y3>xk7JpIe&e6qqV&-j?GV>AAAcyG(xWM*3&6OE0dIdBNtGa)t*ISEfro4aiTr( z>h5+@9bApgNhb~ptOZmAhrCRtwOuanag4$*w}&XTvZPmm;Rs#WoDIm!pVYi-WFW&` zl_hPWB=Sq+_^G1>uoO?NnI-Va(I1}6=UGNfk1nmBvo`}~OXKHu+|;nT5ce&=kCMU_Jr-j8qei`%@{AnC+;8ei5viNEGJ#K0akEqfuj?%ga$5wuVDYF z`VKK;zmkE_>ny)^^nru%ux$@|Yas`0MlwTozapdla%Q5ptKYi;_G8hS?upw9Yg z@U`l-^pdIJ&02s33yfIn;lwlZb%EzUZ^cU}#soxbq>`jG{ku>+R{RmQ{IOx^*{OvP z4ktVreZE!J{!*O;HlArQyqtV|VB%OZ%Gcw?7WpIYL+QOwYSLTbZA^iP!c+ zH|sq*#Ew5eog45|g0!LpwacV0SVB9*?~vXIwo{h_Ne-KSk&3SiN6}!qJU^6j9`lu% zvxw7JDrPjRS0l9|bTkIXd0xYSU|V$;6jlA`nR@?Y+K}(IRpMIyFCz=m_Ljbsx9)Qv zn3%hI56C6yRoJXvplr1HwuAHa!X%LF$4nXuHZ^4JCG^W2r#@$>K9=ovw~(e!Yj%Hz z-NuZ)C$B~hu5>u>^0$SS6)p{-%N-0Wk)jwxv|a*VvB1Hb9}7c|(Hne>KGR(4qxnDr ztv$D#{^%P*XQh)3#G}aeBU(abj~XibhvIfdL)g|Hts1M8RevA4 z?8I_h=dzn-Fo`Y1gY&}xI9RY^&Dwv=;&7^Xf||7jSsBjTJ#sAB?sejxi#parLZ==o zH)U@KGx?|6u~=zr+9k?Tdg?M1&2OA(Zy}B4!IWx)JhVt%S9&zAF@MtV#d0Rt)mE0< zjdfUNS(GaX)F1wB8ek`!y*r}ECwrK0qxl7&7FoPdpj`67-80%6Y0D2*xLsrjJtpT7 z{;JcjBIrGzUz~&V@JvEH1m|#!5(zq6$kL~557>w;uAAizYV6{|nqEWWp*5_?v~^AE zOG0BeaY8Q2JVft(*SdAN7UoBc4~YNeOE!XPmgn#yC!>Hz#j$OdByh569CI~$Q<|d? zrC8I+Ou4}s(~mA?a2O8nI**`eaVaLC6JQ!r%53N8iO+!A~^GoN9b{Ra} zv|Huy<|hrUmn<)276k>imT=akJ#NiTDY`N&_%ZA%bV6c%c~M(2YHs(dlJ?#G5wnzdj1no#TSuAjy#b%VS9jlTNJ5?avx1bxdMlaP zecPa)*aoZOV=5*B;yR0h7hEP6G!YwTdALmnFG_wT(es;ww}f)5S9;v#@Jz%(l=r&t zT6C9jl*d4e*wOnuZ1SG#@hzbws#UNTlwkfUYkJ>FbgfDh--cmJgJiqZS9aSSn*VGp ztUTR@BhiLfv?yaD!(-*2&c+~Ydpur9q;qhOqV8dfyEzX7CB3h4+1K|GY7r>)?yXS)MFiRTj^G^nl^)8b)!bN+%vk=pB<(tY5q}N9%t2Faoz=Hwrf=vJ}em@sBc^o?=aTwD^r+y z%BO;q{wB4X*x*D6iES6dq}UDaA&p5A8&vCa$R(4h6gC+pQBPLd4EGIiJ6FER(cI{+ z7JvwRxS#N-`krH{l7Z#M`{u+P*!(L+N(mp)=gKhn>n*o^52XBG*L@*fZs+c3jl~sQ zCyH?VG-FP&e``E>WX(*}VDY&n9S2b<`B@pNU5ufw7u5Km37tFV>8nuW@AP1wVSyH+ zCvIL-`0yr%a^&cqO^tibqx$@r4F}v^zqnT1&RGcE?0|+{#DOR>&PEm~9K_FP?uy(q z#N2isbMG!U>U-X)UL!oCY+45Ijn-2w!&y?Yb+ffg|B8hT6yhKr`~1mQhrb^%p<}4& zed@KlrT4dvxMN4}bH1>0ofeEH%Is5{r^3hGR!fS^t*a06;Du%_w`_WnP`hipNuE_l zkJKOL^2YAk2Pe^{_M2$b&kMZJJ)akV)d#7wDapd#ro{Ex2xu@!{R+kMA)GYUz1W5f zT8VR$_aYpklp^PT{@ZhkNnXM1(W$YIX}MqML2%Tci~D-!YJ|B+<&6W}cMrYLMcfTK9e$9hoG-BtWD*~eG z@?$uQrK^{u!MU>S(3?}epc@1^es#mRL6zC!v5a7j->G*z`Dy_mrQo4;Fe?4;+{Vr~pb+^6@5@{k2Labnj~>zVv`Zi5Mv zxFzta1!ByqA|>C8liJD*fgI!%RPSzZ7tBiYt_<+eNUf28(aKhR$pJO5JLas{A`$!)L33dLr)mg>e34p`BvNPcMdyvJX;oFzgo^uBvhgwH!E1s?jLILkNdd zgpgbuq#9EkTSNh^d5Zf@H|mqB+}{ui44Ks!lfuzKLyg_qkX)gW%Ke^SHV#MIy(_Lv z*d+G2ASBLZ^XR4+@~`WpR5AH@FYulNk!M6>dPW_!4b^j?7O?0`z=F;=lhE~WtzuZ^G08qZj z{deM7Zo{K&vaY?hJkz3RUiZMtF`}yvs?)Vqt_~YO5JK2Gpk(>slB4cp*JvKLos+$6 zXIS~3ylG80a%;4M;%oOySh=T7s&uduC)4_imWP&XM}|Sj$aSy&Hr1drD^{xq7mDu{ z^2t+_@8+-36R&;vg*C72xV&hFhdrjeYsh{o0K#z!IZ_pIyuh-4(6+5wx4hFq#(Cp# zUuS>jEQLkZytZqFuE&(2CD2%9iu82j^So@;GG4yfm^riPAr7+dz$!3gWfm}kIfVi_ z2ti(gG^X4dt}%b;>;(nic)gvyX7gb?ACp-HTK{^ z2q~_dANY?fVg^O+y9d&0)s!B3<6;y~bU8NfwqoCSG(N_V6zun9X_vNZUgTv$$h(qK zP?nuFy+$lVrEj2Cweu!F<4vhB@NJJbx3l~5?1xEXGvrDjuD~cJ=DE+d_v9s^W=LGf?Nu_KO|rljnxU zYP4nb0gQ7&65Zm?h&Ux{>E+#UC{{<^5>-{A2zs+^0=!@epg(HFo)p|1}pU(oK1a zU`QvmO45NG*X1aJ^d>&?rA9Q4d$2Zi920~h-&LBsnVkTqd|eZ8U#p|<$u_<9B1Bi# zqgzBCuUa*0c7o{R5;p{@GifweB21(+QIf;4wVtE_Q!yc~(%DGP*aNTI4|W_1C_Irq z`YQEgwS|_5$K^F*2lVFTIMwkmnWUxo{d=qu|572ipY_{(Z4G`Ia)m_cKHnL|) zI!a41rJ^j@I|YRssinFtPwZF`4zk~*fe**#uSshtHapeu#Ep*;S;mnAJ(mWXiqgvP zx8b*})~v-`PTnEvcsJ)_QbuqPS8*)p5W@XADlPla3qL^g9_^w9r`RXxa_Yp(XMfOf z{Y%c%fAf03YV|p! zq>ekmZZ;o`ndEOx)x6|AVXCi0^pRBqfN;p2MauRHrDUH8V46X(;&9q#7{P7Qb6}O-*=ebwom`-N(G>xQ=WJqhMU8(<3^`StcVPE~Xc@J|m z6RI_`+m8_FNpYW{pXS(R*uQZHau^Uob_*f_l^so`ZSs^SVdeaKvXCsflw50Aj%YLI zS8qvy3+{X-tnMXQ|MbK}ppb3`rO6?Q>o8MA*&jnT`5a^wSmRvuJ4L<+Hm`W1KAjH+9782zxTn*!Ik^w-pjlqI(Vqs zd|s+?t-~qgu*y$sBhsC$cqJ#_4kb9;pa{OPd+qQfRuK891IqC3|8A*GXxZT#*nri- zz(V24DM6+)2^1-^iUHFJJ|eLHDlP13+z-2m>JuX`^a^bJC(F0Iom}%5;8?ldn_vvg z@hV88whG&F9;V#M`ZI^_ONP zKSK#{9pD&oHNEg%U;@e_MV*b-`qBEI%YX4W%S4Z5f*ls~R;-wbfJ*Zp) zoo1HV-i{f`6T##pA4cFn$^9A z7|g=^m0Z2*HD~DdAli~HSLLh;CqLzJ<}=F^Hu&1IW$w^_Kpe$0rq1dm}BCy}-MtyZCVeaA&`&nCqqN*=Zc@0eX^~VN2 zNVR3m=`ybcVzf8e=wt@qsosE?;RDILg5@hE$2u zk}8m2BtheSPt`Fg;cRo|(w;fMJIrAU@NOj2M#=aXV^St#jvPTH$>N(rCpSnEZ-@fy}Ii<>HfA_$(nt4&PvT|+cdBhk94|?UG^xu=4Gm$ ze}mCu=50ore_;}8y=@*;c?4R2SiS=ai0R0w_q3g$W@bLYe;z242eHEC{@yQj)s&n3 zu6H9vS{QS{AhA%Qd{-AF082ozNF4+Z5ECEI-OV&MB_2N#Ud|PyCBh|P)Qf1pkeCaz zX_zj2YqIg${ld6Jr_g)edpa^;dMEv!N*NmgHRdHMEdh?LkWcHX(5wcfDp{eF?o8v1 zlph7T^(96xDc4fUf2&+nJ^z~axmzy&|JBstX6E2o3rzCq#_M0hzb2s8awXM8B&MYv z7{2j{jp?bmJ~|Vp{BnF8-xLXPpKq>W@+O0QT$R2|GEHvF1Ieamy7Wcm{aa%sH=qSpK@ zb%V)pPGSQJFsx*|L0_7OKMr_DtC=Mt^1=H{*B4!QbPe6#)_bk-9@LqVN*#U@4rb)8 zYtk-mvF<)W!sbqi87ZrI=8uS@h87B)P5!L#yVm$}r5fCiWdC{glRiQZ|}v?`!l^4U@q*U8SEyXr95-kb!-z_EDy@T+*b<@#ey z8tWlo3Y=rBU$89ea`AkezjuOs-Kwz zv=-20hg1ZS>mg(#MsO!?N`vlka=KvH1EHrrAYPCABL<^h!Tlnh8)j$r0c7zOhMn(# zzIC_>e3*GduhB)Kk0Q{FBrIujxMGFqc?lRtAQ6spJ=*VL{FyIVN_x{YvtGSWHo3n@ ziPGM58;t8Dre9*0xGin+Q)&HHr+Kz!pnY3fN1JXi397%9Zc~fBpZ4!Xu2-U^Dl;0B z^YP*PVHOwVxOG~Nk~H3D1&zA^feb)+E0!crZdtNpKJ8w^9t;6;X*zRALJ@sN^r&*1x5+QPP@5J{ z^zTIsp0!CVHyaoeJ&;!1b7 z?2C9FyLaPav03xHgpentMW{J_!jw88=t+qi&}4UitTUl&yYSc2N>F{XKCQfnL~G3R ziDFiBSi8yE#Swc`+?7HVI+iLLmoxe?3Y71$vsC-G`^91zj?uu=eIDQy4mcF4w}{V` zljRivvXxfS!KDzFTpxxo6A3vhk5cXqpI%EraouZQ0n$^L5E4u^f9TW`G&tV-G#7*m zbkV5ox&QBKdtE`G7@E;{;-pJv+TMq0d$)MX206oZ_H6FHK;pc5m8$OUGoCvF;L&*Q zU!<@6D838Mb*$ARZz@d0JeDwfJ>5&WB>F0rR>Ji66rJlBd9nb~^>jdO<%UawtKe*e zkXal=EXfYg$8FTJ{_v$yAD*SoJFtlBtFiMJWZ}_Cd6Us1;povRnwWXnR_@HxC*sdK72P}JU&OBQKUQo2$J&1VeY)W5cz!6~ zf#?^9f^_pTc!8*-iFtY{0#Rs$jS!k)3G@B4-1E=GXB*Bs*G1E=cy%ju9zy4KOyg1Z zS8I&R>8MjRrQh9{GFEtdQ0N6g$CRII zYTiE@Wjl+gy6{H*MfVco*RX2#K8=YG&CP;r`7&<(N_5txM__W0qCWn}a&cf{k8P+; zFWrxpI3@IBxp8}_zEj4iey%bl zC!;OBrcbbC#xpOHE_r-QXje&E^CFYp$z;|}1_`8<2?X&t6Qvs*(wdiTavRv{vQUTl pf412F=)pfP`~TqvAAY8evMYAcJjm+&F;8lVt}Ci3VC3#U`#;08$esWI literal 82431 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 sTw0+)k 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

BxGgr&SL0sw~g@Hic`pFv4@BXy;z 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

XT&PX_W4j zm>|5h7MGo0vJ6bY&9i|z7ca7^yh8(VjqG;LXP{8VZ_u62MD>6@<`TeLjA3lb9oX7o zqOv)5ewC#ugn6HiRI$n?k@o)VlB%EXffc($u6^#8PWb=^0qjalVhk7r1mYlQ?rX*o z(C+$S=k+6=on2e}32eCSa8ID|{&jF176Q84es%FNz9&gM{k7~A#4)2Z3^gEzV6(;!br8KDI%1N`gyX2s z>Q#U&Pck@MvqHrQMI0&q+A@bCQoEBb+AnAIS!64ykd@i&uFOwIi!pSICIer??9&Mn zSJ0w?&RMmKM%PRC-)ZKoLwSW0*heq)Bu0oRqf*9<lY7Aazs(^BQ*oj(yrcrDm}_@xaRvuARt*hG_WS^D&wGPD=N4 z8-AvW7O8#o&>a4~%*$Sfjo%f5a8!wyTA5EGN~GjYEnM|u37{%0qMAd7n?K@;S$5Jt zdUmo%aV=5B7(5PWsv-Tva_A|`(2@vnF{`L)$pz-I;_%cf)N+^mtGpmTx4bNZUSTzF3rUx2A*Qe8+KN;BA?tLt)>}Xp7V|2P2ii}258xlGN<&rK452NMe{r7PG{Ru927m9>mV-Y z?ds)q7Kb}{1#e@<#510^KGqw7j}UawCQRUlzvZ=VQ|Rjp@84`HL`n!aFU=p^Z-xo7 z?ccvelx~G;VsO`maz2c{K66xBJ2ErB7jV|`!{EZtV#Lsw~Xd zZhlowHe?xz9Z){;o`%L{;=oBN-^bV-QD7*W%c?vS%x>)Rw0m#8f+X!$pblC0fa@A%WRG+#=R4G_+WH=P7UlOh}oTZC;tiF&q zTDR$ZJ4jbx<;2+B`P`y9R&DSh3Z zg4otX)vw6rYp;$sIIT)%G4a!55i~XkZI;XX9^%$}t+ypLYNX9pU^B$JR^^sYT^uhC<_YPaw7!%hEuaxfO z&dBaJgc1F(vgP6LPJ;#6;5KK2=J~BMOj)ZTpS5n8P47xh$;kZqgRvfqIWpYm4*NO9 zGjD+Mnyc$yS61$NSsAHk%;yNX|3J5Tk!z*JWgj&+<6!f)z}ETo*VX)chO#`U?hs?M z-WpeK{HTiq&r=qV^~_QpJQS8A(6ya{>xG|RgYH&ru} zb_pxEWcSwD1lL5&jK$Yo2c=ou-=}|Z94u>>E@x|l^KOF_pNg#Zk(lzWBalsEVpPcK zpakJ*(L~ExxSj_PY4sD(&z~wj{wC}q_q_nDIb+}g!qucQetS-t2duw>JI+m zEv`ttSa5~7ol{%RbXE%hRHmiO$*sC#D$& zlX~rTX*q0Q^)pm{_w*aTG~L{b;uv$OxtQGhVYDX77H9G@%2Cm^%JEODUM@Uy6BP!Y z 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 literal 60421 zcmcG#byU<}*FHQ0$Pf|=0@4_SQqmoQf>HuX2uPQ7NW;*Gq$1rC1|8DfT_W8>N)8>v z%`M2&5#65M_7`e8#tz*LH$H=z_2QLG`|n z`9UC?NzY`ZU%I{7n#K1b9zTce-Rlb0@@KqpQ{l0tszTV00+*?`+g972sycb)Ipxn) ze?EM|Ve_t}Jm>h!_D^z-pPo1HLsO$8?wyG7vQXnZo6{cXJM+e*S33>VoxpduFVebG z<}dnE#;>0L|L<25vF;hYGX=8U8gu&X8)b}0>`gLFV3B8P-zk;P22dyc5$4)Yd)Z64%F7YeJ1=Wrt#$h$#~m?Z}i8dgv2Q_j8!8 z;ROd&{5<#|9&-Iwwb!$>sy!#JcDcZ{urQ&uWKwq~E;w5d#afd$BE5=|-TC*g#;#i= z7~kGB=o0}7>+ub0IDQj1ZUo%l2@)9OPTF<-fYF^%N_4R=8{gEH4ppn2k1&z;kbn9SLl5$mdtc1i92>RP zHWySGwlqnwvpKwW`kJh!E6bxqJ#!(Ouf0)ZE3|v;ueXfSlHSE#JN!eLOONZ8K-4MO zEDX8r|BsL439+212NY4oTfgT8DwXQoe#qhECTn#6U z<`wc9cgf%q{QF(Z{BMU{}@Jh5Bt@>`7l>m`N*nA;L7ZB zzSc(k(1w%Xj}R&5Pf_4dr5qDrhV=JD`vUBV`sDRyRWa{iNp5~K6aNa;y#ak~Q} zV^1uPdyo-gK!5MHE^H^jN=ihYCPO8{yK>|=(dJYcvvOQH8%wm^<tf(IA(=p$&@mLy#fLoO%FC(=5i?3T)och4EY)_l3!mWvHlt^IQ2T>0+#u z!kw6vB6gNkU&Dw;Xrnc7cApT%$$oBRq4xMO;aL0WAZi+nLqWqGSm_pe@ucD||4M)5#K4 z>)eUcgN3%dbi6oyzgLnUiYy`u34u2yd~MXO4?mGMpu*HN2^%maz$}Rm7{i+1NjZ(^ zV_VZ@IJB%2kg+z?ZO>=<9Qt`jXp#NK-DZn@pR)3>kTCTTJir4_)*o3Unu1N?>mFUm zO>&dA5WD8nIkiDA#M|gJBWWBnfqY=K6gV93xW8O@+!A$PGOXegi75!RlZjlb}G)nVrc)2{xHo)jCO*}*|CRc+9N-j#(UL%I%&qC!sNCHGvf6H zDEhfaGuqQ}N4y+|OygK|o}N6=)jm;Y8EdOlT7A*rw{J7*{A}+V$#Gst6YJuE`88dw zx&@B0wo}0>AhQj%NXEW zGPt9$$J+3XB|_wyTXw}SXQy)NNJK zdtxeZsF?=zCfvHPK;sK5-yCe`i8b{Pa^7Y6l2%L8%q6VzQfEJHCGXldMXUc|8fs0W z9vrdpxSR+^a#4uD%rxfC#>syYdNiFsRhHWcd>Up-cHyM0N!%n2{8vc^xxN)@YSYu!?a*y*J*6$y)eNBFLsV_S21Ej=!( z$r)v&l)^W**tME$=XLhGk#pI*D;r+>&h7r{#77knYV)sY=a_QlJ>E8tys9Hf^hMfP z3c>jN-J|at(r1G}WAD`%hbUaL5L+{_tni^|!MjKv-F7(XIQn>XHIyRrs~zFGi);M{ z?hHH-#5{#Pu@L?NqXIa{XH~>nX*Pw>IJ}`XO0K=I1j#UEDqzN@r;HRWe(s}NK=~_ETQoHwXxAiXgLk0H>Hj@clt36E>eR_4kD(BqSWZu|O+-4Wa*B2uAOF zAoYL>Ljry&a%BLzXuH_)>@MATiUSQpWu?aNX6q0n7v&1=LVEouH##TCiSbrnKz3F* zyf5Ho6|sD`<2WP}>kyrLy!&R{8`tf+du*;04nM>BWv*iEdy*4? zO%P+p&3+?oH7h9297=)-gZkmu^~c8 zg7P#$zAC)|)~B>65^Ym{j<$B+pWELfscNfu2+)+k zMdL8p!lw!@Vu`d*&WV1!EVk*is<> zi&qubklmm4Iwb4kEA(S;A?DqMVEMq^Yaq4RR1pio#vx7#)EOAt;VP$=_HU2!Eq{}o z&$Zvt{QcJIx%c^*#@pnLQyuKL^Aks~RI#=mmXEFVzVj32KBuOScBcn2Ic;>>(!?Y} z`3q1X%EGX};LyEfKodRdk*Z0OeAlRXre)k`dgRfV!zX4njmGyvbI^ha4FTUKpJplX8DB9?-^)GXE|lmH8bjYEwWsWUj#u@0MEIHo#+QZJ+V z3-+NRx-&Bx7gyz^c%D(jot@2kwS3{5UEGoDv*#X(?>G+TJaH+!D`)l@H1--+=yry` zPj27EC>twnhQpJ%e_Iu^pI+jZ4@H=!dhBlZXbRd{bS7!k_zIQA`@DUTc&6}8&D5O= zvkD3?ZeKtjD7;jl@RAflr?|zWLX3AYZNu*{hwA9`AD z|FF%sjE(7B9RHyga8-qty?eiys}I11?O;}~%}^IF3(uXpMzve!zQo_|#62l+bsFS+ zI6Jn+ih3GFiK;ykxV)`nZh#5{Wy_tLgoj~OdKEyL>s7cyoqG_Qk2(UM$(S``*WeHM zO*_nvqAzI~MjCe_X5j*0Jt<-pRYBd4E7^tXK3r?mbJ^&zbDxhRerGZH;5Zy{cdWdn zy>)*L($VM!DmJ**4&Yjg>B8Flt)y0~ko8RH?Wvtt6od0tGMDY`JDSXgqP4YSZ10nyX%~#UK5?Vl z1D%?*z!`!%X}l=HNUw{{(>Vm8b3$n;Rgj(05X%*={dkvGeipS+$93&|EeCEpMt;_Y zzl!KAwY{uwgihm&qwD>{qO!YXrJ@>I3fc4d&&_k-X6NSSdYOYziC}hogubp2EIhzH zIsrHew-DQ?g`W{|op2~*s&Oo7TlR7+6t}nB7u2t~B-EL}QMB%QdNTSS|;D{rj7j?`cHsS(l3dFGPiAun+__$K2?UPnILp|HIcokE;H(vC<7b{OOyJplp_ zT=k_^e#Xn|p17|U%;{;h9hXyHI$Tx=*KyT*6ImT8*WD5i=YN8V8~QW|2^9k#imCsq zKFUdY>`r7@>to$2oB<7oZ#D~Oi1!8LV;?YX0}R1Yg)5fEbZfm)-!5){+VhKp8zq-8 z7G=c6@P+g)q1A`eZFMJ!GK*&*C9})4D0)9!iEA!y6Vd$bY=}W3m zvzM6m(=AIm{t7Z%lxIAFcU}vZ&MHzu%y*8)BT7rX%E>p1O`++uk~0N+3IwJHa0786 z_E?}*Q`QE31_@u$eC)RD#aQ>p+K#YP1*LOq(Ontp^~=nYQ2r;P4#3m*>l$?gHk({p zBH-uJ=U*u}b=oiX@DAyRJ=>F7Qn9_P@re-g=K#upE4kSs*5wYM3{4@_@|U>Oe6>do z?R4m2LCoFpgWt8WD7PNvxsc9`lh8S?G4hS8`|{ikpK?I5*X3~pW(z>82fXm^*K;8( z87Cj+c*n^9fa|DWL4`T?b!rk$fN9gLN)I%@YdW_la!V+Lp3e(TeK__EAx`gk}E$}{Q_+lEr2D^gN#04T*98HD!mXYvfAeG(PwvPQLl7#DEfPu08+vPQg3&NF3DwO zQRW7=YrNMD^eV{AP_=7Zdxn!w^f65r(b9)=!=7D9Eh*Su;rO7L@UbU0p}itH++TEn z%feNKi;}B^c%LImRLW9W=S75dXJ;in|McFH+?O!Hs)rv+lwR3)k{Aeda_MO!y|Q0s zv&t)3c%ioa*bI4M&paI{3_H~#Bj{-KUZjYfAfkGW7e^xs|Ui^t`92 z(b-5;wc*`sb<5uLU+y$1P4k`nZwH;5y;AVk_RrHT97qg1Bz?X}i=yhuSAn0ESb?8| zofy3V+-B(u7y;?~;zylv(cw5`7Rz}*RaD#Umvv;ztjF+fg5T5A3$`{v6|9J|i+k;D zRR_6~v_2fu1FJSecyN^NQ-f!aenblA*$P&1^B>grWsD_Q!q7rha}@Jnm){) zxapD`P2}&iV3+{w21z0loI6Cj2$}?2Pxf^EX(C$I_)g8|M{}c2(E;er@Yd%Pb_vtTp7?G zf|hOh&L+Q92&BH2+%CzI2pFb9c?(<~6G?Z_UG7?RTv;0vyX^mCT1O;;*!?-V21yoU zGah_Ng>h^VwwIJHluLl!#yQBi0EwRAb`i8j4BLiB?wH54a!-KDw{hMKesC{vxz@E` z;w$Z&=61}24L2TqP)QtyL*+?@x!EerNDjKaVD}+70LC%a;}9iGSc^om;=E6y_jE@R z&jCfziVZge-q?>`{VvP^&&9v+dhSrc>y3)n+uwdZha0eWGJ|rGq6^3cNST;f_UOTMqWg64UAby=0kEw1jk{((2eN~hp;O-e{`y*db5Zrq zM%V8{^KLZPJLWxO2BD_cldupBCXz6`Rq1^|HjP6kyPb)K_@p}1T*#M|%JSL7Jr_mh zaIujmv!ixtef02>ugVD$==9fB*0<~enom9Lc7zRU8g&bb5XA!cDri{+`S1 zqAWFWP+Z81hEKb1+5qbq&1ERcYd32#(3!b-hoX<8&t)|d6Wnt_!n~C3SH0#dLO~RS zBw;fVzuJSZJ76P9V^*j$w0$GRooeW(6VGN^lQM4X(l6O?OP4HWtzQZrj71no5ED_l z9v>=LoBuf_p+9Q&nZu3Q8*CZ{G4n*m5G6yPeYG7@1Ny*C-z}4BT#MTogveaB(v^PC zFu`V7GdQtXMC%0as)Xz3_D+^y!DbUPIE7jGlW@4aQiqeT0X+`R0i)A`2qW?BLTJ)8 zi@4)Uw_n#IQwBA(`=<@=q(6VP;l#Z?MpV|3*-hvwG;v|OTIn54fMHh@h4oQ|QDLH! z!q*_pVt8OvxlQk+7PT?la%WQ%CyP9wi<3!P%mPcXK$< z1e8198e*7xtuaNVQXx?geLz{&oXm(9BN?;mrAQ5K%gCKy!cyEM{-XerPynz{0`f@= z#QUUYg>qt`JoZE^4EG6=8Lw%1@NPnsT+oSY3nc8NV5Y1Ax;f1LHU=}K|nE8-#}>0~z=oF++AI$}-hNQ>iBuJhF)L>-a; zLVBp>nv|MiIE&pM;{SV7{sw(G>Bo9 z5PdpdV}1x{Xo@NB4mUKuiC~a5S-$cp)<s=BE#(+U z>V3~+p*b9GJ&l0QyB(7M&E}FAEne+r0#*8 zZXMFcB;i^OO@(2+leKpLzkG2is12U>TU1WW4l98(tQql9 z@0*c3nG~KikMV@?|BLIIIA#n)gW(5BbYv`~gfub1sn}OG@BR(H_aKO(Q|HDZ1z6>Y z^J4rY$!JUbIb7)8U{>`MZ`v?ocvHLFJ--Xk%ubX=Uc>Zwa)l}@Kb1e}_63gg~t0R_v3-Ug}I21a0NuANp zJJfLIQk*KYeVc1%%Tn^6a1lCn;|up}Kuu2$lp`5Dr&OZ_rAe9L%)}DRM1H`~$Nv}t zm=!qz3_bHbhG&`In=VlG>`-|Bp|3xg5fURA#qT9Xox4XP{$*mI4hi2d;+(^gPCzB* zFa9s#V)3tFuKmR+Ra>(k%$6kD(V!Dr*)022g6c_nfMpnNf&j4+J%*(-Jilk!fCsJJ z^^Vv8CG$Wn4ZCgm08m_yK#xSA3&XhsI@~hIwl-ha&~y$xsh87kVZ1wyBKhUG?K!QY z4qsEg!}=|9>-B9lk_@EX9K(YulK(Yd@evNaY4_*c%VpcqtxpR0ciNOGGRl1;qF!J8?2S=(h0<1cO=(^2*^*fWK+0h~LWuTlvO8J;QSH4-B9GF2i(j(@rQM}wIv@bfp zWOAdKg7W`{@ju0_^lvIwggiqcC*8;tqf?@zV?lB2?*3nk8?HqRB`ITn)Zxa|`^si1 zl(*nP9MP}NbWP-^+$apZwgMhh*=&HS7d)ZmcDN3rZ|mxj@^2Dg0CI>Xf+~V*0m=s4 zM3grjj@R&RZ}+^82zP0>HnGxL==78~LM7+Hd`aqegyib!Fs1wdXN89~2p$lo934~fNZOO|L}d@$DtqNowc0@VA#@b+2p)XD9_G1yz_Mh@4@l? z5mfpZSLK?`&~128zXWW(;y$%!Zp&#r*?`{#zN0wktH1@CB^igFb-57@F-d9ab-S3Q z3pGDtiBuuR0L5)LfcOeRDDLuFC0!Og6hDyxa59G(-Vm|f*Wk@2Byq>fdg4$;VNYT` zaL(AHNc-28lK~OK--nO@aSEtrBz*z&!JEFiCiS=$^cjTj)*TbK`y?FX_kx}rgzO8f zFQDQNf=f~-S*~lhcG96(g#JvgTmmfIGH-li09wV+(J1|2!1NxUF6=rZ0H*Qg8BU+Q zJ?>5?UT#0M^vTvg39cie7MUu7)feT?m$rcvL-urF|JHa(Dk%c<;_Fz^fq+GLW94Je zLG|H75&HCi=p{N}yZ{>6FaVeVed7>4EawejeRK-|ByO+Fo8&Wi*Po%LAeV$_K z?U=0ykOdDJ>{{@EPJ}&;{|IeN$HEfqEl^Fq8}M{pJm(~iKS&66nm~rt(MSuH3<$Yn zfL{>+sKZP3v7PaU+W2)UWas#F_Rg+3$?XYP_%^2BN#VW&+8t0uSoU%!{j)R**ITDE zZlKdZ>ww2Mw$prCDVc(;0t&u2IDC^T;)&#~tJbO9E}%nULOF0+Q2wC)T^d8z^a2iA z;)8uHuEU-KbBY&HGN*~CVFw0iD#VL6_BY{NLI3XW>Op_^FT(r~bfyi*buXU%ZSO=Z zmJ{Ir*tB(6y47N6OA-8)M>^y?3EI5jHk(`caiE0|37d<()yQ@i4pXtI>cIwGG z;(y!fe`+4Ng|+`$PjZWA|Czcidv^Tn>{*C$z{MECy9?qmk8}1tn4DOmAuzVyy1L(* zrSDXw${9H;qc>H);N8XOvAZsAqGUJ#mFNfzMA}ILfdEK)7foWU2p|wp>SCj_tbBd0 zTHR96`AU3TNcME;7niU$;Ft?>&NvC16C5L731k8xdQ&4&ILyaLG_wP~)lC*d?7F!} zuqz`n?D=$;&Whk2=+v0+g~L6Yg`)u}FbM!)V!)=a_X4%Oq#ib3cii|1<81n;2^qUz%!td2wYSV7>u;@7J{XO zxJSP;q+bR^UOv&dZ#m#(LOq*XE+&+-?b7A4-q|9U|)zR`WL2l2357yrk8E<0d(YwU?FV1ShYxmFagGGv9&sMVg6 znrU^!*n&;lH6`_97|S^ZBMh@RD|E# zXlp2TR+aEke115nvK!DuNd#k%i;EF2@6)Itb3~ODFnI5ne^tD$O47Z#H5$r#<5jW;`I@1Oc>qcWC|V#z{H4EFrO!d1Z(W6(oo;x` zVoC3TZ1%j2q5}6Naz>|eN@^}1>+<0B!k5Jbz->B;sV{0)ka?hfF(}tG1r4U(YKoeq zzbqS(EW5@@P5eL8ngvp1=e`rl%XaB_sWVoNuiVjJ)zr-r_OWN53Q1(cXK89N);&r6 zlg#`0GVGTHRs><;@TI*66eyR;oQI7o-Z~Y(fM|(Qe-SWHIaF0u z7aUv7`aCsgly>IPR-5RvY*w9T-`xH5`H*Mx^=kdeb@p@H>J`cS1@B&UpXfJz^P`^R zD_EZ@Z7)~aB~LA)Ji3x-cN^6=dUExr%W_|FQnmdz(U$`dkbp~W19JevR}Eny_G&Y~ z6iqIUg;A!Ckea$O<2-IeBLThm08eA{8kJzpQmj6Fqbo^61T1AKE(fOVj#^{achFl8 zKcfL&vM+~6o&V*Clv1#Nk9^|flZd!6Ai`vN4H69cvd_WB0oy@&1fZE z=Ih{%M(kDdVsUvL-REevn?&wv-`i75n>vca zIozTwq^D3gtxJTCSJ?g`cjaW4+71v2anVsIxqgpHLtOj)|0HRh-@XCH zfCxBmB(AlK=qFxUKX3D|4l25=$T7Yei5mO4f678!bTcP7RsHdlEo9PYh9TTIax zP=1xd7DO_{b+N+@-}*9B)Cb+=IN`i=)f5Y-ablcG46~f|?Gb(1NK?B@r;KM?matUT zwm&Qi1Uhr2hl~Q~kmA&Dk{ao%J;Ko(Dswu*J>pJDHj)(9)5xUrPZD=Dy<*qKnj7^^ zb%s){G@XiNTyA3y-wc?nHIe_cQlY{Ov4MxPA^ye4PJ#IdnBOPm%ye1(53c!GOfIHw`ykzu+D8$E+Vp+G9O z!{Xvu%IXXd4bV?82I37ZTQu$vWntzdWB5&}sGKd%k z*xTL`9~$6J+R?bh?m$G!EERL9w0TtJc{wFN z*4BNOL2hiuU7~RBSMFIISE>x1PDQx*_GtppqgR&q2ngu4kMm+5y6XcuzDeGjm=p-@ zV73eJRb_qrQr{p-))fhmY?9f5JMBh~R7$VJ`G0Hd)k3;uW~r){)0`f}im$0KYOTUe z0E^!53lP$UWt)Dt^0kL1Ei5tJ0+I^wx~3>_%ZgH6g80i0S9{n{1y~}xdA>Ib~{N;K$PtFC#X58Re)CM36Lc=LZ3hg zmIhh#D=?4w%VH|HQlgu#jNq0nNqpYHiTj$l3tN{Ru+|tp-4)no2mv*CQ8R52c96>X`^PH)7plc*~tM^}HCL`#Mue{*d z&^6x}uvEZmrvS=tWpb68(d(KB|9MtSzaWFHX(>I-+qTL=Cy#k|Dy<=ciuyt}w-CVwm*YX*O78y&_87=)a!p4(BSF8AaiS;e{ z^uh=*DC&u8WrPZA{+Knxd#Nz^rYiD8T8;|yxJB52yDuOR3}Q3`zAkdR2wH(R)OIzO zsX2Bz8p@C4$Pe{;^LFIXa(zja1r@s&I^UNtjB==j8YtGP4~TY z17vzd;I)m<$ld908=w9e;q+4lrv3S@2FcdRFa9(RaXn%Vwq0xLHqLMpREhuXld5-o zIx2R)R3@zBH8hUFgX3R!{tx=;Xe_y+@#W(FlJ77w15`4>nlB?@JcI6rRi1qQK;trG zcPk+D-_vT>EFAyaIGqkFHf^_Rv*|0p0Zz@bl{Got$Wj}3`t4|tnKLc60j5y9yp{Yi> z%XRDv>Jny7#wm49D&byDT}lySH0}}UdmMzmE0|jZWRRY)7z(@NA1Q>yAL#O$YJW!! zyU(8JpQh^b!QJ*}Ym16GmFbD@)tEUHX09LD7)-^~85TJIIf&`E+PBx^Io!2Dv$ zI3{=4dgPF4*T0Dy{myUU?*QY#ViN!6j}|=-FSRNK*BL`|C>WAd1})V#w)2NyWRmQj z?%PqbT4eK&g%{z~f2yo|PJZ-81*Vr^P4^Sq{>ty#a4p6N`5&1YAa zqH#jqTx>>(aEzjQx`XG+k^7U7hKOr-IEW82uB&&z|NGGDgMSaAQf8jH+geb@LnJmElS;pFMCoLYxf zabxE|ka56^)MBb|ObBZX^I($^=3yo3!fsT?z#NE`ZHucLXWo9AZ_;(LF$?M_stKw> z?2~4GM!Ia0AvR8Soh?txqZ99?LAle?!p|&2zpbyiS$zA7DlB9CY=3iM4ZSvk-<&)u zlMw=-W<7bmot^R6=VL6#k=k%aVpL2_Vb<;3@ZUYAWf(q7?wyQc>TvkGk3@w!CB`^Njx>2%xkob+UnY6F8EDDz$o3mIY|B##J3*@I+O?DLqt^4Cp+?hUQaVD0f_wm%8{(F+!8)?EFecaiqinW};+)`#R|E49=I!j0~g za*Hv442NEy&LsM=EB&(8iV5m8A*oH zE_9fC5l#yhza1y16=`2C+pWw)nkKF3vxCj-b^~X)#?D0CMqyPtc=T#{)5F8of&z>? z-yAEum@HgJW=bxRL$}CF4*!j2!*MD;D6 zWF>t;0I8<;-X2ur#H@Oat-OeQ&e?r@wjLX;#%NbT^Db{yH}clUBPZK2b7|16)H`16 zWlH&UsgZr>9=yp(y!+xl_ls#MIj6Ng9;4sopR7Q9bp1i3XCr8ZUN^oj%-wZ<7`P_E zq(qSdV>9%l27Mt;8-wx{w1gt@mY)*w6DyWb3Y2D;d5JNev~%)lgn(Q(eVGu`97U!@@KA zTWJi-Y2>?Ve8*J^q|+bRrXR&yce|eE<*E-rHC<0?g?nNp`v?4fL#z08obZOI3DPAW zGD@IyQ>)(F>sJh>yFE;b>rlz;eR6+{qqbD-IM&*y2VH0Wh%&^SEq+?t2?-DR{JHpX z#Oqi`p9>!bjPWS0_Y+S2Pv-MWsc^TMdWt_E-F~+tcHW^sG%S^^x`YmXir+q{+B!D# zYp(rF->6x5%hXzfBi@_HHufhaHO66a?ahZMyg^DzhXFyR{l{<6Y6P?X?LV#0CipWl zdT*UzamG)+32-v#tGJelaHCn5!FVv45xa}$4F@0a6V^&;vuKzCEPOO{Y-~x^&$%^nwAbT1ovd}uK zf=0AsN^r(|5+{_C{MuxLZ!br6fTIVi-~A|+IGuNS=j?K?p6K&V=Wi&8zOAjEd55fW zinz96#hDhWsde!~VQg6_p1s>ucjnX5WL(pEerifn<YK5GsF{IJ9lK+j3a@R6NFh=?>PM7KJVjuiejEQe z9Xu4n(??4M3xhKVS`~Vm5V_R+`ckbsAOc>4o4qCy{fF9K%(IY|@S*0hj*j*EbX8u9 z3EmKvCFb~h{2k7@%=tmfP5~tqqZh21IWJWQZ4Nrfr!(oXIC6-G%!*(5D*I*JNpx_! z``l)Zu0DzX35F)B1V8bUh*UBJO3fo%w3lC!wIWj|x=3l!w%BpP=xfSwYhE6HO7pwx z_eAULk&TPR^=XTn*i#vjk;YN!5y^6tZc}q-Vs-iFH+|VG6eGWsoK8i@^j}r3EYCBB zBGgNl^G`1i8@GEV@_!+yF72*Cis|wK%_}10+$abi4EfWD+|OT{gBvI9aX$Dpl_jaz z>*QA3K31?)W@O*#uVvAU|4mBt$?dTFVIH>0QKI*(i#jKGxl)8^1f#(6lYRK2RK{*d zDs%X~T4vH)CzP&`xkepmma`Ww>em(kv0>7CnqKI+>gB~hCL28#a?`*cCGO%QEMSr6 zfyaXdeNEOQqz$G@rD>{ zq|*amN!YWS;alAilgVY2(i!@E|07iAShlkIR*ZaJAETm`3O@JfH`L4HbY>#9()6i4 za6CzB9frS>swqjfb-4kib@`PsSfYW%?`9~@-D5i6P}4al_>R zmS;qNwf3TsCk2}Bl!mW8pT9>syVk1LJ|D0vHrhupNo_8DOU~O2(P_Zb?zk}ErKpaL zruEJ=8W`_5I_M-Q{<~hDm`-yKMll@-#f`Emd~9su;dcKD0ERtFWwhLYl9@?I6CZsz zT$3v3lPOt8H|H>_u8+knYoX@2U(0v=2EJ*c?sMHbQ04P_rPUM6G+m9c{^3bXye#g% z1jN^LkL%%+H&izkC-1!QtH>PGl)W`mw`n%LIUFjiMfu8do9&h5+s`D(*OE4Fs`=qv znOFs)rdvVe2QwnB&Lye9*@T2IpQ_Q?j0@RCq!rz&YPo=%BnU?Wl;D~sAQo*qc&&JNRt0k9oPVDPU-XGQEG&pYF>KK5%JNe~gsV2~pGrG84Y@przsW zL7(01$%CA$cFdLVIviNeESgVj<#;3N$|eQ~;9q6pF^;hf?AQ>}v}-NA+L3$Kba+Do zC(`_go3ThU?(1yR>ev$rELrIJ{W5esy%8yGgpDTOc>~QRQ*vCe7xt z5c9s1UbM1|C?!FjwraJL{Go%Qu^stiKFIr?$BWg!$`}3IXontyXN=aG`t{B$KX{bd z;#|Mxl~i3_Gj#AA@7I)?e}5y3F{NsB?)K&64W>T|88O0qxn)(=Lj?Jy5i3J&*(Rnb z!*+xR#s;d!7iSFaHJ@E6r?fPeOY#HPgT13FU)Dk(M#azF%%3W$*d3PLVB#cKVnm=CtGKMx4|gxy`e$D>1aC%wg%888y!BOpEkVlh&v*- z8}#QGWDP;~CGo#>knRSA2vR(Iq#W$=Y_K7iC9m^(py6nzwWGebT6T&!+u7xsDn zS-gP!__t_8C&>kjR*l5(Rz1(U>;br+WZLTM-3HxKQEv|B38w}w7};vp)KQ_=~ zOOKkX*4MMJ{xiY~KjPNv|6zH5ysDcA<_xF1EBfw1PZy%zaCTEV;!=0 zy#^$zkqG9eo|yXCKv&hoG5SkYy)<6WxCxQJjokueCVd6*@Pi=|kIRA>B`*C&9Y6k@ ze0lT!B@vfjb2i(LNR04KP_J6uruS*Pkq&HI-1EZ{0|fcKs$L zQ=>$$X2S65z~Z6CM3$sz;E(c(^(gej`gCZFhFyI{C^M5?xUim%H-7ov?AQA~Uyz&3 zKKv>qnXY6pokLY`d6!=HyoMPtd5!R=+1!bm9qO;OElg_=`@y)24Ox#2GOsCQ5({7= z&0tceh#;I&l+Jc9nBg)#aisaz760}1?vlCcLZ;2cXQ!9K*NCjo?l^15P&y8`YxGRl z+~t~2d~W<>KCo;sFQoaw>9SSz6q&|4NpjJ!F&P9>V?54VBO0>9PIjxMte;UTKt0%* zoeF&ru13bDsOiZJyZnrQ?Pj3mHmhGqg*ayJjdJE!>2$e-9N=jw$MyAvrt9U&gk!#$lDoOKK38_@6&u+j;JVGWvL92FHs}82+KQxV= zLu($A@TE!UP`uI-zkX+Pyo2ip`anVn45ODkH@3Qp+Vys<#YA>Fw+aRvi=k^^{Xw6` z|EzpZ6*Z4z+9GW!ulT$`=7St?CXgs6N+Z{J=8ex|j7~5Twdgxv?GZ_NXG)XT<96=Q z`?H_uoYpFb9_wTMull|3YdtF&wJfAxpi&|f_=9p+-PW2-@eS~d-~W|4o3mHTgkKlS zkZ0e>{h5WsFm=ojarVLAIh9^cE+QS?5C}Xraiab_e|xB{lG>_ANLdC!_DM3sVbo>$ z`#FjV?+-#6iV4JJlN@IDdT)zf#XlE!fk3`$vx>PUUA1<*0TB!4`Ay{Bo$23wCT?hk z@FShH&NJ|j93|(i1^>M4uC5#3yvCUqa&-TEP|I|*jf)GXVA?%^b5sqzb!$2<{^3Ub z;=xD1+EE$CJLjc{mK@RalH8$~Zb+jwcDyoc!^e~6+;u{siq=6bKhFG{X_LWgX*Sny zS#Y=KtG4@m{o$M(?5@umEjXRLMfzi8>I-4-#J7j85;`S2e~6QY{*__ni*DGFizp$= z-&SwgXlYhF`VpQPz+yx(eCiH&k$vw$C0n+HSfZ&DpJgq7FD4<=nzf_Y*|Q6Y*2WuT zBzT!2O@&xZ<@#wl-mlU9r%KlJwdbLn-q~65e}Mhir&$oXf6(Z}B$mPU`mUrAjclFK zeqOkNXrnw}n%W-3^uAqjDo^2NTp-;I=pUlAwGJWRvv@niVi-$88;sA3i=S+yIrJ`(vw$$t#7(vE5f^c|15S)H%EO~7 zLR&I#^!XgjPwT#{;E#`ak7gH}FAVPD4Q22Lnv)XQF5)tIUme%1h(a5Leox(?_H@>2(q2 z$z2E@=h*?8#y)NLM+_h%h}|R{eECA!4c8C^>)zjF>hGNOr<%If+{rtH?r{Prt+{`( zW9It`)pWVfuk`)pHjuB;R(zZ^8iT(B-{p8oh=@H{bfV_MW(i(A^YGhyma<u`jMd5?^+g4*^H{Er1Hs|A7eMUyN_E6wG;elLci7b_l)A zOOr+6iQrrj=hjD^zP{ZQE9}%0VuYagc5}=Li%1))4r#7IerM~PSk1)H+24Y?R zWP>;|EIzHdC5Pr@wkp1&*o&O4H@0^tnF1|s*cR8FWn0(@qulwV;jqNi~VL=R2&KN z&EPcSZ5)f@2qrqhV2oJSs4M~3pk!)2zo@JPBN!^+2jS+ovfEx!Z^ua zy$QO=N9Qm9sEF7fX|d*sY#y2}2}M|hJJSXQb@cI>YAwtyKvoLzGGz`^YrBo#FnE-* z?PB|8vy-QZD$&qag`7z9oZfy|Tu;xCQs{n%{mt0?4nLMsUpyt!sc}CA@xpG5^D8ZX znxUj|tSVW9kiJ)Ix}YVhTL?E6DLp@GTxys$J|{AH*mG1Hqouz7j4kLghyllD#k-jC zd?|c;k5?nwPy>I^y47j$6R3XHc4$xO>F*CNU)PKM1c-#Lg*fv;0Y}YHgg9laR3pY( z!;NA}be1sv%cE24+q=j452sJnJ7AZ=EK2#E{i0Dp9g2IGpbYjT{f>Pc(PhjvdV^ll zYA?I^c^wJllaw3oLup@J%j*`KlxK+1o9b*`qh12$gf4iMZULDR-Vf~=A{vc?#7%Th zmGMWCU1wiXP$wS|QBdNfnBCa7FL1R4%U_Ik{V4a+zgRPXX-tvp%y<*m{cUM(xH0FUhT@Xj zkEgCal!OttLshWi^TZ8<3g00rWU@D zkW(0weUA%i-8;};UQ4@?wpape@fe(SwhO+f%It~o6wrJPAuyzNE;((@P~saa^{gJw z!YPe-bYC8Rx%qp$A2-eIl{k(El_cZBkox_)nycon<{1W2l&1$Nen1##UP`-on;r(G zW+eOOSZ1i)B}Z=m;PPa;0q<8vb-MZI^Fq^0v7cJ%9mreM-l7gzud?Q;oN5FlajBEf zT!!_aK0D5x0YgmZF4iMeE_R}S4kRF2;ZIr)hWDA~Hr;6$mGFij%1M3j>G+B-L9?bP zZ~YVT-1@9hPpMNmpW z2?L~+l&TYmi``@$HQxK>zcV_>2(!xTJw8{-zut26?PMeHO7ArXBhA-0 zpRD*xKM+91S5j$&i9{yOuTz}%tQ>1!Fo72aeBg9-`+3Kl9$7jws`UguDQwlhZ1P7r z)Q<@_dzfK;o4CF-`NT<8Gc~3%^jFPbSN4yl<-3UtU$d1WSgwS9M;kRZK2VX(#@(_* zMcO=thmGpbdVbRndnZTnExy#>>f8^n!*3438Tls}5G1k|?nh1e`-CLijPM@Pp`_t{tIVW+& zx>ftIvged_{ZJ%VW`PtImh;;4Bhg;j z1+T_Q>hGNwA5(bHzQuWzL5a>ui06(L*mx)09Ow=D^6pIBinQXlK|=+(0BX@I_7<{D zJGq&>QiA+l;yOKg<^l%Jx@BRIZ$i{jcRH2PW0u*kS}e8??$lh!`S(aw&%%Gfh| zX9*LKq_u58K6VAjwAtgyraRb!ZKbTDdXGk`cz7GSJ?;Y|<#hG=&r=OkW2jpd>j=ZC zS(e$~k!C7PIze>OP;A(qRb%Fi))H(_a+&!Gs=Is!`=ItkE1|1qE?P7KMEMCYMR4`S z;cr2$d%jrxMu+tVD*#SJvJigD^);pAxjJp8E{)utmD&?dCp#TJ!d4BFzK}d)9{%1Q zBiqEX)*uj-0_Z_*Ut69Nq8QOjTdQdpb`ji;VZGq-=oWhUXDBk4KJI@Pa^q}>;|T^D zMN`^nhyWbCFTfAa`OZzts>zMro5S#yDI<1qs3tvlU5#L*)vfHVEDFK;oZdRzv+#N7 zAT1)n<498Ux7tWd0u{1oM& zfG@#~*UJF)(*EsS@-LzKMsfocJHPa5&XT=hA)n0b)dG)71j6aM*wlV(k5+r41-ejQ z^MSFD<(&x{P$s!yg6izbuZ~_NBz)ZM$dPE0OMrOf@~T*q*R)<(YJ9JG@hZ^g#)_e( zB~QOHIN;UP4Um7n_<|!J0Q?%(Sr5VV*0XHlfZmt2p2w{ zQr;pkN^8-8R7%2YmIGTK2}4r%8LS5?4++hQa+(c zkMV351i*iV_`+DQ{7l2i(K)@lJ!8|)S)tiSyIaa>Dd_z{biw_>Uvn}r%f!g-bw zCfSIRbzXcWXTR6r(5kMM>gZUl9LfGTx2=519l*EvbUdZsS+*9#}Cu4**NMs@a2)N9j+&#!m8)R_X@9D%2H+|4E?BZHd_>P4n4Rbg~Vnn zdx_$hOn3p6}@d~aSEqiU^TgL0}2ETZM5N+DbtA^5*ulN4V16ibnnL&JO9B%+L+_h0Nxq{?`Sr23kQTA()+GcxP*cVdrf?|W7#qtuTgPsLn7u-~9r729l3dQf z?;q@3JbK;Y?Jd4SOH)xtZJqpiZHLto_f8s<;QWN=PI!|?JpqNNcO_Y{pXs;YC2S{dC+-N=kUb58E`QI> zdW#VNND$Fdh!`*n@EGy?nR?TUcw@qfg&t({-UTSyvvljP<#xzyws&unCJ;1E6K{{i6LR3Bx8c}>24Dd^7~ zA=W&Ek=hksA08~0@o8|WgUJceZ`!|^UIrg*eWQ8tdK-UI&!)WN6UcC%8?`K+KRC4# zQ6$Ai8u7Mp1YJd=fHhrw>Xl0M7NfNGrT6dKtX)}=P!QdyuoShJWVx;MTm~h3G@E^X*xP~Zf7Py*!DtVrl31W^~!>m7em-d z>Gnb+S$U$5{p544z%uBPA0~eb(y#pR-0X(z^Z!QqfHMn>G6eK^qpqv5kn? zl-ED#iV}V(pKyG(NboOUryfF=y6yCFDhugd>3HwX{_$&_-ykePi0bfa(ZP&0Os-7D zdBKYs<_C%}7%YduFg^(-kMnvH8H%l}&#rh#dR(N;RjVBGJOrfmW3}e|UJNrFC)Y6D zt)?&v^a`WgXvf}N99PaZUuh~OOhPMv3oT<_L-xCJJw#8EcB6up9t(N4ke0lYD=Jm5 zyu^vI%xGLTuo)?<6=5>=%a{Hq8|RNBc5z!@e$o%waE3*ue1;uUx#U(*%N6HB9X1o7 z_8`y!JFgK$6`cw^1AO8nfUs$`#A7326p(e* z#SVOtyeME2Vik(?QEy$Ti8tz6k)5i%2Q_HkeCzqzokb%(R>$$-G$$DYm<7`7Ptfju=68+jPqPCeI4VT zv%baNgX?3d=+<}hKJ!4$@jsXr8uJwrGg$cKH(S!}@0YZSu2l9KR`_2v*f?`KA=?X`L7$cdoB?9`Q169(INdS8{E5ojL4>b8WBud{aT6 z-#e&N7KSvP1xU9!(V6BwJ--i$-v*i^XDRgz-auzefcu55^ON<&Qr5a6+yS zuA<*R6u=c6Z&Ow3rF7^%O@t{SJWvM>E3}Q-P~kHr3=<4a!(il(7AIctn|~at6`hPf zeq(y)$MqRfTkF27udL?g`3GXo-^>%le>g;4wpSNDPShhj_Kq)cT!&2E5;u^;DM1+t%t$O*9fQ^5(EOb_ar=t; zekw^l!-vaWu3MmDt}s$!49l+k_#L7Ra3cpyV+O`TY+OEVbEr;^*?NAd{j%&m%koqF zcLKy~3O=eKFo5Fd`mc=F>rzR%$WvIY;Y^wHm; z^|@Vu zs#h9t0z|HpFF$cTa9SNTCFG?^$q!YE-d{fm0B$y3)Z4SPN(eviXn5w9Hb(p%4=Fj;C8Q zqpdWF*+C4n?J)>}uvnw*Kv7u{OKlFPE4E5i5q}zluqEuUWJ%HZ${Pbcg6R#PJcW@D z_jS8YTr5iv<#-_z^-)jWPB!wi8*Ox9f2qh$Fcktpd!&384V$JFYMOCV&5*BMuX+XY z>sNSHyJpR)sB^nuPtxFNQrq>utF|>UfjVNKB4Y}0WW9x;QcNy^NJArcCgQm=8w%=n zR7bon+ademx7xb}^(}Tc67sZEkGz}n7Aht5%ON)~6b{@#;x}#)T##+{UPCXhto`Cu zJCtL$%~nk3Q!e!Bk!D89X|jF@!DI%NY%-59PTpD7$!VSn)-vYc8y2@Z9oj(G4tH^3 z{JiSJS3lT6HD*>_Q}bbrU07{ztcL>wOq%~4 zH`j4NlgEQAg03Zqj$~;wm5*IZ8d%9@J*O~pioK_r#+87aLwM~n$f%|4gQ+0rxI3q| zU)t-kwNt8FG49M&ej&TUg(RBsdczXiEDek|&ImMMSL#6RD?K#xk>KyK8(y-=E7G2<|A?9|k( znM>7!Bj<=u$*JlPbf1uS_kJ87k?%c$ZC)8~ZQ&5S>$7!@h6XAOg5!5>N)m}Pba*;+ zIP{b9eg8C}4Ec6C6PLR@Yic7~X1v3Y>TrG6Ur=Lt&*f+C=UtMasDsK4)y3Z?18!XI zD>b+)hIaYMx+^+=Q}C&8FQPvrk?RE$2=FWf z5}XtG!T3dXS5P_tBh^<8``t1~t}gv3>xdDo zJg<4=y?5yVxVa#&$=PQ<1xQR{$EEm2ftOC;Bmcq9ex0g@O?736kND?nXjd5{xJZ`2<}q}67eL1j9{||n=P*)BsqP(qxkI2ra|6$RQE?yuYXczk<};)=z*=o) zDx?1wlebuHc893^E9NgfC!pq?bsu;x4z{wgZgz)aA6whnGlA!(D>riION-*3WOq!h z(4KE6zdcRj^1se#Rkp@~*u%IKi+w2|5J7OkG>AAN9N4`>ga7lr?`R4L9z4SQ7Y3&+ zC+ZPG0k(!Ka$Vq;L}eU)dDdW6>Uo@A z&nCQC-H;TBGtoB+lf;7pbHq0%v*+$RSP<^@6_D(Fe@>x5I$KPm25lcu(z>9&#)!j~ zqurz=AOXnk4|YN59z0otDDq>j%_PbC$5-@P9&n+~)0qVR)r(DGmhDJa8R4SqLL+CR z-E|NV38tExZHjbx`F?%cV7_8fZo%aj_pG6Htt9XQj zD4iT-tqfUDu?r(!8rRDf@T_GcI9Q&p1 zve&x-3W6GM51TPHoozZCfeR(|$K~`6$)`AVYY1x9uqZJ>+Yg#?Ei3pu$~i7t*{z%q zz(2XUx{%;JHUwxbTFzY?OO-q}4_wPwbNl(a5;=mq_I2K|vc4hBjCyZhVfyCmiJ?Ig z?SA;dQNe7>l&nsbMNf?M;hu2MX^R-f$u{$&Nl-T?0mf;QiF`wdwiNMrUKCsXl zAZ=aw^}&mLN`E9&?9Q#1p&w@AKCDu|ilxgh_s0YTEyyGlKSpj6Aej|+qlq6{eKUFH>F_zW$cYp45CptWWGV*)FfwFxnpAh1aA3sKs{Lr~BI1)=eAP*H4F9Dsv zil6Fhli0s4c-Yo0XmLNra>I-QAz|4m;D@HXv|mv8F9Y(Io=Mxo5>Q`G_97N5clb}YuIVL&!4u~828iq*JYeMhbd2eqdM5f{*X9T8H=k7XYkLTk& zXTt3Wx@tE-ICaG3YF!`GvRFNYEuNc7q3a^lgTfn52%#kA067+Ch@-(^|Bvds`6 z&LA^Ds@dxShchuy*!6E!~5SOjBi0EM3(ep;(C(BWoTsVB^_JY!@6jSFQTBN^ly zpFLi*gxE~nu=88d__F<==iM^TugV~Em=NCJ-~L|)&SNQ*RXSnXzG=jkd%1hiq3a~( zCG2#$ZpsOB_3QI90&rrM@>nSC64j=cb@a@}wjRkXznOs&%ml=t$$adSJG0+h8^cf~ zxT&4ULLBNe4!b}30_%#c=H3)#a8J^-B`2-%pho~-;Kp|5E zfoR^P;3hI;3+bp$fp&BQs{AV_?tnw?QT=88+ge>JZ~gsQ!PRAIZvC;*V&t~^N@_XF zZOZaN9*yW3sMp!xe!h`m0~$(gr_=W@&65C_CurMHh_HhV-^xXDKSF5C%raCt17_Z! z|Me1lQEeV(0pX+5{-K)`fIW@|PagyA%4BM{4!|2M?2aCEV1{+raLPp859>swG=5?M6sCDTmukeXY_?bsxb59LoXBSMa3BN;SB4j#P4^{UQf$ z{}tiudAU>#QvfXc%bsz%zmP|;@R_X*yrB9YOZo`4v4H1W4p=D***A+ojlO@^CY<$1 z7v++S&? zF3BMqXS;9Le*hgB`ipTp{tEj0Kyj~toKyxEzC^l-?&F z&Qmf=5=0cu`8mQ;hjL$VQbjPs0w6n9l|&x-<+E=I``7=xnFfF<1?#!_n;9Tt2ZL(hC-1925l+}Qy(6_CQ~6I+^A-j9;{8Cz zJ#nx*dmV@-f!kj+^j&qBUOL+F(t-$AE;V2}oTpiVSjAgl#$Mv{w6so@39{0y3jQqLsqKbRG*JY@?Uzc9L^ zum$^kO1P@w*sRfU>54j5lu`6H?pZQDelkW`_Rp|e8N{)_|GOTr+|IAhfmAo3? znZ@efH~3TqiFuvRwj((j-|ftL07{knwC0bSLlVxQqX=XJ^Phv8sUP4`r%sKUYbKPFY=n z%0t~u#;151iKL9Y*zrQ7AwRArtXD-s9mI{n{?CjHDnq_0W(m=k} zbLqZzJ+YJ_Iaxgtx+>hLrJTF`ojtUp=)nO10>j1y5ZJ~&LlTNXQ$lErIeCl3r!Ur-i>U3>;c)J!m-`h4w6y%l8*OdT_Eaw1yKif7?F<~vciFF z+u3^;3fk%bc7Q?dT)ObkSfk8m&5L1jPJlW-Hdf$du$ex7w_*O@(G4__M?hJ&2;b%Q z0wc?G=Mr)z!dOOdfx2Sn)g{4wmC?bSi@x)MY(^nZHc+oF?nz0PnY8X?74v_}D#B|( zZUPb?FRwuhOmbY);mHH!%K>tv1<4m0O zEOZb^0OlW4po9Es`6?=Tp;*(#|BpQ}fiIe4EV+rHghZl_sQn8C(#~3x;U&le4023z@}#0o}WEUlo3IG1bcM z*Nlo53*EZ3w3!HyPzzg^6lJDxa~RKG_j)e zyIX0;D1@Vhk_=Q6K^LxMln$L5M&Mjjg?f$KUmnFWbBV%MUU`|@CmUq*^YDqFscoer zHCuh}XaB{%e3p|mLrC%RyN*tSVND-F^I9BP*RAFjEujy)1`N-+^pZQ`a@c(xH1Xz4 zbaUt4-IlWQK^O(FVI!i_JsY%47x%xPv_}lQo?Ot1CyEIg1((S>{X$>o;%l!E38ps~tJ9dGUsHNHTUPBJ&>S?E3P;8-7-t$S!H9 zI7T}Qx#DeK_6jm582&XdTVRgrik=aOoD~mkQR!i zpIl2R2~EGf-y=x}8b#Rsm?^gkjx!Xp+^-V=W*RhK0P7&cyA*71Uxp;vdz%rW2|8}p z?}-jK5Drlvohv>JFrav4`uU)bLwfMf#~*e4r+khbielw5x7M2WO6viR(h35<*?)*Z zUJ6aVfBnlqg`)qr#wM_V+O(YKH>dcOy6g9n{oj{ILZ62G#Q#3c4H{=Cz?iU3x21P2 zVQneD5$@FulG)1?KAeFx8#)wCtdpr<%miq+-I%Hx(Gt^ z(%ih8TtoO(XMe?2kLJGvnf_vD|4P9`Pv39wS1LeJZh{A3VBXhUjOF)Lt$3u@aRPIZ z-v;SmL1r6EFZi{3Zw;4vPHH#QlwLOsY%dN$$6jiwajPAiUOn>)utVXr=zv<&z>6Do zmk_ph|BqzwT)_}RN9C8k0%x))bHNgF19rJG6Zxyw+V6z4g}&B717B{=)UeA_f4)0i z*6Vyg-h_GLWna0H8dAAUQf_K|^Hfu-d9zWG;#W2)<(htuBx_uvVs)|I}kU#OhkEw*4 zSB^51zc(oviwRwx3?vIqT9Hd7d+Km|KHCXEur5&NCraDUv;VF^XXENq6rCl|$naZG zi%87-@&`XAlrM?(0UqJl*Eaf^G9WiXtC$Sv2f-KwEdFr`^nwBBfQI2cyj;Z^lF z;u65q_SFMIgIxvvzur$cmp?_*Dg}z^gTpITdh@z!h<&M?U$tdDm$S5g+l3-8KpaWo zy^`$TUWSBCm+Q^;{Cwg_SI7;f*eJ!O`E~(w0&N*I zEEwoQVb*Wy+b4wX$m{vTVtHS%2?8jX>)yJ|2w?WR7oUT|t=-aew!!VW7n|LJLG)di zz2P5eJd!|#^{5NlvsVg1vvbQ0FZNzC4xE5%^Ogo&BiO{!rI&?W*_B5*`FUfC4*n0-;rCu%sZ;1{kb&km+S^ z@{2lN3$}sm6ZhxV=rGN1^uEDsS>aMTue`A)A~*u9)sFqjx3=W_v=;xZ8fC};BG^Po zp$3IF*jQ{WU=FTADA}b0%I&|cARl?8cdjvEGmY39Hy_<<5(L8p;jCbn2Dj*wE>*%n zCtV1%I#1u~6oGA)Uu=zYz>Fw>ecWn)cWECq{{QMsCwYb{ZcmPB_9$r@u#hGOXr*j< z^;Cj@2F(n|2_cd~Pcg=sC<(p_1r1yGOXk8%Wx?Ox?3xgFmLN$`r7}3OgCu?d1D!3awzzamtdllLm zYdYLaJ3PvB&`;H;JTJlWjam0y{o!TZi+I;tfU$F;@MQO_G3)nA3BtpdvswL8NDKRBRwf0!B)#e6Or9*s9UOYak4)J!&+}j3h`UY5rYdqfk}v{LPvYQr=FU# z}*Qp|$%7@^1peVK}=q57FSIHmPXqR0u&;TA*fUBVDx9PuFYf$3fX zn;PwEjX&xL`lg*ysU-_!u@)zXEW{L`Z! zwYKa&0ieL;S0)s#gf|(qe=Lesh)!BqmR%}O>)4SlW zkUu3smhJCvv)xuEK!bJ6M1pxaYY<==S%pA=^~W2C>NMJXbX;(^OVjzf@!P{}Oj-&c zUVA8Mi+73$UpcA}&kRT^cfi4=)k~88sf>!&RX)3iePXEs> zrU=vBRqBRUA4Xv?_T@jEiX)1AbM0`}J98t}2X$?vLo1Hb^WL~zaoIUZ3#Z`1*xkzm3Zg5tgRQ8>T8%VSaX4U&a65ot9<9qWCiU&UOG#mb z;fYx!Ma>whe)q&KU(nlnZ|bzSMSuBPA29n%hUu%(do~lEp8|9H^4c#h-h7>5%5xrO zM!_@X7DmoaoUCi87Q`E$P7>v>S+Q7N2~uF?BJD*os)96s=!;cfGv zbsfm}a0s&|P}(Iok9=szmnR+F`h}Ed1VM!k3ztKdnCd<8bwFWu$33`+|vrj6}U`Fh_s}CEY z5UBg*H4oOR1u2jea&>1tAg|sjS(^3gfk+VWsxXLdDS~)Ho}_wP-UKb`oOY#qREqU( zG`VbS&qBofD<$ZZDiEb>q>`tWWYdIC9*cDE6;AMn#V?$hTK;qb5>iAHWL;5(8bsL`-wv<0|$mmgB3yO&^wo9c7x812^Ba!g6D_@&k7y zlc!#lo<0JGPvm&iQqe>plz&Upyr4P}VNV)vtzp`83lfY)+_m0pu`Aw>%-&+byrn_4 zf;J{tvvcOBmS0$)uxd4>w4BG*={+f}{l$IZ_@0Jm%HWShC*4Dz9bA}q_x6-6!ZekG zaj&T)7Ces)Ghlp&CkorTU+pkP2(-NG$i~^>8gNDiN^$u@Ss?Jk{Ge+w?{s!X2-EL; z`sk46XO6tR;pKFiHUr4A;9sj}2N#vCx_-!xGi)()!eXz3!%@9Zn3fx*R02adY2&u(TtZGTqK6hl>^LrI?2AMx&X&-@!AQH zA@|ft%v8Zb3Rqx?GxyJ~(1<>V33pI<<<0T=K zHC*X_=4{kq=emnrN2-EXVFpwo$sV4BN&c8HRR}%q>5y!F_)t~wMA^&rS;5fPFS+&+ zS-VA+7d^XKIpAJ76LXOa&;I$e{Fr1b)twL2839J`yUgWKUN;5a-b8${b2-~@AIAja z$}rf;K+VZ#fJwt1-6p+pB|Nq=I3QDaN5$UL-d)Ohh|r^w)XSWcF&?PVe8~-f3E)) z?yd?9hx~YaH?ntq90gBzkevySc0Bj|qJcy1=|3J>#G26pTLQkv+eiWz z$w+VUqhm}PJR)}>kmThMr%MethjnoJ=KVQqD|9mw$gMT^XotHp{M#tp!y1h!R_)X# zB?V~#GAV1A_a1xo-(y}we1?7Ob!@X1%!u&e_|(amJ~*O8l2|82cLirPRahVZGFzj`+g;m zd+<8a7ECIPu|+za=CPr9cgNQ39Hf`eHdDbw>|$Bbe|-?Noj?e~d)j6{$eExD$~~*d zQ4^IJ>Y2N4>l=H#z|GzF3LdZk%81pP#l4j2yzXS)uV&rjZt8s1Z&KkQlez9m zqc8(OAHmZz8UZ|Tb%6U?j8oQHR*W_fbD^gbNDKRRl5-A))5 z%wgJQjW@vHPhW;gH$^m?Tfj$=Zcg8jK%EIAB>&!$f+4u2V2+n<*1NnB-VTh0c{Ai_ z+E+NEO(#FRuL0Uo%ix9!-42b!bC*-);=4RBGu$#k7+!0d;oVmJNeY$R{u(?Jl>Vu? z!(mP!tmztQ-XA$~`i|W3mc$`TVu>eP9dR8f;4QNIRQSe{QRcvJ(2RD20 zehd-N?VD+FwO+!lV)g!f=&O^($2-Y5!akX3d^{$4jjt>pLkd!qyuJ_K=Yi2{ng4Z% z(@^jZp02VvRChyv!^L&c?ULiwrXU)H%l*RITC7~`X+P%t5-Mp2ge;QJJPV-x~ywRthsg}tjj{>Id{h>tskBUqagH1Jq={bVsLx)|h zNf!aS?7$y`CMpHuT7sq5j1;WJ%b%)fq}@OyzA0k#_#K9w$@t~P(oj~E25dUQ>aTx; z2H`{ud;(3`1N|2jEL1-ygu1cVl!mMa6nB%-@?qGl4t)UZ!~kiwFB(x7x4{Oai&g(@ z;BunTCyk_PL~(A*y|?khW>LLDmlwPF}iSB;s)Hzj;V!NfT>ZZJB4#S-wnPzThDmDzh!L<4txK_?1~*O z$P;K(LBPD)+FG_093V)X1cs~qKiDWp3psH+&D>7Z8YtGOQSi98!6b1{f&VGafJTcA zt5S}vZF~(|GI(}tedKS{>44fnZ#B6Dn65VXR-b?3JDn)4zHXu*E>^yyj{RD$qKW!_ z1;}xz$8I!Wz|D*KasC*e_ch=`3H>lg@#QLhAGB(!5!H^5m}-@ETbYihyOzp9Ud`%$aA$dTAzC1?5CCsjk$Y{dQntw zb2&AWCBPT zy0Pvdrl5Vr0)CRO9hEfbXicq_+1z3TG6!tISIh`n@CJkcDY*6T&d!w!cE}vS3#8jd z^jaJ;dUd06+>1&P+qBv^$TSS~pBY>kSC{AJ=Cl~#%eK-N0boY~euIlYM^i!YSO&$H z!QDDPQ-A+AznDOZv%@ew5yho|-A8b<9G!WIW1JKyx}2#ExHj9QvMCJ@91%@+^*@nk z8Dx+KH+B3?@m8LEnbfP~uu(4gc5`bC%b4V~S{BzUpxpLjH3hQpll7_2Y&NtY@tr^N zo_+`9EpM<-QZ>-B6Fn~*eU{ueN2ovx|5YN#HnM$2`j!I&S-X1)@=c2J~1exUKLEdP2#?%vvg@ctw_c)aV; z?OY^E6y%Onc)%x!2ndYr)|lc=wj`$MO}&r7^PlrbZcTpD_2nmZ;ad2Mf3APjtox*BsI{^v2FYHx;PTVn8dRiAI z-JVuNWiNUjj_^J>)Y-s;8G^aRZJT~mpjVrd6I5vpSHnR+5j2XSb`h||J0bdGz#CXSH=L8UG?D)^0 z%ei1oe}CrT$qpSI!m{{gX0(zdTdhb#R|wp>b49kt3$#>!8MyYnez}K;JKgD9)T}PI z#dDNdve-*cWiLQ`AU~xb^EpW+>cVp`RAogDb_m?FI3$NtV7E&mwOc=a0Twn^#cloF zpqMae@E@yOpQ8CI@70rV>3I~LJk6DITd?13ttG|l-K^hL8$|9C6N6RQH9_ zJow92tFmX|irwwLotmJ^2}@_h&lWO82bcW{`uzYSz1L%dZJuBU?c(LxOmxMD-0SDszqUS4k5LRlEvc2+yiW@moI4>*rUFioTkQRD{$V%-6ywW=KRB)W;Pg zug=g_%cjDu=q<2W$UGQKW>#K%_39EHy1Z2M1q^wuffrQ{!ZhN3`h0#<) z!Xx>&CO?f59DF$$`?OVC?8Vk5;($g`PonO?%@e?kCK0HpAhuK)VG`U?S7J@HfPRQ? zZYEJ-4yL`)F;rYxe;y9feW&Q$zL8zm(b-Cy-u^GSd;aMf&!Q@+)shnffgJ#mKe;l) zOOkMYeQ(xY|Cbron3jq0M!9_)e2S{d!B>weR~B{Dy!qf~Op^uRHxYw-h4>U5_j5GH zG3D}q23B;b1wmg+;g7`6u>!^;(<~&;sEGK`YznDCvt;y1U9Dj{(Rj=`FY%ko z+C&y`J}7$RmJqOMV?m4|wEF<649BthEfXc^0@+grPNt@0BNq_QG_%urOF^5Z@QJ?i zq*s3E!0LJ?O?P}{UBPK1Mm=~_tqIh0UuU|6Rl+aQ#%d`#nP_g0Hx%Igv#6+mz--N8 zU1>_9 z3>3x#M+{t#NNlEtu%PP#Kz9esZ&BLL&Q9UC!gBd(`N5P{Y0a1K@o53w^sI~rDedBU z63@8!G@93RHHV|~98{eZ7jU#|7YWJ__2DP_dQlspx#c6^`bqw-CqvInff+Uc;dOwn zCfUYLk@hqYB)H1qCJJtaL*0=ajD7JcdHq$-qDW!6$P+OV3K21&$;*DAR#i&VFLAwp zff3M4>uQsgY?(9hA=Rt$Hym#`i*9U!Ho&+9%^->QzdPWb7bg1RrO1LN5XprznpNv5_djCz3b=B|Jn6X^aKDYRMrWBzQ|~ z{k+?Bk4C`s2SV#~g=&n-W(bw!S$~)Dla}@HPdUZtm)AT5-E~Ho40$X|=>%73ehU{Z zWK*o`b0>Ed$UXMb6>_tq<-gx8To-Egyk~o7``46%o-cTzIQ&LM?H!M(b=;C}4PFC* zT=#?7WN+w>zBfG`ZJ&Hu%V&4G!&D-V`9*+n`@o&d=K!`8je#N+!_QEQGy>Ydc>}TQb3A1Ho zjamo{H==)h2t=MyH~Z7a9uE}s=X#@yvI*cb#l6}KeZSO_qb>r4nI={>1egG?8UcKQ zGpy*=i#F?C`K4gV219;jU$q*)SbmO1kJBpl`pxo~6ODQaT6WMw;Lc|f4^nHH?3?N- zkUx$q9wM^5lXggxVG_ZYFSm)-V!yz!X}cD31VD?T^Cd6I!5A0}_5qaL;kX1y=M7$> zXKy{rYdsjBZ?i>)CCLH9)aUb0pc<)`|2}ZaO_k zT<;{ixqqTwEx(Co-S9SBmVa3f&bPK1Y`N@lQF<7V+sOoe1)?WS6DB3jt+;xhGx;>% zt7k`y=6pV`uPsFs)1Le+#A9*RQT@_rQCneO&_t%C8V`m5zwH+>Oj|=)x9hLA%x-$% zsRmg#um|F@>XDC!XBP%e<;O`3lsPCln5g3y zOHQmm#-DSx%}QxC%M6uwHEwSMBn4ZzN5rQ!LUVrU6bJ{@Vs9- zv|2Ggcy`XU{5SX5I|{Ro+f06@GSnAZ*9{YbqNMq-5L@9z!NbDtGq*fOW;UYW(YRJM zb6<^Il}`JWJhopRmM5y6Qo9NR?)cS^sko}5b5JzlfLa~a3p%he1WY!*ea=CouErZ| zZs)nHWtoBvR`tF<_blI^82dzjGH`mZw(thmq0zH)SV{0K`IG;!Sr=t^*%d(COmyiy zRTvw&vQpL`d}^JaUk?h&>HAmB!YL9ol{4|d$}_TqTl(J}(*n}pJm&em=*8nIjlH=V z&>;Vi_~W62MXADj8jl_1F6Hr55@$tXzIvuPlU6tC0U)sP?S48u8;bgc0Ul;OJ&x2x z19=P>_6syk5!H4_4_-{-l896t%@GvWS|DHg`7lK)v06%0`|D$w>(TieD3xz^W=#pX_Lw6<@xAsQ| zTo&Zqz>E1L0$1>1j^JHB8Jrn%iLH}rvQU@BgQe#9Glmv@1ui- z#SeyNX8?DW6V7?iZ9S3YsQW8?^0214NmdygyG!+nv@{?q@!5SkOseEKP4i5p`BE*M z1g-WBSYwVsn>FDL)Q?QvIDVF*295Lk7!qvMhkE%;a^dRgt9sndav1x)krfFodHu+A z#`XIkF|7TZ%P4p$eP>Ae7(hnZm(sW4P-oxZE1F3rCIl)!R$HWBUGe0>*Ylla8?XJ$ zZ;1VK*9_T>Eml={JSyQQ5P0X2-!=!0u2)xUj@Hxp8%37QO&kwrn4(R zU0pl-IMRh18q0_`Dc?63JOpplcY&OT7|_lJ-0luJ08CrHyhjKHOG6*e#mNSSuv{Lh8ph!}OQB**#acL2>dj``(53Ja=t{zr|}d zkMSyckvawfG`eZy*;~vp&<is{)-a4wv z=-V15goCt5NS8_rQc5=>NVlW{(x7yA36c^b0tY0dL6B~c?rx+HAl-G&w-5fteeWIP zyW@Qw!+#u}{XEZ(wdR^@uC>>v?$@LR9BZQ=6oPI7xS-QvW$7}%4mmC5+mgQdiEG07 zzdIWPY7hF72MgG?dx*0VNa|8`r*=S6Nj@W_Fd`pV*f*CTtcw=``4f~WKmkvYYRzF5 ztkA!nOQ`v5ki+in=qR)BOcTj|W^;9YRhyqs#Hmv?*1H-`mjUwi$@g+=N5>1piM<4x zmQ2j)cWtBQ$>Q^QMLdg<=e!bx&z0?upJ$Xd7lW{P_daqH&!Npkdjg%8e5IEtKa(%@wp^&8?%Jr*?uW}w`UE9j& zv%c0!!15rl>`gYxKU1|n%OA;gNnI3ACjd+j%0x(d8JeDi8$X#MzGdzyu31WYnMb_4 zflr=0)9x7tWsS8Sa+Il}CAsV~q#Abz<&gx@Bq>0fO=KbA`u^EeTLKT~&1efL9i^DW5@ z1+sc5IoC^Ta$xZ?9IQNL4q`1Ax$^J8_zElcB>?tSvlKk6DZkb-eIs=|eWQA;t|s~Y zcM9|V8lH-lKoW}_Ta~l#u=7057QHPWxgp=T1??G!a}Q@AYRuxSM+uDe2!^t%Yh%#fVS!_19{PghbZ|USXRpMh}Bx z#xcP`FH3@kDzHk57k#i@{L4NIWKJ5XA2xnTs>6#5Eaxr~NhR-;a#zV-7Fjgrneri$ zesuF&1~{#LSgYJ^)Z3ux`c5;k;H|k?pC&Rze`m8#Rg`B2natsWfR3MWfb@Iw+m;I( zktsVR^LvUv*r)CFPIw8t+59{6>ILbEWoNA##%7ydn-9-&`IaysK0Kl$wD!NxUjMU` zb%4r5CIL`9kn6HU!jVCShdhp1BfrqK!DV@ghyiu3iT<+xP3a*HN1=5esteK zYif&nwP2DeRBq<1cg&O!!{8-8fRdU`Tt``V`w~*HG6C+i@)p=(3d1 zM$-x!N?20?S5yjVKQX{#QNmm>CCdLwWrs# z8zfj@g7|{mi6f8X6UQJl(-YO2Q>Z9~pkohG{{5$( zly>a-fUlAE6d@Ail^j%Z3@u{7e+To9TY#%#(;08zrFnyu&uCAsErGz+{i6Ep?LTnw z${=oBbBg5^a>n*Sr))xepkj1^ojFhAvpG_RHC96jH)0v}j3yFp?Et5*^)}BI{gG4Z zv}^b-Y3IOKE$ z$mY{OVsvR0b1Z-p3&wU5wD|&0TKp)+zz<> z7r;8+qwh0~m|QBay#fs=#5G^@^lW%l`uQ&J&Q3$hTz)u=>40)`KY9Ry=z&TLc58#M zi3dT^zf4hWLWHo(iI5P2#nkqIMmg0&yS8158wkSD^2!@wdbkYnmlCVjRlM=p8Kk-?No6zUpc>f8%&1F8hpB zoA#S7Br_I|a_JOPUby6u`l18a19%l=Ka>a2TFmc+3j1t-#-|%Bi}5{Hzs0xQ#_Eqw zVsvUbEh;{Xl7SUQq2mD7nd0?_lpSfqWEZe$rbuXKGecnUF=khUim==c=F+kpjVk9C zM&Y`05|_Er2yG1!_Qb3Fk%ei(EO5F3sL5#wpG8?;rhg4fsA(dqkk5l$3ZwOsS;#6@ zzPz6`NK;*{b)7~r%t(#WAh_J#rlDe*MM7S+wvRF;wcoJp_Ytx|__N}``V z#9Dcu4=cV7AX@q+JsIqNSy9)-fY$?Fh6d9UvD9(&KeFdO47q+-j7%7pdh2o0u*I}_ zl!1qg&jf&}S#onj>iE$t{=*~Alz|{s5V?V?`b1(v&$5RsI}|*pE8_zwwtL=NSAn8Y zXFeBHj7`4#a9lNl2)1mXqT$`!1`0_$6uP_Mt^;Cll-yn`7dm$t6y@9ni(!Lj-8(yy z(ezSckkm#ReC55Y!5c?Qz9vJglHXT+QOGK|6!Qr30z-rgO9hN$iv382nze$!8{c#q?2+1@qI`$nBC=-4Zk5a z$3eTM%Ho*>^;=p?+(gmRZab>so>)>q1xPp9AE5q^-%K=1Rg|(hG67=502$aUB$0Y6 zwP<4VWj&tF!WubduP51)6i0e!P&6Rn>eU(uOeA~eKelk|PSe~8P8F%%n^=~HVYK(e zeTT#Y^z&BpIJG4u#WX*ozz(26;$$5XG+tPEsJZYNt}(r0h&JBfO8RHXWWWo|i6vR6 zav0Aj<{do?=AMXOuiUNH1As{mv40DgtT$_PK&F^Ixl>DX^ZMn}db4nsqT1cuv->FG z+Q9HY1%k{khJq47H#-%Glr>47L6vJT8|eA>Wp;Dpwd;MNTyWv^n}~Dg8N;T}2q6T8 z^@xEOgOA50x*)aBI4-N_n z1voDTLvJ~c>nW_m1@FQ-+4!OK_t7g9Kyb7*v7`P5XD>i@U*-#65%BJtfRM8;&B2xU z+R;Mg3WQ7-R)>kF^Dt_9Ri@%>_C)i%L1jObomMp7y@L-+2`9$UoRoS#`Y3+S!TgfF z!_0Gn%Cs4Ruxv)kuaaq4%1JAl9sM>>dq$t|k541LBqOZIx|0*|=*Y&yb`GcVhw#AW zx#Lc|(8p}uQ6h=gr6{SAn zt`a7hzATAVas&9bOylrS@Q6sB(>1Y1p87}DJx+RO-;juBY*Q16PrGIsJzZbOjlDc5 z7zw}xJwwZuVnt@f=E-jAhGfw;ANt`Bbrm0et0+Hc}+k%#wgx&r88GKS(( z3bsr~1q#Jp8+s%4h2AvC0FIdgD$Ysk4EcR!lk<1Wg$j#OoSq2;@daN|aS%e)0S`Vp zsIwdeq;jCqX-+JsYf`9r1JOAr0-3gIu_}u=g-zk8DgDR8a9O|ftF-X>uzRhUw&NI&gP(i zg4@x8D8MFfUIA!$6hN3Palb_LMy~Q`4b4~J`w|Q7>`x76oY?kedwN`_Ha5BTjw;;z zloaod(g^NI;)CiagH*3chb9w~J}Kt7-+Q$P!@CVefN%PHN-oE~4g?=7Vk8M#tk zXT_?nJHu-xQr+J89_d-jKkv~VGxyvE_!C?dZg%wTrm@pCsOpvcD;E=kw$_SBG^cRD z|N8yBm}t7Tprx1CV*QO?a&NBv*jvSUF>OlZjyPCO z9=+K^x?H3#k(^#!Du-UUEszkp25M|*ku^4?7YC7nzY9o<7vI0nmRksQI=4HHiurNB zNBJ@E0w7HvdTcPfNfn8Rz!?=XY_)7Puc))>ayuw(CQD^MTj}=xFId`M{EDAMOwcxyDMD zpgm28Paa_T-v6t(Kd5ajPse(ozqCh*n{PS`24jwXYa=!}^GJ77kUHlPE@-RyK`N4A z?XbjJbn9Yt3=_pu(k}!T_`v<=Ihe3~c5wn(KYkp^iiR6xj%a|kMlGE$yQV0`RxL8w zUiMn+^iX#re}o7EUW{uewRffD**gCeATCjaB)~XNdFZmywdVMflUEo)UQISKM8j~f z&KPYNA?gO;UaM{5fbJB4R#UJba~&k@;q#8Gn3n-Y z1Qj`VGN3&e+RuCna9&|fTCWi*HlGx0-StK~u<2=4Z;y{z)&OviURVk7Q`5{6?eLCR! z?Y0Njl5TvdMGNYbK_AbOP+RZIo*EcM;l`nib_d_|~D@35FC=N^U4D0f<3$#EWRjY5GSTkarO@^F#~DXag+3W7wFpf|U3mL#ft-r*NSNu`6>*8J?n zjr58Y5`h6VK(iCp&^{qe+K1UkI`R(OG%xR|BI%wZ$eLB#*VYi&(Tn2iQuk9IqXh`w z@Zwe`$@N#Y+ssorO0 zF^dd~1G6azygR8*-wf?JF)VM<$?W8qxvsYF`HNDI2jcg8&TE~4@CStl*!}>mxpzXb zzCNY^APeJz7orslmBCX!uCnhbti&4j`2K-VBag0Vi~~^8OQBCnTFH2!=w@ESiE0Un z?oWkKzJoE)Kw#r{4=~3rX1lAVNi0Tq?RPZnBSW=5Lam&N1E%XriviB&{Clx|1Z2jF zKrdnTRA>gtrx|(QMX3O}Mx76oe^FiE>&dEQ2NX;zjWuiRuK)fLT)j5&fI4S<{)Gf+ zH&#<5bo%aEAN$$$04GY(JjgaLP}W3s%*3Ids}YJTU=78sEP%Q9r&Ll%-)8!^OLTlb!Iw{Il)R}ZUiNBq>w&hhL8}GZiVqzrUieYF%m=3!4oRRD- z`{2;_65!&-c5${XuQ{lJP`(*>*+-z?7)quUKj8OjaMoab$a4jb5C4)a*UNOXe*UEV zdn!q{tG~5+l0ay*jaU_YOB>^X=a4U){RiNj*?p`v;YB(!P z0NTBVUR(hUG`M>raF@iQz*_9r034L*fR4qgOm#ZRdME%oxqU=agG2Sf=>EKWlO2)RGY>R4N~r6zRlaO((Gr5UM>8@3xFE{1 zTlN#^Q1VAc0T*~dC$2yTB05Y!<+yc(&qD7NGQ1p>BvI#_hbUF>awqeV*h7=nMsWMfrS@`GL%i6H@UK#&H=2|mUG@x#~6NPMwF`|`> zUcEpOHq5gWBateqT`=-H?Zmq8mayk0ElF?s^*o#PX4~BJW-JNi?_JcHj@vku4kI!B z15Q;W5{SPRpY|##MW$2_r&D@;!O2fQlR)9dB1ymNwaCaZZ$nG_%%0C;3X3(qB7JG?2D-gS4rydCtjjmq+YRSWX zwYMG*ZL{V_w+ps(AV9T|=6)T~e4)*JTT zGA2YTM1L_+XF@>NYT0vY3(w5ozEeu8gh3#pm7V-5N$+k1#1bI1WP*o5w`e=E?tjHq z)=W5+(VV&4^Cc@Xy0@`+5xC?+0@Rsz08OJz;UQA|6Kd$yUwf&nJjbAq{yTm7vzQ&k zR}WjmF$D*uHD5Eze`zE|3L`;W&<_A~3@K=~#z&JGY?$mRadt93{v_LC3;%3RywcEZY zsm0{ju6**o02%rAU=-W?*R5e2X%cUlB|uq{4+$q3zGgr)SkvXa?ZxX$aytd$`P;w^ zwX3(Yfo!{nC@W#MHVJRx)8h8H+-U4zYW4?dJy31%kNpPa1fq>RUObVbByC{lf1nqi zMQPG#cHQp4RtBYu*xuVUuo@cP5<;+r(I|OOexI)bw8OqQUU`PD*8M zUvX1JhZ6too0EmgTf8Z z9H=|;PQPa7%X@CfB3JQwHsDzZ@z5%Q0SoV^5d+O`MN}G_*$v^|>{e5F2%Fv&VOgoz z(?)-$4X%((T=>!k5~QGE`<$#6?579T@eopUGdh*2m^uFEzRYH)pn2+z$U+dgc5^X z`qjpW)h7cJUfSUN3fcIw?YO_(M=<+(RuLi~0L4eEkOA`tn&^TSm@tKu|47Y%dF+PshL9)}~rDtLk$_Z^Ft0~}&dzV8-i3fSRs3y`zD z2*0c_K_*Mvo05FngZf1&2#Sa#S{}P*{7u!>PNXZEn*b845^&>YGjqwOVwdm^N?Q=% zpP1cp?{`ODe(Wv>q~KL#$5D@KWs(+n4yZNo2Rv++k(vV$8t>ew$J-*Q-GyoCG>t@) z`<0dTc>KdYR`WN+R<|*niG9al_Md|lNK=vuL11jH@2~|^qyR9zIiEHnqP7=@++;N= zXdw5MBtS}zWLPE?aAG>581+If0KT&9p)v1Q5%>M{nOO+Pg}XLlSdTF3Fhq$JQP;=+ zwuS@x%ZVCGlYqRyE6jBRblFPUFRu7+G7okWWzOSg9!mbpHB}>nk3fj5;!g_V9Z<=O ziO_p=+%pFl^`Zio79|S&eBzf0E%m4ZLZ!v*RnE%hDJ)Cm@KJBn68R(v&6$_HIp&7K z*;?5fPS<&r9uG`IQ8?(3nVS#i~aE3#%c6!doDV1X+#<{mgVpG|B?8{b^?Gr;S^z z2UuLj)!K^%KHS-?JG%)a5`srG#q!azny*Q}yvGJWs`(`|h+~1GabQt*z8sWrs4_(~ zT>L_@DeiB79m?EXZT5k>uNI5bIGo0ae?elUROQDl+ng!@q`J!c`A$q4**o~CuTenC z6ch~%#o#w2@=kZSNOH1<5OPF|_I|a+&(qDqw`QpJvwU4|bn_fEhXF<*{B?qoxaJI? zH!%EU+EBhF{f+ySz82`T1Y%3-%ncWK4b!YuUTE_G;0NC)2PoVEIj^zxf4LaICo73W2;w3NP{WD=(icu>!q_jiM=1DX71c2fLmlRn0>v8@$kOJ#oPQC=~W(O62{<|Q75t~dRQld{|P&Z(^|7Z^_ z3+D#TeG^1%9j>pr`Qo$o0_Mk|qtAe`9XC_#)qtz`C$`NgiA~m~_~lo8wrGsZufPE9 z>(M|(GxZ-=Kn4rGDySPA@7EmL$WS+SwtLwix*Kc)I_HwQpbZZNd;*Vu2;K%t_1*}n zYu+|gF+|M(1H`x^QnVPhv`qUy`-Wo3E=KLXf2JULAf!vAzgzpeZmyqb&mq+I?-y{9 zo@K%7+9KF4|G5VwBtF(SvJoJWpt659?Mx^=~h`Gch6Thj3ZJ{bPA-Loe-I z4eUG&T|S=HFB9$jKBY-AAo}?`&m^s~&^5lnfrfcSEDgRmR;Ij?8hORubJ5%(MtN0H zvv}atO+MJ+%T9^-;BMeGRr4n?Uh@KRbogO!#@SFx1Kdbl0e`C=aiFZ0ik>@lYMb{{ zW-ufX%V4}%a*}y%5k>9ZHIAFi7Pgba#P*YJnphj5!AhJb-P2F%9@hP?t*-vfqUS(5 zqb`*$ppGBIl?=tlAjhA&UW3@18_IKiQM>F&pV%r)=pf#OW)`|`uo{)@KH%9`MjD) zmt0ixH_pka6M319Gl#nD@P1`Oj4rlxz5FYIDa6~-dP8a_Wx8*o!$f=ygoNxCP zO4&2+a^FmgVaMu_^_ORKpY={>X-uUg_({s#=Y;J@-}l}(7~@#EDg4_cM|9b~qs0+A zDcrw~^6|8HATR2V=4>FMpICF*NR7+RthxjK`?c;{N5K`b&cON%yp+kp*|Oz2vS~5Y zhcB-w#b17SG^<;sFg;jJk^L%5^`|Ht@6hA=3F!8REluLY>DApk|Dikf`@Z0+-%MiE zl-6PE$AXGn!grq?n06GadUrtq($6$kp~OcMHE(?6_y_DP?S3L!B?*4kX6H~^)@C%O zAbM?$yhMX;aNhrPn@UuR%`F~{rcrrqlVe+q{sZ;f8}w8(lV|uPR1Qnx<)f+@9|+va zOh1345_o%9v(}(G# z+bi=WL30qlFV;kTbllQIxG$}~ z@0h3{MAT=iA|D=jMbI0Q!A)t|vW;Tphga&a6cD>DRxHDhqsW+vr|csC1@9=rv|(jw zPKB)gbw~e)@lK9$-zILd6mz$Xm$OYz9J$`wZ#OXzc$TYkw66Ao=Pw?J+B_Fi|c>SBP=<`P#!AK87G0yJP-wn9OO^BcJzxGSDpK6 zK2#?^4Zn%lr|E1;s$-0^c|7sS;{1eP5aM~m@1&5dkXtfouD;1XN;HW&hJs^^euMUX zf}psD#U|CLZ(fhQTjML<(b3SLj!>qd3mfs;iWZFZ<_EUu8SdSbpGQ}5DM}^V4yUhm ze7H5~;iBJmxC(e)t#ZolGG@IITy|j`eRRqxFOJV_ zG5urb_aJSAm2^ms-77G=RMWge!q7o0RX-j$Pwt>YZkp@&i#E!r`CUOgm#-t1j$lH8Pf7I5{XO}Q%?Yr;Y z-2UM&u|-rPpQrj%?UOgEObuNcYv-<{_w1vI?q$V(jjVc(DzoByvnXLbFptaDqLha# z0R7TT<6G}>)iIB4`sHtA_XQP`eoBZwyOg_X z@{Q)}FOkQ;*f(DO{d~?OKsWT_eqjJb%&RGJ9>+6f&eCI8D}2NLTd!gcr~$nH=M@xf z8ppuWp!nuoDWNvqH5D`U*l?!i1RgeTACqBspe*1Bjnn=${#kEOcS{gMa99}5vg#)p zcUft7$w8NKQCXMTRi%(qWu9`^oA3o?4o#2yTZQvk0$SlLqmo`T9`A`2u5N#7J2FR$ zD=LFAzlTFU=pt`swbv49k{7QAZiE!OH9B)PU&?k=kWW_lOxrs&y-uex+Ynd9A?QEU zcX4`S6ugj`sy2Woxi~YHuYdJ%r`PrOq%^zug_H)+jfU<-fFx*e3q*_VCocCnmD(>e(KA_S>s_h`T&La|SEp zh+}9yC$F&x=2Wnj#fD?hvA>+aYptq^7xJV-qMtoH-ki?3aIH=4cJx!Ce*+7AKC?fX z@vXD!n>7NKagAo=jx;b3E>_o6s}L&ny(V@jN3rN_7)WR(r#6O^mH@z-aG}V=M`gzIZ$&#Da za3dyjgTL&GDGRSk!1k{S_1VCCo-m`i{bHOW0R)k1OM%r;{DdP}osz#CAtF%!^I>#^e38^W}!oH^y@7D-GKMO9S-yIdNZ5b?|r=F+G)t zJN#U?H(8i3V$A5;pgd2aSiO0+D&>Wy4i$G50a&7_rOXC@UF;5?XiKrD5BMO>_0Grn}*dDc|G3~=i``Xeec#*R=s0ho>$kA@U6zR z$Cz9C`e>!k-!8#3a_3^JS!I%?6n)v~K^JP&5adIsXc*%dD!qj|di<1l)n&F%I?gi& zQ3k1pxW2ORzlMwKp5`kL`5_S}I&<)y7#v9BW2yG02e|3iBw}e3E=wgg_@t88IClk% zd5$F{C1_1~#!#1-jnK0e#G@B4&1x`0-{C)$nzJQ}IKtNmJ)G}2DY@BHon+yfZIvn) z_MH+8X*9q+;G{9f$NeEpz$~y$O@E+|s1{?&Rr&kyl&&|kRXrh~lX@5_{Ao`2 z@Vd0e_v$%+sOi?Fb%9bR=MCRiu%-@Aa+n*-34=&lq6IWlKm2Y6`vq{rg=bufexPFPbK&G z7+f?%8;|w_U0x*z6AM8Go4(3%zo|Z&r8W%R?`kF_bAhB#!F1c4WJEeIJ*ZLOyfyCr@4FK2?~n z89jvPu6NAOA;=@5Ex)*|64X{ZC>eEHs%L9u$!QEdk*p%VhxexQJ4ZLP@Q{%#po@^Y zW+M>TM}q~%hl;{5R3Pz>o$&}A&>J3_`V8z zv`8g9Xm4_fLBA_bn?-Ugp)5{46dunfUX91AKyexWvK9)35b!EL`Sm#I=I_$?(7hP? z@DR~&zrS~-qzQcDOL|tLw0ZZSgkx1)7#3I&BpN0`Jrw7}C;p@AeG}aAL}JxXNa-?T zvW}+?K699I7J>kFv@Vu@*+>lEW5*J=w8jOz_NXX?`B-8`l2#guZ=sk^LDz?Q+3?86 z-k`~w#3-tm6Vd?Z#h=n=3)DWdd*E`iiUp4ScCUnqUk6%>HTnU;r%D0w41y7wOS&=C z`IqYGLFY8Er@r__m4{RI5nU>wSs9Doq<<+Mf8=zxEEDbTZ5+4jvi|N`UUT@^9+A`c z4Sf_rC)JK9-y}lB57)dsn*_cRX3wup@y}OE(Z(~w0*QkKW0-%SqAfN0r@0!-Hh!G# z95Euw$N0T+r#rcOMYe@1O2KfNItizS49)|6oz8RYrPenkl4o&__g%v6c)EURGO~Ws z?uD5-BI~Urxwkcb@kH6%W*KnTIyfHYF@fRsdQR)&wY-~qpR1#f9XOq8pq@*SH`cx$ zV<&?jtDc)04un~Jr~l|X7zT56ABbIPfVhsv`KtYb-r3!vq-gGt2QC%gLEHcqNCfeY zsa1g(;_`{J&pjK$e$>Arxs+NU9i;3p&nA{9W<{H-w^BSJWFY{XDK zSpS-T_aNP&3-uy{K%V?q!a<5!j(iM7wAv1;*H<{pdAJ@-(5m-X0W+9eEW$)BX9Ilx%T^o-zd{4`1R@lEkVbopX$d0Lm3h@ayI~wtp=26==i8XJX z=P#dJgWQWRjh>Qain)`{0@Nh0V_szs`V-YC`10qr^(5OA6Sp_<#h^O?OD%dVaVSpB zMQi0JQf&+Ew4+jWpB~0g=u+vx*?yHMk5PayXwq3BxAhh@bWA0Mco%ebj9R0ghVHRS z<@|gcGn}s<${)BLU2%Vx08VV1u1wU;aYjejFWV|0YfV&PM!$f;YQ=?su`e1MEMj z;A;%MgE&fQ{2CfXo_e<7WTRKr z!HpH3(geD(G}oKiDF*;l|04E>+hk2y`)7n4NU0lsjLulvJP|?2*b31^;F3#)jOe2u zV%upP_6vNc@a6nXHYe7LxOrL%zx-Sv6r1r1qn&wsljmXS{Ia{v6TWsaqb}5^z>TAO z$2?GhoJ-(wh3-(oXe*=Wo9f>cJ(ePW@|EY!*CcQ2ukuDrT<_Y3tk@8jMG*3yIAK}f z6Bi$-c!pKT2;tw@^n4Qe%pa4%dtmfSrJv;f>jC{u!R!#9-a5WTM>|g(?)b+LwER;` zx>j==b+iLc{8bb&Sm3!7Z9Bo1-vbqNwT@G~iih^o?;pS7dr`EuqIbu^mo7x}vSi=B za(3!*ZysxtCrp!_YF`^Jc#Igkb6oGfl z^C8GIfwMUK57h3@U#V?}&EE97cKO5Oh>~OJZ9CF8G1O`-RE{^ki!t4}cgK?|#9sV7 zkDc&TxL#m@EUl#1qt$6{j;n7Hf~{Df@zeNjP=8>qxP zo^>?ZQ^L<&aL#NYI`@f`;OpQ+xF>AK8^Q(^eSNrzFYx0zBN#WGu6{Ysp;Jn)enJ2! z_Po|_P5jLna>4zIUfJ&;MCUM=1DqzfUEb&%~)|6um^&kWDVH!uef6n6Xvz_(W z&@PqsIwjc&-09pqXH#b+Db|Couh*3AIu>9c3^go~aDEX_b|A!*{^HNz^^j4Fqss{% z_4-#dnc_*Z)uH5i=|0p=QAp@{5`jarJ}ht*z!I+?;8f$eHS+$o$nzX8iL58TvRCIP z`KT)Fnm3r}I?wyD-yiGh=DO0uz)IRE@?*Yu&Tese>w7WB9gX~zUc}vZj!PH)o^6Pk zoq`IBu*$>`&km~3{Abu1O%LhQ_Mt!UIDb7!d~ym;RWoIsaX$Jnns*t=sGv+^>X<OJT4=c7lhkzuDctVG{smpmHQUCzB9r$`Aq8Ne=M zGTz%SK@X%?!WDzbTuw|C9SC>u(^Odp71}0T7LV{!+U~<z)-pXT#`MT3X z`us)Zlwg5W3iNR9k*?Am)6xX$0M% z#X1JPsYXH+W!?bwYSrYV{VUzh^?fR*RG3F>hKg&th5qpQTlF`oP4^6AsibSSt>Oo+ zMuwVQA~wnd>QM~XYTubMtKmP_vAK(PP=dKCewaZJM|%m42N;pos(F-sUL2CDb3h}2 zmB6csGyeC=`)Jd8ii*g;n9SfAH!WqMGJNKGUquM02)VgM8w^AlxuSAmTAQ|uch+Ch~KFZ6z7sxr7HFCpzp_j=47 zr+L_AYzEgyMjbDaHP~+{urUr1!(E@p9p}E`vmNMGnPytQn2f=d=|+V_Jf)|Hj|Wo8 z2_8#q0odsD1Kmmj@0_-mf9N}cN-dH~n#D%;l9&8l-)8AD8NkTU?H7}=xH2!Pj7ZH} zFW!yHT~-psQq=ufth2rGkEBnYq6j};RW~BFmXx?Iz!8XX18*EC%6tIcSbCBxK`;Nr zh867zU-M7AV_GJyq0aFLhe;N<-m4d~WlytE^j@fbWr9TTEZw0tQff+9`chXMxE1xF zy(31_h9kJwEJ?_ zaKmdcucnlbQy$o{&v^$d>dW%D-tNx#bcNKD+c%A5yX&P#O-@m%g%v+CQ0FFQfZPfH z)k%o3lESZla7p(ogTUkI7^-syrcQ-FzF=8^Xpu?~IQ|!CnwS_GJB}g!Eq9zmj9653 zPjROo-s+@k^&xun$UTSDQ!Q z?Y*GQ!pXR#)1LbfDhMSru=d-egf%P)&3s1R1JlqwXBOgGGO@>-5{TiUvF96J%tL;t zLVN2@-tseaDnebihYs#A_l5{#40dSqO$8M3oK@Ll5xKUuBjTR4h?PCn`BcQ`;3s~) zeOF-LD03ARI2tIyCFdCG4NM1}{Q{TQyh9+bZT5S+ z3qNK`Dc{CdbhLJwWh0X=)C?%WPx4DB0wDX(c6`lac*oToM)i{T^+L^$+D+YVMRiNLdy7Hq`!EJ60{kECyrv-hw(R|crEYH3Prq0 zQL0J~C9VT^Zy`Uh%K-9kYM{RY9@Idj`|7S=%jnFL>x9S_S)2Kq1@~oY-`wJF%Y`e8~yKWt{yx;e*~r(Mjq3l%;DIS3XF1C!e5l#iNY3(eiR^!NEFG&m@N zeA1Whj%JC^Y8;v| zB;=Quj6(hKZg&q?j);x$h7cQm&!;fXFP;0rG{t{Q`(e2Y`pX%K+s{jJU< zU^40Fi2vMVSS!po?7KDci%`4?xBPaU@{q4Js4t@FhgZ{;AmGYNiT0wt1ij?>Dm7x7 zr+V?N)Spjhzy92d06$djq=LF_fS0(1a?avZf@3I0a5V1|Cm;URmLK~2<7+m!RGKWS z_4soOwJmJ;VBG%l_YX9&$8}mdn#t=(=N$ZAurt8vMX4SABx&yuU(!8Mf!xWI!sD_< zzvGpJZOoGAUdJ%{$#dFy)9Z8_+;3&pEu4_&?F`Gb z%cD<`K_Q6imeHKW>A>rZ@+0fxk$+fu%+N(l&ayIBn|HcB(?Eiyj2_GH=w#pQz#@g* z^RZ(jqF(pNz)Xtp&W81J@7od5FkiVaCFG6?I0vu}$5~uBe-cHVe@Of7lgWn=JLLto zxX~*#$^ew-Mg)+E7qj{`B;9=Qh;>$z#E>GKE(oEYtSQ~ z9&-4fUxDo`E)Kqe1WXGeLw5FkiyR)TbZMA@?%y{RRjTP@w{okwUzRB3BR8G^X{1B3v5_oI1oAieb>T zQYFXZdk8uPq1!cOkf6O&TMkD1=`XwNC->LRbm+Oi#otdak&oQ1mZrV)?|%qBJ|MSH ziJCtMJBJKUk$(nHytjn{!#yCVEf;*OI4zF;ZykRO#N#<79_!kd)1$b$bTTf}N}HI2 zIg*h6fer=73^uU!h1VLLx-A4{&P*xkQ6iqL|9_1bJOAOMFiI?x0Bv5E`ZHLD9VHFF zjisUI^l%Ag7r2t_bzs=vU4wwuA=&ct1G|OQ21CcoUU+92O_y37rT@mE8vLlsm`kzv;%^>!z{=n zL`eHD(0Fk|Vcdf$h@>V~3IBeb<~&?HqOrk3`{N}NpesD{7;0r-eBise{#)M$E8vfp zVu0@dJ_^OZ1r&D%7Dl}$+oL^1_&iGI>iRtvmwNe0Phb;Xr5a3It4;1@N(tI zKEQY~zzF|+m`uA^d#(x6Oo5ZsjOm1LgDt58#hb(Jzs$>mJD_24K@2HQO&E&L*IeHu zzHw}*j6avw{NmgPToRNIY}Ni+$eZyl|5-hLtiazHJK&Iah`^ET^yf(b`!0CTH~e@= zZG+E4pVzJ<&-D-_10SZ8L}5IGS^MGyH5dHy{yEl*p^qeRU_b$28;+!^ZZHePdI#+I z?)YWuV@TtHua|&<@1HOO^kU%o{})3pL+FW6^5DONzYCJJogvLFj8!l2$Y{Q%7Gv`g^rRE$r~>O{1&P@2kxs@SF7}|H0NLDEHJ2yz1qzmHQP5{2PR=*Z#g ziy_3HOO{-VSj`k4{GO&_=kh)adh3+h9dl-&eVGiQaGlfS&~QW*cpr@jvsfAZpeK7( zDxeco{M5jjdo>N6{j^&0dK)6J&pXl%NX#G=?-;h-YANcWh+@9xV?3v%9ue4m6n9^^ zzr&r~)K{F$I;I_IFQvNtU0YRJ*mtY9RWkG*3SiwsG||Ab#V7-1rYLY?|IeruPZEY8 zo0307yGUH;z}A$Rq%iI_hZ+rN`}ZbQGc{Lj5H(dzJ$QAz5EtcSP}5`($eL6Vux9in zjhLi9A2Sxf*phhr&I|ix2?~II*(C8Fu&)RColim>{!9-+@(8?#%E7P_8(>(>%M&#Y z9|p)hqRtQJ*Nyh(f0H%hZvy~=)Ws_f^6>Ya-4<&3zlr%tTR}c+lkqsX`pQF))u|nc zC|lQ!iE4A4z%7npb;bXlf$s3<0z3oHd*~>zgUix9p&C}jeh(AGTD&at4wwRAM2IN+XVF=%J>a1n!ORpvE&qSPR^zPj7UgZQ zRq0Q2IrC+Hm9BO68FS}6qzpCnAOW96ax%J@kvu$(w}pKm=t#BU9;8bm{yf(!r5{}M z@Gn3dd9K>RJ`ogfu1)4ZcL1gV;;pg_rr~4p67uLzYuwSd@-w5f$d}&b&YW}4q+$Y_ zFn{sTu78>;&aar#K#ZF>+aiqANSP(6M3{rBb9Fg2>af?0=&X6I!GJ{Mkzor z3fMY96?Ay-2wsJe3_>otuO_K9kC{qnz%K3ZV9PLaiYhIz_`U%rH!;hbx&QDABwdCv zjYZNw);G_yn`Eyzt!88UmoQ+jhxr(#GANix^(3XP3s41OyZ~VoD#~o80$B~E*ymMv zHl&doKHnJ^DECoHpfc!2;3hCZH9K)@%);LD?fCF=L6LP(sL( z<*_F;L@|ShNHMl7MMJhIO4(y7yX=I@-q0ZX*aqXh^gPG=JC67G{r~$9kCx9bPAfVSbsInDM8F>%xbtu8K@;aDmk8d zQ908ng;?1GA?Sgy0TL+7+VEsQph)Sk8>CGOQDD3^dNbXN<%G+6Q^URi{mI6x8I$ig zj}qs#haRx$8G*1gIa@M(?e18$p%(%=nNh%9bm1Qk64lo4)^kMFGN!}8TF?rxs;=bK)Scpw30UTi%8K7v1LSF$z3r2}}1r#ml z0KO5^6j$NE-#D(qow(vLsb1Ft1V|tcI!&|(j*kQdu)M|m^WV8)>0i}+6$7D5@e2ryQj#TZgco?s?%rXjjbp07X>X7GtExySVmf3z1LyvR4$#v>2nTl$iv4I;$T%|v@^7uL?zD?O{~0lz zZ*t<(mjHeKum2++n)&hId^ne7C-g?^zNLUtilUX&3-fB2H}ep@I=(YyF4l;hY2WrI{LKrrMzIq_&AaV=j>!yyHJ#inqEdra%2cqvY%(c-g_qI7?|GJIq zX~y$1b_NL8xCDtduN}{_TEkW5{FpiFRr0KhH6!qR(Dat8vsB0~|C*G5UFr1~-$skq z&o8KVwopg8A9}0Tm3)~k>Is~bF zZ)Ca6awXY>{?JI>f~|@|LwI(aS2$_^AD{4)%z0#<;ckEVGaWyNG|!?_jktC(keNY( z?t!+kV?|v|AzKq5!SRPqZM>~*GmVTD8ULxBsGQXDI2b265-yY zf&8X+Dh5V);S}OGwsZYrdcab@29R9otpzm1Y|%A zz+G$$Au$nxqOe5}pdd`zok+6cI=qkxOgyV0*UJo16D8nj6^{~zF82SW&6-q+GyAJ6 zY?c~3iLI*V0cFdhF5X(wSnZ5H?p<{s=RPJ}*p!Dx)J4N{r3S)ub=W!o<`i<9J8-#0 z)JaP=N&}KX6YfAZO@ZzW{6+WiDtY{=_};k@;R?Fzf!p0#I6t~P`qt-?UH6PNYF9_Y z`p?tG5h^+wH;TCe>3efBaEDI>X;E@H=6&GexZLFf3xs$KFcmkr`2$#TNE+quLg-^} z)H935s{(dB4lC*H&bKXhnLCnAyk~j~Ry_{?7bE=}%B;X5YDsE%;N&?0J~4TTcuk6p z)r{91Hcit&+eZIMmd17R!cWCHL-!OHou959MZCNqshC__}9v#+Ro(8tyIM)D|fI_p3aM8FHOp`?;GYcqIwSZy0|JCb zn4c&kpb^3~DMt$-)(K_IN2W@6BA-MGbz3RFFDhO(=64W?U&{ zCx281Q!&$st^k1uf3JdSWk36MF-6Xj_LY_^BOvZO;M_BBR0`?>Zc~lqQ{KIASf}iR zTEqAOIH5sB%j4CFXJ2~a-w3(2mxklWJEgE9bd-T``SJgSLQWVa*0>D=TH*{DC7#W3 zl@G*&wuosWRRu)>bLIKPM`wM74v00NR<&1KAKQ^o!53z+*vxQ#^or?2@b!UP(YR?) zM;!?vT&1i7DgnqOhF5Z!a~<`iuRXt>s5wSb4w^I?oQ}wsjMW8g2W0XXQ)q7P4R*qu?8plH(Yg8B$${?z&e4^=(O=w5 zKlpx3JH;LGP59Dk!=U0c--(R!10=~&`FrXTtr`DaC$0>c#;_vKOUCPg;TS^*dSJM0 zXLdpW3qUer~h+_Q|P}O1i7duH^2;_0F)7_h&-ag|X)<_}{AgZ7a;Gv>bK^+jcs)CAPKda)g zH<95PC%=Z!8Ht=~2r78#K5G&757v7)Aic)_MqBz$J{#cGw6wZ}DHeG{!ys~^YK+4~ zIQKuJV7CE?bDoM8&W0U9KNTc)fb~VZ8m-wD)X5( zjpc-^TvvN`IF`a9--7Bkp`@QE-iQk)Kr+y9DhPW)w8&i+50tnYDJ)JoaG%O# z6fgH1M{lkkaW1l9LMG**Hnc6RQ$4ln&GHt1*%qJ?b*TZj>a-j;g`5kW7=33@lBFKS zh{~*Y16Y^r%Gkv5nc+$7k!xIPEXF6n15F;n<6>QS0#j{r^70E~)J@Y`!C*On7@6Fla9x6CXD zk*JKJeEc$cY&MBBm2r%nG69@fMIPW?Q9?vBZFas-W$5eB-|Ks&!nYL>TX($2b-wLj^Dd)OFyw zf0}QwLmW;2t^20Ku&AXetUW{Q-X*cXmb~!ANO|6lD_h+lV~Jw$u|d$#F4r4cKcvDN zH9Ny%_p>$~_I1;(uF;bq+hx4b;%{+nr)z&Ep46Yjikz;$m$1i;_x5^pFuOKzVh(2K z@FIFEJ?2Sieab)I)6F?r&z}@l?>M}&0bG-|;UG=3nvS27i( zow`$6HZ(8AT!UAe#S`(R<_zu<=jib61PGCViY5Y1_#a*T|M9n*JhQQXdfQr{h}jUl QB8`Coqi3vJqU{j=Kizim6aWAK From 56a6ebcc740d35e5d233480fe9dbe43fd3d35ec3 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Fri, 15 Oct 2021 10:17:45 -0500 Subject: [PATCH 04/38] Smaller favicon --- docs/make.jl | 1 - docs/src/assets/favicon.ico | Bin 35595 -> 26041 bytes 2 files changed, 1 deletion(-) diff --git a/docs/make.jl b/docs/make.jl index 4caf120e..70cb7644 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -9,7 +9,6 @@ makedocs( joinpath("assets", "favicon.ico") ] ), - # format=Documenter.HTML(), pages=[ "Home" => "index.md", "Tutorial" => [ diff --git a/docs/src/assets/favicon.ico b/docs/src/assets/favicon.ico index 24efd77fb30b26d090ea050cc714925de5e37707..c20690b44acabf8adb0d9371f5fcc7abf2126aeb 100644 GIT binary patch literal 26041 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 JERi>V@jnAm>f8VT literal 35595 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
XT&PX_W4j zm>|5h7MGo0vJ6bY&9i|z7ca7^yh8(VjqG;LXP{8VZ_u62MD>6@<`TeLjA3lb9oX7o zqOv)5ewC#ugn6HiRI$n?k@o)VlB%EXffc($u6^#8PWb=^0qjalVhk7r1mYlQ?rX*o z(C+$S=k+6=on2e}32eCSa8ID|{&jF176Q84es%FNz9&gM{k7~A#4)2Z3^gEzV6(;!br8KDI%1N`gyX2s z>Q#U&Pck@MvqHrQMI0&q+A@bCQoEBb+AnAIS!64ykd@i&uFOwIi!pSICIer??9&Mn zSJ0w?&RMmKM%PRC-)ZKoLwSW0*heq)Bu0oRqf*9<lY7Aazs(^BQ*oj(yrcrDm}_@xaRvuARt*hG_WS^D&wGPD=N4 z8-AvW7O8#o&>a4~%*$Sfjo%f5a8!wyTA5EGN~GjYEnM|u37{%0qMAd7n?K@;S$5Jt zdUmo%aV=5B7(5PWsv-Tva_A|`(2@vnF{`L)$pz-I;_%cf)N+^mtGpmTx4bNZUSTzF3rUx2A*Qe8+KN;BA?tLt)>}Xp7V|2P2ii}258xlGN<&rK452NMe{r7PG{Ru927m9>mV-Y z?ds)q7Kb}{1#e@<#510^KGqw7j}UawCQRUlzvZ=VQ|Rjp@84`HL`n!aFU=p^Z-xo7 z?ccvelx~G;VsO`maz2c{K66xBJ2ErB7jV|`!{EZtV#Lsw~Xd zZhlowHe?xz9Z){;o`%L{;=oBN-^bV-QD7*W%c?vS%x>)Rw0m#8f+X!$pblC0fa@A%WRG+#=R4G_+WH=P7UlOh}oTZC;tiF&q zTDR$ZJ4jbx<;2+B`P`y9R&DSh3Z zg4otX)vw6rYp;$sIIT)%G4a!55i~XkZI;XX9^%$}t+ypLYNX9pU^B$JR^^sYT^uhC<_YPaw7!%hEuaxfO z&dBaJgc1F(vgP6LPJ;#6;5KK2=J~BMOj)ZTpS5n8P47xh$;kZqgRvfqIWpYm4*NO9 zGjD+Mnyc$yS61$NSsAHk%;yNX|3J5Tk!z*JWgj&+<6!f)z}ETo*VX)chO#`U?hs?M z-WpeK{HTiq&r=qV^~_QpJQS8A(6ya{>xG|RgYH&ru} zb_pxEWcSwD1lL5&jK$Yo2c=ou-=}|Z94u>>E@x|l^KOF_pNg#Zk(lzWBalsEVpPcK zpakJ*(L~ExxSj_PY4sD(&z~wj{wC}q_q_nDIb+}g!qucQetS-t2duw>JI+m zEv`ttSa5~7ol{%RbXE%hRHmiO$*sC#D$& zlX~rTX*q0Q^)pm{_w*aTG~L{b;uv$OxtQGhVYDX77H9G@%2Cm^%JEODUM@Uy6BP!Y z z(+N<><%*<0xkQkTSTtM&2RA2A`pK@y+ZZZDX;fHIej$6h7yP0Q$9KH zd|ug%`_Yv?&>0_8+hDI8AklPDhlJ`!iq$OeN><|x=TkFQa#XCYVj*-5a~oy>vNkNU0m)$_m4{F&~OFd~BBmcG;jYZG9y98%2qBxJ2|iH78>hxh{t>Zo%_ZHAhWj8B(-_ND*dyZ0!M&d1&dIAT)NzB6CJTv%4 z#Mgy$YV`NY&sjkf$iS5-ja)awiQ5C(5+rJWh)s3hnw|7{cxz#m)O(M|Qy+^EVTLv@|>3q)Yb~{mGJ61>!wk@6P%?fB>;BffOVFkLcUS??fZ3?dop7(sP zhpni!TQ`MKbT{IWSHRFj!Bwb43BNfWz_p5>u5mO?_sn!Yc^cb5r>WjciHZ}f6-v2j zzwpL$@#WnrBtwW+?qz(Kk_9IS5JB7R~;fFw{<5)TVl7w2Buu zZ;kkPx=AjFJv{H1-_HlK*x;Ztef?OQbC&cQ|JUJ@@4drIleFxG$gheD*BkEY64ye> zj02~hY5kdv@3Z=}UFfux94ASRs`Ws(D&%CRw1`xo4mnuoP6Fr1ite=xF&l?XDgXkG ztC7CGd0>pqD6ihF%oE@P`zCOQBOw=gf81c-_EJT6=z%RVE5rA2<~KzQ;Y+=9e`~uU z{DC?`w&zq{WJw!QrO>l8CFV;LT|~m_-GrL7qc|P!OFA~&@(3F$1wRi2G#z-pLa8-{ zk^XJLIeRaE=C#j;3*`c*zKJ3j7j_pjX~1I3SnR=YL$A+J)% z?9>>cU(4ubErXjqyJng5=jH9hJs!&cQG_s~!UPdp`&V8vS>Ot$F{2zW&zH?RZgiTn z=(@sW+{K&1f0g&5>R|iWBYnUB!;Eo`eSQ37yDBh7CLzSZ?7X|?^ZO*#O`t}IKpBaG zrM7@9`HMlZth3o-f}@8rAmJxcg}fJ}wQ$8?8&@g~7Ws2;kIs(2_fE+n+9A3({+sGz zGMz5lQKW6L7_nLH*T%9QPJ$k#9zCArOCp0}xF5!HguP}KkUR3-T(M0Jw?d>6wRz7s zb*jW+LbEnTo*acz%>S+@t1{6He$H9Ua}2$DK8fw^9Vi#5iy=VXy(w?1*nJYmPCSJ$yEXE(L9>6+eG#jlMimU_iRSG_n@;akmW(9x{=xGA^1{4=I_n10X# z_akboj?FY^g%@m~#_?_^(SjcDEWFUOA@mfIK6+z0MfjvH?ZE07OvbWm6fCM&?o;va z6gu3VXx711eEf~$LGfC z5j48^8K54)6nHd(+>MFt?YBP0n;hlzsDzg2ocRYY`8nI&-10Pxd=8U~Nb7WPD$>uA z#pC8UW<|Bd%{qP6dFQ#uMFYF(wv(tpWt6XTa!#x<(a?MGI`Dd3*y2)gIo0vQ(5M(L z#F3#D&1?GIec)<+j(q7Q!%dFC2xW5+t|Tk+O#cZg+Xdgr25>Fl_C>c z>ZP#D8w*3C+d5gm+4j4f^Hfk5g-4YdNKTPWV80U0WJJAf)RA$fm*&wrXj z-Y)LQ^E|K#8W(_g!ixkmVgWmEe0I;6qGWsAxXAN$Y2t|U7I|sgUm@cBQ-$`9jqd}5 zpNSx=HUN@g=8qKBlPgp69^uEvnDl9^SCEf(G>Os8*7%-R?RcGw!ml5)HJrI390634 znyB&=Nk<1@V>HtLNsSF#$!U9;(#=WXLnY(B`5?tNf|c*(^hQtG-u#LPblgkqw|rG~ z+1}FnO07a!wlmgZwF&uQOI;C-iCg|)DiSD{t1Hag zXjLW3DT>h_%5O7tEL?gK7QTwCZeS-ke3mgXtFYj(YK_k^EjQfR+DDyWTg&9{uxprk z?5I>UXcQ;r`y=)Oc^IrEzV>TXU#iz8^O2>ze5>r3`P`BpKMgoS84@muP`xD7|8ZZi zsM!Nw@ksqCZPKcv>4m)WNlyN_$mXS}gqE3x87k8!&*ra06c2i@2KRff1Q*>m-+3W~ z;sl;BT*_vo=Jg)9Wv^l-C&{JxlBoM<{ARnikQaWb(C@^F7sdzslbhDGbx#nL4OloX zFTbIcz2Xa@XVQ>1gqw?Vu(}>6VqS3<_W|-TLSXJyf`Ge&yy;3(P`}F+(;2T5`^X4+ za3M=>gc6|k+ld&-b0S$(aKPI~LZoVVOFzXTtwz=l2GycSq9xu#+G8Qq|6AyJy# z{a-uM;hN3KZLNm9402|%(lQZrnwu8B-x_^JNhYoz6w8X2es124 z_6i-;f=wvSXKN_(J%9JG4}Y)T&9{u_ZlL6(yKIuczNf9JUmjvFJfU}$AI*HS+ZL)4 zt@>z&wXlb}@4!|r{BiYk&*h)itG*+9O1;pF>HbHhBkkv!`xZ#;6tD2#KQJ3_176`5 z_|Ug$h4EWMmke04X`z#2-jvI*bWyC;53Swh531+u4$HImVu#}W`_l{jv&pn8i)M_6 zrv}8bUKI@Ue?*bRGJTfGd>7br|IC6Sl-Dkxz#@0gBS2b<#e5gu7fc0W5dK0qrgP&f z0k*8w&oH!pSIS}CM{LK$4B$w{7kuz1?G#xRgSuB=X$ahOU;XU!g7Ac;Sh=j* zo6x~?zs|vNA<}p1`&rbElH8wUYdAHE#bDEmtf@@Chd#xbPLI8tS^S$($a^6A>^>Uf zCD=s~{ajV%9pZ?3$WE$}w0Y!A`Sg+hI-mfqm3aNM3kcH21~UMX;Xsn=j~Zz4u0>eg zV6s5s1Py0t_V^8n_%hxhTVei~FmJXB%0HmRPqZ=z6=S1s+$=BL{=OlS6|k%FEoEgM zuElV#p{!qvWw6tV$Lx!*rl6-{C9C^7O_|MiVm)74QyVKOcQ5SV4YwtoN&W?G-0yUO z1_5aw;tHV+c^+MFa%pcMu0NEx?cc z3zha4G)>1u!GOkB2g^t_QF@iKNvuh|%dJFgxvH3r`kPcql& zHg+-N+hXs^dHG9sgHH~69dw`npi1zd3K_WGec@WHlPGk=yTeyEeodJlqv1GrHO8l? z%5YhOySL+sB0q#FN4e*QP90{JhD(jHxfH;T{(>TA)12KRVwwU5RibA~;T}BD$>yq6 zr4eyyaL+yyB$SHwhWN{_q{U}zR;_@oW;G8k@fZL1d+VRUU0eK8{hOb&i6+wIAIAQ~ zs5ox<^aSIaw6jJ;JYsj?G7q0sg6As!hE|NfeO3zY&}S>Pb#Agc63Cns*P<&3v)grO zWgxRVI|gq1r{0=4uTH#m|JvWT?ynIkiBdv78C&1N_U;#6p=y9?BNSj9Ys-saGn-Zz zdFbmVERhC61u%lA05jogiD+POckmdxli*oj3a9{oD2aV_ZoBq(EktPm1Tp>P)3dNI zxtp)5QqpZ}ZZ9^;^!-Mme+2_b+NW3GB7dIxm@Pj7y)vbj#rpKGTzfH;_Iu|nX=7{wP^IRM!3`)^Xyl~TAT4_j4%MQn=oQF0>@lNf~g-BtRd&e|-F# z{+OX2H9~gf(U&MeR1 zA$#jyG}YCcE+6_A&b!T?&6aquE_LDk;N8snxah^f5tWLSUkqDXJlcmoC&oVeT8o)o zH;UKdNbGh4s2pK{%5lr4O_6uBQR^B6oI{_o!-jZ6jvY5a7Q4!*%=Fg?rQ(5r#rM0q z<_Pq}B1H{uC@OW{o(xbEbLH2$mSys#W@yo$f$jc3(55au!Rc_E?;!iHD~!sj26UxO z^vZUUycf*a$pZfqErmfX$=fiWfT*D6_yV7!xk|5m@H@PY!^HjbbD3}J5GSW%ID_(q zSSiy{R9s!H+f|ER)_(@KoJLqYXV;mC51@`Kg0F>ZA^Y=|L;6_CgM=14#!I1jDA}@? zXIZGmMBCNMpO4n4oS5xW(6i>kG!PKSFDATKK?@rd0PFiZD z$vm_!C0e1gE+GqA94p7v#5_PvoPVP)Js%yK4dK^L;or)=l{@it{z(bAjMm4K&4DLZ z&TjMIIshg@4TuwV4*(kh5(JQUPCd>f0vn%8R2GN;SdgtU-}{bOFXas@#f-iyU*zg{ zd@ca8<0XEg6$3Cfx{%#9z<(jTrA7oJ-FMjECdXg@jZxFv>~>5{Lfl;XLq$4IuH)5s z%GURE!0y_IPekGeTN_&_Fm3<}<;MgUy?Yj6KV|wS}&1~A$PeiokDBu{1U_)*Lj^X=J`-Vxa-OKBKSL35!UR~Jfq&h&` zh_`e$zr0KHhX!Tm_vJv}Y2MF6-dh{Y3#$Yo0}yZj z5(RMCop1ItkRqw&2|`KCwVIx_04U`bh?1#VGLtc&Ur;m#wh{1@Z@O2|Y{3C!?^I^r z;2KX1drd_um0~-?ZgA?5Q*wQC+*b=!ZfZxr4}V)ot^$(k8G#xZ(p1{pW#eUx)*3(lTF#GnHD;zR#kB7iHP+muM` za)%u((%>@(k+Bcv@8mPq;=u@LxGK z^FbIcBi_aak#ltR%%Le)n4bq%#sNNI_Rk3+p-Ia}+jy;M-LU^of=i5vnQI798@dT^ zS)%tob7t)SMQ)s1P~s-?>b`IRAmUPru3q(P$8W4bzc#OAY60JzTt?5tk%(cmgJzfi zGlmgqsoDD&lFRC_@31nfxqc;c%>g!hbw|r~!uq)q-)>mJGiVHz$7px_qI2UvkQ~J> zJSp0Mcc)X4gX0#&~t( z|4*HeQgC4yZLGl_vi6Q5U?l=pWtZvh0H~&ZeuQ*(LTFJecjK)fzd$h3FlXJ7EB*X#1L7J7r-tEPu{!z1W}cF#4u zCDxwIg%}{P&V1lb6BVyLW~zqPdgZMHe@y_o!{K>Q!nS=i^UeS1$#fbLEp94pzVmz9 zo^vwptK|paawA|grxVU@BvXX|Wb zQnV|=tcB~7jQ@+3tFJoxZ*;{ENX5UNP9;A5Di^C;8aD89f}d7kxve>_-lE(t)gXc9 zpBIMLt`BT;B4;5Ra1%SRB;7m;4pUO!TDz2;d+Gf?x&ZlfX+hEB8F3H*1aJlUpVbS| zOkBN0c}8(8_)HW2l+&`liw;N6)rV?2;x)p}xogcu^|mlS%TYp!znX~)S?dGhLdF0V zGPq0(;1j;VnXs@2bf(fQIlYf|Ml5B`d(_+MP!gU{oFo7l*MBKI*ovgp z582iFFt7lech)vGc10);rAx^AT&3t;DnzEwI@eesw}@|kBXnh12ym%K@7Mz~RRdmb4;J)CD>s>H`+{kG@js5Z=rb65was<(^=8#- z?Och1f)LASxfGYOceP9RGvG|z{IOK$#kSbk3{cK@t?^)pz6Q=yIw%x4PnYjy(?m!i zGJ(?toPohq6BThsmBBRcfzFeR_vnr>)psp}h|d7fApi=)0MGLBy&M{pBtmH%$)F%q zg2@h!4oW_q8+;66OE$+l=Y!;h=Uw{&;o1^G^wlU_LIBrt1w498xRyj@YIYg= zJb_%5DUEa<{376!jR_ZGp*pB0XS}DE@&tAGqd8FyTG3$#+TEFL=4=lr2|ze6zc(O4 z7T=9S1Oh`}D30X@$aqdxmKXfY!`XMq%1*Ho_TCB&M0U(w{F~I+Ai)pDX@dkHEYbo9 zE#Ly*vU7Yr!pjL#*X#Aw0_t)U7VkGeN;m$Or=vA5gJI|5;t5LCUE3ar~ZsV*2&#o@j zyPweltA=&x|Ci5CjZg}B<*B9)c67zCYH zP95DgG6XDfT7Zqrrm_C(x0zfTWiTE(-cyl1SsnF^rzss2f2EhnLV9QRZN7QM3WUt= z%#Z-epyS^qwd`qbx@sQZx;IX}b;VwE7QJlPkStd-5Z-D$UU6nyP_zbcMV%5+5cCCd z63#EpYv4OQEeBMC6av=L6d2WK1l=S-{E$?ow*vjx3$9xE@Gj`r$X(sdHADb;#`EKl zQtR9+5L50~_Z7--r27B_%UU*wq-%YsKhqOx8DqpbHt z`-T~~O>smKN@;PNAv^a9_I6yn=J{>MQydBgEnV3C` z4aq$t?LH1w*3az?wzC*RV!Z~2!h!4Sa)Bis;2X2mb}SY|3g_KHK=v3eqxU!zR4$wJ zZ?t5sX!p9c{<6`RBbzNTiyAlS2@~V81T%AL^S68#9_|-^LJ2+m8cze9cySDfXB1!j zt;$3Wp1Yvd;)iI)$J&~=iA~5WsFuAYU4N+O9G7e%DEpeLy@@VT8 z5I@*^zPkv7?p+^_xbOJ7xdebr70+ko(bk}N?)C45e$i6(gu!FW7AM`3Hmc z<&`i#`i=cJLCd{uQ>|J4yK9LLIh+ba%%H3mK6oc0*HMPZb$t3Su4A@mx~>Tt3hmm@ z`c>xeEm)j#05tZ9&EC3|t^)LR8xELz}DoFYkFF>(15rZHGadZG29Ri|25MJAuu+-O~A>rn)+pliTi|WU;O+;lUDlfPd zZ6r|vSMuo&=o<0B$^h_t;IUgt)a8)a=e-|Vf}X7;i@&AGA2mQ)e56^`^KnvYR+H9j z$s^f{0t|90J0b&}COZN+J9=6yEv~vORi_cJQ0+NgoAvo~v;&=?kN=Lq;)%Q8=T7+<2%w6wxD2FI4;}y)Uozj^7yTm9bu#( zhukO%7go(Ulpw%dsFGe}g|p}geX=w}U!6L!D0k(!{1Y8%GGD<=H3|lsn#NWV=++l~ z!>TMQ!Lc8Kg@ex$^PkHe8gDiVd*H)!Quqm>F@^yq|Moq%&RkN{WiItl2@>G$E3J-l z9!V8gKxk$9Q??~vEAvzusRTmh5GU$X*S|fs#UvAxg=@-^j|G7vvJ1pn9y@&6O;_p3 zXsAxnqt_nV?9g-cu@(lz$;DwJ(p_@naJG5eMeG+=+UpKq-*R=K@$c2< zJx-N~p-=td7sKyZ|9B~;9(=?7w)Kyn?A_bX4P=kD*S?a*Z(0d`K@*4hHU|Y)z%fs9 m{LFFjM0fW;|1br&<9#VN^-irSh}|asi>k7wQh~xF|Njp#BBI^^ From a5807aadb154e626867c71669535119ae3adcc14 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Fri, 15 Oct 2021 12:51:20 -0500 Subject: [PATCH 05/38] Add basic example in does with example block --- docs/Project.toml | 3 ++ docs/make.jl | 6 ++- docs/src/getting-started/basic-example.md | 58 +++++++++++++++++++++++ docs/src/getting-started/whatisart.md | 5 ++ 4 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 docs/src/getting-started/basic-example.md create mode 100644 docs/src/getting-started/whatisart.md diff --git a/docs/Project.toml b/docs/Project.toml index 9b142ab5..646c147c 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -1,4 +1,7 @@ [deps] AdaptiveResonance = "3d72adc0-63d3-4141-bf9b-84450dd0395b" +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" LiveServer = "16fef848-5104-11e9-1b77-fb7a48bbb589" +MLDataUtils = "cc2ba9b6-d476-5e6d-8eaf-a92d5412d41d" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" diff --git a/docs/make.jl b/docs/make.jl index 70cb7644..6d5745af 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -11,11 +11,15 @@ makedocs( ), pages=[ "Home" => "index.md", + "Getting Started" => [ + "getting-started/whatisart.md", + "getting-started/basic-example.md", + ], "Tutorial" => [ "Guide" => "man/guide.md", "Examples" => "man/examples.md", "Contributing" => "man/contributing.md", - "Index" => "man/full-index.md" + "Index" => "man/full-index.md", ] ], repo="https://github.com/AP6YC/AdaptiveResonance.jl/blob/{commit}{path}#L{line}", diff --git a/docs/src/getting-started/basic-example.md b/docs/src/getting-started/basic-example.md new file mode 100644 index 00000000..cdc03118 --- /dev/null +++ b/docs/src/getting-started/basic-example.md @@ -0,0 +1,58 @@ +# Basic Example + +```@example +# Copyright © 2021 Alexander L. Hayes +# MIT License + +using AdaptiveResonance +using Distributions, Random +using MLDataUtils +using Plots + +""" +Demonstrates Unsupervised DDVFA, Supervised DDVFA, and (Supervised) SFAM on a toy problem +with two multivariate Gaussians. +""" + +# Setup two multivariate Gaussians and sampling 1000 points from each. + +rng = MersenneTwister(1234) +dist1 = MvNormal([0.0, 6.0], [1.0 0.0; 0.0 1.0]) +dist2 = MvNormal([4.5, 6.0], [2.0 -1.5; -1.5 2.0]) + +N_POINTS = 1000 + +X = hcat(rand(rng, dist1, N_POINTS), rand(rng, dist2, N_POINTS)) +y = vcat(ones(Int64, N_POINTS), zeros(Int64, N_POINTS)) + +p1 = scatter(X[1,:], X[2,:], group=y, title="Original Data") + +(X_train, y_train), (X_test, y_test) = stratifiedobs((X, y)) + +# Standardize data types +X_train = convert(Matrix{Float64}, X_train) +X_test = convert(Matrix{Float64}, X_test) +y_train = convert(Vector{Int}, y_train) +y_test = convert(Vector{Int}, y_test) + +# Unsupervised DDVFA +art = DDVFA() +train!(art, X_train) +y_hat_test = AdaptiveResonance.classify(art, X_test) +p2 = scatter(X_test[1,:], X_test[2,:], group=y_hat_test, title="Unsupervised DDVFA") + +# Supervised DDVFA +art = DDVFA() +train!(art, X_train, y=y_train) +y_hat_test = AdaptiveResonance.classify(art, X_test) +p3 = scatter(X_test[1,:], X_test[2,:], group=y_hat_test, title="Supervised DDVFA", xlabel="Performance: " * string(round(performance(y_hat_test, y_test); digits=3))) + +# Supervised SFAM +art = SFAM() +train!(art, X_train, y_train) +y_hat_test = AdaptiveResonance.classify(art, X_test) +p4 = scatter(X_test[1,:], X_test[2,:], group=y_hat_test, title="Supervised SFAM", xlabel="Performance: " * string(round(performance(y_hat_test, y_test); digits=3))) + +# Performance Measure + display the plots +plot(p1, p2, p3, p4, layout=(1, 4), legend = false, xtickfontsize=6, xguidefontsize=8, titlefont=font(8)) +``` diff --git a/docs/src/getting-started/whatisart.md b/docs/src/getting-started/whatisart.md new file mode 100644 index 00000000..d3c4c82d --- /dev/null +++ b/docs/src/getting-started/whatisart.md @@ -0,0 +1,5 @@ +# Background + +## What is Adaptive Resonance Theory? + +TODO From 1e9f47ca2a58d3f48e6a4014c9b9dc00873eaf6c Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Fri, 15 Oct 2021 13:01:54 -0500 Subject: [PATCH 06/38] Provide some more documentation on all examples --- docs/src/getting-started/basic-example.md | 2 ++ docs/src/man/examples.md | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/docs/src/getting-started/basic-example.md b/docs/src/getting-started/basic-example.md index cdc03118..70e08b21 100644 --- a/docs/src/getting-started/basic-example.md +++ b/docs/src/getting-started/basic-example.md @@ -1,5 +1,7 @@ # Basic Example +In the example below, we create a dataset generated from two multivariate Gaussian distributions in two dimensions, showing how an ART module can be used in unsupervised or simple supervised modes alongside an ARTMAP module that is explicitly supervised-only. + ```@example # Copyright © 2021 Alexander L. Hayes # MIT License diff --git a/docs/src/man/examples.md b/docs/src/man/examples.md index 7c64afcd..df174d80 100644 --- a/docs/src/man/examples.md +++ b/docs/src/man/examples.md @@ -9,6 +9,8 @@ All ART modules learn in an unsupervised (i.e. clustering) mode by default, but ### DDVFA Unsupervised +DDVFA is an unsupervised clustering algorithm by definition, so it can be used to cluster a set of samples all at once in batch mode. + ```julia # Load the data from some source with a train/test split train_x, train_y, test_x, test_y = load_some_data() @@ -25,6 +27,8 @@ y_hat_test = classify(art, test_x) ### DDVFA Supervised +ART modules such as DDVFA can also be used in simple supervised mode where provided labels are used in place of internal incremental labels for the clusters, providing a method of assessing the clustering performance when labels are available. + ```julia # Load the data from some source with a train/test split train_x, train_y, test_x, test_y = load_some_data() @@ -47,6 +51,9 @@ perf_test = performance(y_hat_test, test_y) ### Incremental DDVFA With Custom Options and Data Configuration +Even more advanced, DDVFA can be run incrementally (i.e. with one sample at a time) with custom algorithmic options and a predetermined data configuration. +It is necessary to provide a data configuration if the model is not pretrained because the model has no knowledge of the boundaries and dimensionality of the data, which are necessary in the complement coding step. + ```julia # Load the data from some source with a train/test split train_x, train_y, test_x, test_y = load_some_data() @@ -97,6 +104,8 @@ ARTMAP modules are supervised by definition, so the require supervised labels in ### SFAM +A Simplified FuzzyARTMAP can be used to learn supervised mappings on features directly and in batch mode. + ```julia # Load the data from some source with a train/test split train_x, train_y, test_x, test_y = load_some_data() @@ -116,8 +125,11 @@ perf_train = performance(y_hat_train, train_y) # Calculate testing performance perf_test = performance(y_hat_test, test_y) ``` + ### Incremental SFAM With Custom Options and Data Configuration +A simplified FuzzyARTMAP can also be run iteratively, assuming that we know the statistics of the features ahead of time and reflect that in the module's `config` with a `DataConfig` object. + ```julia # Load the data from some source with a train/test split train_x, train_y, test_x, test_y = load_some_data() From cb38bbc6851bda0c1de4ea2f86a8c9c9a7678463 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Fri, 15 Oct 2021 15:17:21 -0500 Subject: [PATCH 07/38] Write up ART background and history --- docs/make.jl | 2 +- docs/src/assets/figures/art.png | Bin 0 -> 28577 bytes docs/src/getting-started/whatisart.md | 62 +++++++++++++++++++++++++- docs/src/man/guide.md | 7 +++ 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 docs/src/assets/figures/art.png diff --git a/docs/make.jl b/docs/make.jl index 6d5745af..d001acb0 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -20,7 +20,7 @@ makedocs( "Examples" => "man/examples.md", "Contributing" => "man/contributing.md", "Index" => "man/full-index.md", - ] + ], ], repo="https://github.com/AP6YC/AdaptiveResonance.jl/blob/{commit}{path}#L{line}", sitename="AdaptiveResonance.jl", diff --git a/docs/src/assets/figures/art.png b/docs/src/assets/figures/art.png new file mode 100644 index 0000000000000000000000000000000000000000..47728937445b9aeb04d789cc5d1a1ff37997ae18 GIT binary patch literal 28577 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 Date: Mon, 18 Oct 2021 12:45:58 -0500 Subject: [PATCH 08/38] Introduce Float alias for largest floating point --- src/common.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/common.jl b/src/common.jl index 975d6ac2..79581c42 100644 --- a/src/common.jl +++ b/src/common.jl @@ -31,6 +31,9 @@ const IntegerMatrix{T<:Integer} = AbstractArray{T, 2} # Specifically floating-point aliases const RealFP = Union{Float32, Float64} +# System's largest native floating point variable +const Float = (Sys.WORD_SIZE == 64 ? Float64 : Float32) + # Acceptable iterators for ART module training and inference const ARTIterator = Union{UnitRange, ProgressBar} @@ -55,8 +58,8 @@ Default constructor for a data configuration, not set up. function DataConfig() DataConfig( false, # setup - Array{RealFP}(undef, 0), # min - Array{RealFP}(undef, 0), # max + Array{Float}(undef, 0), # min + Array{Float}(undef, 0), # max 0, # dim 0 # dim_comp ) From 2df7b1bc32bf16a2d90986756d7a7f1e186bc246 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 18 Oct 2021 12:51:23 -0500 Subject: [PATCH 09/38] Add DataConfig convenience function and test --- src/common.jl | 16 ++++++++++++++++ test/test_sets.jl | 1 + 2 files changed, 17 insertions(+) diff --git a/src/common.jl b/src/common.jl index 79581c42..a9c87e35 100644 --- a/src/common.jl +++ b/src/common.jl @@ -196,6 +196,22 @@ function data_setup!(config::DataConfig, data::RealMatrix) config.maxs = [maximum(data[i, :]) for i in 1:config.dim] end # data_setup!(config::DataConfig, data::RealMatrix) +""" + DataConfig(data::RealMatrix) + +Convenience constructor for DataConfig, requiring only the data matrix. +""" +function DataConfig(data::RealMatrix) + # Create an empty dataconfig + config = DataConfig() + + # Runthe setup upon the config using the data matrix for reference + data_setup!(config, data) + + # Return the constructed DataConfig + return config +end # DataConfig(min::Real, max::Real, dim::Integer) + """ get_data_characteristics(data::RealArray ; config::DataConfig=DataConfig()) diff --git a/test/test_sets.jl b/test/test_sets.jl index 15061c82..3253ba43 100644 --- a/test/test_sets.jl +++ b/test/test_sets.jl @@ -21,6 +21,7 @@ data = load_iris("../data/Iris.csv") dc1 = DataConfig() # Default constructor dc2 = DataConfig(0, 1, 2) # When min and max are same across all features dc3 = DataConfig([0, 1], [2, 3]) # When min and max differ across features + dc4 = DataConfig(three_by_two) # When a data matrix is provided # Test get_n_samples @test get_n_samples([1,2,3]) == 1 # 1-D array case From 5ad74918f70f490743bda5c11f8c937007c5984e Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 18 Oct 2021 13:24:15 -0500 Subject: [PATCH 10/38] Replace with Float and signed Int where applicable --- src/ART/DDVFA.jl | 64 +++++++++++++++++++++++----------------------- src/ART/DVFA.jl | 36 +++++++++++++------------- src/ARTMAP/DAM.jl | 37 ++++++++++++--------------- src/ARTMAP/FAM.jl | 16 ++++++------ src/ARTMAP/SFAM.jl | 16 ++++++------ src/common.jl | 2 +- 6 files changed, 84 insertions(+), 87 deletions(-) diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index f8b8f43a..a4a6fff1 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -16,7 +16,7 @@ julia> opts_GNFA() Initialized GNFA ``` """ -@with_kw mutable struct opts_GNFA <: ARTOpts @deftype RealFP +@with_kw mutable struct opts_GNFA <: ARTOpts @deftype Float # Vigilance parameter: [0, 1] rho = 0.6; @assert rho >= 0.0 && rho <= 1.0 # Choice parameter: alpha > 0 @@ -34,7 +34,7 @@ Initialized GNFA # Display flag display::Bool = true # Maximum number of epochs during training - max_epochs::Integer = 1 + max_epochs::Int = 1 end # opts_GNFA """ @@ -56,7 +56,7 @@ mutable struct GNFA <: ART config::DataConfig # Working variables - threshold::RealFP + threshold::Float labels::IntegerVector T::RealVector M::RealVector @@ -65,8 +65,8 @@ mutable struct GNFA <: ART W::RealMatrix W_old::RealMatrix n_instance::IntegerVector - n_categories::Integer - epoch::Integer + n_categories::Int + epoch::Int end # GNFA <: ART """ @@ -122,12 +122,12 @@ function GNFA(opts::opts_GNFA) GNFA(opts, # opts DataConfig(), # config 0.0, # threshold - Array{Integer}(undef,0), # labels - Array{RealFP}(undef, 0), # T - Array{RealFP}(undef, 0), # M - Array{RealFP}(undef, 0, 0), # W - Array{RealFP}(undef, 0, 0), # W_old - Array{Integer}(undef, 0), # n_instance + Array{Int}(undef,0), # labels + Array{Float}(undef, 0), # T + Array{Float}(undef, 0), # M + Array{Float}(undef, 0, 0), # W + Array{Float}(undef, 0, 0), # W_old + Array{Int}(undef, 0), # n_instance 0, # n_categories 0 # epoch ) @@ -170,7 +170,7 @@ function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} # IMPORTANT: Assuming that x is a sample, so each entry is a feature dim = length(x) art.config.dim_comp = dim - art.config.dim = Integer(dim/2) # Assumes input is already complement coded + art.config.dim = Int(dim/2) # Assumes input is already complement coded # Initialize the instance and categories counters art.n_instance = [1] @@ -201,7 +201,7 @@ julia> x = load_data() julia> train!(my_GNFA, x) ``` """ -function train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Integer}()) +function train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) # Flag for if training in supervised mode supervised = !isempty(y) # Initialization if weights are empty; fast commit the first sample @@ -275,7 +275,7 @@ function train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Integer}()) # If we didn't break, deep copy the old weights art.W_old = deepcopy(art.W) end -end # train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Integer}()) +end # train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) """ classify(art::GNFA, x::RealArray) @@ -300,7 +300,7 @@ function classify(art::GNFA, x::RealArray) n_samples = get_n_samples(x) # Initialize the output vector and iterate across all data - y_hat = zeros(Integer, n_samples) + y_hat = zeros(Int, n_samples) iter = get_iterator(art.opts, x) for ix in iter # Update the iterator if necessary @@ -396,7 +396,7 @@ Distributed Dual Vigilance Fuzzy ART options struct. julia> my_opts = opts_DDVFA() ``` """ -@with_kw mutable struct opts_DDVFA <: ARTOpts @deftype RealFP +@with_kw mutable struct opts_DDVFA <: ARTOpts @deftype Float # Lower-bound vigilance parameter: [0, 1] rho_lb = 0.80; @assert rho_lb >= 0.0 && rho_lb <= 1.0 rho = rho_lb @@ -416,7 +416,7 @@ julia> my_opts = opts_DDVFA() # Display flag display::Bool = true # Maximum number of epochs during training - max_epoch::Integer = 1 + max_epoch::Int = 1 end # opts_DDVFA """ @@ -440,15 +440,15 @@ mutable struct DDVFA <: ART config::DataConfig # Working variables - threshold::RealFP + threshold::Float F2::Vector{GNFA} labels::IntegerVector W::RealMatrix # All F2 nodes' weight vectors W_old::RealMatrix # Old F2 node weight vectors (for stopping criterion) - n_categories::Integer - epoch::Integer - T::RealFP - M::RealFP + n_categories::Int + epoch::Int + T::Float + M::Float end # DDVFA <: ART """ @@ -514,9 +514,9 @@ function DDVFA(opts::opts_DDVFA) DataConfig(), 0.0, Array{GNFA}(undef, 0), - Array{Integer}(undef, 0), - Array{RealFP}(undef, 0, 0), - Array{RealFP}(undef, 0, 0), + Array{Int}(undef, 0), + Array{Float}(undef, 0, 0), + Array{Float}(undef, 0, 0), 0, 0, 0.0, @@ -525,11 +525,11 @@ function DDVFA(opts::opts_DDVFA) end # DDVFA(opts::opts_DDVFA) """ - train!(art::DDVFA, x::RealArray ; y::IntegerVector=[], preprocessed::Bool=false) + train!(art::DDVFA, x::RealArray ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) Train the DDVFA model on the data. """ -function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Integer}(), preprocessed::Bool=false) +function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) # Show a message if display is on art.opts.display && @info "Training DDVFA" @@ -549,9 +549,9 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Integer}(), # art.labels = zeros(n_samples) if n_samples == 1 - y_hat = zero(Integer) + y_hat = zero(Int) else - y_hat = zeros(Integer, n_samples) + y_hat = zeros(Int, n_samples) end # Initialization @@ -666,7 +666,7 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Integer}(), art.W_old = deepcopy(art.W) end return y_hat -end # train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Integer}(), preprocessed::Bool=false) +end # train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) """ create_category(art::DDVFA, sample::RealVector, label::Integer) @@ -792,9 +792,9 @@ function classify(art::DDVFA, x::RealArray ; preprocessed::Bool=false, get_bmu:: # Initialize the output vector if n_samples == 1 - y_hat = zero(Integer) + y_hat = zero(Int) else - y_hat = zeros(Integer, n_samples) + y_hat = zeros(Int, n_samples) end # Get the iterator based on the module options and data shape diff --git a/src/ART/DVFA.jl b/src/ART/DVFA.jl index 693a5e6d..a2e1259b 100644 --- a/src/ART/DVFA.jl +++ b/src/ART/DVFA.jl @@ -26,7 +26,7 @@ Dual Vigilance Fuzzy ART options struct. julia> my_opts = opts_DVFA() ``` """ -@with_kw mutable struct opts_DVFA <: ARTOpts @deftype RealFP +@with_kw mutable struct opts_DVFA <: ARTOpts @deftype Float # Lower-bound vigilance parameter: [0, 1] rho_lb = 0.55; @assert rho_lb >= 0.0 && rho_lb <= 1.0 # Upper bound vigilance parameter: [0, 1] @@ -38,7 +38,7 @@ julia> my_opts = opts_DVFA() # Display flag display::Bool = true # Maximum number of epochs during training - max_epochs::Integer = 1 + max_epochs::Int = 1 end # opts_DVFA """ @@ -66,9 +66,9 @@ mutable struct DVFA <: ART M::RealVector W_old::RealMatrix map::IntegerVector - n_categories::Integer - n_clusters::Integer - epoch::Integer + n_categories::Int + n_clusters::Int + epoch::Int end # DVFA """ @@ -125,12 +125,12 @@ function DVFA(opts::opts_DVFA) DVFA( opts, # opts DataConfig(), # config - Array{Integer}(undef, 0), # labels - Array{RealFP}(undef, 0, 0), # W - Array{RealFP}(undef, 0), # M - Array{RealFP}(undef, 0), # T - Array{RealFP}(undef, 0, 0), # W_old - Array{Integer}(undef, 0), # map + Array{Int}(undef, 0), # labels + Array{Float}(undef, 0, 0), # W + Array{Float}(undef, 0), # M + Array{Float}(undef, 0), # T + Array{Float}(undef, 0, 0), # W_old + Array{Int}(undef, 0), # map 0, # n_categories 0, # n_clusters 0 # epoch @@ -138,7 +138,7 @@ function DVFA(opts::opts_DVFA) end # DDVFA(opts::opts_DDVFA) """ - train!(art::DVFA, x::RealArray ; y::IntegerVector = [], preprocessed::Bool=false) + train!(art::DVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) Train the DVFA module on x with optional custom category labels y. @@ -147,7 +147,7 @@ Train the DVFA module on x with optional custom category labels y. - `x::RealArray`: the data to train on, interpreted as a single sample if x is a vector. - `y::IntegerVector=[]`: optional custom labels to assign to the categories. If empty, ordinary incremental labels are prescribed. """ -function train!(art::DVFA, x::RealArray ; y::IntegerVector = Vector{Integer}(), preprocessed::Bool=false) +function train!(art::DVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) # Show a message if display is on art.opts.display && @info "Training DVFA" @@ -166,9 +166,9 @@ function train!(art::DVFA, x::RealArray ; y::IntegerVector = Vector{Integer}(), end if n_samples == 1 - y_hat = zero(Integer) + y_hat = zero(Int) else - y_hat = zeros(Integer, n_samples) + y_hat = zeros(Int, n_samples) end # Initialization @@ -284,7 +284,7 @@ function train!(art::DVFA, x::RealArray ; y::IntegerVector = Vector{Integer}(), end return y_hat -end # train!(art::DVFA, x::RealArray ; y::IntegerVector = Vector{Integer}(), preprocessed::Bool=false) +end # train!(art::DVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) """ classify(art::DVFA, x::RealArray) @@ -321,9 +321,9 @@ function classify(art::DVFA, x::RealArray ; preprocessed::Bool=false, get_bmu::B # Initialize the output vector if n_samples == 1 - y_hat = zero(Integer) + y_hat = zero(Int) else - y_hat = zeros(Integer, n_samples) + y_hat = zeros(Int, n_samples) end iter = get_iterator(art.opts, x) diff --git a/src/ARTMAP/DAM.jl b/src/ARTMAP/DAM.jl index 4553dc79..a4bdff18 100644 --- a/src/ARTMAP/DAM.jl +++ b/src/ARTMAP/DAM.jl @@ -15,7 +15,7 @@ Implements a Default ARTMAP learner's options. julia> my_opts = opts_DAM() ``` """ -@with_kw mutable struct opts_DAM <: ARTOpts @deftype RealFP +@with_kw mutable struct opts_DAM <: ARTOpts @deftype Float # Vigilance parameter: [0, 1] rho = 0.6; @assert rho >= 0.0 && rho <= 1.0 # Choice parameter: alpha > 0 @@ -27,7 +27,7 @@ julia> my_opts = opts_DAM() # Display flag display::Bool = true # Maximum number of epochs during training - max_epochs::Integer = 1 + max_epochs::Int = 1 end # opts_DAM() """ @@ -42,8 +42,8 @@ mutable struct DAM <: ARTMAP W_old::RealMatrix labels::IntegerVector y::IntegerVector - n_categories::Integer - epoch::Integer + n_categories::Int + epoch::Int end # DAM <: ARTMAP """ @@ -99,17 +99,17 @@ DAM function DAM(opts::opts_DAM) DAM(opts, # opts_DAM DataConfig(), # config - Array{RealFP}(undef, 0,0), # W - Array{RealFP}(undef, 0,0), # W_old - Array{Integer}(undef, 0), # labels - Array{Integer}(undef, 0), # y + Array{Float}(undef, 0,0), # W + Array{Float}(undef, 0,0), # W_old + Array{Int}(undef, 0), # labels + Array{Int}(undef, 0), # y 0, # n_categories 0 # epoch ) end # DAM(opts::opts_DAM) """ - train!(art::DAM, x::RealArray, y::RealArray ; preprocessed::Bool=false) + train!(art::DAM, x::RealMatrix, y::IntegerVector ; preprocessed::Bool=false) Trains a Default ARTMAP learner in a supervised manner. @@ -123,7 +123,7 @@ DAM julia> train!(art, x, y) ``` """ -function train!(art::DAM, x::RealArray, y::RealArray ; preprocessed::Bool=false) +function train!(art::DAM, x::RealMatrix, y::IntegerVector ; preprocessed::Bool=false) # Show a message if display is on art.opts.display && @info "Training DAM" @@ -138,11 +138,8 @@ function train!(art::DAM, x::RealArray, y::RealArray ; preprocessed::Bool=false) x = complement_code(x, config=art.config) end - # Convenient semantic flag - # is_supervised = !isempty(y) - # Initialize the internal categories - art.y = zeros(Integer, n_samples) + art.y = zeros(Int, n_samples) # Initialize the training loop, continue to convergence art.epoch = 0 @@ -156,8 +153,8 @@ function train!(art::DAM, x::RealArray, y::RealArray ; preprocessed::Bool=false) if !(y[ix] in art.labels) # Initialize W and labels if isempty(art.W) - art.W = Array{Float64}(undef, art.config.dim_comp, 1) - art.W_old = Array{Float64}(undef, art.config.dim_comp, 1) + art.W = Array{Float}(undef, art.config.dim_comp, 1) + art.W_old = Array{Float}(undef, art.config.dim_comp, 1) art.W[:, ix] = x[:, ix] else art.W = [art.W x[:, ix]] @@ -213,10 +210,10 @@ function train!(art::DAM, x::RealArray, y::RealArray ; preprocessed::Bool=false) end art.W_old = deepcopy(art.W) end -end # train!(art::DAM, x::RealArray, y::RealArray ; preprocessed::Bool=false) +end # train!(art::DAM, x::RealMatrix, y::IntegerVector ; preprocessed::Bool=false) """ - classify(art::DAM, x::RealArray ; preprocessed::Bool=false) + classify(art::DAM, x::RealMatrix ; preprocessed::Bool=false) Categorize data 'x' using a trained Default ARTMAP module 'art'. @@ -232,7 +229,7 @@ julia> train!(art, x, y) julia> classify(art, x_test) ``` """ -function classify(art::DAM, x::RealArray ; preprocessed::Bool=false) +function classify(art::DAM, x::RealMatrix ; preprocessed::Bool=false) # Show a message if display is on art.opts.display && @info "Testing DAM" @@ -281,7 +278,7 @@ function classify(art::DAM, x::RealArray ; preprocessed::Bool=false) end end return y_hat -end # classify(art::DAM, x::RealArray ; preprocessed::Bool=false) +end # classify(art::DAM, x::RealMatrix ; preprocessed::Bool=false) """ stopping_conditions(art::DAM) diff --git a/src/ARTMAP/FAM.jl b/src/ARTMAP/FAM.jl index f2bd36fd..8efb148c 100644 --- a/src/ARTMAP/FAM.jl +++ b/src/ARTMAP/FAM.jl @@ -15,7 +15,7 @@ Implements a Fuzzy ARTMAP learner's options. julia> my_opts = opts_FAM() ``` """ -@with_kw mutable struct opts_FAM <: ARTOpts @deftype RealFP +@with_kw mutable struct opts_FAM <: ARTOpts @deftype Float # Vigilance parameter: [0, 1] rho = 0.6; @assert rho >= 0.0 && rho <= 1.0 # Choice parameter: alpha > 0 @@ -29,7 +29,7 @@ julia> my_opts = opts_FAM() # Display flag display::Bool = true # Maximum number of epochs during training - max_epochs::Integer = 1 + max_epochs::Int = 1 end # opts_FAM() """ @@ -44,8 +44,8 @@ mutable struct FAM <: ARTMAP W_old::RealMatrix labels::IntegerVector y::IntegerVector - n_categories::Integer - epoch::Integer + n_categories::Int + epoch::Int end # FAM <: ARTMAP """ @@ -101,10 +101,10 @@ FAM function FAM(opts::opts_FAM) FAM(opts, # opts_FAM DataConfig(), # config - Array{RealFP}(undef, 0,0), # W - Array{RealFP}(undef, 0,0), # W_old - Array{Integer}(undef, 0), # labels - Array{Integer}(undef, 0), # y + Array{Float}(undef, 0,0), # W + Array{Float}(undef, 0,0), # W_old + Array{Int}(undef, 0), # labels + Array{Int}(undef, 0), # y 0, # n_categories 0 # epoch ) diff --git a/src/ARTMAP/SFAM.jl b/src/ARTMAP/SFAM.jl index e0418879..27715658 100644 --- a/src/ARTMAP/SFAM.jl +++ b/src/ARTMAP/SFAM.jl @@ -15,7 +15,7 @@ Implements a Simple Fuzzy ARTMAP learner's options. julia> my_opts = opts_SFAM() ``` """ -@with_kw mutable struct opts_SFAM <: ARTOpts @deftype RealFP +@with_kw mutable struct opts_SFAM <: ARTOpts @deftype Float # Vigilance parameter: [0, 1] rho = 0.75; @assert rho >= 0.0 && rho <= 1.0 # Choice parameter: alpha > 0 @@ -29,7 +29,7 @@ julia> my_opts = opts_SFAM() # Display flag display::Bool = true # Maximum number of epochs during training - max_epochs::Integer = 1 + max_epochs::Int = 1 end # opts_SFAM() """ @@ -44,8 +44,8 @@ mutable struct SFAM <: ARTMAP W_old::RealMatrix labels::IntegerVector y::IntegerVector - n_categories::Integer - epoch::Integer + n_categories::Int + epoch::Int end # SFAM <: ARTMAP """ @@ -102,10 +102,10 @@ function SFAM(opts::opts_SFAM) SFAM( opts, # opts_SFAM DataConfig(), # config - Array{RealFP}(undef, 0, 0), # W - Array{RealFP}(undef, 0, 0), # W_old - Array{Integer}(undef, 0), # labels - Array{Integer}(undef, 0), # y + Array{Float}(undef, 0, 0), # W + Array{Float}(undef, 0, 0), # W_old + Array{Int}(undef, 0), # labels + Array{Int}(undef, 0), # y 0, # n_categories 0 # epoch ) diff --git a/src/common.jl b/src/common.jl index a9c87e35..53bd972d 100644 --- a/src/common.jl +++ b/src/common.jl @@ -284,7 +284,7 @@ function get_iterator(opts::ARTOpts, x::RealArray) # Construct the iterator iter_raw = 1:n_samples - iter = prog_bar ? ProgressBar(iter_raw) : iter_raw + iter = prog_bar ? ProgressBar(iter_raw) : iter_raw return iter end # get_iterator(opts::ARTOpts, x::RealArray) From 20ac7dd29776251b7ce9d1ece549b2a9d0fc6792 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 18 Oct 2021 14:02:39 -0500 Subject: [PATCH 11/38] Update signed Int and Floats in common --- src/common.jl | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/common.jl b/src/common.jl index 53bd972d..e2b7e621 100644 --- a/src/common.jl +++ b/src/common.jl @@ -46,8 +46,8 @@ mutable struct DataConfig setup::Bool mins::RealVector maxs::RealVector - dim::Integer - dim_comp::Integer + dim::Int + dim_comp::Int end # DataConfig """ @@ -88,13 +88,13 @@ function DataConfig(mins::RealVector, maxs::RealVector) end # DataConfig(mins::RealVector, maxs::RealVector) """ - DataConfig(min::Real, max::Real, dim::Integer) + DataConfig(min::Real, max::Real, dim::Int) Convenience constructor for DataConfig, requiring only a global min, max, and dim. This constructor is used in the case that the feature mins and maxs are all the same respectively. """ -function DataConfig(min::Real, max::Real, dim::Integer) +function DataConfig(min::Real, max::Real, dim::Int) DataConfig( true, # setup repeat([min], dim), # min @@ -102,7 +102,7 @@ function DataConfig(min::Real, max::Real, dim::Integer) dim, # dim dim*2 # dim_comp ) -end # DataConfig(min::Real, max::Real, dim::Integer) +end # DataConfig(min::Real, max::Real, dim::Int) """ element_min(x::RealVector, W::RealVector) @@ -210,7 +210,7 @@ function DataConfig(data::RealMatrix) # Return the constructed DataConfig return config -end # DataConfig(min::Real, max::Real, dim::Integer) +end # DataConfig(min::Real, max::Real, dim::Int) """ get_data_characteristics(data::RealArray ; config::DataConfig=DataConfig()) @@ -290,9 +290,9 @@ function get_iterator(opts::ARTOpts, x::RealArray) end # get_iterator(opts::ARTOpts, x::RealArray) """ - update_iter(art::ARTModule, iter::ARTIterator, i::Integer) + update_iter(art::ARTModule, iter::ARTIterator, i::Int) """ -function update_iter(art::ARTModule, iter::ARTIterator, i::Integer) +function update_iter(art::ARTModule, iter::ARTIterator, i::Int) # Check explicitly for each, as the function definition restricts the types if iter isa ProgressBar set_description(iter, string(@sprintf("Ep: %i, ID: %i, Cat: %i", art.epoch, i, art.n_categories))) @@ -302,11 +302,11 @@ function update_iter(art::ARTModule, iter::ARTIterator, i::Integer) end # update_iter(art::ARTModule, iter::Union{UnitRange, ProgressBar}, i::Int) """ - get_sample(x::RealArray, i::Integer) + get_sample(x::RealArray, i::Int) Returns a sample from data array x safely, accounting for 1-D and """ -function get_sample(x::RealArray, i::Integer) +function get_sample(x::RealArray, i::Int) # Get the shape of the data, irrespective of data type dim, n_samples = get_data_shape(x) # Get the type shape of the array @@ -323,4 +323,4 @@ function get_sample(x::RealArray, i::Integer) sample = x[:, i] end return sample -end # get_sample(x::RealArray, i::Integer) +end # get_sample(x::RealArray, i::Int) From 5a45825e4a8d0a27f59b51267468b40e78616073 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 18 Oct 2021 14:44:34 -0500 Subject: [PATCH 12/38] Start generating dev pages --- .github/workflows/Documentation.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Documentation.yml b/.github/workflows/Documentation.yml index d2973f9d..6fa792a7 100644 --- a/.github/workflows/Documentation.yml +++ b/.github/workflows/Documentation.yml @@ -4,6 +4,7 @@ on: push: branches: - master + - develop tags: '*' pull_request: From f1227ea692643796ae3d38eb7267b0536f928688 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Tue, 19 Oct 2021 08:35:52 -0500 Subject: [PATCH 13/38] Update Documenter deploydocs devbranch to develop --- docs/make.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/make.jl b/docs/make.jl index d001acb0..565e536f 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -30,4 +30,5 @@ makedocs( deploydocs( repo="github.com/AP6YC/AdaptiveResonance.jl.git", + devbranch="develop", ) From 5ed468191676ece536d6bd6e87ab179a0d2b2c1e Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Wed, 20 Oct 2021 10:07:35 -0500 Subject: [PATCH 14/38] Move GNFA to separate file as its own module --- src/ART/ART.jl | 1 + src/ART/DDVFA.jl | 381 -------------------------------------- src/ART/GNFA.jl | 387 +++++++++++++++++++++++++++++++++++++++ src/AdaptiveResonance.jl | 2 +- 4 files changed, 389 insertions(+), 382 deletions(-) create mode 100644 src/ART/GNFA.jl diff --git a/src/ART/ART.jl b/src/ART/ART.jl index 89668af6..c9ea5807 100644 --- a/src/ART/ART.jl +++ b/src/ART/ART.jl @@ -5,5 +5,6 @@ Description: Includes all of the unsupervised ART modules definitions. """ +include("GNFA.jl") # GNFA include("DDVFA.jl") # DDVFA and GNFA include("DVFA.jl") # DVFA diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index a4a6fff1..01e71e1e 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -5,387 +5,6 @@ Description: Includes all of the structures and logic for running a Distributed Dual-Vigilance Fuzzy ART (DDVFA) module. """ -""" - opts_GNFA() - -Gamma-Normalized Fuzzy ART options struct. - -# Examples -```julia-repl -julia> opts_GNFA() -Initialized GNFA -``` -""" -@with_kw mutable struct opts_GNFA <: ARTOpts @deftype Float - # Vigilance parameter: [0, 1] - rho = 0.6; @assert rho >= 0.0 && rho <= 1.0 - # Choice parameter: alpha > 0 - alpha = 1e-3; @assert alpha > 0.0 - # Learning parameter: (0, 1] - beta = 1.0; @assert beta > 0.0 && beta <= 1.0 - # "Pseudo" kernel width: gamma >= 1 - gamma = 3.0; @assert gamma >= 1.0 - # gamma = 784; @assert gamma >= 1 - # "Reference" gamma for normalization: 0 <= gamma_ref < gamma - gamma_ref = 1.0; @assert 0.0 <= gamma_ref && gamma_ref < gamma - # Similarity method (activation and match): - # 'single', 'average', 'complete', 'median', 'weighted', or 'centroid' - method::String = "single" - # Display flag - display::Bool = true - # Maximum number of epochs during training - max_epochs::Int = 1 -end # opts_GNFA - -""" - GNFA <: ART - -Gamma-Normalized Fuzzy ART learner struct - -# Examples -```julia-repl -julia> GNFA() -GNFA - opts: opts_GNFA - ... -``` -""" -mutable struct GNFA <: ART - # Assign numerical parameters from options - opts::opts_GNFA - config::DataConfig - - # Working variables - threshold::Float - labels::IntegerVector - T::RealVector - M::RealVector - - # "Private" working variables - W::RealMatrix - W_old::RealMatrix - n_instance::IntegerVector - n_categories::Int - epoch::Int -end # GNFA <: ART - -""" - GNFA() - -Implements a Gamma-Normalized Fuzzy ART learner. - -# Examples -```julia-repl -julia> GNFA() -GNFA - opts: opts_GNFA - ... -``` -""" -function GNFA() - opts = opts_GNFA() - GNFA(opts) -end # GNFA() - -""" - GNFA(;kwargs...) - -Implements a Gamma-Normalized Fuzzy ART learner with keyword arguments. - -# Examples -```julia-repl -julia> GNFA(rho=0.7) -GNFA - opts: opts_GNFA - ... -``` -""" -function GNFA(;kwargs...) - opts = opts_GNFA(;kwargs...) - GNFA(opts) -end # GNFA(;kwargs...) - -""" - GNFA(opts::opts_GNFA) - -Implements a Gamma-Normalized Fuzzy ART learner with specified options. - -# Examples -```julia-repl -julia> GNFA(opts) -GNFA - opts: opts_GNFA - ... -``` -""" -function GNFA(opts::opts_GNFA) - GNFA(opts, # opts - DataConfig(), # config - 0.0, # threshold - Array{Int}(undef,0), # labels - Array{Float}(undef, 0), # T - Array{Float}(undef, 0), # M - Array{Float}(undef, 0, 0), # W - Array{Float}(undef, 0, 0), # W_old - Array{Int}(undef, 0), # n_instance - 0, # n_categories - 0 # epoch - ) -end # GNFA(opts::opts_GNFA) - -""" - GNFA(opts::opts_GNFA, sample::RealArray) - -Create and initialize a GNFA with a single sample in one step. -""" -function GNFA(opts::opts_GNFA, sample::RealArray) - art = GNFA(opts) - initialize!(art, sample) - return art -end # GNFA(opts::opts_GNFA, sample::RealArray) - -""" - initialize!(art::GNFA, x::Array) - -Initializes a GNFA learner with an intial sample 'x'. - -# Examples -```julia-repl -julia> my_GNFA = GNFA() -GNFA - opts: opts_GNFA - ... -julia> initialize!(my_GNFA, [1 2 3 4]) -``` -""" -# function initialize!(art::GNFA, x::RealArray ; y::Integer=0) -function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} - # Set up the data config - if art.config.setup - @warn "Data configuration already set up, overwriting config" - else - art.config.setup = true - end - - # IMPORTANT: Assuming that x is a sample, so each entry is a feature - dim = length(x) - art.config.dim_comp = dim - art.config.dim = Int(dim/2) # Assumes input is already complement coded - - # Initialize the instance and categories counters - art.n_instance = [1] - art.n_categories = 1 - - # Set the threshold - art.threshold = art.opts.rho * (art.config.dim^art.opts.gamma_ref) - # Fast commit the weight - art.W = Array{T}(undef, art.config.dim_comp, 1) - # Assign the contents, valid this way for 1-D or 2-D arrays - art.W[:, 1] = x - label = y == 0 ? y : 1 - push!(art.labels, label) -end # initialize!(art::GNFA, x::RealArray ; y::Integer=0) - -""" - train!(art::GNFA, x::RealArray ; y::IntegerVector=[]) - -Trains a GNFA learner with dataset 'x' and optional labels 'y' - -# Examples -```julia-repl -julia> my_GNFA = GNFA() -GNFA - opts: opts_GNFA - ... -julia> x = load_data() -julia> train!(my_GNFA, x) -``` -""" -function train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) - # Flag for if training in supervised mode - supervised = !isempty(y) - # Initialization if weights are empty; fast commit the first sample - if isempty(art.W) - label = supervised ? y[1] : 1 - push!(art.labels, label) - initialize!(art, x[:, 1]) - skip_first = true - else - skip_first = false - end - - art.W_old = deepcopy(art.W) - - # Learning - art.epoch = 0 - while true - # Increment the epoch and get the iterator - art.epoch += 1 - iter = get_iterator(art.opts, x) - # Loop over samples - for i = iter - # Update the iterator if necessary - update_iter(art, iter, i) - # Skip the first sample if we just initialized - (i == 1 && skip_first) && continue - # Grab the sample slice - sample = get_sample(x, i) - # Compute activation/match functions - activation_match!(art, sample) - # Sort activation function values in descending order - index = sortperm(art.T, rev=true) - # Initialize mismatch as true - mismatch_flag = true - # Loop over all categories - for j = 1:art.n_categories - # Best matching unit - bmu = index[j] - # Vigilance check - pass - if art.M[bmu] >= art.threshold - # Learn the sample - learn!(art, sample, bmu) - # Update sample labels - label = supervised ? y[i] : bmu - push!(art.labels, label) - # No mismatch - mismatch_flag = false - break - end - end - # If there was no resonant category, make a new one - if mismatch_flag - # Increment the number of categories - art.n_categories += 1 - # Fast commit - # art.W = [art.W x[:, i]] - art.W = hcat(art.W, sample) - # Increment number of samples associated with new category - push!(art.n_instance, 1) - # Update sample labels - label = supervised ? y[i] : art.n_categories - push!(art.labels, label) - end - end - # Make sure to start at first sample from now on - skip_first = false - # Check for the stopping condition for the whole loop - if stopping_conditions(art) - break - end - # If we didn't break, deep copy the old weights - art.W_old = deepcopy(art.W) - end -end # train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) - -""" - classify(art::GNFA, x::RealArray) - -Predict categories of 'x' using the GNFA model. - -Returns predicted categories 'y_hat' - -# Examples -```julia-repl -julia> my_GNFA = GNFA() -GNFA - opts: opts_GNFA - ... -julia> x, y = load_data() -julia> train!(my_GNFA, x) -julia> y_hat = classify(my_GNFA, y) -``` -""" -function classify(art::GNFA, x::RealArray) - # Get the number of samples to classify - n_samples = get_n_samples(x) - - # Initialize the output vector and iterate across all data - y_hat = zeros(Int, n_samples) - iter = get_iterator(art.opts, x) - for ix in iter - # Update the iterator if necessary - update_iter(art, iter, ix) - # Compute activation and match functions - activation_match!(art, x[:, ix]) - # Sort activation function values in descending order - index = sortperm(art.T, rev=true) - mismatch_flag = true - for jx in 1:art.n_categories - bmu = index[jx] - # Vigilance check - pass - if art.M[bmu] >= art.threshold - # Current winner - y_hat[ix] = art.labels[bmu] - mismatch_flag = false - break - end - end - if mismatch_flag - # Create new weight vector - @debug "Mismatch" - y_hat[ix] = -1 - end - end - return y_hat -end # classify(art::GNFA, x::RealArray) - -""" - activation_match!(art::GNFA, x::RealArray) - -Computes the activation and match functions of the art module against sample x. - -# Examples -```julia-repl -julia> my_GNFA = GNFA() -GNFA - opts: opts_GNFA - ... -julia> x, y = load_data() -julia> train!(my_GNFA, x) -julia> x_sample = x[:, 1] -julia> activation_match!(my_GNFA, x_sample) -``` -""" -function activation_match!(art::GNFA, x::RealArray) - art.T = zeros(art.n_categories) - art.M = zeros(art.n_categories) - for i = 1:art.n_categories - W_norm = norm(art.W[:, i], 1) - art.T[i] = (norm(element_min(x, art.W[:, i]), 1)/(art.opts.alpha + W_norm))^art.opts.gamma - art.M[i] = (W_norm^art.opts.gamma_ref)*art.T[i] - end -end # activation_match!(art::GNFA, x::RealArray) - -""" - learn(art::GNFA, x::RealVector, W::RealVector) - -Return the modified weight of the art module conditioned by sample x. -""" -function learn(art::GNFA, x::RealVector, W::RealVector) - # Update W - return art.opts.beta .* element_min(x, W) .+ W .* (1 - art.opts.beta) -end # learn(art::GNFA, x::RealVector, W::RealVector) - -""" - learn!(art::GNFA, x::RealVector, index::Integer) - -In place learning function with instance counting. -""" -function learn!(art::GNFA, x::RealVector, index::Integer) - # Update W - art.W[:, index] = learn(art, x, art.W[:, index]) - art.n_instance[index] += 1 -end # learn!(art::GNFA, x::RealVector, index::Integer) - -""" - stopping_conditions(art::GNFA) - -Stopping conditions for a GNFA module. -""" -function stopping_conditions(art::GNFA) - return isequal(art.W, art.W_old) || art.epoch >= art.opts.max_epochs -end # stopping_conditions(art::GNFA) - """ opts_DDVFA() diff --git a/src/ART/GNFA.jl b/src/ART/GNFA.jl new file mode 100644 index 00000000..710c8dab --- /dev/null +++ b/src/ART/GNFA.jl @@ -0,0 +1,387 @@ +""" + GNFA.jl + +Description: + Includes all of the structures and logic for running a Gamma-Normalized Fuzzy ART module. +""" + +""" + opts_GNFA() + +Gamma-Normalized Fuzzy ART options struct. + +# Examples +```julia-repl +julia> opts_GNFA() +Initialized GNFA +``` +""" +@with_kw mutable struct opts_GNFA <: ARTOpts @deftype Float + # Vigilance parameter: [0, 1] + rho = 0.6; @assert rho >= 0.0 && rho <= 1.0 + # Choice parameter: alpha > 0 + alpha = 1e-3; @assert alpha > 0.0 + # Learning parameter: (0, 1] + beta = 1.0; @assert beta > 0.0 && beta <= 1.0 + # "Pseudo" kernel width: gamma >= 1 + gamma = 3.0; @assert gamma >= 1.0 + # gamma = 784; @assert gamma >= 1 + # "Reference" gamma for normalization: 0 <= gamma_ref < gamma + gamma_ref = 1.0; @assert 0.0 <= gamma_ref && gamma_ref < gamma + # Similarity method (activation and match): + # 'single', 'average', 'complete', 'median', 'weighted', or 'centroid' + method::String = "single" + # Display flag + display::Bool = true + # Maximum number of epochs during training + max_epochs::Int = 1 +end # opts_GNFA + +""" + GNFA <: ART + +Gamma-Normalized Fuzzy ART learner struct + +# Examples +```julia-repl +julia> GNFA() +GNFA + opts: opts_GNFA + ... +``` +""" +mutable struct GNFA <: ART + # Assign numerical parameters from options + opts::opts_GNFA + config::DataConfig + + # Working variables + threshold::Float + labels::IntegerVector + T::RealVector + M::RealVector + + # "Private" working variables + W::RealMatrix + W_old::RealMatrix + n_instance::IntegerVector + n_categories::Int + epoch::Int +end # GNFA <: ART + +""" + GNFA() + +Implements a Gamma-Normalized Fuzzy ART learner. + +# Examples +```julia-repl +julia> GNFA() +GNFA + opts: opts_GNFA + ... +``` +""" +function GNFA() + opts = opts_GNFA() + GNFA(opts) +end # GNFA() + +""" + GNFA(;kwargs...) + +Implements a Gamma-Normalized Fuzzy ART learner with keyword arguments. + +# Examples +```julia-repl +julia> GNFA(rho=0.7) +GNFA + opts: opts_GNFA + ... +``` +""" +function GNFA(;kwargs...) + opts = opts_GNFA(;kwargs...) + GNFA(opts) +end # GNFA(;kwargs...) + +""" + GNFA(opts::opts_GNFA) + +Implements a Gamma-Normalized Fuzzy ART learner with specified options. + +# Examples +```julia-repl +julia> GNFA(opts) +GNFA + opts: opts_GNFA + ... +``` +""" +function GNFA(opts::opts_GNFA) + GNFA(opts, # opts + DataConfig(), # config + 0.0, # threshold + Array{Int}(undef,0), # labels + Array{Float}(undef, 0), # T + Array{Float}(undef, 0), # M + Array{Float}(undef, 0, 0), # W + Array{Float}(undef, 0, 0), # W_old + Array{Int}(undef, 0), # n_instance + 0, # n_categories + 0 # epoch + ) +end # GNFA(opts::opts_GNFA) + +""" + GNFA(opts::opts_GNFA, sample::RealArray) + +Create and initialize a GNFA with a single sample in one step. +""" +function GNFA(opts::opts_GNFA, sample::RealArray) + art = GNFA(opts) + initialize!(art, sample) + return art +end # GNFA(opts::opts_GNFA, sample::RealArray) + +""" + initialize!(art::GNFA, x::Array) + +Initializes a GNFA learner with an intial sample 'x'. + +# Examples +```julia-repl +julia> my_GNFA = GNFA() +GNFA + opts: opts_GNFA + ... +julia> initialize!(my_GNFA, [1 2 3 4]) +``` +""" +# function initialize!(art::GNFA, x::RealArray ; y::Integer=0) +function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} + # Set up the data config + if art.config.setup + @warn "Data configuration already set up, overwriting config" + else + art.config.setup = true + end + + # IMPORTANT: Assuming that x is a sample, so each entry is a feature + dim = length(x) + art.config.dim_comp = dim + art.config.dim = Int(dim/2) # Assumes input is already complement coded + + # Initialize the instance and categories counters + art.n_instance = [1] + art.n_categories = 1 + + # Set the threshold + art.threshold = art.opts.rho * (art.config.dim^art.opts.gamma_ref) + # Fast commit the weight + art.W = Array{T}(undef, art.config.dim_comp, 1) + # Assign the contents, valid this way for 1-D or 2-D arrays + art.W[:, 1] = x + label = y == 0 ? y : 1 + push!(art.labels, label) +end # initialize!(art::GNFA, x::RealArray ; y::Integer=0) + +""" + train!(art::GNFA, x::RealArray ; y::IntegerVector=[]) + +Trains a GNFA learner with dataset 'x' and optional labels 'y' + +# Examples +```julia-repl +julia> my_GNFA = GNFA() +GNFA + opts: opts_GNFA + ... +julia> x = load_data() +julia> train!(my_GNFA, x) +``` +""" +function train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) + # Flag for if training in supervised mode + supervised = !isempty(y) + # Initialization if weights are empty; fast commit the first sample + if isempty(art.W) + label = supervised ? y[1] : 1 + push!(art.labels, label) + initialize!(art, x[:, 1]) + skip_first = true + else + skip_first = false + end + + art.W_old = deepcopy(art.W) + + # Learning + art.epoch = 0 + while true + # Increment the epoch and get the iterator + art.epoch += 1 + iter = get_iterator(art.opts, x) + # Loop over samples + for i = iter + # Update the iterator if necessary + update_iter(art, iter, i) + # Skip the first sample if we just initialized + (i == 1 && skip_first) && continue + # Grab the sample slice + sample = get_sample(x, i) + # Compute activation/match functions + activation_match!(art, sample) + # Sort activation function values in descending order + index = sortperm(art.T, rev=true) + # Initialize mismatch as true + mismatch_flag = true + # Loop over all categories + for j = 1:art.n_categories + # Best matching unit + bmu = index[j] + # Vigilance check - pass + if art.M[bmu] >= art.threshold + # Learn the sample + learn!(art, sample, bmu) + # Update sample labels + label = supervised ? y[i] : bmu + push!(art.labels, label) + # No mismatch + mismatch_flag = false + break + end + end + # If there was no resonant category, make a new one + if mismatch_flag + # Increment the number of categories + art.n_categories += 1 + # Fast commit + # art.W = [art.W x[:, i]] + art.W = hcat(art.W, sample) + # Increment number of samples associated with new category + push!(art.n_instance, 1) + # Update sample labels + label = supervised ? y[i] : art.n_categories + push!(art.labels, label) + end + end + # Make sure to start at first sample from now on + skip_first = false + # Check for the stopping condition for the whole loop + if stopping_conditions(art) + break + end + # If we didn't break, deep copy the old weights + art.W_old = deepcopy(art.W) + end +end # train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) + +""" + classify(art::GNFA, x::RealArray) + +Predict categories of 'x' using the GNFA model. + +Returns predicted categories 'y_hat' + +# Examples +```julia-repl +julia> my_GNFA = GNFA() +GNFA + opts: opts_GNFA + ... +julia> x, y = load_data() +julia> train!(my_GNFA, x) +julia> y_hat = classify(my_GNFA, y) +``` +""" +function classify(art::GNFA, x::RealArray) + # Get the number of samples to classify + n_samples = get_n_samples(x) + + # Initialize the output vector and iterate across all data + y_hat = zeros(Int, n_samples) + iter = get_iterator(art.opts, x) + for ix in iter + # Update the iterator if necessary + update_iter(art, iter, ix) + # Compute activation and match functions + activation_match!(art, x[:, ix]) + # Sort activation function values in descending order + index = sortperm(art.T, rev=true) + mismatch_flag = true + for jx in 1:art.n_categories + bmu = index[jx] + # Vigilance check - pass + if art.M[bmu] >= art.threshold + # Current winner + y_hat[ix] = art.labels[bmu] + mismatch_flag = false + break + end + end + if mismatch_flag + # Create new weight vector + @debug "Mismatch" + y_hat[ix] = -1 + end + end + return y_hat +end # classify(art::GNFA, x::RealArray) + +""" + activation_match!(art::GNFA, x::RealArray) + +Computes the activation and match functions of the art module against sample x. + +# Examples +```julia-repl +julia> my_GNFA = GNFA() +GNFA + opts: opts_GNFA + ... +julia> x, y = load_data() +julia> train!(my_GNFA, x) +julia> x_sample = x[:, 1] +julia> activation_match!(my_GNFA, x_sample) +``` +""" +function activation_match!(art::GNFA, x::RealArray) + art.T = zeros(art.n_categories) + art.M = zeros(art.n_categories) + for i = 1:art.n_categories + W_norm = norm(art.W[:, i], 1) + art.T[i] = (norm(element_min(x, art.W[:, i]), 1)/(art.opts.alpha + W_norm))^art.opts.gamma + art.M[i] = (W_norm^art.opts.gamma_ref)*art.T[i] + end +end # activation_match!(art::GNFA, x::RealArray) + +""" + learn(art::GNFA, x::RealVector, W::RealVector) + +Return the modified weight of the art module conditioned by sample x. +""" +function learn(art::GNFA, x::RealVector, W::RealVector) + # Update W + return art.opts.beta .* element_min(x, W) .+ W .* (1 - art.opts.beta) +end # learn(art::GNFA, x::RealVector, W::RealVector) + +""" + learn!(art::GNFA, x::RealVector, index::Integer) + +In place learning function with instance counting. +""" +function learn!(art::GNFA, x::RealVector, index::Integer) + # Update W + art.W[:, index] = learn(art, x, art.W[:, index]) + art.n_instance[index] += 1 +end # learn!(art::GNFA, x::RealVector, index::Integer) + +""" + stopping_conditions(art::GNFA) + +Stopping conditions for a GNFA module. +""" +function stopping_conditions(art::GNFA) + return isequal(art.W, art.W_old) || art.epoch >= art.opts.max_epochs +end # stopping_conditions(art::GNFA) \ No newline at end of file diff --git a/src/AdaptiveResonance.jl b/src/AdaptiveResonance.jl index ef85fbdb..25525fc1 100644 --- a/src/AdaptiveResonance.jl +++ b/src/AdaptiveResonance.jl @@ -46,8 +46,8 @@ export get_n_samples, # Get the number of samples (1-D interpreted as one sample) # ART (unsupervised) - DDVFA, opts_DDVFA, GNFA, opts_GNFA, + DDVFA, opts_DDVFA, DVFA, opts_DVFA, # ARTMAP (supervised) From a82b8125456a3900806fd85a269d5519ca19ce7b Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Wed, 20 Oct 2021 10:18:14 -0500 Subject: [PATCH 15/38] Copy GNFA to FuzzyART as template --- src/ART/ART.jl | 3 +- src/ART/FuzzyART.jl | 387 +++++++++++++++++++++++++++++++++++++++ src/ART/GNFA.jl | 27 ++- src/AdaptiveResonance.jl | 1 + 4 files changed, 403 insertions(+), 15 deletions(-) create mode 100644 src/ART/FuzzyART.jl diff --git a/src/ART/ART.jl b/src/ART/ART.jl index c9ea5807..595d54ee 100644 --- a/src/ART/ART.jl +++ b/src/ART/ART.jl @@ -5,6 +5,7 @@ Description: Includes all of the unsupervised ART modules definitions. """ +include("FuzzyART.jl") # FuzzyART include("GNFA.jl") # GNFA -include("DDVFA.jl") # DDVFA and GNFA +include("DDVFA.jl") # DDVFA include("DVFA.jl") # DVFA diff --git a/src/ART/FuzzyART.jl b/src/ART/FuzzyART.jl new file mode 100644 index 00000000..605a9566 --- /dev/null +++ b/src/ART/FuzzyART.jl @@ -0,0 +1,387 @@ +""" + FuzzyART.jl + +Description: + Includes all of the structures and logic for running a Gamma-Normalized Fuzzy ART module. +""" + +""" + opts_FuzzyART() + +Gamma-Normalized Fuzzy ART options struct. + +# Examples +```julia-repl +julia> opts_FuzzyART() +Initialized FuzzyART +``` +""" +@with_kw mutable struct opts_FuzzyART <: ARTOpts @deftype Float + # Vigilance parameter: [0, 1] + rho = 0.6; @assert rho >= 0.0 && rho <= 1.0 + # Choice parameter: alpha > 0 + alpha = 1e-3; @assert alpha > 0.0 + # Learning parameter: (0, 1] + beta = 1.0; @assert beta > 0.0 && beta <= 1.0 + # "Pseudo" kernel width: gamma >= 1 + gamma = 3.0; @assert gamma >= 1.0 + # gamma = 784; @assert gamma >= 1 + # "Reference" gamma for normalization: 0 <= gamma_ref < gamma + gamma_ref = 1.0; @assert 0.0 <= gamma_ref && gamma_ref < gamma + # Similarity method (activation and match): + # 'single', 'average', 'complete', 'median', 'weighted', or 'centroid' + method::String = "single" + # Display flag + display::Bool = true + # Maximum number of epochs during training + max_epochs::Int = 1 +end # opts_FuzzyART + +""" + FuzzyART <: ART + +Gamma-Normalized Fuzzy ART learner struct + +# Examples +```julia-repl +julia> FuzzyART() +FuzzyART + opts: opts_FuzzyART + ... +``` +""" +mutable struct FuzzyART <: ART + # Assign numerical parameters from options + opts::opts_FuzzyART + config::DataConfig + + # Working variables + threshold::Float + labels::IntegerVector + T::RealVector + M::RealVector + + # "Private" working variables + W::RealMatrix + W_old::RealMatrix + n_instance::IntegerVector + n_categories::Int + epoch::Int +end # FuzzyART <: ART + +""" + FuzzyART() + +Implements a Gamma-Normalized Fuzzy ART learner. + +# Examples +```julia-repl +julia> FuzzyART() +FuzzyART + opts: opts_FuzzyART + ... +``` +""" +function FuzzyART() + opts = opts_FuzzyART() + FuzzyART(opts) +end # FuzzyART() + +""" + FuzzyART(;kwargs...) + +Implements a Gamma-Normalized Fuzzy ART learner with keyword arguments. + +# Examples +```julia-repl +julia> FuzzyART(rho=0.7) +FuzzyART + opts: opts_FuzzyART + ... +``` +""" +function FuzzyART(;kwargs...) + opts = opts_FuzzyART(;kwargs...) + FuzzyART(opts) +end # FuzzyART(;kwargs...) + +""" + FuzzyART(opts::opts_FuzzyART) + +Implements a Gamma-Normalized Fuzzy ART learner with specified options. + +# Examples +```julia-repl +julia> FuzzyART(opts) +FuzzyART + opts: opts_FuzzyART + ... +``` +""" +function FuzzyART(opts::opts_FuzzyART) + FuzzyART(opts, # opts + DataConfig(), # config + 0.0, # threshold + Array{Int}(undef,0), # labels + Array{Float}(undef, 0), # T + Array{Float}(undef, 0), # M + Array{Float}(undef, 0, 0), # W + Array{Float}(undef, 0, 0), # W_old + Array{Int}(undef, 0), # n_instance + 0, # n_categories + 0 # epoch + ) +end # FuzzyART(opts::opts_FuzzyART) + +""" + FuzzyART(opts::opts_FuzzyART, sample::RealArray) + +Create and initialize a FuzzyART with a single sample in one step. +""" +function FuzzyART(opts::opts_FuzzyART, sample::RealArray) + art = FuzzyART(opts) + initialize!(art, sample) + return art +end # FuzzyART(opts::opts_FuzzyART, sample::RealArray) + +""" + initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} + +Initializes a FuzzyART learner with an intial sample 'x'. + +# Examples +```julia-repl +julia> my_FuzzyART = FuzzyART() +FuzzyART + opts: opts_FuzzyART + ... +julia> initialize!(my_FuzzyART, [1 2 3 4]) +``` +""" +# function initialize!(art::FuzzyART, x::RealArray ; y::Integer=0) +function initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} + # Set up the data config + if art.config.setup + @warn "Data configuration already set up, overwriting config" + else + art.config.setup = true + end + + # IMPORTANT: Assuming that x is a sample, so each entry is a feature + dim = length(x) + art.config.dim_comp = dim + art.config.dim = Int(dim/2) # Assumes input is already complement coded + + # Initialize the instance and categories counters + art.n_instance = [1] + art.n_categories = 1 + + # Set the threshold + art.threshold = art.opts.rho * (art.config.dim^art.opts.gamma_ref) + # Fast commit the weight + art.W = Array{T}(undef, art.config.dim_comp, 1) + # Assign the contents, valid this way for 1-D or 2-D arrays + art.W[:, 1] = x + label = y == 0 ? y : 1 + push!(art.labels, label) +end # initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} + +""" + train!(art::FuzzyART, x::RealArray ; y::IntegerVector = Vector{Int}()) + +Trains a FuzzyART learner with dataset 'x' and optional labels 'y' + +# Examples +```julia-repl +julia> my_FuzzyART = FuzzyART() +FuzzyART + opts: opts_FuzzyART + ... +julia> x = load_data() +julia> train!(my_FuzzyART, x) +``` +""" +function train!(art::FuzzyART, x::RealArray ; y::IntegerVector = Vector{Int}()) + # Flag for if training in supervised mode + supervised = !isempty(y) + # Initialization if weights are empty; fast commit the first sample + if isempty(art.W) + label = supervised ? y[1] : 1 + push!(art.labels, label) + initialize!(art, x[:, 1]) + skip_first = true + else + skip_first = false + end + + art.W_old = deepcopy(art.W) + + # Learning + art.epoch = 0 + while true + # Increment the epoch and get the iterator + art.epoch += 1 + iter = get_iterator(art.opts, x) + # Loop over samples + for i = iter + # Update the iterator if necessary + update_iter(art, iter, i) + # Skip the first sample if we just initialized + (i == 1 && skip_first) && continue + # Grab the sample slice + sample = get_sample(x, i) + # Compute activation/match functions + activation_match!(art, sample) + # Sort activation function values in descending order + index = sortperm(art.T, rev=true) + # Initialize mismatch as true + mismatch_flag = true + # Loop over all categories + for j = 1:art.n_categories + # Best matching unit + bmu = index[j] + # Vigilance check - pass + if art.M[bmu] >= art.threshold + # Learn the sample + learn!(art, sample, bmu) + # Update sample labels + label = supervised ? y[i] : bmu + push!(art.labels, label) + # No mismatch + mismatch_flag = false + break + end + end + # If there was no resonant category, make a new one + if mismatch_flag + # Increment the number of categories + art.n_categories += 1 + # Fast commit + # art.W = [art.W x[:, i]] + art.W = hcat(art.W, sample) + # Increment number of samples associated with new category + push!(art.n_instance, 1) + # Update sample labels + label = supervised ? y[i] : art.n_categories + push!(art.labels, label) + end + end + # Make sure to start at first sample from now on + skip_first = false + # Check for the stopping condition for the whole loop + if stopping_conditions(art) + break + end + # If we didn't break, deep copy the old weights + art.W_old = deepcopy(art.W) + end +end # train!(art::FuzzyART, x::RealArray ; y::IntegerVector = Vector{Int}()) + +""" + classify(art::FuzzyART, x::RealArray) + +Predict categories of 'x' using the FuzzyART model. + +Returns predicted categories 'y_hat' + +# Examples +```julia-repl +julia> my_FuzzyART = FuzzyART() +FuzzyART + opts: opts_FuzzyART + ... +julia> x, y = load_data() +julia> train!(my_FuzzyART, x) +julia> y_hat = classify(my_FuzzyART, y) +``` +""" +function classify(art::FuzzyART, x::RealArray) + # Get the number of samples to classify + n_samples = get_n_samples(x) + + # Initialize the output vector and iterate across all data + y_hat = zeros(Int, n_samples) + iter = get_iterator(art.opts, x) + for ix in iter + # Update the iterator if necessary + update_iter(art, iter, ix) + # Compute activation and match functions + activation_match!(art, x[:, ix]) + # Sort activation function values in descending order + index = sortperm(art.T, rev=true) + mismatch_flag = true + for jx in 1:art.n_categories + bmu = index[jx] + # Vigilance check - pass + if art.M[bmu] >= art.threshold + # Current winner + y_hat[ix] = art.labels[bmu] + mismatch_flag = false + break + end + end + if mismatch_flag + # Create new weight vector + @debug "Mismatch" + y_hat[ix] = -1 + end + end + return y_hat +end # classify(art::FuzzyART, x::RealArray) + +""" + activation_match!(art::FuzzyART, x::RealArray) + +Computes the activation and match functions of the art module against sample x. + +# Examples +```julia-repl +julia> my_FuzzyART = FuzzyART() +FuzzyART + opts: opts_FuzzyART + ... +julia> x, y = load_data() +julia> train!(my_FuzzyART, x) +julia> x_sample = x[:, 1] +julia> activation_match!(my_FuzzyART, x_sample) +``` +""" +function activation_match!(art::FuzzyART, x::RealArray) + art.T = zeros(art.n_categories) + art.M = zeros(art.n_categories) + for i = 1:art.n_categories + W_norm = norm(art.W[:, i], 1) + art.T[i] = (norm(element_min(x, art.W[:, i]), 1)/(art.opts.alpha + W_norm))^art.opts.gamma + art.M[i] = (W_norm^art.opts.gamma_ref)*art.T[i] + end +end # activation_match!(art::FuzzyART, x::RealArray) + +""" + learn(art::FuzzyART, x::RealVector, W::RealVector) + +Return the modified weight of the art module conditioned by sample x. +""" +function learn(art::FuzzyART, x::RealVector, W::RealVector) + # Update W + return art.opts.beta .* element_min(x, W) .+ W .* (1 - art.opts.beta) +end # learn(art::FuzzyART, x::RealVector, W::RealVector) + +""" + learn!(art::FuzzyART, x::RealVector, index::Integer) + +In place learning function with instance counting. +""" +function learn!(art::FuzzyART, x::RealVector, index::Integer) + # Update W + art.W[:, index] = learn(art, x, art.W[:, index]) + art.n_instance[index] += 1 +end # learn!(art::FuzzyART, x::RealVector, index::Integer) + +""" + stopping_conditions(art::FuzzyART) + +Stopping conditions for a FuzzyART module. +""" +function stopping_conditions(art::FuzzyART) + return isequal(art.W, art.W_old) || art.epoch >= art.opts.max_epochs +end # stopping_conditions(art::FuzzyART) \ No newline at end of file diff --git a/src/ART/GNFA.jl b/src/ART/GNFA.jl index 710c8dab..817d282d 100644 --- a/src/ART/GNFA.jl +++ b/src/ART/GNFA.jl @@ -120,16 +120,16 @@ GNFA """ function GNFA(opts::opts_GNFA) GNFA(opts, # opts - DataConfig(), # config - 0.0, # threshold - Array{Int}(undef,0), # labels - Array{Float}(undef, 0), # T - Array{Float}(undef, 0), # M - Array{Float}(undef, 0, 0), # W - Array{Float}(undef, 0, 0), # W_old - Array{Int}(undef, 0), # n_instance - 0, # n_categories - 0 # epoch + DataConfig(), # config + 0.0, # threshold + Array{Int}(undef,0), # labels + Array{Float}(undef, 0), # T + Array{Float}(undef, 0), # M + Array{Float}(undef, 0, 0), # W + Array{Float}(undef, 0, 0), # W_old + Array{Int}(undef, 0), # n_instance + 0, # n_categories + 0 # epoch ) end # GNFA(opts::opts_GNFA) @@ -145,7 +145,7 @@ function GNFA(opts::opts_GNFA, sample::RealArray) end # GNFA(opts::opts_GNFA, sample::RealArray) """ - initialize!(art::GNFA, x::Array) + initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} Initializes a GNFA learner with an intial sample 'x'. @@ -158,7 +158,6 @@ GNFA julia> initialize!(my_GNFA, [1 2 3 4]) ``` """ -# function initialize!(art::GNFA, x::RealArray ; y::Integer=0) function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} # Set up the data config if art.config.setup @@ -184,10 +183,10 @@ function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} art.W[:, 1] = x label = y == 0 ? y : 1 push!(art.labels, label) -end # initialize!(art::GNFA, x::RealArray ; y::Integer=0) +end # initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} """ - train!(art::GNFA, x::RealArray ; y::IntegerVector=[]) + train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) Trains a GNFA learner with dataset 'x' and optional labels 'y' diff --git a/src/AdaptiveResonance.jl b/src/AdaptiveResonance.jl index 25525fc1..0e943acd 100644 --- a/src/AdaptiveResonance.jl +++ b/src/AdaptiveResonance.jl @@ -46,6 +46,7 @@ export get_n_samples, # Get the number of samples (1-D interpreted as one sample) # ART (unsupervised) + FuzzyART, opts_FuzzyART, GNFA, opts_GNFA, DDVFA, opts_DDVFA, DVFA, opts_DVFA, From 750fc0925a2fcd4f4894df81da4b1cfbccbe05b7 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Wed, 20 Oct 2021 10:22:01 -0500 Subject: [PATCH 16/38] FuzzyART init sample is RealVector --- src/ART/FuzzyART.jl | 6 +++--- src/ART/GNFA.jl | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ART/FuzzyART.jl b/src/ART/FuzzyART.jl index 605a9566..f521a526 100644 --- a/src/ART/FuzzyART.jl +++ b/src/ART/FuzzyART.jl @@ -134,15 +134,15 @@ function FuzzyART(opts::opts_FuzzyART) end # FuzzyART(opts::opts_FuzzyART) """ - FuzzyART(opts::opts_FuzzyART, sample::RealArray) + FuzzyART(opts::opts_FuzzyART, sample::RealVector) Create and initialize a FuzzyART with a single sample in one step. """ -function FuzzyART(opts::opts_FuzzyART, sample::RealArray) +function FuzzyART(opts::opts_FuzzyART, sample::RealVector) art = FuzzyART(opts) initialize!(art, sample) return art -end # FuzzyART(opts::opts_FuzzyART, sample::RealArray) +end # FuzzyART(opts::opts_FuzzyART, sample::RealVector) """ initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} diff --git a/src/ART/GNFA.jl b/src/ART/GNFA.jl index 817d282d..25ca03a9 100644 --- a/src/ART/GNFA.jl +++ b/src/ART/GNFA.jl @@ -134,15 +134,15 @@ function GNFA(opts::opts_GNFA) end # GNFA(opts::opts_GNFA) """ - GNFA(opts::opts_GNFA, sample::RealArray) + GNFA(opts::opts_GNFA, sample::RealVector) Create and initialize a GNFA with a single sample in one step. """ -function GNFA(opts::opts_GNFA, sample::RealArray) +function GNFA(opts::opts_GNFA, sample::RealVector) art = GNFA(opts) initialize!(art, sample) return art -end # GNFA(opts::opts_GNFA, sample::RealArray) +end # GNFA(opts::opts_GNFA, sample::RealVector) """ initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} From 159f6ed39cd0ba63afa5052b4f5c2267f2b10815 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Wed, 20 Oct 2021 10:29:25 -0500 Subject: [PATCH 17/38] Add get_W to DDVFA, remove deepcopy stop condition --- src/ART/DDVFA.jl | 27 +++++++++++++-------------- src/AdaptiveResonance.jl | 2 +- test/test_ddvfa.jl | 6 +++--- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index 01e71e1e..208e469e 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -62,8 +62,6 @@ mutable struct DDVFA <: ART threshold::Float F2::Vector{GNFA} labels::IntegerVector - W::RealMatrix # All F2 nodes' weight vectors - W_old::RealMatrix # Old F2 node weight vectors (for stopping criterion) n_categories::Int epoch::Int T::Float @@ -134,8 +132,6 @@ function DDVFA(opts::opts_DDVFA) 0.0, Array{GNFA}(undef, 0), Array{Int}(undef, 0), - Array{Float}(undef, 0, 0), - Array{Float}(undef, 0, 0), 0, 0, 0.0, @@ -191,9 +187,6 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), pre skip_first = false end - # Initialize old weight vector for checking stopping conditions between epochs - art.W_old = deepcopy(art.W) - # Set the learning threshold as a function of the data dimension art.threshold = art.opts.rho*(art.config.dim^art.opts.gamma_ref) @@ -272,21 +265,27 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), pre create_category(art, sample, label) end end + # Make sure to start at first sample from now on skip_first = false - # Deep copy all of the weights for stopping condition check - art.W = art.F2[1].W - for kx = 2:art.n_categories - art.W = [art.W art.F2[kx].W] - end + + # Check stopping conditions if stopping_conditions(art) break end - art.W_old = deepcopy(art.W) end return y_hat end # train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) +function get_W(art::DDVFA) + # Deep copy all of the weights for stopping condition check + # art.W = art.F2[1].W + # for kx = 2:art.n_categories + # art.W = [art.W art.F2[kx].W] + # end + return [art.F2[kx].W for kx = 1:art.n_categories] +end + """ create_category(art::DDVFA, sample::RealVector, label::Integer) @@ -309,7 +308,7 @@ Returns true if there is no change in weights during the epoch or the maxmimum e """ function stopping_conditions(art::DDVFA) # Compute the stopping condition, return a bool - return art.W == art.W_old || art.epoch >= art.opts.max_epoch + return art.epoch >= art.opts.max_epoch end # stopping_conditions(DDVFA) """ diff --git a/src/AdaptiveResonance.jl b/src/AdaptiveResonance.jl index 0e943acd..0561bfde 100644 --- a/src/AdaptiveResonance.jl +++ b/src/AdaptiveResonance.jl @@ -48,7 +48,7 @@ export # ART (unsupervised) FuzzyART, opts_FuzzyART, GNFA, opts_GNFA, - DDVFA, opts_DDVFA, + DDVFA, opts_DDVFA, get_W, DVFA, opts_DVFA, # ARTMAP (supervised) diff --git a/test/test_ddvfa.jl b/test/test_ddvfa.jl index e3227c14..716c2995 100644 --- a/test/test_ddvfa.jl +++ b/test/test_ddvfa.jl @@ -98,18 +98,18 @@ end # Create the ART module, train, and classify @info " ------- DDVFA Testing: Default Training -------" default_opts = opts_DDVFA() - default_art = tt_ddvfa(default_opts, train_x) + default_ddvfa = tt_ddvfa(default_opts, train_x) @info "DDVFA Testing: Default Complete" # Create the ART module, train, and classify with no display @info "------- DDVFA Testing: No Display Training -------" no_disp_opts = opts_DDVFA() no_disp_opts.display = false - no_disp_art = tt_ddvfa(no_disp_opts, train_x) + no_disp_ddvfa = tt_ddvfa(no_disp_opts, train_x) @info "DDVFA Testing: No Display Complete" # Test that the resulting weights are equivalent - @test default_art.W == no_disp_art.W + @test get_W(default_ddvfa) == get_W(no_disp_ddvfa) end # @testset "DDVFA" @testset "GNFA" begin From 2dbe1706d94037ae63db92c2bcb3da326d84f2fd Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Wed, 20 Oct 2021 10:35:14 -0500 Subject: [PATCH 18/38] Remove W_old from FuzzyART and GNFA --- src/ART/DDVFA.jl | 13 +++++++------ src/ART/FuzzyART.jl | 8 +------- src/ART/GNFA.jl | 8 +------- test/test_sets.jl | 6 +++--- 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index 208e469e..a418c208 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -277,14 +277,15 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), pre return y_hat end # train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) +""" + get_W(art::DDVFA) + +Return a concatednated array of all DDVFA weights. +""" function get_W(art::DDVFA) - # Deep copy all of the weights for stopping condition check - # art.W = art.F2[1].W - # for kx = 2:art.n_categories - # art.W = [art.W art.F2[kx].W] - # end + # Return a concatenated array of the weights return [art.F2[kx].W for kx = 1:art.n_categories] -end +end # get_W(art::DDVFA) """ create_category(art::DDVFA, sample::RealVector, label::Integer) diff --git a/src/ART/FuzzyART.jl b/src/ART/FuzzyART.jl index f521a526..fd94cc28 100644 --- a/src/ART/FuzzyART.jl +++ b/src/ART/FuzzyART.jl @@ -63,7 +63,6 @@ mutable struct FuzzyART <: ART # "Private" working variables W::RealMatrix - W_old::RealMatrix n_instance::IntegerVector n_categories::Int epoch::Int @@ -126,7 +125,6 @@ function FuzzyART(opts::opts_FuzzyART) Array{Float}(undef, 0), # T Array{Float}(undef, 0), # M Array{Float}(undef, 0, 0), # W - Array{Float}(undef, 0, 0), # W_old Array{Int}(undef, 0), # n_instance 0, # n_categories 0 # epoch @@ -214,8 +212,6 @@ function train!(art::FuzzyART, x::RealArray ; y::IntegerVector = Vector{Int}()) skip_first = false end - art.W_old = deepcopy(art.W) - # Learning art.epoch = 0 while true @@ -272,8 +268,6 @@ function train!(art::FuzzyART, x::RealArray ; y::IntegerVector = Vector{Int}()) if stopping_conditions(art) break end - # If we didn't break, deep copy the old weights - art.W_old = deepcopy(art.W) end end # train!(art::FuzzyART, x::RealArray ; y::IntegerVector = Vector{Int}()) @@ -383,5 +377,5 @@ end # learn!(art::FuzzyART, x::RealVector, index::Integer) Stopping conditions for a FuzzyART module. """ function stopping_conditions(art::FuzzyART) - return isequal(art.W, art.W_old) || art.epoch >= art.opts.max_epochs + return art.epoch >= art.opts.max_epochs end # stopping_conditions(art::FuzzyART) \ No newline at end of file diff --git a/src/ART/GNFA.jl b/src/ART/GNFA.jl index 25ca03a9..00118f84 100644 --- a/src/ART/GNFA.jl +++ b/src/ART/GNFA.jl @@ -63,7 +63,6 @@ mutable struct GNFA <: ART # "Private" working variables W::RealMatrix - W_old::RealMatrix n_instance::IntegerVector n_categories::Int epoch::Int @@ -126,7 +125,6 @@ function GNFA(opts::opts_GNFA) Array{Float}(undef, 0), # T Array{Float}(undef, 0), # M Array{Float}(undef, 0, 0), # W - Array{Float}(undef, 0, 0), # W_old Array{Int}(undef, 0), # n_instance 0, # n_categories 0 # epoch @@ -213,8 +211,6 @@ function train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) skip_first = false end - art.W_old = deepcopy(art.W) - # Learning art.epoch = 0 while true @@ -271,8 +267,6 @@ function train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) if stopping_conditions(art) break end - # If we didn't break, deep copy the old weights - art.W_old = deepcopy(art.W) end end # train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) @@ -382,5 +376,5 @@ end # learn!(art::GNFA, x::RealVector, index::Integer) Stopping conditions for a GNFA module. """ function stopping_conditions(art::GNFA) - return isequal(art.W, art.W_old) || art.epoch >= art.opts.max_epochs + return art.epoch >= art.opts.max_epochs end # stopping_conditions(art::GNFA) \ No newline at end of file diff --git a/test/test_sets.jl b/test/test_sets.jl index 3253ba43..3eeec315 100644 --- a/test/test_sets.jl +++ b/test/test_sets.jl @@ -93,7 +93,7 @@ end # @testset "AdaptiveResonance.jl" end @info "--------- END TRAIN TEST ---------" -end +end # @testset "Train Test" @testset "kwargs" begin @info "--------- KWARGS TEST ---------" @@ -110,7 +110,7 @@ end end @info "--------- END KWARGS TEST ---------" -end +end # @testset "kwargs" @testset "DVFA.jl" begin @info "------- DVFA Unsupervised -------" @@ -143,7 +143,7 @@ end @info "DVFA Training Perf: $perf_train" @info "DVFA Testing Perf: $perf_test" @info "DVFA Testing BMU Perf: $perf_test_bmu" -end +end # @testset "DVFA.jl" @testset "DDVFA.jl" begin # DDVFA training and testing From 81b45620e5f92658c0851594899dbccdea41de16 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Wed, 20 Oct 2021 12:57:16 -0500 Subject: [PATCH 19/38] Refactor initialization logic, seq and batch --- src/ART/DDVFA.jl | 6 +- src/ART/GNFA.jl | 176 +++++++++++++++++++++++++++++---------------- src/common.jl | 87 +++++++++++++++++++--- test/test_ddvfa.jl | 10 ++- test/test_sets.jl | 1 + 5 files changed, 206 insertions(+), 74 deletions(-) diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index a418c208..d5e1882c 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -238,7 +238,7 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), pre break end # Update the weights with the sample - train!(art.F2[bmu], sample) + train!(art.F2[bmu], sample, preprocessed=true) # Save the output label for the sample label = art.labels[bmu] if n_samples == 1 @@ -296,8 +296,8 @@ function create_category(art::DDVFA, sample::RealVector, label::Integer) # Global Fuzzy ART art.n_categories += 1 push!(art.labels, label) - # Local Fuzzy ART - push!(art.F2, GNFA(art.subopts, sample)) + # Local Gamma-Normalized Fuzzy ART + push!(art.F2, GNFA(art.subopts, sample, preprocessed=true)) end # function create_category(art::DDVFA, sample::RealVector, label::Integer) """ diff --git a/src/ART/GNFA.jl b/src/ART/GNFA.jl index 00118f84..12b9cc36 100644 --- a/src/ART/GNFA.jl +++ b/src/ART/GNFA.jl @@ -136,8 +136,9 @@ end # GNFA(opts::opts_GNFA) Create and initialize a GNFA with a single sample in one step. """ -function GNFA(opts::opts_GNFA, sample::RealVector) +function GNFA(opts::opts_GNFA, sample::RealVector ; preprocessed::Bool=false) art = GNFA(opts) + init_train!(sample, art, preprocessed) initialize!(art, sample) return art end # GNFA(opts::opts_GNFA, sample::RealVector) @@ -158,16 +159,16 @@ julia> initialize!(my_GNFA, [1 2 3 4]) """ function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} # Set up the data config - if art.config.setup - @warn "Data configuration already set up, overwriting config" - else - art.config.setup = true - end + # if art.config.setup + # @warn "Data configuration already set up, overwriting config" + # else + # art.config.setup = true + # end - # IMPORTANT: Assuming that x is a sample, so each entry is a feature - dim = length(x) - art.config.dim_comp = dim - art.config.dim = Int(dim/2) # Assumes input is already complement coded + # # IMPORTANT: Assuming that x is a sample, so each entry is a feature + # dim = length(x) + # art.config.dim_comp = dim + # art.config.dim = Int(dim/2) # Assumes input is already complement coded # Initialize the instance and categories counters art.n_instance = [1] @@ -179,12 +180,85 @@ function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} art.W = Array{T}(undef, art.config.dim_comp, 1) # Assign the contents, valid this way for 1-D or 2-D arrays art.W[:, 1] = x - label = y == 0 ? y : 1 + label = iszero(y) ? y : 1 push!(art.labels, label) end # initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} +function train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) + # Flag for if training in supervised mode + supervised = !iszero(y) + + # # If the data is not preprocessed + # if !preprocessed + # # If the data config is not setup, not enough information to preprocess + # if !art.config.setup + # error("$(typeof(art)): cannot preprocess data before being setup.") + # else + # x = complement_code(x, config=art.config) + # end + # end + + # Run the sequential initialization procedure + x = init_train!(x, art, preprocessed) + @info art.config + # # Set up the data config if training for the first time + # !art.config.setup && data_setup!(art.config, x) + + # # If the data is not preprocessed, then complement code it + # if !preprocessed + # x = complement_code(x, config=art.config) + # end + + # Initialization if weights are empty; fast commit the first sample + if isempty(art.W) + label = supervised ? y : 1 + # label = !isempty(y) ? y : 1 + push!(art.labels, label) + initialize!(art, x) + return + end + + # Compute activation/match functions + activation_match!(art, x) + # Sort activation function values in descending order + index = sortperm(art.T, rev=true) + # Initialize mismatch as true + mismatch_flag = true + # Loop over all categories + for j = 1:art.n_categories + # Best matching unit + bmu = index[j] + # Vigilance check - pass + if art.M[bmu] >= art.threshold + # Learn the sample + learn!(art, x, bmu) + # Update sample labels + label = supervised ? y : bmu + push!(art.labels, label) + # No mismatch + mismatch_flag = false + break + end + end + # If there was no resonant category, make a new one + if mismatch_flag + # Increment the number of categories + art.n_categories += 1 + # Fast commit + # art.W = [art.W x[:, i]] + art.W = hcat(art.W, x) + # Increment number of samples associated with new category + push!(art.n_instance, 1) + # Update sample labels + label = supervised ? y : art.n_categories + push!(art.labels, label) + end + + return +end + """ - train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) + train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}()) Trains a GNFA learner with dataset 'x' and optional labels 'y' @@ -198,18 +272,32 @@ julia> x = load_data() julia> train!(my_GNFA, x) ``` """ -function train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) +function train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) # Flag for if training in supervised mode supervised = !isempty(y) - # Initialization if weights are empty; fast commit the first sample - if isempty(art.W) - label = supervised ? y[1] : 1 - push!(art.labels, label) - initialize!(art, x[:, 1]) - skip_first = true - else - skip_first = false - end + # # Initialization if weights are empty; fast commit the first sample + # if isempty(art.W) + # label = supervised ? y[1] : 1 + # push!(art.labels, label) + # initialize!(art, x[:, 1]) + # skip_first = true + # else + # skip_first = false + # end + + # Set up the data config if training for the first time + # !art.config.setup && data_setup!(art.config, x) + + # Complement code the data according to the data configuration + # x = complement_code(x, config=art.config) + + # # If the data is not preprocessed, then complement code it + # if !preprocessed + # # Set up the data config if training for the first time + # !art.config.setup && data_setup!(art.config, x) + # x = complement_code(x, config=art.config) + # end + x = init_train!(x, art, preprocessed) # Learning art.epoch = 0 @@ -222,53 +310,21 @@ function train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) # Update the iterator if necessary update_iter(art, iter, i) # Skip the first sample if we just initialized - (i == 1 && skip_first) && continue + # (i == 1 && skip_first) && continue # Grab the sample slice sample = get_sample(x, i) - # Compute activation/match functions - activation_match!(art, sample) - # Sort activation function values in descending order - index = sortperm(art.T, rev=true) - # Initialize mismatch as true - mismatch_flag = true - # Loop over all categories - for j = 1:art.n_categories - # Best matching unit - bmu = index[j] - # Vigilance check - pass - if art.M[bmu] >= art.threshold - # Learn the sample - learn!(art, sample, bmu) - # Update sample labels - label = supervised ? y[i] : bmu - push!(art.labels, label) - # No mismatch - mismatch_flag = false - break - end - end - # If there was no resonant category, make a new one - if mismatch_flag - # Increment the number of categories - art.n_categories += 1 - # Fast commit - # art.W = [art.W x[:, i]] - art.W = hcat(art.W, sample) - # Increment number of samples associated with new category - push!(art.n_instance, 1) - # Update sample labels - label = supervised ? y[i] : art.n_categories - push!(art.labels, label) - end + # Train on the sample + local_y = supervised ? y[i] : 0 + train!(art, sample, y=local_y, preprocessed=true) end # Make sure to start at first sample from now on - skip_first = false + # skip_first = false # Check for the stopping condition for the whole loop if stopping_conditions(art) break end end -end # train!(art::GNFA, x::RealArray ; y::IntegerVector = Vector{Int}()) +end # train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}()) """ classify(art::GNFA, x::RealArray) diff --git a/src/common.jl b/src/common.jl index e2b7e621..c6f05496 100644 --- a/src/common.jl +++ b/src/common.jl @@ -58,8 +58,8 @@ Default constructor for a data configuration, not set up. function DataConfig() DataConfig( false, # setup - Array{Float}(undef, 0), # min - Array{Float}(undef, 0), # max + Array{Float}(undef, 0), # min + Array{Float}(undef, 0), # max 0, # dim 0 # dim_comp ) @@ -237,21 +237,59 @@ function get_data_characteristics(data::RealArray ; config::DataConfig=DataConfi end # get_data_characteristics(data::RealArray ; config::DataConfig=DataConfig()) """ - linear_normalization(data::RealArray ; config::DataConfig=DataConfig()) + linear_normalization(data::RealMatrix ; config::DataConfig=DataConfig()) Normalize the data to the range [0, 1] along each feature. """ -function linear_normalization(data::RealArray ; config::DataConfig=DataConfig()) +function linear_normalization(data::RealMatrix ; config::DataConfig=DataConfig()) # Get the data characteristics dim, n_samples, mins, maxs = get_data_characteristics(data, config=config) # Populate a new array with normalized values. x_raw = zeros(dim, n_samples) + + # Verify that all maxs are strictly greater than mins + if !all(mins .< maxs) + error("Got a data max index that is smaller than the corresonding min") + end + + # Iterate over each dimension for i = 1:dim - if maxs[i] < mins[i] - error("Got a data max index that is smaller than the corresonding min") - elseif maxs[i] - mins[i] != 0 - x_raw[i, :] = (data[i, :] .- mins[i]) ./ (maxs[i] - mins[i]) + denominator = maxs[i] - mins[i] + if denominator != 0 + # If the denominator is not zero, normalize + x_raw[i, :] = (data[i, :] .- mins[i]) ./ denominator + else + # Otherwise, the feature is zeroed because it contains no useful information + x_raw[i, :] = zeros(length(x_raw[i, :])) + end + end + return x_raw +end # linear_normalization(data::RealMatrix ; config::DataConfig=DataConfig()) + +""" + linear_normalization(data::RealVector ; config::DataConfig=DataConfig()) + +Normalize the data to the range [0, 1] along each feature. +""" +function linear_normalization(data::RealVector ; config::DataConfig=DataConfig()) + # Vector normalization requires a setup DataConfig + if !config.setup + error("Attempting to complement code a vector without a setup DataConfig") + end + + # Populate a new array with normalized values. + x_raw = zeros(config.dim) + + # Iterate over each dimension + for i = 1:config.dim + denominator = config.maxs[i] - config.mins[i] + if denominator != 0 + # If the denominator is not zero, normalize + x_raw[i] = (data[i] .- config.mins[i]) ./ denominator + else + # Otherwise, the feature is zeroed because it contains no useful information + x_raw[i] = zero(Int) end end return x_raw @@ -324,3 +362,36 @@ function get_sample(x::RealArray, i::Int) end return sample end # get_sample(x::RealArray, i::Int) + +function init_train!(x::RealVector, art::ART, preprocessed::Bool) + # If the data is not preprocessed + if !preprocessed + # If the data config is not setup, not enough information to preprocess + if !art.config.setup + error("$(typeof(art)): cannot preprocess data before being setup.") + end + x = complement_code(x, config=art.config) + # If it is preprocessed and we are not setup + elseif !art.config.setup + # Get the dimension of the vector + dim_comp = length(x) + # If the complemented dimension is not even, error + if !iseven(dim_comp) + error("Declare that the vector is preprocessed, but it is not even") + end + # Half the complemented dimension and setup the DataConfig with that + dim = Int(dim_comp/2) + art.config = DataConfig(0, 1, dim) + end + return x +end + +function init_train!(x::RealMatrix, art::ART, preprocessed::Bool) + # If the data is not preprocessed, then complement code it + if !preprocessed + # Set up the data config if training for the first time + !art.config.setup && data_setup!(art.config, x) + x = complement_code(x, config=art.config) + end + return x +end diff --git a/test/test_ddvfa.jl b/test/test_ddvfa.jl index 716c2995..52a9ef1c 100644 --- a/test/test_ddvfa.jl +++ b/test/test_ddvfa.jl @@ -117,8 +117,9 @@ end # @testset "DDVFA" # GNFA train and test my_gnfa = GNFA() - local_complement_code = AdaptiveResonance.complement_code(data.train_x) - train!(my_gnfa, local_complement_code) + # local_complement_code = AdaptiveResonance.complement_code(data.train_x) + # train!(my_gnfa, local_complement_code, preprocessed=true) + train!(my_gnfa, data.train_x) # Similarity methods methods = [ @@ -134,7 +135,10 @@ end # @testset "DDVFA" field_names = ["T", "M"] # Compute a local sample for GNFA similarity method testing - local_sample = local_complement_code[:, 1] + # local_sample = local_complement_code[:, 1] + # local_complement_code = AdaptiveResonance.complement_code(data.train_x) + # local_sample = data.train_x[:, 1] + local_sample = AdaptiveResonance.complement_code(data.train_x[:, 1], config=my_gnfa.config) # Compute the local activation and match AdaptiveResonance.activation_match!(my_gnfa, local_sample) diff --git a/test/test_sets.jl b/test/test_sets.jl index 3eeec315..2c3f2c6c 100644 --- a/test/test_sets.jl +++ b/test/test_sets.jl @@ -99,6 +99,7 @@ end # @testset "Train Test" @info "--------- KWARGS TEST ---------" arts = [ + GNFA, DVFA, DDVFA, SFAM, From 64c9bbf70e3e49c1ae2d7a9ee105903666a76fae Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Wed, 20 Oct 2021 15:12:07 -0500 Subject: [PATCH 20/38] Trim comments --- src/ART/GNFA.jl | 65 +++++-------------------------------------------- 1 file changed, 6 insertions(+), 59 deletions(-) diff --git a/src/ART/GNFA.jl b/src/ART/GNFA.jl index 12b9cc36..2c1c52ff 100644 --- a/src/ART/GNFA.jl +++ b/src/ART/GNFA.jl @@ -158,18 +158,6 @@ julia> initialize!(my_GNFA, [1 2 3 4]) ``` """ function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} - # Set up the data config - # if art.config.setup - # @warn "Data configuration already set up, overwriting config" - # else - # art.config.setup = true - # end - - # # IMPORTANT: Assuming that x is a sample, so each entry is a feature - # dim = length(x) - # art.config.dim_comp = dim - # art.config.dim = Int(dim/2) # Assumes input is already complement coded - # Initialize the instance and categories counters art.n_instance = [1] art.n_categories = 1 @@ -184,35 +172,19 @@ function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} push!(art.labels, label) end # initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} +""" + train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) +""" function train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) # Flag for if training in supervised mode supervised = !iszero(y) - # # If the data is not preprocessed - # if !preprocessed - # # If the data config is not setup, not enough information to preprocess - # if !art.config.setup - # error("$(typeof(art)): cannot preprocess data before being setup.") - # else - # x = complement_code(x, config=art.config) - # end - # end - # Run the sequential initialization procedure x = init_train!(x, art, preprocessed) - @info art.config - # # Set up the data config if training for the first time - # !art.config.setup && data_setup!(art.config, x) - - # # If the data is not preprocessed, then complement code it - # if !preprocessed - # x = complement_code(x, config=art.config) - # end # Initialization if weights are empty; fast commit the first sample if isempty(art.W) label = supervised ? y : 1 - # label = !isempty(y) ? y : 1 push!(art.labels, label) initialize!(art, x) return @@ -245,7 +217,6 @@ function train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=fa # Increment the number of categories art.n_categories += 1 # Fast commit - # art.W = [art.W x[:, i]] art.W = hcat(art.W, x) # Increment number of samples associated with new category push!(art.n_instance, 1) @@ -255,7 +226,7 @@ function train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=fa end return -end +end # train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) """ train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}()) @@ -275,28 +246,8 @@ julia> train!(my_GNFA, x) function train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) # Flag for if training in supervised mode supervised = !isempty(y) - # # Initialization if weights are empty; fast commit the first sample - # if isempty(art.W) - # label = supervised ? y[1] : 1 - # push!(art.labels, label) - # initialize!(art, x[:, 1]) - # skip_first = true - # else - # skip_first = false - # end - - # Set up the data config if training for the first time - # !art.config.setup && data_setup!(art.config, x) - - # Complement code the data according to the data configuration - # x = complement_code(x, config=art.config) - - # # If the data is not preprocessed, then complement code it - # if !preprocessed - # # Set up the data config if training for the first time - # !art.config.setup && data_setup!(art.config, x) - # x = complement_code(x, config=art.config) - # end + + # Run the batch initialization procedure x = init_train!(x, art, preprocessed) # Learning @@ -309,16 +260,12 @@ function train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), pre for i = iter # Update the iterator if necessary update_iter(art, iter, i) - # Skip the first sample if we just initialized - # (i == 1 && skip_first) && continue # Grab the sample slice sample = get_sample(x, i) # Train on the sample local_y = supervised ? y[i] : 0 train!(art, sample, y=local_y, preprocessed=true) end - # Make sure to start at first sample from now on - # skip_first = false # Check for the stopping condition for the whole loop if stopping_conditions(art) break From a7d2988d44f4102a6d5007e572cffee985915e24 Mon Sep 17 00:00:00 2001 From: AP6YC Date: Wed, 20 Oct 2021 19:52:51 -0500 Subject: [PATCH 21/38] Overhaul GNFA and common --- examples/art/gnfa.jl | 17 +++--- src/ART/DDVFA.jl | 2 +- src/ART/GNFA.jl | 125 +++++++++++++++++++++++++++++-------------- src/common.jl | 76 ++++++++++++++++---------- test/test_ddvfa.jl | 80 +++++++++++++-------------- test/test_sets.jl | 3 +- 6 files changed, 185 insertions(+), 118 deletions(-) diff --git a/examples/art/gnfa.jl b/examples/art/gnfa.jl index 02734df3..b36f0293 100644 --- a/examples/art/gnfa.jl +++ b/examples/art/gnfa.jl @@ -9,12 +9,17 @@ LogLevel(Logging.Info) include("../../test/test_utils.jl") # GNFA train and test -opts = opts_GNFA(rho=0.5) -my_gnfa = GNFA(opts) +# opts = opts_GNFA(rho=0.6, gamma_ref = 1.0, gamma=1.0) +opts = opts_GNFA(rho=0.6, gamma = 5.0) +art = GNFA(opts) # data = load_am_data(200, 50) data = load_iris("data/Iris.csv") -local_complement_code = complement_code(data.train_x) +# local_complement_code = complement_code(data.train_x) -train!(my_gnfa, local_complement_code, y=data.train_y) -cc_test = complement_code(data.test_x) -y_hat = classify(my_gnfa, cc_test) +# train!(my_gnfa, local_complement_code, y=data.train_y) +train!(art, data.train_x, y=data.train_y) +# y_hat = classify(my_gnfa, data.test_x, get_bmu=true) +y_hat = classify(art, data.test_x) + +perf = performance(y_hat, data.test_y) +@info "Performance: $perf" diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index d5e1882c..732c412e 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -234,7 +234,7 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), pre art.M = M art.T = T[bmu] # If supervised and the label differs, trigger mismatch - if supervised && art.labels[bmu] != y[i] + if supervised && (art.labels[bmu] != y[i]) break end # Update the weights with the sample diff --git a/src/ART/GNFA.jl b/src/ART/GNFA.jl index 2c1c52ff..9ac41fbe 100644 --- a/src/ART/GNFA.jl +++ b/src/ART/GNFA.jl @@ -27,7 +27,7 @@ Initialized GNFA gamma = 3.0; @assert gamma >= 1.0 # gamma = 784; @assert gamma >= 1 # "Reference" gamma for normalization: 0 <= gamma_ref < gamma - gamma_ref = 1.0; @assert 0.0 <= gamma_ref && gamma_ref < gamma + gamma_ref = 1.0; @assert 0.0 <= gamma_ref && gamma_ref <= gamma # Similarity method (activation and match): # 'single', 'average', 'complete', 'median', 'weighted', or 'centroid' method::String = "single" @@ -168,7 +168,7 @@ function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} art.W = Array{T}(undef, art.config.dim_comp, 1) # Assign the contents, valid this way for 1-D or 2-D arrays art.W[:, 1] = x - label = iszero(y) ? y : 1 + label = !iszero(y) ? y : 1 push!(art.labels, label) end # initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} @@ -185,8 +185,7 @@ function train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=fa # Initialization if weights are empty; fast commit the first sample if isempty(art.W) label = supervised ? y : 1 - push!(art.labels, label) - initialize!(art, x) + initialize!(art, x, y=label) return end @@ -196,17 +195,27 @@ function train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=fa index = sortperm(art.T, rev=true) # Initialize mismatch as true mismatch_flag = true + + # If we have a new supervised category, create a new category + if supervised && !(y in art.labels) + create_category(art, x, y) + return y + end # Loop over all categories for j = 1:art.n_categories # Best matching unit bmu = index[j] # Vigilance check - pass if art.M[bmu] >= art.threshold + # If supervised and the label differed, force mismatch + if supervised && (art.labels[bmu] != y) + break + end # Learn the sample learn!(art, x, bmu) # Update sample labels - label = supervised ? y : bmu - push!(art.labels, label) + # label = supervised ? y : bmu + # push!(art.labels, label) # No mismatch mismatch_flag = false break @@ -214,20 +223,29 @@ function train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=fa end # If there was no resonant category, make a new one if mismatch_flag - # Increment the number of categories - art.n_categories += 1 - # Fast commit - art.W = hcat(art.W, x) - # Increment number of samples associated with new category - push!(art.n_instance, 1) - # Update sample labels - label = supervised ? y : art.n_categories - push!(art.labels, label) + # Get the correct label for the new category + label = supervised ? y : art.n_categories + 1 + # Create a new category + create_category(art, x, label) end - return + return y end # train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) +""" + create_category(art::GNFA, x::RealVector, y::Integer) +""" +function create_category(art::GNFA, x::RealVector, y::Integer) + # Increment the number of categories + art.n_categories += 1 + # Fast commit + art.W = hcat(art.W, x) + # Increment number of samples associated with new category + push!(art.n_instance, 1) + # Add the label for the ategory + push!(art.labels, y) +end # create_category(art::GNFA, x::RealVector, y::Integer) + """ train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}()) @@ -262,6 +280,7 @@ function train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), pre update_iter(art, iter, i) # Grab the sample slice sample = get_sample(x, i) + # sample = x[:, i] # Train on the sample local_y = supervised ? y[i] : 0 train!(art, sample, y=local_y, preprocessed=true) @@ -273,6 +292,45 @@ function train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), pre end end # train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}()) +""" + classify(art::GNFA, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) +""" +function classify(art::GNFA, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) + # Preprocess the data + x = init_classify!(x, art, preprocessed) + + # Compute activation and match functions + activation_match!(art, x) + # Sort activation function values in descending order + index = sortperm(art.T, rev=true) + # Default is mismatch + mismatch_flag = true + y_hat = -1 + for jx in 1:art.n_categories + bmu = index[jx] + # Vigilance check - pass + if art.M[bmu] >= art.threshold + # Current winner + y_hat = art.labels[bmu] + mismatch_flag = false + break + end + end + # If we did not find a match + if mismatch_flag + # Create new weight vector + @debug "Mismatch" + # If we mismatched and want the best matching unit + if get_bmu + y_hat = art.labels[index[1]] + # Otherwise, report the mismatch label -1 + else + y_hat = -1 + end + end + return y_hat +end + """ classify(art::GNFA, x::RealArray) @@ -291,7 +349,9 @@ julia> train!(my_GNFA, x) julia> y_hat = classify(my_GNFA, y) ``` """ -function classify(art::GNFA, x::RealArray) +function classify(art::GNFA, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) + # Preprocess the data + x = init_classify!(x, art, preprocessed) # Get the number of samples to classify n_samples = get_n_samples(x) @@ -301,32 +361,14 @@ function classify(art::GNFA, x::RealArray) for ix in iter # Update the iterator if necessary update_iter(art, iter, ix) - # Compute activation and match functions - activation_match!(art, x[:, ix]) - # Sort activation function values in descending order - index = sortperm(art.T, rev=true) - mismatch_flag = true - for jx in 1:art.n_categories - bmu = index[jx] - # Vigilance check - pass - if art.M[bmu] >= art.threshold - # Current winner - y_hat[ix] = art.labels[bmu] - mismatch_flag = false - break - end - end - if mismatch_flag - # Create new weight vector - @debug "Mismatch" - y_hat[ix] = -1 - end + sample = x[:, ix] + y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) end return y_hat end # classify(art::GNFA, x::RealArray) """ - activation_match!(art::GNFA, x::RealArray) + activation_match!(art::GNFA, x::RealVector) Computes the activation and match functions of the art module against sample x. @@ -342,15 +384,16 @@ julia> x_sample = x[:, 1] julia> activation_match!(my_GNFA, x_sample) ``` """ -function activation_match!(art::GNFA, x::RealArray) +function activation_match!(art::GNFA, x::RealVector) art.T = zeros(art.n_categories) art.M = zeros(art.n_categories) for i = 1:art.n_categories W_norm = norm(art.W[:, i], 1) art.T[i] = (norm(element_min(x, art.W[:, i]), 1)/(art.opts.alpha + W_norm))^art.opts.gamma art.M[i] = (W_norm^art.opts.gamma_ref)*art.T[i] + # art.M[i] = ((W_norm/norm(x, 1))^art.opts.gamma_ref)*art.T[i] end -end # activation_match!(art::GNFA, x::RealArray) +end # activation_match!(art::GNFA, x::RealVector) """ learn(art::GNFA, x::RealVector, W::RealVector) @@ -380,4 +423,4 @@ Stopping conditions for a GNFA module. """ function stopping_conditions(art::GNFA) return art.epoch >= art.opts.max_epochs -end # stopping_conditions(art::GNFA) \ No newline at end of file +end # stopping_conditions(art::GNFA) diff --git a/src/common.jl b/src/common.jl index c6f05496..7a20bb49 100644 --- a/src/common.jl +++ b/src/common.jl @@ -1,4 +1,3 @@ - # ------------------------------------------- # Document: common.jl # Author: Sasha Petrenko @@ -237,63 +236,63 @@ function get_data_characteristics(data::RealArray ; config::DataConfig=DataConfi end # get_data_characteristics(data::RealArray ; config::DataConfig=DataConfig()) """ - linear_normalization(data::RealMatrix ; config::DataConfig=DataConfig()) + linear_normalization(data::RealVector ; config::DataConfig=DataConfig()) Normalize the data to the range [0, 1] along each feature. """ -function linear_normalization(data::RealMatrix ; config::DataConfig=DataConfig()) - # Get the data characteristics - dim, n_samples, mins, maxs = get_data_characteristics(data, config=config) +function linear_normalization(data::RealVector ; config::DataConfig=DataConfig()) + # Vector normalization requires a setup DataConfig + if !config.setup + error("Attempting to complement code a vector without a setup DataConfig") + end # Populate a new array with normalized values. - x_raw = zeros(dim, n_samples) - - # Verify that all maxs are strictly greater than mins - if !all(mins .< maxs) - error("Got a data max index that is smaller than the corresonding min") - end + x_raw = zeros(config.dim) # Iterate over each dimension - for i = 1:dim - denominator = maxs[i] - mins[i] + for i = 1:config.dim + denominator = config.maxs[i] - config.mins[i] if denominator != 0 # If the denominator is not zero, normalize - x_raw[i, :] = (data[i, :] .- mins[i]) ./ denominator + x_raw[i] = (data[i] .- config.mins[i]) ./ denominator else # Otherwise, the feature is zeroed because it contains no useful information - x_raw[i, :] = zeros(length(x_raw[i, :])) + x_raw[i] = zero(Int) end end return x_raw -end # linear_normalization(data::RealMatrix ; config::DataConfig=DataConfig()) +end # linear_normalization(data::RealArray ; config::DataConfig=DataConfig()) """ - linear_normalization(data::RealVector ; config::DataConfig=DataConfig()) + linear_normalization(data::RealMatrix ; config::DataConfig=DataConfig()) Normalize the data to the range [0, 1] along each feature. """ -function linear_normalization(data::RealVector ; config::DataConfig=DataConfig()) - # Vector normalization requires a setup DataConfig - if !config.setup - error("Attempting to complement code a vector without a setup DataConfig") - end +function linear_normalization(data::RealMatrix ; config::DataConfig=DataConfig()) + # Get the data characteristics + dim, n_samples, mins, maxs = get_data_characteristics(data, config=config) # Populate a new array with normalized values. - x_raw = zeros(config.dim) + x_raw = zeros(dim, n_samples) + + # Verify that all maxs are strictly greater than mins + if !all(mins .< maxs) + error("Got a data max index that is smaller than the corresonding min") + end # Iterate over each dimension - for i = 1:config.dim - denominator = config.maxs[i] - config.mins[i] + for i = 1:dim + denominator = maxs[i] - mins[i] if denominator != 0 # If the denominator is not zero, normalize - x_raw[i] = (data[i] .- config.mins[i]) ./ denominator + x_raw[i, :] = (data[i, :] .- mins[i]) ./ denominator else # Otherwise, the feature is zeroed because it contains no useful information - x_raw[i] = zero(Int) + x_raw[i, :] = zeros(length(x_raw[i, :])) end end return x_raw -end # linear_normalization(data::RealArray ; config::DataConfig=DataConfig()) +end # linear_normalization(data::RealMatrix ; config::DataConfig=DataConfig()) """ complement_code(data::RealArray ; config::DataConfig=DataConfig()) @@ -386,6 +385,9 @@ function init_train!(x::RealVector, art::ART, preprocessed::Bool) return x end +""" + init_train!(x::RealMatrix, art::ART, preprocessed::Bool) +""" function init_train!(x::RealMatrix, art::ART, preprocessed::Bool) # If the data is not preprocessed, then complement code it if !preprocessed @@ -394,4 +396,20 @@ function init_train!(x::RealMatrix, art::ART, preprocessed::Bool) x = complement_code(x, config=art.config) end return x -end +end # init_train!(x::RealMatrix, art::ART, preprocessed::Bool) + +""" + init_classify!(x::RealArray, art::ART, preprocessed::Bool) +""" +function init_classify!(x::RealArray, art::ART, preprocessed::Bool) + # If the data is not preprocessed + if !preprocessed + # If the data config is not setup, not enough information to preprocess + if !art.config.setup + error("$(typeof(art)): cannot preprocess data before being setup.") + end + # Dispatch to the correct complement code method (vector or matrix) + x = complement_code(x, config=art.config) + end + return x +end # init_classify!(x::RealArray, art::ART, preprocessed::Bool) diff --git a/test/test_ddvfa.jl b/test/test_ddvfa.jl index 52a9ef1c..53cc3dcc 100644 --- a/test/test_ddvfa.jl +++ b/test/test_ddvfa.jl @@ -87,7 +87,7 @@ end @info "DDVFA Training Perf: $perf_train" @info "DDVFA Testing Perf: $perf_test" @info "DDVFA Testing BMU Perf: $perf_test_bmu" -end +end # @testset "DDVFA Supervised" @testset "DDVFA" begin # Parse the data @@ -141,45 +141,45 @@ end # @testset "DDVFA" local_sample = AdaptiveResonance.complement_code(data.train_x[:, 1], config=my_gnfa.config) # Compute the local activation and match - AdaptiveResonance.activation_match!(my_gnfa, local_sample) - - # Declare the true activation and match magnitudes - truth = Dict( - "single" => Dict( - "T" => 0.9988714513100155, - "M" => 2.6532834139109758 - ), - "average" => Dict( - "T" => 0.33761483787933894, - "M" => 1.1148764060015297 - ), - "complete" => Dict( - "T" => 0.018234409874338647, - "M" => 0.07293763949735459 - ), - "median" => Dict( - "T" => 0.2089217851518073, - "M" => 0.835687140607229 - ), - "weighted" => Dict( - "T" => 0.5374562506748786, - "M" => 1.4396083090159748 - ), - "centroid" => Dict( - "T" => 0.0, - "M" => 0.0 - ) - ) - - # Test every method and field name - for method in methods - results = Dict() - for field_name in field_names - results[field_name] = AdaptiveResonance.similarity(method, my_gnfa, field_name, local_sample, my_gnfa.opts.gamma_ref) - @test isapprox(truth[method][field_name], results[field_name]) - end - @info "Method: $method" results - end + # AdaptiveResonance.activation_match!(my_gnfa, local_sample) + + # # Declare the true activation and match magnitudes + # truth = Dict( + # "single" => Dict( + # "T" => 0.9988714513100155, + # "M" => 2.6532834139109758 + # ), + # "average" => Dict( + # "T" => 0.33761483787933894, + # "M" => 1.1148764060015297 + # ), + # "complete" => Dict( + # "T" => 0.018234409874338647, + # "M" => 0.07293763949735459 + # ), + # "median" => Dict( + # "T" => 0.2089217851518073, + # "M" => 0.835687140607229 + # ), + # "weighted" => Dict( + # "T" => 0.5374562506748786, + # "M" => 1.4396083090159748 + # ), + # "centroid" => Dict( + # "T" => 0.0, + # "M" => 0.0 + # ) + # ) + + # # Test every method and field name + # for method in methods + # results = Dict() + # for field_name in field_names + # results[field_name] = AdaptiveResonance.similarity(method, my_gnfa, field_name, local_sample, my_gnfa.opts.gamma_ref) + # @test isapprox(truth[method][field_name], results[field_name]) + # end + # @info "Method: $method" results + # end # Check the error handling of the similarity function # Access the wrong similarity metric keyword ("asdf") diff --git a/test/test_sets.jl b/test/test_sets.jl index 2c3f2c6c..fa0bebf3 100644 --- a/test/test_sets.jl +++ b/test/test_sets.jl @@ -55,6 +55,7 @@ end # @testset "AdaptiveResonance.jl" @testset "Train Test" begin # All ART modules arts = [ + GNFA, DVFA, DDVFA ] @@ -76,7 +77,7 @@ end # @testset "AdaptiveResonance.jl" @info "--------- TRAIN TEST ---------" # ART - perf_baseline = 0.8 + perf_baseline = 0.7 # Iterate over all ART modules for ix = 1:n_arts From 3c2b712594999e2b93b1aa72e29980e9d752ff39 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Thu, 21 Oct 2021 14:23:09 -0500 Subject: [PATCH 22/38] Add convenience functions for DDVFA, trim --- src/ART/DDVFA.jl | 65 ++++++++++++++++++++++++++++++++++++++---------- src/ART/GNFA.jl | 7 ------ 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index 732c412e..609be6e9 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -5,6 +5,10 @@ Description: Includes all of the structures and logic for running a Distributed Dual-Vigilance Fuzzy ART (DDVFA) module. """ +# --------------------------------------------------------------------------- # +# OPTIONS +# --------------------------------------------------------------------------- # + """ opts_DDVFA() @@ -18,7 +22,7 @@ julia> my_opts = opts_DDVFA() @with_kw mutable struct opts_DDVFA <: ARTOpts @deftype Float # Lower-bound vigilance parameter: [0, 1] rho_lb = 0.80; @assert rho_lb >= 0.0 && rho_lb <= 1.0 - rho = rho_lb + # rho = rho_lb # Upper bound vigilance parameter: [0, 1] rho_ub = 0.85; @assert rho_ub >= 0.0 && rho_ub <= 1.0 # Choice parameter: alpha > 0 @@ -38,6 +42,10 @@ julia> my_opts = opts_DDVFA() max_epoch::Int = 1 end # opts_DDVFA +# --------------------------------------------------------------------------- # +# STRUCTS +# --------------------------------------------------------------------------- # + """ DDVFA <: ART @@ -68,6 +76,10 @@ mutable struct DDVFA <: ART M::Float end # DDVFA <: ART +# --------------------------------------------------------------------------- # +# CONSTRUCTORS +# --------------------------------------------------------------------------- # + """ DDVFA() @@ -94,7 +106,7 @@ Implements a DDVFA learner with keyword arguments. # Examples ```julia-repl -julia> DDVFA(rho=0.7) +julia> DDVFA(rho_lb=0.4, rho_ub = 0.75) DDVFA opts: opts_DDVFA subopts: opts_GNFA @@ -139,6 +151,10 @@ function DDVFA(opts::opts_DDVFA) ) end # DDVFA(opts::opts_DDVFA) +# --------------------------------------------------------------------------- # +# ALGORITHMIC METHODS +# --------------------------------------------------------------------------- # + """ train!(art::DDVFA, x::RealArray ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) @@ -188,7 +204,7 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), pre end # Set the learning threshold as a function of the data dimension - art.threshold = art.opts.rho*(art.config.dim^art.opts.gamma_ref) + art.threshold = art.opts.rho_lb*(art.config.dim^art.opts.gamma_ref) # Learn until the stopping conditions art.epoch = 0 @@ -277,16 +293,6 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), pre return y_hat end # train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) -""" - get_W(art::DDVFA) - -Return a concatednated array of all DDVFA weights. -""" -function get_W(art::DDVFA) - # Return a concatenated array of the weights - return [art.F2[kx].W for kx = 1:art.n_categories] -end # get_W(art::DDVFA) - """ create_category(art::DDVFA, sample::RealVector, label::Integer) @@ -480,3 +486,36 @@ function classify(art::DDVFA, x::RealArray ; preprocessed::Bool=false, get_bmu:: return y_hat end # classify(art::DDVFA, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) + +# --------------------------------------------------------------------------- # +# CONVENIENCE METHODS +# --------------------------------------------------------------------------- # + +""" + get_W(art::DDVFA) + +Convenience functio; return a concatenated array of all DDVFA weights. +""" +function get_W(art::DDVFA) + # Return a concatenated array of the weights + return [art.F2[kx].W for kx = 1:art.n_categories] +end # get_W(art::DDVFA) + +""" + get_n_weights_vec(art::DDVFA) + +Convenience function; return the number of weights in each category as a vector. +""" +function get_n_weights_vec(art::DDVFA) + return [art.F2[i].n_categories for i = 1:art.n_categories] +end # get_n_weights_vec(art::DDVFA) + +""" + get_n_weights(art::DDVFA) + +Convenience function; return the sum total number of weights in the DDVFA module. +""" +function get_n_weights(art::DDVFA) + # Return the number of weights across all categories + return sum(get_n_weights_vec(art)) +end # get_n_weights(art::DDVFA) diff --git a/src/ART/GNFA.jl b/src/ART/GNFA.jl index 9ac41fbe..85de292e 100644 --- a/src/ART/GNFA.jl +++ b/src/ART/GNFA.jl @@ -25,12 +25,8 @@ Initialized GNFA beta = 1.0; @assert beta > 0.0 && beta <= 1.0 # "Pseudo" kernel width: gamma >= 1 gamma = 3.0; @assert gamma >= 1.0 - # gamma = 784; @assert gamma >= 1 # "Reference" gamma for normalization: 0 <= gamma_ref < gamma gamma_ref = 1.0; @assert 0.0 <= gamma_ref && gamma_ref <= gamma - # Similarity method (activation and match): - # 'single', 'average', 'complete', 'median', 'weighted', or 'centroid' - method::String = "single" # Display flag display::Bool = true # Maximum number of epochs during training @@ -213,9 +209,6 @@ function train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=fa end # Learn the sample learn!(art, x, bmu) - # Update sample labels - # label = supervised ? y : bmu - # push!(art.labels, label) # No mismatch mismatch_flag = false break From b4c7876629c8fd0b45a7a421d9529172bd8640ea Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Thu, 21 Oct 2021 14:42:02 -0500 Subject: [PATCH 23/38] Add get_bmu to ARTMAPs, remove redundant tests --- src/ART/GNFA.jl | 24 +++++- src/ARTMAP/DAM.jl | 10 ++- src/ARTMAP/SFAM.jl | 10 ++- test/test_ddvfa.jl | 190 --------------------------------------------- test/test_sets.jl | 137 +++++++++++++++++++------------- test/test_utils.jl | 32 ++++---- 6 files changed, 137 insertions(+), 266 deletions(-) delete mode 100644 test/test_ddvfa.jl diff --git a/src/ART/GNFA.jl b/src/ART/GNFA.jl index 85de292e..fc9538c9 100644 --- a/src/ART/GNFA.jl +++ b/src/ART/GNFA.jl @@ -5,6 +5,10 @@ Description: Includes all of the structures and logic for running a Gamma-Normalized Fuzzy ART module. """ +# --------------------------------------------------------------------------- # +# OPTIONS +# --------------------------------------------------------------------------- # + """ opts_GNFA() @@ -33,6 +37,10 @@ Initialized GNFA max_epochs::Int = 1 end # opts_GNFA +# --------------------------------------------------------------------------- # +# STRUCTS +# --------------------------------------------------------------------------- # + """ GNFA <: ART @@ -64,6 +72,10 @@ mutable struct GNFA <: ART epoch::Int end # GNFA <: ART +# --------------------------------------------------------------------------- # +# CONSTRUCTORS +# --------------------------------------------------------------------------- # + """ GNFA() @@ -139,6 +151,10 @@ function GNFA(opts::opts_GNFA, sample::RealVector ; preprocessed::Bool=false) return art end # GNFA(opts::opts_GNFA, sample::RealVector) +# --------------------------------------------------------------------------- # +# ALGORITHMIC METHODS +# --------------------------------------------------------------------------- # + """ initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} @@ -325,9 +341,9 @@ function classify(art::GNFA, x::RealVector ; preprocessed::Bool=false, get_bmu:: end """ - classify(art::GNFA, x::RealArray) + classify(art::GNFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) -Predict categories of 'x' using the GNFA model. +Batch predict categories of 'x' using the GNFA model. Returns predicted categories 'y_hat' @@ -342,7 +358,7 @@ julia> train!(my_GNFA, x) julia> y_hat = classify(my_GNFA, y) ``` """ -function classify(art::GNFA, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) +function classify(art::GNFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) # Preprocess the data x = init_classify!(x, art, preprocessed) # Get the number of samples to classify @@ -358,7 +374,7 @@ function classify(art::GNFA, x::RealArray ; preprocessed::Bool=false, get_bmu::B y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) end return y_hat -end # classify(art::GNFA, x::RealArray) +end # classify(art::GNFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) """ activation_match!(art::GNFA, x::RealVector) diff --git a/src/ARTMAP/DAM.jl b/src/ARTMAP/DAM.jl index a4bdff18..7de944ef 100644 --- a/src/ARTMAP/DAM.jl +++ b/src/ARTMAP/DAM.jl @@ -229,7 +229,7 @@ julia> train!(art, x, y) julia> classify(art, x_test) ``` """ -function classify(art::DAM, x::RealMatrix ; preprocessed::Bool=false) +function classify(art::DAM, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) # Show a message if display is on art.opts.display && @info "Testing DAM" @@ -274,7 +274,13 @@ function classify(art::DAM, x::RealMatrix ; preprocessed::Bool=false) if mismatch_flag # Create new weight vector @debug "Mismatch" - y_hat[ix] = -1 + # If we mismatched and want the best matching unit + if get_bmu + y_hat = art.labels[index[1]] + # Otherwise, report the mismatch label -1 + else + y_hat[ix] = -1 + end end end return y_hat diff --git a/src/ARTMAP/SFAM.jl b/src/ARTMAP/SFAM.jl index 27715658..b94ca0fb 100644 --- a/src/ARTMAP/SFAM.jl +++ b/src/ARTMAP/SFAM.jl @@ -230,7 +230,7 @@ julia> train!(art, x, y) julia> classify(art, x_test) ``` """ -function classify(art::SFAM, x::RealArray ; preprocessed::Bool=false) +function classify(art::SFAM, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) # Show a message if display is on art.opts.display && @info "Testing SFAM" @@ -273,7 +273,13 @@ function classify(art::SFAM, x::RealArray ; preprocessed::Bool=false) if mismatch_flag # Label as -1 if mismatched @debug "Mismatch" - y_hat[ix] = -1 + # If we mismatched and want the best matching unit + if get_bmu + y_hat = art.labels[index[1]] + # Otherwise, report the mismatch label -1 + else + y_hat[ix] = -1 + end end end return y_hat diff --git a/test/test_ddvfa.jl b/test/test_ddvfa.jl deleted file mode 100644 index 53cc3dcc..00000000 --- a/test/test_ddvfa.jl +++ /dev/null @@ -1,190 +0,0 @@ -""" - tt_ddvfa(opts::opts_DDVFA, train_x::Array) - -Trains and tests (tt) a DDVFA module on unlabeled data train_x. -""" -function tt_ddvfa(opts::opts_DDVFA, train_x::Array) - # Create the ART module, train, and classify - art = DDVFA(opts) - train!(art, train_x) - y_hat = classify(art, train_x) - # perf = performance(y_hat, data.test_y) - - # Total number of categories - total_vec = [art.F2[i].n_categories for i = 1:art.n_categories] - total_cat = sum(total_vec) - @info "Categories: $(art.n_categories)" - @info "Weights: $total_cat" - - return art -end # tt_ddvfa(opts::opts_DDVFA, train_x::Array) - -@testset "DDVFA Sequential" begin - @info "------- DDVFA Sequential -------" - - # Initialize the ART module - art = DDVFA() - # Turn off display for sequential training/testing - art.opts.display = false - # Set up the data manually because the module can't infer from single samples - data_setup!(art.config, data.train_x) - - # Get the dimension and size of the data - dim, n_samples = get_data_shape(data.train_x) - y_hat_train = zeros(Int64, n_samples) - dim_test, n_samples_test = get_data_shape(data.test_x) - y_hat = zeros(Int64, n_samples_test) - y_hat_bmu = zeros(Int64, n_samples_test) - - # Iterate over all examples sequentially - for i = 1:n_samples - y_hat_train[i] = train!(art, data.train_x[:, i], y=[data.train_y[i]]) - end - - # Iterate over all test samples sequentially - for i = 1:n_samples_test - y_hat[i] = classify(art, data.test_x[:, i]) - y_hat_bmu[i] = classify(art, data.test_x[:, i], get_bmu=true) - end - - # Calculate performance - perf_train = performance(y_hat_train, data.train_y) - perf_test = performance(y_hat, data.test_y) - perf_test_bmu = performance(y_hat_bmu, data.test_y) - - # Test the permance above a baseline number - perf_baseline = 0.8 - @test perf_train >= perf_baseline - @test perf_test >= perf_baseline - @test perf_test_bmu >= perf_baseline - - @info "DDVFA Training Perf: $perf_train" - @info "DDVFA Testing Perf: $perf_test" - @info "DDVFA Testing BMU Perf: $perf_test_bmu" -end - -@testset "DDVFA Supervised" begin - @info "------- DDVFA Supervised -------" - - # Train and classify - art = DDVFA() - y_hat_train = train!(art, data.train_x, y=data.train_y) - y_hat = classify(art, data.test_x) - y_hat_bmu = classify(art, data.test_x, get_bmu=true) - - # Calculate performance - perf_train = performance(y_hat_train, data.train_y) - perf_test = performance(y_hat, data.test_y) - perf_test_bmu = performance(y_hat_bmu, data.test_y) - - # Test the performances with a baseline number - perf_baseline = 0.8 - @test perf_train >= perf_baseline - @test perf_test >= perf_baseline - @test perf_test_bmu >= perf_baseline - - # Log the results - @info "DDVFA Training Perf: $perf_train" - @info "DDVFA Testing Perf: $perf_test" - @info "DDVFA Testing BMU Perf: $perf_test_bmu" -end # @testset "DDVFA Supervised" - -@testset "DDVFA" begin - # Parse the data - data_file = "../data/art_data_rng.csv" - train_x = readdlm(data_file, ',') - train_x = permutedims(train_x) - - # Create the ART module, train, and classify - @info " ------- DDVFA Testing: Default Training -------" - default_opts = opts_DDVFA() - default_ddvfa = tt_ddvfa(default_opts, train_x) - @info "DDVFA Testing: Default Complete" - - # Create the ART module, train, and classify with no display - @info "------- DDVFA Testing: No Display Training -------" - no_disp_opts = opts_DDVFA() - no_disp_opts.display = false - no_disp_ddvfa = tt_ddvfa(no_disp_opts, train_x) - @info "DDVFA Testing: No Display Complete" - - # Test that the resulting weights are equivalent - @test get_W(default_ddvfa) == get_W(no_disp_ddvfa) -end # @testset "DDVFA" - -@testset "GNFA" begin - @info "------- GNFA Testing -------" - - # GNFA train and test - my_gnfa = GNFA() - # local_complement_code = AdaptiveResonance.complement_code(data.train_x) - # train!(my_gnfa, local_complement_code, preprocessed=true) - train!(my_gnfa, data.train_x) - - # Similarity methods - methods = [ - "single", - "average", - "complete", - "median", - "weighted", - "centroid" - ] - - # Both field names - field_names = ["T", "M"] - - # Compute a local sample for GNFA similarity method testing - # local_sample = local_complement_code[:, 1] - # local_complement_code = AdaptiveResonance.complement_code(data.train_x) - # local_sample = data.train_x[:, 1] - local_sample = AdaptiveResonance.complement_code(data.train_x[:, 1], config=my_gnfa.config) - - # Compute the local activation and match - # AdaptiveResonance.activation_match!(my_gnfa, local_sample) - - # # Declare the true activation and match magnitudes - # truth = Dict( - # "single" => Dict( - # "T" => 0.9988714513100155, - # "M" => 2.6532834139109758 - # ), - # "average" => Dict( - # "T" => 0.33761483787933894, - # "M" => 1.1148764060015297 - # ), - # "complete" => Dict( - # "T" => 0.018234409874338647, - # "M" => 0.07293763949735459 - # ), - # "median" => Dict( - # "T" => 0.2089217851518073, - # "M" => 0.835687140607229 - # ), - # "weighted" => Dict( - # "T" => 0.5374562506748786, - # "M" => 1.4396083090159748 - # ), - # "centroid" => Dict( - # "T" => 0.0, - # "M" => 0.0 - # ) - # ) - - # # Test every method and field name - # for method in methods - # results = Dict() - # for field_name in field_names - # results[field_name] = AdaptiveResonance.similarity(method, my_gnfa, field_name, local_sample, my_gnfa.opts.gamma_ref) - # @test isapprox(truth[method][field_name], results[field_name]) - # end - # @info "Method: $method" results - # end - - # Check the error handling of the similarity function - # Access the wrong similarity metric keyword ("asdf") - @test_throws ErrorException AdaptiveResonance.similarity("asdf", my_gnfa, "T", local_sample, my_gnfa.opts.gamma_ref) - # Access the wrong output function ("A") - @test_throws ErrorException AdaptiveResonance.similarity("centroid", my_gnfa, "A", local_sample, my_gnfa.opts.gamma_ref) - -end # @testset "GNFA" diff --git a/test/test_sets.jl b/test/test_sets.jl index fa0bebf3..2b373e59 100644 --- a/test/test_sets.jl +++ b/test/test_sets.jl @@ -57,7 +57,9 @@ end # @testset "AdaptiveResonance.jl" arts = [ GNFA, DVFA, - DDVFA + DDVFA, + SFAM, + DAM, ] n_arts = length(arts) @@ -75,7 +77,7 @@ end # @testset "AdaptiveResonance.jl" ] n_test_opts = length(test_opts) - @info "--------- TRAIN TEST ---------" + @info "-------------- BEGIN TRAIN TEST --------------" # ART perf_baseline = 0.7 @@ -84,8 +86,11 @@ end # @testset "AdaptiveResonance.jl" # Iterate over all test options for jx = 1:n_test_opts for kx = 1:n_art_opts - # Unsupervised - train_test_art(arts[ix](;art_opts[kx]...), data; test_opts=test_opts[jx]) + # Only do the unsupervised method if we have an ART module (not ARTMAP) + if arts[ix] isa ART + # Unsupervised + train_test_art(arts[ix](;art_opts[kx]...), data; test_opts=test_opts[jx]) + end # Supervised @test train_test_art(arts[ix](;art_opts[kx]...), data; supervised=true, test_opts=test_opts[jx]) >= perf_baseline @@ -93,7 +98,7 @@ end # @testset "AdaptiveResonance.jl" end end - @info "--------- END TRAIN TEST ---------" + @info "-------------- END TRAIN TEST --------------" end # @testset "Train Test" @testset "kwargs" begin @@ -114,54 +119,82 @@ end # @testset "Train Test" @info "--------- END KWARGS TEST ---------" end # @testset "kwargs" -@testset "DVFA.jl" begin - @info "------- DVFA Unsupervised -------" - - # Train and classify - art = DVFA() - y_hat_train = train!(art, data.train_x) - - @info "------- DVFA Supervised -------" - - # Train and classify - art = DVFA() - y_hat_train = train!(art, data.train_x, y=data.train_y) - y_hat = classify(art, data.test_x) - y_hat_bmu = classify(art, data.test_x, get_bmu=true) - - # Calculate performance - perf_train = performance(y_hat_train, data.train_y) - perf_test = performance(y_hat, data.test_y) - perf_test_bmu = performance(y_hat_bmu, data.test_y) - - # Test the performances are above a baseline - perf_baseline = 0.8 - @test perf_train >= perf_baseline - @test perf_test >= perf_baseline - @test perf_test_bmu >= perf_baseline - @info art.n_categories - - # Log the results - @info "DVFA Training Perf: $perf_train" - @info "DVFA Testing Perf: $perf_test" - @info "DVFA Testing BMU Perf: $perf_test_bmu" -end # @testset "DVFA.jl" - -@testset "DDVFA.jl" begin - # DDVFA training and testing - include("test_ddvfa.jl") -end # @testset "DDVFA.jl" - -@testset "ARTMAP.jl" begin - # Declare the baseline performance for all modules - perf_baseline = 0.7 +@testset "GNFA" begin + @info "------- GNFA Testing -------" - # Iterate over each artmap module - for art in [SFAM, DAM] - perf = train_test_artmap(art(), data) - @test perf >= perf_baseline - end -end # @testset "ARTMAP.jl" + # GNFA train and test + my_gnfa = GNFA() + # local_complement_code = AdaptiveResonance.complement_code(data.train_x) + # train!(my_gnfa, local_complement_code, preprocessed=true) + train!(my_gnfa, data.train_x) + + # Similarity methods + methods = [ + "single", + "average", + "complete", + "median", + "weighted", + "centroid" + ] + + # Both field names + field_names = ["T", "M"] + + # Compute a local sample for GNFA similarity method testing + # local_sample = local_complement_code[:, 1] + # local_complement_code = AdaptiveResonance.complement_code(data.train_x) + # local_sample = data.train_x[:, 1] + local_sample = AdaptiveResonance.complement_code(data.train_x[:, 1], config=my_gnfa.config) + + # Compute the local activation and match + # AdaptiveResonance.activation_match!(my_gnfa, local_sample) + + # # Declare the true activation and match magnitudes + # truth = Dict( + # "single" => Dict( + # "T" => 0.9988714513100155, + # "M" => 2.6532834139109758 + # ), + # "average" => Dict( + # "T" => 0.33761483787933894, + # "M" => 1.1148764060015297 + # ), + # "complete" => Dict( + # "T" => 0.018234409874338647, + # "M" => 0.07293763949735459 + # ), + # "median" => Dict( + # "T" => 0.2089217851518073, + # "M" => 0.835687140607229 + # ), + # "weighted" => Dict( + # "T" => 0.5374562506748786, + # "M" => 1.4396083090159748 + # ), + # "centroid" => Dict( + # "T" => 0.0, + # "M" => 0.0 + # ) + # ) + + # # Test every method and field name + # for method in methods + # results = Dict() + # for field_name in field_names + # results[field_name] = AdaptiveResonance.similarity(method, my_gnfa, field_name, local_sample, my_gnfa.opts.gamma_ref) + # @test isapprox(truth[method][field_name], results[field_name]) + # end + # @info "Method: $method" results + # end + + # Check the error handling of the similarity function + # Access the wrong similarity metric keyword ("asdf") + @test_throws ErrorException AdaptiveResonance.similarity("asdf", my_gnfa, "T", local_sample, my_gnfa.opts.gamma_ref) + # Access the wrong output function ("A") + @test_throws ErrorException AdaptiveResonance.similarity("centroid", my_gnfa, "A", local_sample, my_gnfa.opts.gamma_ref) + +end # @testset "GNFA" @testset "ARTSCENE.jl" begin # ARTSCENE training and testing diff --git a/test/test_utils.jl b/test/test_utils.jl index ad03958f..81b24a82 100644 --- a/test/test_utils.jl +++ b/test/test_utils.jl @@ -30,22 +30,22 @@ function DataSplit(data_x::Array, data_y::Array, ratio::Real) return DataSplit(train_x, test_x, train_y, test_y) end # DataSplit(data_x::Array, data_y::Array, ratio::Real) -""" - train_test_artmap(art::ARTMAP, data::DataSplit) - -Train and test an ARTMAP module in a supervised manner on the dataset. -""" -function train_test_artmap(art::ARTMAP, data::DataSplit) - # Train and classify - train!(art, data.train_x, data.train_y) - y_hat = classify(art, data.test_x) - - # Calculate performance - perf = performance(y_hat, data.test_y) - @info "Performance is $perf" - - return perf -end # train_test_artmap(art::ARTMAP, data::DataSplit) +# """ +# train_test_artmap(art::ARTMAP, data::DataSplit) + +# Train and test an ARTMAP module in a supervised manner on the dataset. +# """ +# function train_test_artmap(art::ARTMAP, data::DataSplit) +# # Train and classify +# train!(art, data.train_x, data.train_y) +# y_hat = classify(art, data.test_x) + +# # Calculate performance +# perf = performance(y_hat, data.test_y) +# @info "Performance is $perf" + +# return perf +# end # train_test_artmap(art::ARTMAP, data::DataSplit) """ train_test_art(art::ARTModule, data::DataSplit; supervised::Bool=false, art_opts...) From b334eff2e18b9cac78a113d4cf4f73235f4f6521 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Thu, 21 Oct 2021 14:45:47 -0500 Subject: [PATCH 24/38] Remove redundant train/test method --- examples/artmap/artmap.jl | 2 +- src/ARTMAP/DAM.jl | 1 - test/test_utils.jl | 17 ----------------- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/examples/artmap/artmap.jl b/examples/artmap/artmap.jl index 5b635595..bd76e221 100644 --- a/examples/artmap/artmap.jl +++ b/examples/artmap/artmap.jl @@ -9,5 +9,5 @@ data = load_iris("data/Iris.csv") # Iterate over several ARTMAP modules for art in [SFAM, DAM] # Train and classify, returning the performance - perf = train_test_artmap(art(), data) + perf = train_test_art(art(), data) end diff --git a/src/ARTMAP/DAM.jl b/src/ARTMAP/DAM.jl index 7de944ef..43ba572d 100644 --- a/src/ARTMAP/DAM.jl +++ b/src/ARTMAP/DAM.jl @@ -263,7 +263,6 @@ function classify(art::DAM, x::RealMatrix ; preprocessed::Bool=false, get_bmu::B for jx in 1:art.n_categories # Compute match function M = art_match(art, x[:, ix], art.W[:, index[jx]]) - @debug M # Current winner if M >= art.opts.rho y_hat[ix] = art.labels[index[jx]] diff --git a/test/test_utils.jl b/test/test_utils.jl index 81b24a82..c013adee 100644 --- a/test/test_utils.jl +++ b/test/test_utils.jl @@ -30,23 +30,6 @@ function DataSplit(data_x::Array, data_y::Array, ratio::Real) return DataSplit(train_x, test_x, train_y, test_y) end # DataSplit(data_x::Array, data_y::Array, ratio::Real) -# """ -# train_test_artmap(art::ARTMAP, data::DataSplit) - -# Train and test an ARTMAP module in a supervised manner on the dataset. -# """ -# function train_test_artmap(art::ARTMAP, data::DataSplit) -# # Train and classify -# train!(art, data.train_x, data.train_y) -# y_hat = classify(art, data.test_x) - -# # Calculate performance -# perf = performance(y_hat, data.test_y) -# @info "Performance is $perf" - -# return perf -# end # train_test_artmap(art::ARTMAP, data::DataSplit) - """ train_test_art(art::ARTModule, data::DataSplit; supervised::Bool=false, art_opts...) From d6bb05f8313c6c034e9a37f456ea796a5bb6ea79 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Thu, 21 Oct 2021 16:01:18 -0500 Subject: [PATCH 25/38] Add threshold_normalization option to DDVFA, GNFA --- src/ART/DDVFA.jl | 15 ++++++++++++++- src/ART/GNFA.jl | 22 +++++++++++++++++++--- test/test_sets.jl | 29 +++++++++++++++++++++++------ 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index 609be6e9..4e609436 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -40,6 +40,8 @@ julia> my_opts = opts_DDVFA() display::Bool = true # Maximum number of epochs during training max_epoch::Int = 1 + # Normalize the threshold by the feature dimension + threshold_normalization::Bool = false end # opts_DDVFA # --------------------------------------------------------------------------- # @@ -136,6 +138,7 @@ DDVFA function DDVFA(opts::opts_DDVFA) subopts = opts_GNFA( rho=opts.rho_ub, + threshold_normalization=opts.threshold_normalization, display=false ) DDVFA(opts, @@ -155,6 +158,14 @@ end # DDVFA(opts::opts_DDVFA) # ALGORITHMIC METHODS # --------------------------------------------------------------------------- # +function set_threshold!(art::DDVFA) + if art.opts.threshold_normalization + art.threshold = art.opts.rho_lb*(art.config.dim^art.opts.gamma_ref) + else + art.threshold = art.opts.rho_lb + end +end # set_threshold!(art::DDVFA) + """ train!(art::DDVFA, x::RealArray ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) @@ -204,7 +215,9 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), pre end # Set the learning threshold as a function of the data dimension - art.threshold = art.opts.rho_lb*(art.config.dim^art.opts.gamma_ref) + # art.threshold = art.opts.rho_lb*(art.config.dim^art.opts.gamma_ref) + # art.threshold = art.opts.rho_lb + set_threshold!(art) # Learn until the stopping conditions art.epoch = 0 diff --git a/src/ART/GNFA.jl b/src/ART/GNFA.jl index fc9538c9..f51b4ac1 100644 --- a/src/ART/GNFA.jl +++ b/src/ART/GNFA.jl @@ -35,6 +35,8 @@ Initialized GNFA display::Bool = true # Maximum number of epochs during training max_epochs::Int = 1 + # Normalize the threshold by the feature dimension + threshold_normalization::Bool = true end # opts_GNFA # --------------------------------------------------------------------------- # @@ -155,6 +157,14 @@ end # GNFA(opts::opts_GNFA, sample::RealVector) # ALGORITHMIC METHODS # --------------------------------------------------------------------------- # +function set_threshold!(art::GNFA) + if art.opts.threshold_normalization + art.threshold = art.opts.rho*(art.config.dim^art.opts.gamma_ref) + else + art.threshold = art.opts.rho + end +end # set_threshold!(art::GNFA) + """ initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} @@ -175,7 +185,10 @@ function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} art.n_categories = 1 # Set the threshold - art.threshold = art.opts.rho * (art.config.dim^art.opts.gamma_ref) + # art.threshold = art.opts.rho * (art.config.dim^art.opts.gamma_ref) + # art.threshold = art.opts.rho + set_threshold!(art) + # Fast commit the weight art.W = Array{T}(undef, art.config.dim_comp, 1) # Assign the contents, valid this way for 1-D or 2-D arrays @@ -399,8 +412,11 @@ function activation_match!(art::GNFA, x::RealVector) for i = 1:art.n_categories W_norm = norm(art.W[:, i], 1) art.T[i] = (norm(element_min(x, art.W[:, i]), 1)/(art.opts.alpha + W_norm))^art.opts.gamma - art.M[i] = (W_norm^art.opts.gamma_ref)*art.T[i] - # art.M[i] = ((W_norm/norm(x, 1))^art.opts.gamma_ref)*art.T[i] + if art.opts.threshold_normalization + art.M[i] = (W_norm^art.opts.gamma_ref)*art.T[i] + else + art.M[i] = ((W_norm/norm(x, 1))^art.opts.gamma_ref)*art.T[i] + end end end # activation_match!(art::GNFA, x::RealVector) diff --git a/test/test_sets.jl b/test/test_sets.jl index 2b373e59..afd20e5a 100644 --- a/test/test_sets.jl +++ b/test/test_sets.jl @@ -66,9 +66,20 @@ end # @testset "AdaptiveResonance.jl" # All common ART options art_opts = [ (display = true,), - (display = false,), + # (display = false,), ] - n_art_opts = length(art_opts) + + # Specific ART options + art_specifics = Dict( + DDVFA => [ + (threshold_normalization=true,), + (threshold_normalization=false,), + ], + GNFA => [ + (threshold_normalization=true,), + (threshold_normalization=false,), + ], + ) # All test option permutations test_opts = [ @@ -85,15 +96,21 @@ end # @testset "AdaptiveResonance.jl" for ix = 1:n_arts # Iterate over all test options for jx = 1:n_test_opts - for kx = 1:n_art_opts + # If we are testing a module with different options, merge + if haskey(art_specifics, arts[ix]) + local_art_opts = vcat(art_opts, art_specifics[arts[ix]]) + else + local_art_opts = art_opts + end + # Iterate over all options + for kx = 1:length(local_art_opts) # Only do the unsupervised method if we have an ART module (not ARTMAP) if arts[ix] isa ART # Unsupervised - train_test_art(arts[ix](;art_opts[kx]...), data; test_opts=test_opts[jx]) + train_test_art(arts[ix](;local_art_opts[kx]...), data; test_opts=test_opts[jx]) end - # Supervised - @test train_test_art(arts[ix](;art_opts[kx]...), data; supervised=true, test_opts=test_opts[jx]) >= perf_baseline + @test train_test_art(arts[ix](;local_art_opts[kx]...), data; supervised=true, test_opts=test_opts[jx]) >= perf_baseline end end end From 582ea1614df6841966334cb6607688bf173d3f9c Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Fri, 22 Oct 2021 09:02:48 -0500 Subject: [PATCH 26/38] Remove FuzzyART file to refactor GNFA --- src/ART/ART.jl | 1 - src/ART/FuzzyART.jl | 381 --------------------------------------- src/AdaptiveResonance.jl | 1 - test/test_sets.jl | 2 +- 4 files changed, 1 insertion(+), 384 deletions(-) delete mode 100644 src/ART/FuzzyART.jl diff --git a/src/ART/ART.jl b/src/ART/ART.jl index 595d54ee..3fb55a52 100644 --- a/src/ART/ART.jl +++ b/src/ART/ART.jl @@ -5,7 +5,6 @@ Description: Includes all of the unsupervised ART modules definitions. """ -include("FuzzyART.jl") # FuzzyART include("GNFA.jl") # GNFA include("DDVFA.jl") # DDVFA include("DVFA.jl") # DVFA diff --git a/src/ART/FuzzyART.jl b/src/ART/FuzzyART.jl deleted file mode 100644 index fd94cc28..00000000 --- a/src/ART/FuzzyART.jl +++ /dev/null @@ -1,381 +0,0 @@ -""" - FuzzyART.jl - -Description: - Includes all of the structures and logic for running a Gamma-Normalized Fuzzy ART module. -""" - -""" - opts_FuzzyART() - -Gamma-Normalized Fuzzy ART options struct. - -# Examples -```julia-repl -julia> opts_FuzzyART() -Initialized FuzzyART -``` -""" -@with_kw mutable struct opts_FuzzyART <: ARTOpts @deftype Float - # Vigilance parameter: [0, 1] - rho = 0.6; @assert rho >= 0.0 && rho <= 1.0 - # Choice parameter: alpha > 0 - alpha = 1e-3; @assert alpha > 0.0 - # Learning parameter: (0, 1] - beta = 1.0; @assert beta > 0.0 && beta <= 1.0 - # "Pseudo" kernel width: gamma >= 1 - gamma = 3.0; @assert gamma >= 1.0 - # gamma = 784; @assert gamma >= 1 - # "Reference" gamma for normalization: 0 <= gamma_ref < gamma - gamma_ref = 1.0; @assert 0.0 <= gamma_ref && gamma_ref < gamma - # Similarity method (activation and match): - # 'single', 'average', 'complete', 'median', 'weighted', or 'centroid' - method::String = "single" - # Display flag - display::Bool = true - # Maximum number of epochs during training - max_epochs::Int = 1 -end # opts_FuzzyART - -""" - FuzzyART <: ART - -Gamma-Normalized Fuzzy ART learner struct - -# Examples -```julia-repl -julia> FuzzyART() -FuzzyART - opts: opts_FuzzyART - ... -``` -""" -mutable struct FuzzyART <: ART - # Assign numerical parameters from options - opts::opts_FuzzyART - config::DataConfig - - # Working variables - threshold::Float - labels::IntegerVector - T::RealVector - M::RealVector - - # "Private" working variables - W::RealMatrix - n_instance::IntegerVector - n_categories::Int - epoch::Int -end # FuzzyART <: ART - -""" - FuzzyART() - -Implements a Gamma-Normalized Fuzzy ART learner. - -# Examples -```julia-repl -julia> FuzzyART() -FuzzyART - opts: opts_FuzzyART - ... -``` -""" -function FuzzyART() - opts = opts_FuzzyART() - FuzzyART(opts) -end # FuzzyART() - -""" - FuzzyART(;kwargs...) - -Implements a Gamma-Normalized Fuzzy ART learner with keyword arguments. - -# Examples -```julia-repl -julia> FuzzyART(rho=0.7) -FuzzyART - opts: opts_FuzzyART - ... -``` -""" -function FuzzyART(;kwargs...) - opts = opts_FuzzyART(;kwargs...) - FuzzyART(opts) -end # FuzzyART(;kwargs...) - -""" - FuzzyART(opts::opts_FuzzyART) - -Implements a Gamma-Normalized Fuzzy ART learner with specified options. - -# Examples -```julia-repl -julia> FuzzyART(opts) -FuzzyART - opts: opts_FuzzyART - ... -``` -""" -function FuzzyART(opts::opts_FuzzyART) - FuzzyART(opts, # opts - DataConfig(), # config - 0.0, # threshold - Array{Int}(undef,0), # labels - Array{Float}(undef, 0), # T - Array{Float}(undef, 0), # M - Array{Float}(undef, 0, 0), # W - Array{Int}(undef, 0), # n_instance - 0, # n_categories - 0 # epoch - ) -end # FuzzyART(opts::opts_FuzzyART) - -""" - FuzzyART(opts::opts_FuzzyART, sample::RealVector) - -Create and initialize a FuzzyART with a single sample in one step. -""" -function FuzzyART(opts::opts_FuzzyART, sample::RealVector) - art = FuzzyART(opts) - initialize!(art, sample) - return art -end # FuzzyART(opts::opts_FuzzyART, sample::RealVector) - -""" - initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} - -Initializes a FuzzyART learner with an intial sample 'x'. - -# Examples -```julia-repl -julia> my_FuzzyART = FuzzyART() -FuzzyART - opts: opts_FuzzyART - ... -julia> initialize!(my_FuzzyART, [1 2 3 4]) -``` -""" -# function initialize!(art::FuzzyART, x::RealArray ; y::Integer=0) -function initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} - # Set up the data config - if art.config.setup - @warn "Data configuration already set up, overwriting config" - else - art.config.setup = true - end - - # IMPORTANT: Assuming that x is a sample, so each entry is a feature - dim = length(x) - art.config.dim_comp = dim - art.config.dim = Int(dim/2) # Assumes input is already complement coded - - # Initialize the instance and categories counters - art.n_instance = [1] - art.n_categories = 1 - - # Set the threshold - art.threshold = art.opts.rho * (art.config.dim^art.opts.gamma_ref) - # Fast commit the weight - art.W = Array{T}(undef, art.config.dim_comp, 1) - # Assign the contents, valid this way for 1-D or 2-D arrays - art.W[:, 1] = x - label = y == 0 ? y : 1 - push!(art.labels, label) -end # initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} - -""" - train!(art::FuzzyART, x::RealArray ; y::IntegerVector = Vector{Int}()) - -Trains a FuzzyART learner with dataset 'x' and optional labels 'y' - -# Examples -```julia-repl -julia> my_FuzzyART = FuzzyART() -FuzzyART - opts: opts_FuzzyART - ... -julia> x = load_data() -julia> train!(my_FuzzyART, x) -``` -""" -function train!(art::FuzzyART, x::RealArray ; y::IntegerVector = Vector{Int}()) - # Flag for if training in supervised mode - supervised = !isempty(y) - # Initialization if weights are empty; fast commit the first sample - if isempty(art.W) - label = supervised ? y[1] : 1 - push!(art.labels, label) - initialize!(art, x[:, 1]) - skip_first = true - else - skip_first = false - end - - # Learning - art.epoch = 0 - while true - # Increment the epoch and get the iterator - art.epoch += 1 - iter = get_iterator(art.opts, x) - # Loop over samples - for i = iter - # Update the iterator if necessary - update_iter(art, iter, i) - # Skip the first sample if we just initialized - (i == 1 && skip_first) && continue - # Grab the sample slice - sample = get_sample(x, i) - # Compute activation/match functions - activation_match!(art, sample) - # Sort activation function values in descending order - index = sortperm(art.T, rev=true) - # Initialize mismatch as true - mismatch_flag = true - # Loop over all categories - for j = 1:art.n_categories - # Best matching unit - bmu = index[j] - # Vigilance check - pass - if art.M[bmu] >= art.threshold - # Learn the sample - learn!(art, sample, bmu) - # Update sample labels - label = supervised ? y[i] : bmu - push!(art.labels, label) - # No mismatch - mismatch_flag = false - break - end - end - # If there was no resonant category, make a new one - if mismatch_flag - # Increment the number of categories - art.n_categories += 1 - # Fast commit - # art.W = [art.W x[:, i]] - art.W = hcat(art.W, sample) - # Increment number of samples associated with new category - push!(art.n_instance, 1) - # Update sample labels - label = supervised ? y[i] : art.n_categories - push!(art.labels, label) - end - end - # Make sure to start at first sample from now on - skip_first = false - # Check for the stopping condition for the whole loop - if stopping_conditions(art) - break - end - end -end # train!(art::FuzzyART, x::RealArray ; y::IntegerVector = Vector{Int}()) - -""" - classify(art::FuzzyART, x::RealArray) - -Predict categories of 'x' using the FuzzyART model. - -Returns predicted categories 'y_hat' - -# Examples -```julia-repl -julia> my_FuzzyART = FuzzyART() -FuzzyART - opts: opts_FuzzyART - ... -julia> x, y = load_data() -julia> train!(my_FuzzyART, x) -julia> y_hat = classify(my_FuzzyART, y) -``` -""" -function classify(art::FuzzyART, x::RealArray) - # Get the number of samples to classify - n_samples = get_n_samples(x) - - # Initialize the output vector and iterate across all data - y_hat = zeros(Int, n_samples) - iter = get_iterator(art.opts, x) - for ix in iter - # Update the iterator if necessary - update_iter(art, iter, ix) - # Compute activation and match functions - activation_match!(art, x[:, ix]) - # Sort activation function values in descending order - index = sortperm(art.T, rev=true) - mismatch_flag = true - for jx in 1:art.n_categories - bmu = index[jx] - # Vigilance check - pass - if art.M[bmu] >= art.threshold - # Current winner - y_hat[ix] = art.labels[bmu] - mismatch_flag = false - break - end - end - if mismatch_flag - # Create new weight vector - @debug "Mismatch" - y_hat[ix] = -1 - end - end - return y_hat -end # classify(art::FuzzyART, x::RealArray) - -""" - activation_match!(art::FuzzyART, x::RealArray) - -Computes the activation and match functions of the art module against sample x. - -# Examples -```julia-repl -julia> my_FuzzyART = FuzzyART() -FuzzyART - opts: opts_FuzzyART - ... -julia> x, y = load_data() -julia> train!(my_FuzzyART, x) -julia> x_sample = x[:, 1] -julia> activation_match!(my_FuzzyART, x_sample) -``` -""" -function activation_match!(art::FuzzyART, x::RealArray) - art.T = zeros(art.n_categories) - art.M = zeros(art.n_categories) - for i = 1:art.n_categories - W_norm = norm(art.W[:, i], 1) - art.T[i] = (norm(element_min(x, art.W[:, i]), 1)/(art.opts.alpha + W_norm))^art.opts.gamma - art.M[i] = (W_norm^art.opts.gamma_ref)*art.T[i] - end -end # activation_match!(art::FuzzyART, x::RealArray) - -""" - learn(art::FuzzyART, x::RealVector, W::RealVector) - -Return the modified weight of the art module conditioned by sample x. -""" -function learn(art::FuzzyART, x::RealVector, W::RealVector) - # Update W - return art.opts.beta .* element_min(x, W) .+ W .* (1 - art.opts.beta) -end # learn(art::FuzzyART, x::RealVector, W::RealVector) - -""" - learn!(art::FuzzyART, x::RealVector, index::Integer) - -In place learning function with instance counting. -""" -function learn!(art::FuzzyART, x::RealVector, index::Integer) - # Update W - art.W[:, index] = learn(art, x, art.W[:, index]) - art.n_instance[index] += 1 -end # learn!(art::FuzzyART, x::RealVector, index::Integer) - -""" - stopping_conditions(art::FuzzyART) - -Stopping conditions for a FuzzyART module. -""" -function stopping_conditions(art::FuzzyART) - return art.epoch >= art.opts.max_epochs -end # stopping_conditions(art::FuzzyART) \ No newline at end of file diff --git a/src/AdaptiveResonance.jl b/src/AdaptiveResonance.jl index 0561bfde..bfff34a9 100644 --- a/src/AdaptiveResonance.jl +++ b/src/AdaptiveResonance.jl @@ -46,7 +46,6 @@ export get_n_samples, # Get the number of samples (1-D interpreted as one sample) # ART (unsupervised) - FuzzyART, opts_FuzzyART, GNFA, opts_GNFA, DDVFA, opts_DDVFA, get_W, DVFA, opts_DVFA, diff --git a/test/test_sets.jl b/test/test_sets.jl index afd20e5a..c776887e 100644 --- a/test/test_sets.jl +++ b/test/test_sets.jl @@ -89,7 +89,7 @@ end # @testset "AdaptiveResonance.jl" n_test_opts = length(test_opts) @info "-------------- BEGIN TRAIN TEST --------------" - # ART + # Performance baseline for all algorithms perf_baseline = 0.7 # Iterate over all ART modules From 0fbed6ddf33894498fd2e6aefa52c400c08cef4f Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Fri, 22 Oct 2021 09:08:54 -0500 Subject: [PATCH 27/38] Refactor GNFA to FuzzyART --- README.md | 4 +- examples/art/gnfa.jl | 14 +-- src/ART/ART.jl | 2 +- src/ART/DDVFA.jl | 26 ++--- src/ART/{GNFA.jl => FuzzyART.jl} | 188 +++++++++++++++---------------- src/AdaptiveResonance.jl | 2 +- test/test_sets.jl | 32 +++--- 7 files changed, 134 insertions(+), 134 deletions(-) rename src/ART/{GNFA.jl => FuzzyART.jl} (68%) diff --git a/README.md b/README.md index 08aee526..114e3eb6 100644 --- a/README.md +++ b/README.md @@ -136,9 +136,9 @@ art = DDVFA(opts) This project has implementations of the following ART (unsupervised) and ARTMAP (supervised) modules: - ART - - **DDVFA**: Distributed Dual Vigilance Fuzzy ART + - **FuzzyART**: Fuzzy ART - **DVFA**: Dual Vigilance Fuzzy ART - - **GNFA**: Gamma-Normalized Fuzzy ART + - **DDVFA**: Distributed Dual Vigilance Fuzzy ART - ARTMAP - **SFAM**: Simplified Fuzzy ARTMAP - **FAM**: Fuzzy ARTMAP diff --git a/examples/art/gnfa.jl b/examples/art/gnfa.jl index b36f0293..f7667ea6 100644 --- a/examples/art/gnfa.jl +++ b/examples/art/gnfa.jl @@ -3,22 +3,22 @@ using Logging # Set the log level LogLevel(Logging.Info) -@info "GNFA Testing" +@info "FuzzyART Testing" # Auxiliary generic functions for loading data, etc. include("../../test/test_utils.jl") -# GNFA train and test -# opts = opts_GNFA(rho=0.6, gamma_ref = 1.0, gamma=1.0) -opts = opts_GNFA(rho=0.6, gamma = 5.0) -art = GNFA(opts) +# FuzzyART train and test +# opts = opts_FuzzyART(rho=0.6, gamma_ref = 1.0, gamma=1.0) +opts = opts_FuzzyART(rho=0.6, gamma = 5.0) +art = FuzzyART(opts) # data = load_am_data(200, 50) data = load_iris("data/Iris.csv") # local_complement_code = complement_code(data.train_x) -# train!(my_gnfa, local_complement_code, y=data.train_y) +# train!(my_FuzzyART, local_complement_code, y=data.train_y) train!(art, data.train_x, y=data.train_y) -# y_hat = classify(my_gnfa, data.test_x, get_bmu=true) +# y_hat = classify(my_FuzzyART, data.test_x, get_bmu=true) y_hat = classify(art, data.test_x) perf = performance(y_hat, data.test_y) diff --git a/src/ART/ART.jl b/src/ART/ART.jl index 3fb55a52..aeada79e 100644 --- a/src/ART/ART.jl +++ b/src/ART/ART.jl @@ -5,6 +5,6 @@ Description: Includes all of the unsupervised ART modules definitions. """ -include("GNFA.jl") # GNFA +include("FuzzyART.jl") # FuzzyART include("DDVFA.jl") # DDVFA include("DVFA.jl") # DVFA diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index 4e609436..589a6a97 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -58,19 +58,19 @@ Distributed Dual Vigilance Fuzzy ARTMAP module struct. julia> DDVFA() DDVFA opts: opts_DDVFA - subopts::opts_GNFA + subopts::opts_FuzzyART ... ``` """ mutable struct DDVFA <: ART # Get parameters opts::opts_DDVFA - subopts::opts_GNFA + subopts::opts_FuzzyART config::DataConfig # Working variables threshold::Float - F2::Vector{GNFA} + F2::Vector{FuzzyART} labels::IntegerVector n_categories::Int epoch::Int @@ -92,7 +92,7 @@ Implements a DDVFA learner with default options. julia> DDVFA() DDVFA opts: opts_DDVFA - subopts: opts_GNFA + subopts: opts_FuzzyART ... ``` """ @@ -111,7 +111,7 @@ Implements a DDVFA learner with keyword arguments. julia> DDVFA(rho_lb=0.4, rho_ub = 0.75) DDVFA opts: opts_DDVFA - subopts: opts_GNFA + subopts: opts_FuzzyART ... ``` """ @@ -131,12 +131,12 @@ julia> my_opts = opts_DDVFA() julia> DDVFA(my_opts) DDVFA opts: opts_DDVFA - subopts: opts_GNFA + subopts: opts_FuzzyART ... ``` """ function DDVFA(opts::opts_DDVFA) - subopts = opts_GNFA( + subopts = opts_FuzzyART( rho=opts.rho_ub, threshold_normalization=opts.threshold_normalization, display=false @@ -145,7 +145,7 @@ function DDVFA(opts::opts_DDVFA) subopts, DataConfig(), 0.0, - Array{GNFA}(undef, 0), + Array{FuzzyART}(undef, 0), Array{Int}(undef, 0), 0, 0, @@ -309,14 +309,14 @@ end # train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), prepro """ create_category(art::DDVFA, sample::RealVector, label::Integer) -Create a new category by appending and initializing a new GNFA node to F2. +Create a new category by appending and initializing a new FuzzyART node to F2. """ function create_category(art::DDVFA, sample::RealVector, label::Integer) # Global Fuzzy ART art.n_categories += 1 push!(art.labels, label) # Local Gamma-Normalized Fuzzy ART - push!(art.F2, GNFA(art.subopts, sample, preprocessed=true)) + push!(art.F2, FuzzyART(art.subopts, sample, preprocessed=true)) end # function create_category(art::DDVFA, sample::RealVector, label::Integer) """ @@ -332,12 +332,12 @@ function stopping_conditions(art::DDVFA) end # stopping_conditions(DDVFA) """ - similarity(method::String, F2::GNFA, field_name::String, sample::RealVector, gamma_ref::RealFP) + similarity(method::String, F2::FuzzyART, field_name::String, sample::RealVector, gamma_ref::RealFP) Compute the similarity metric depending on method with explicit comparisons for the field name. """ -function similarity(method::String, F2::GNFA, field_name::String, sample::RealVector, gamma_ref::RealFP) +function similarity(method::String, F2::FuzzyART, field_name::String, sample::RealVector, gamma_ref::RealFP) @debug "Computing similarity" if field_name != "T" && field_name != "M" @@ -393,7 +393,7 @@ function similarity(method::String, F2::GNFA, field_name::String, sample::RealVe end return value -end # similarity(method::String, F2::GNFA, field_name::String, sample::RealVector, gamma_ref::RealFP) +end # similarity(method::String, F2::FuzzyART, field_name::String, sample::RealVector, gamma_ref::RealFP) """ classify(art::DDVFA, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) diff --git a/src/ART/GNFA.jl b/src/ART/FuzzyART.jl similarity index 68% rename from src/ART/GNFA.jl rename to src/ART/FuzzyART.jl index f51b4ac1..67039b66 100644 --- a/src/ART/GNFA.jl +++ b/src/ART/FuzzyART.jl @@ -1,5 +1,5 @@ """ - GNFA.jl + FuzzyART.jl Description: Includes all of the structures and logic for running a Gamma-Normalized Fuzzy ART module. @@ -10,17 +10,17 @@ Description: # --------------------------------------------------------------------------- # """ - opts_GNFA() + opts_FuzzyART() Gamma-Normalized Fuzzy ART options struct. # Examples ```julia-repl -julia> opts_GNFA() -Initialized GNFA +julia> opts_FuzzyART() +Initialized FuzzyART ``` """ -@with_kw mutable struct opts_GNFA <: ARTOpts @deftype Float +@with_kw mutable struct opts_FuzzyART <: ARTOpts @deftype Float # Vigilance parameter: [0, 1] rho = 0.6; @assert rho >= 0.0 && rho <= 1.0 # Choice parameter: alpha > 0 @@ -37,28 +37,28 @@ Initialized GNFA max_epochs::Int = 1 # Normalize the threshold by the feature dimension threshold_normalization::Bool = true -end # opts_GNFA +end # opts_FuzzyART # --------------------------------------------------------------------------- # # STRUCTS # --------------------------------------------------------------------------- # """ - GNFA <: ART + FuzzyART <: ART Gamma-Normalized Fuzzy ART learner struct # Examples ```julia-repl -julia> GNFA() -GNFA - opts: opts_GNFA +julia> FuzzyART() +FuzzyART + opts: opts_FuzzyART ... ``` """ -mutable struct GNFA <: ART +mutable struct FuzzyART <: ART # Assign numerical parameters from options - opts::opts_GNFA + opts::opts_FuzzyART config::DataConfig # Working variables @@ -72,63 +72,63 @@ mutable struct GNFA <: ART n_instance::IntegerVector n_categories::Int epoch::Int -end # GNFA <: ART +end # FuzzyART <: ART # --------------------------------------------------------------------------- # # CONSTRUCTORS # --------------------------------------------------------------------------- # """ - GNFA() + FuzzyART() Implements a Gamma-Normalized Fuzzy ART learner. # Examples ```julia-repl -julia> GNFA() -GNFA - opts: opts_GNFA +julia> FuzzyART() +FuzzyART + opts: opts_FuzzyART ... ``` """ -function GNFA() - opts = opts_GNFA() - GNFA(opts) -end # GNFA() +function FuzzyART() + opts = opts_FuzzyART() + FuzzyART(opts) +end # FuzzyART() """ - GNFA(;kwargs...) + FuzzyART(;kwargs...) Implements a Gamma-Normalized Fuzzy ART learner with keyword arguments. # Examples ```julia-repl -julia> GNFA(rho=0.7) -GNFA - opts: opts_GNFA +julia> FuzzyART(rho=0.7) +FuzzyART + opts: opts_FuzzyART ... ``` """ -function GNFA(;kwargs...) - opts = opts_GNFA(;kwargs...) - GNFA(opts) -end # GNFA(;kwargs...) +function FuzzyART(;kwargs...) + opts = opts_FuzzyART(;kwargs...) + FuzzyART(opts) +end # FuzzyART(;kwargs...) """ - GNFA(opts::opts_GNFA) + FuzzyART(opts::opts_FuzzyART) Implements a Gamma-Normalized Fuzzy ART learner with specified options. # Examples ```julia-repl -julia> GNFA(opts) -GNFA - opts: opts_GNFA +julia> FuzzyART(opts) +FuzzyART + opts: opts_FuzzyART ... ``` """ -function GNFA(opts::opts_GNFA) - GNFA(opts, # opts +function FuzzyART(opts::opts_FuzzyART) + FuzzyART(opts, # opts DataConfig(), # config 0.0, # threshold Array{Int}(undef,0), # labels @@ -139,47 +139,47 @@ function GNFA(opts::opts_GNFA) 0, # n_categories 0 # epoch ) -end # GNFA(opts::opts_GNFA) +end # FuzzyART(opts::opts_FuzzyART) """ - GNFA(opts::opts_GNFA, sample::RealVector) + FuzzyART(opts::opts_FuzzyART, sample::RealVector) -Create and initialize a GNFA with a single sample in one step. +Create and initialize a FuzzyART with a single sample in one step. """ -function GNFA(opts::opts_GNFA, sample::RealVector ; preprocessed::Bool=false) - art = GNFA(opts) +function FuzzyART(opts::opts_FuzzyART, sample::RealVector ; preprocessed::Bool=false) + art = FuzzyART(opts) init_train!(sample, art, preprocessed) initialize!(art, sample) return art -end # GNFA(opts::opts_GNFA, sample::RealVector) +end # FuzzyART(opts::opts_FuzzyART, sample::RealVector) # --------------------------------------------------------------------------- # # ALGORITHMIC METHODS # --------------------------------------------------------------------------- # -function set_threshold!(art::GNFA) +function set_threshold!(art::FuzzyART) if art.opts.threshold_normalization art.threshold = art.opts.rho*(art.config.dim^art.opts.gamma_ref) else art.threshold = art.opts.rho end -end # set_threshold!(art::GNFA) +end # set_threshold!(art::FuzzyART) """ - initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} + initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} -Initializes a GNFA learner with an intial sample 'x'. +Initializes a FuzzyART learner with an intial sample 'x'. # Examples ```julia-repl -julia> my_GNFA = GNFA() -GNFA - opts: opts_GNFA +julia> my_FuzzyART = FuzzyART() +FuzzyART + opts: opts_FuzzyART ... -julia> initialize!(my_GNFA, [1 2 3 4]) +julia> initialize!(my_FuzzyART, [1 2 3 4]) ``` """ -function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} +function initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} # Initialize the instance and categories counters art.n_instance = [1] art.n_categories = 1 @@ -195,12 +195,12 @@ function initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} art.W[:, 1] = x label = !iszero(y) ? y : 1 push!(art.labels, label) -end # initialize!(art::GNFA, x::Vector{T} ; y::Integer=0) where {T<:RealFP} +end # initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} """ - train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) + train!(art::FuzzyART, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) """ -function train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) +function train!(art::FuzzyART, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) # Flag for if training in supervised mode supervised = !iszero(y) @@ -252,12 +252,12 @@ function train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=fa end return y -end # train!(art::GNFA, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) +end # train!(art::FuzzyART, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) """ - create_category(art::GNFA, x::RealVector, y::Integer) + create_category(art::FuzzyART, x::RealVector, y::Integer) """ -function create_category(art::GNFA, x::RealVector, y::Integer) +function create_category(art::FuzzyART, x::RealVector, y::Integer) # Increment the number of categories art.n_categories += 1 # Fast commit @@ -266,24 +266,24 @@ function create_category(art::GNFA, x::RealVector, y::Integer) push!(art.n_instance, 1) # Add the label for the ategory push!(art.labels, y) -end # create_category(art::GNFA, x::RealVector, y::Integer) +end # create_category(art::FuzzyART, x::RealVector, y::Integer) """ - train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}()) + train!(art::FuzzyART, x::RealMatrix ; y::IntegerVector = Vector{Int}()) -Trains a GNFA learner with dataset 'x' and optional labels 'y' +Trains a FuzzyART learner with dataset 'x' and optional labels 'y' # Examples ```julia-repl -julia> my_GNFA = GNFA() -GNFA - opts: opts_GNFA +julia> my_FuzzyART = FuzzyART() +FuzzyART + opts: opts_FuzzyART ... julia> x = load_data() -julia> train!(my_GNFA, x) +julia> train!(my_FuzzyART, x) ``` """ -function train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) +function train!(art::FuzzyART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) # Flag for if training in supervised mode supervised = !isempty(y) @@ -312,12 +312,12 @@ function train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), pre break end end -end # train!(art::GNFA, x::RealMatrix ; y::IntegerVector = Vector{Int}()) +end # train!(art::FuzzyART, x::RealMatrix ; y::IntegerVector = Vector{Int}()) """ - classify(art::GNFA, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) + classify(art::FuzzyART, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) """ -function classify(art::GNFA, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) +function classify(art::FuzzyART, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) # Preprocess the data x = init_classify!(x, art, preprocessed) @@ -354,24 +354,24 @@ function classify(art::GNFA, x::RealVector ; preprocessed::Bool=false, get_bmu:: end """ - classify(art::GNFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) + classify(art::FuzzyART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) -Batch predict categories of 'x' using the GNFA model. +Batch predict categories of 'x' using the FuzzyART model. Returns predicted categories 'y_hat' # Examples ```julia-repl -julia> my_GNFA = GNFA() -GNFA - opts: opts_GNFA +julia> my_FuzzyART = FuzzyART() +FuzzyART + opts: opts_FuzzyART ... julia> x, y = load_data() -julia> train!(my_GNFA, x) -julia> y_hat = classify(my_GNFA, y) +julia> train!(my_FuzzyART, x) +julia> y_hat = classify(my_FuzzyART, y) ``` """ -function classify(art::GNFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) +function classify(art::FuzzyART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) # Preprocess the data x = init_classify!(x, art, preprocessed) # Get the number of samples to classify @@ -387,26 +387,26 @@ function classify(art::GNFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu:: y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) end return y_hat -end # classify(art::GNFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) +end # classify(art::FuzzyART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) """ - activation_match!(art::GNFA, x::RealVector) + activation_match!(art::FuzzyART, x::RealVector) Computes the activation and match functions of the art module against sample x. # Examples ```julia-repl -julia> my_GNFA = GNFA() -GNFA - opts: opts_GNFA +julia> my_FuzzyART = FuzzyART() +FuzzyART + opts: opts_FuzzyART ... julia> x, y = load_data() -julia> train!(my_GNFA, x) +julia> train!(my_FuzzyART, x) julia> x_sample = x[:, 1] -julia> activation_match!(my_GNFA, x_sample) +julia> activation_match!(my_FuzzyART, x_sample) ``` """ -function activation_match!(art::GNFA, x::RealVector) +function activation_match!(art::FuzzyART, x::RealVector) art.T = zeros(art.n_categories) art.M = zeros(art.n_categories) for i = 1:art.n_categories @@ -418,34 +418,34 @@ function activation_match!(art::GNFA, x::RealVector) art.M[i] = ((W_norm/norm(x, 1))^art.opts.gamma_ref)*art.T[i] end end -end # activation_match!(art::GNFA, x::RealVector) +end # activation_match!(art::FuzzyART, x::RealVector) """ - learn(art::GNFA, x::RealVector, W::RealVector) + learn(art::FuzzyART, x::RealVector, W::RealVector) Return the modified weight of the art module conditioned by sample x. """ -function learn(art::GNFA, x::RealVector, W::RealVector) +function learn(art::FuzzyART, x::RealVector, W::RealVector) # Update W return art.opts.beta .* element_min(x, W) .+ W .* (1 - art.opts.beta) -end # learn(art::GNFA, x::RealVector, W::RealVector) +end # learn(art::FuzzyART, x::RealVector, W::RealVector) """ - learn!(art::GNFA, x::RealVector, index::Integer) + learn!(art::FuzzyART, x::RealVector, index::Integer) In place learning function with instance counting. """ -function learn!(art::GNFA, x::RealVector, index::Integer) +function learn!(art::FuzzyART, x::RealVector, index::Integer) # Update W art.W[:, index] = learn(art, x, art.W[:, index]) art.n_instance[index] += 1 -end # learn!(art::GNFA, x::RealVector, index::Integer) +end # learn!(art::FuzzyART, x::RealVector, index::Integer) """ - stopping_conditions(art::GNFA) + stopping_conditions(art::FuzzyART) -Stopping conditions for a GNFA module. +Stopping conditions for a FuzzyART module. """ -function stopping_conditions(art::GNFA) +function stopping_conditions(art::FuzzyART) return art.epoch >= art.opts.max_epochs -end # stopping_conditions(art::GNFA) +end # stopping_conditions(art::FuzzyART) diff --git a/src/AdaptiveResonance.jl b/src/AdaptiveResonance.jl index bfff34a9..030d6cae 100644 --- a/src/AdaptiveResonance.jl +++ b/src/AdaptiveResonance.jl @@ -46,7 +46,7 @@ export get_n_samples, # Get the number of samples (1-D interpreted as one sample) # ART (unsupervised) - GNFA, opts_GNFA, + FuzzyART, opts_FuzzyART, DDVFA, opts_DDVFA, get_W, DVFA, opts_DVFA, diff --git a/test/test_sets.jl b/test/test_sets.jl index c776887e..cb442746 100644 --- a/test/test_sets.jl +++ b/test/test_sets.jl @@ -55,7 +55,7 @@ end # @testset "AdaptiveResonance.jl" @testset "Train Test" begin # All ART modules arts = [ - GNFA, + FuzzyART, DVFA, DDVFA, SFAM, @@ -75,7 +75,7 @@ end # @testset "AdaptiveResonance.jl" (threshold_normalization=true,), (threshold_normalization=false,), ], - GNFA => [ + FuzzyART => [ (threshold_normalization=true,), (threshold_normalization=false,), ], @@ -122,7 +122,7 @@ end # @testset "Train Test" @info "--------- KWARGS TEST ---------" arts = [ - GNFA, + FuzzyART, DVFA, DDVFA, SFAM, @@ -136,14 +136,14 @@ end # @testset "Train Test" @info "--------- END KWARGS TEST ---------" end # @testset "kwargs" -@testset "GNFA" begin - @info "------- GNFA Testing -------" +@testset "FuzzyART" begin + @info "------- FuzzyART Testing -------" - # GNFA train and test - my_gnfa = GNFA() + # FuzzyART train and test + my_FuzzyART = FuzzyART() # local_complement_code = AdaptiveResonance.complement_code(data.train_x) - # train!(my_gnfa, local_complement_code, preprocessed=true) - train!(my_gnfa, data.train_x) + # train!(my_FuzzyART, local_complement_code, preprocessed=true) + train!(my_FuzzyART, data.train_x) # Similarity methods methods = [ @@ -158,14 +158,14 @@ end # @testset "kwargs" # Both field names field_names = ["T", "M"] - # Compute a local sample for GNFA similarity method testing + # Compute a local sample for FuzzyART similarity method testing # local_sample = local_complement_code[:, 1] # local_complement_code = AdaptiveResonance.complement_code(data.train_x) # local_sample = data.train_x[:, 1] - local_sample = AdaptiveResonance.complement_code(data.train_x[:, 1], config=my_gnfa.config) + local_sample = AdaptiveResonance.complement_code(data.train_x[:, 1], config=my_FuzzyART.config) # Compute the local activation and match - # AdaptiveResonance.activation_match!(my_gnfa, local_sample) + # AdaptiveResonance.activation_match!(my_FuzzyART, local_sample) # # Declare the true activation and match magnitudes # truth = Dict( @@ -199,7 +199,7 @@ end # @testset "kwargs" # for method in methods # results = Dict() # for field_name in field_names - # results[field_name] = AdaptiveResonance.similarity(method, my_gnfa, field_name, local_sample, my_gnfa.opts.gamma_ref) + # results[field_name] = AdaptiveResonance.similarity(method, my_FuzzyART, field_name, local_sample, my_FuzzyART.opts.gamma_ref) # @test isapprox(truth[method][field_name], results[field_name]) # end # @info "Method: $method" results @@ -207,11 +207,11 @@ end # @testset "kwargs" # Check the error handling of the similarity function # Access the wrong similarity metric keyword ("asdf") - @test_throws ErrorException AdaptiveResonance.similarity("asdf", my_gnfa, "T", local_sample, my_gnfa.opts.gamma_ref) + @test_throws ErrorException AdaptiveResonance.similarity("asdf", my_FuzzyART, "T", local_sample, my_FuzzyART.opts.gamma_ref) # Access the wrong output function ("A") - @test_throws ErrorException AdaptiveResonance.similarity("centroid", my_gnfa, "A", local_sample, my_gnfa.opts.gamma_ref) + @test_throws ErrorException AdaptiveResonance.similarity("centroid", my_FuzzyART, "A", local_sample, my_FuzzyART.opts.gamma_ref) -end # @testset "GNFA" +end # @testset "FuzzyART" @testset "ARTSCENE.jl" begin # ARTSCENE training and testing From f5ee58f1278f25529993f40f969ecef87ba8760d Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Fri, 22 Oct 2021 09:47:11 -0500 Subject: [PATCH 28/38] Add modules section to docs and README --- README.md | 2 ++ docs/make.jl | 1 + docs/src/index.md | 2 ++ docs/src/man/modules.md | 35 +++++++++++++++++++++++++++++++++++ src/ART/FuzzyART.jl | 16 +++++++--------- 5 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 docs/src/man/modules.md diff --git a/README.md b/README.md index 114e3eb6..cf472d63 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,8 @@ This project has implementations of the following ART (unsupervised) and ARTMAP - **FAM**: Fuzzy ARTMAP - **DAM**: Default ARTMAP +Because each of these modules is a framework for many variants in the literature, this project also implements these [variants](https://ap6yc.github.io/AdaptiveResonance.jl/dev/man/modules/) by changing their module [options](https://ap6yc.github.io/AdaptiveResonance.jl/dev/man/guide/#art_options). + In addition to these modules, this package contains the following accessory methods: - **ARTSCENE**: the ARTSCENE algorithm's multiple-stage filtering process is implemented as `artscene_filter`. Each filter stage is exported if further granularity is required. diff --git a/docs/make.jl b/docs/make.jl index 565e536f..1ede48ec 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -18,6 +18,7 @@ makedocs( "Tutorial" => [ "Guide" => "man/guide.md", "Examples" => "man/examples.md", + "Modules" => "man/modules.md", "Contributing" => "man/contributing.md", "Index" => "man/full-index.md", ], diff --git a/docs/src/index.md b/docs/src/index.md index 44427ad8..9cbfe3a1 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -21,6 +21,7 @@ This documentation is split into the following sections: Pages = [ "man/guide.md", "man/examples.md", + "man/modules.md", "man/contributing.md", "man/full-index.md", ] @@ -28,5 +29,6 @@ Depth = 1 ``` The [Package Guide](@ref) provides a tutorial to the full usage of the package, while [Examples](@ref) gives sample workflows using a variety of ART modules. +A list of the implemented ART modules is included in [Modules](@ref), where different options are also listed for creating variants of these modules that exist in the literature. Instructions on how to contribute to the package are found in [Contributing](@ref), and docstrings for every element of the package is listed in the [Index](@ref main-index). diff --git a/docs/src/man/modules.md b/docs/src/man/modules.md new file mode 100644 index 00000000..6e058749 --- /dev/null +++ b/docs/src/man/modules.md @@ -0,0 +1,35 @@ +# Modules + +This project implements a number of ART-based models with options that modulate their behavior (see the [options section of the Guide](@ref art_options)) + +This page lists both the [implemented models](@ref Implemented-Models) and some [variants](@ref Variants) + +## Implemented Models + +This project has implementations of the following ART (unsupervised) and ARTMAP (supervised) modules: + +- ART + - `FuzzyART`: Fuzzy ART + - `DVFA`: Dual Vigilance Fuzzy ART + - `DDVFA`: Distributed Dual Vigilance Fuzzy ART +- ARTMAP + - `SFAM`: Simplified Fuzzy ARTMAP + - `FAM`: Fuzzy ARTMAP + - `DAM`: Default ARTMAP + +## Variants + +Each module contains many [options](@ref art_options) that modulate its behavior. +Some of these options are used to modulate the internals of the module, such as switching the match and activation functions, to achieve different modules that are found in the literature. + +These variants are: + +- [`Gamma-Normalized FuzzyART`](@ref Gamma-Normalized-FuzzyART) + +### Gamma-Normalized FuzzyART + +A Gamma-Normalized FuzzyART is a FuzzyART module where the kernel width parameter is set to $$\gamma = \gamma_{ref} = 1.0$$ ($$\gamma_{ref}$$ is 1.0 by default): + +```julia +my_gnfa = FuzzyART(gamma=1) +``` diff --git a/src/ART/FuzzyART.jl b/src/ART/FuzzyART.jl index 67039b66..3fb501c7 100644 --- a/src/ART/FuzzyART.jl +++ b/src/ART/FuzzyART.jl @@ -185,15 +185,18 @@ function initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealF art.n_categories = 1 # Set the threshold - # art.threshold = art.opts.rho * (art.config.dim^art.opts.gamma_ref) - # art.threshold = art.opts.rho set_threshold!(art) # Fast commit the weight art.W = Array{T}(undef, art.config.dim_comp, 1) + # Assign the contents, valid this way for 1-D or 2-D arrays art.W[:, 1] = x + + # Set the label to either the supervised label or 1 if unsupervised label = !iszero(y) ? y : 1 + + # Add the label to the label list push!(art.labels, label) end # initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} @@ -342,13 +345,8 @@ function classify(art::FuzzyART, x::RealVector ; preprocessed::Bool=false, get_b if mismatch_flag # Create new weight vector @debug "Mismatch" - # If we mismatched and want the best matching unit - if get_bmu - y_hat = art.labels[index[1]] - # Otherwise, report the mismatch label -1 - else - y_hat = -1 - end + # Report either the best matching unit or the mismatch label -1 + y_hat = get_bmu ? art.labels[index[1]] : -1 end return y_hat end From 96d0cb4f6bd494b40e312499ca978079e3bd0e86 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Fri, 22 Oct 2021 10:10:14 -0500 Subject: [PATCH 29/38] Rename threshold_normalization to gamma_normalization --- docs/src/man/modules.md | 6 ++++-- src/ART/DDVFA.jl | 16 +++++++++++++--- src/ART/FuzzyART.jl | 13 ++++++++----- test/test_sets.jl | 8 ++++---- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/docs/src/man/modules.md b/docs/src/man/modules.md index 6e058749..a6349d47 100644 --- a/docs/src/man/modules.md +++ b/docs/src/man/modules.md @@ -28,8 +28,10 @@ These variants are: ### Gamma-Normalized FuzzyART -A Gamma-Normalized FuzzyART is a FuzzyART module where the kernel width parameter is set to $$\gamma = \gamma_{ref} = 1.0$$ ($$\gamma_{ref}$$ is 1.0 by default): +A Gamma-Normalized FuzzyART is a FuzzyART module where the gamma normalization option is set on `gamma_normalization=true` and the kernel width parameter is set to $$\gamma >= 1.0$$ ($$\gamma_{ref}$$ is 1.0 by default): ```julia -my_gnfa = FuzzyART(gamma=1) +my_gnfa = FuzzyART(gamma_normalization=true, gamma=5.0) ``` + +The `gamma_normalization` flag must be set high here because it also changes the thresholding value and match function of the module. diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index 589a6a97..b7fc6f3e 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -41,7 +41,7 @@ julia> my_opts = opts_DDVFA() # Maximum number of epochs during training max_epoch::Int = 1 # Normalize the threshold by the feature dimension - threshold_normalization::Bool = false + gamma_normalization::Bool = true end # opts_DDVFA # --------------------------------------------------------------------------- # @@ -136,11 +136,16 @@ DDVFA ``` """ function DDVFA(opts::opts_DDVFA) + # Set the options used for all F2 FuzzyART modules subopts = opts_FuzzyART( rho=opts.rho_ub, - threshold_normalization=opts.threshold_normalization, + gamma=opts.gamma, + gamma_ref=opts.gamma_ref, + gamma_normalization=opts.gamma_normalization, display=false ) + + # Construct the DDVFA module DDVFA(opts, subopts, DataConfig(), @@ -158,8 +163,13 @@ end # DDVFA(opts::opts_DDVFA) # ALGORITHMIC METHODS # --------------------------------------------------------------------------- # +""" + set_threshold!(art::DDVFA) + +Sets the vigilance threshold of the DDVFA module as a function of several flags and hyperparameters. +""" function set_threshold!(art::DDVFA) - if art.opts.threshold_normalization + if art.opts.gamma_normalization art.threshold = art.opts.rho_lb*(art.config.dim^art.opts.gamma_ref) else art.threshold = art.opts.rho_lb diff --git a/src/ART/FuzzyART.jl b/src/ART/FuzzyART.jl index 3fb501c7..d1bd2c98 100644 --- a/src/ART/FuzzyART.jl +++ b/src/ART/FuzzyART.jl @@ -36,7 +36,7 @@ Initialized FuzzyART # Maximum number of epochs during training max_epochs::Int = 1 # Normalize the threshold by the feature dimension - threshold_normalization::Bool = true + gamma_normalization::Bool = false end # opts_FuzzyART # --------------------------------------------------------------------------- # @@ -158,7 +158,7 @@ end # FuzzyART(opts::opts_FuzzyART, sample::RealVector) # --------------------------------------------------------------------------- # function set_threshold!(art::FuzzyART) - if art.opts.threshold_normalization + if art.opts.gamma_normalization art.threshold = art.opts.rho*(art.config.dim^art.opts.gamma_ref) else art.threshold = art.opts.rho @@ -229,6 +229,7 @@ function train!(art::FuzzyART, x::RealVector ; y::Integer = 0, preprocessed::Boo create_category(art, x, y) return y end + # Loop over all categories for j = 1:art.n_categories # Best matching unit @@ -246,6 +247,7 @@ function train!(art::FuzzyART, x::RealVector ; y::Integer = 0, preprocessed::Boo break end end + # If there was no resonant category, make a new one if mismatch_flag # Get the correct label for the new category @@ -409,11 +411,12 @@ function activation_match!(art::FuzzyART, x::RealVector) art.M = zeros(art.n_categories) for i = 1:art.n_categories W_norm = norm(art.W[:, i], 1) - art.T[i] = (norm(element_min(x, art.W[:, i]), 1)/(art.opts.alpha + W_norm))^art.opts.gamma - if art.opts.threshold_normalization + numerator = norm(element_min(x, art.W[:, i]), 1) + art.T[i] = (numerator/(art.opts.alpha + W_norm))^art.opts.gamma + if art.opts.gamma_normalization art.M[i] = (W_norm^art.opts.gamma_ref)*art.T[i] else - art.M[i] = ((W_norm/norm(x, 1))^art.opts.gamma_ref)*art.T[i] + art.M[i] = numerator/norm(x, 1) end end end # activation_match!(art::FuzzyART, x::RealVector) diff --git a/test/test_sets.jl b/test/test_sets.jl index cb442746..61d2a0de 100644 --- a/test/test_sets.jl +++ b/test/test_sets.jl @@ -72,12 +72,12 @@ end # @testset "AdaptiveResonance.jl" # Specific ART options art_specifics = Dict( DDVFA => [ - (threshold_normalization=true,), - (threshold_normalization=false,), + (gamma_normalization=true,), + (gamma_normalization=false,), ], FuzzyART => [ - (threshold_normalization=true,), - (threshold_normalization=false,), + (gamma_normalization=true,), + (gamma_normalization=false,), ], ) From b530a68754ad5401620d334b5879fabc25df6b82 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 25 Oct 2021 10:54:09 -0500 Subject: [PATCH 30/38] Refactor DDVFA train!, clean FuzzyART --- src/ART/DDVFA.jl | 195 ++++++++++++++++++++------------------------ src/ART/FuzzyART.jl | 53 +++++++----- 2 files changed, 120 insertions(+), 128 deletions(-) diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index b7fc6f3e..a4ef30fe 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -21,8 +21,7 @@ julia> my_opts = opts_DDVFA() """ @with_kw mutable struct opts_DDVFA <: ARTOpts @deftype Float # Lower-bound vigilance parameter: [0, 1] - rho_lb = 0.80; @assert rho_lb >= 0.0 && rho_lb <= 1.0 - # rho = rho_lb + rho_lb = 0.7; @assert rho_lb >= 0.0 && rho_lb <= 1.0 # Upper bound vigilance parameter: [0, 1] rho_ub = 0.85; @assert rho_ub >= 0.0 && rho_ub <= 1.0 # Choice parameter: alpha > 0 @@ -169,66 +168,112 @@ end # DDVFA(opts::opts_DDVFA) Sets the vigilance threshold of the DDVFA module as a function of several flags and hyperparameters. """ function set_threshold!(art::DDVFA) + # Gamma match normalization if art.opts.gamma_normalization + # Set the learning threshold as a function of the data dimension art.threshold = art.opts.rho_lb*(art.config.dim^art.opts.gamma_ref) else + # Set the learning threshold as simply the vigilance parameter art.threshold = art.opts.rho_lb end end # set_threshold!(art::DDVFA) """ - train!(art::DDVFA, x::RealArray ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) + train!(art::DDVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=false) +""" +function train!(art::DDVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=false) + # Flag for if training in supervised mode + supervised = !iszero(y) + + # Run the sequential initialization procedure + sample = init_train!(x, art, preprocessed) + + # Initialization + if isempty(art.F2) + # Set the first label as either 1 or the first provided label + y_hat = supervised ? y : 1 + # Create a new category + create_category(art, sample, y_hat) + return y_hat + end + + # # If we have a new supervised category, create a new category + # if supervised && !(y in art.labels) + # create_category(art, sample, y) + # return y + # end + + # Default to mismatch + mismatch_flag = true + + # Compute the activation for all categories + T = zeros(art.n_categories) + for jx = 1:art.n_categories + activation_match!(art.F2[jx], sample) + T[jx] = similarity(art.opts.method, art.F2[jx], "T", sample, art.opts.gamma_ref) + end + + # Compute the match for each category in the order of greatest activation + index = sortperm(T, rev=true) + for jx = 1:art.n_categories + bmu = index[jx] + M = similarity(art.opts.method, art.F2[bmu], "M", sample, art.opts.gamma_ref) + # If we got a match, then learn (update the category) + if M >= art.threshold + # Update the stored match and activation values + art.M = M + art.T = T[bmu] + # If supervised and the label differs, trigger mismatch + if supervised && (art.labels[bmu] != y) + break + end + # Update the weights with the sample + train!(art.F2[bmu], sample, preprocessed=true) + # Save the output label for the sample + y_hat = art.labels[bmu] + # No mismatch + mismatch_flag = false + break + end + end + + # If we triggered a mismatch + if mismatch_flag + # Update the stored match and activation values + bmu = index[1] + art.M = similarity(art.opts.method, art.F2[bmu], "M", sample, art.opts.gamma_ref) + art.T = T[bmu] + # Get the correct label + y_hat = supervised ? y : art.n_categories + 1 + create_category(art, sample, y_hat) + end + + return y_hat +end # train!(art::DDVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=false) + +""" + train!(art::DDVFA, x::RealMatrix ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) Train the DDVFA model on the data. """ -function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) +function train!(art::DDVFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) # Show a message if display is on art.opts.display && @info "Training DDVFA" - # Simple supervised flag + # Flag for if training in supervised mode supervised = !isempty(y) # Data information and setup n_samples = get_n_samples(x) - # Set up the data config if training for the first time - !art.config.setup && data_setup!(art.config, x) - - # If the data is not preprocessed, then complement code it - if !preprocessed - x = complement_code(x, config=art.config) - end - - # art.labels = zeros(n_samples) - if n_samples == 1 - y_hat = zero(Int) - else - y_hat = zeros(Int, n_samples) - end - - # Initialization - if isempty(art.F2) - # Set the first label as either 1 or the first provided label - local_label = supervised ? y[1] : 1 - # Add the local label to the output vector - if n_samples == 1 - y_hat = local_label - else - y_hat[1] = local_label - end - # Create a new category - create_category(art, get_sample(x, 1), local_label) - # Skip the first training entry - skip_first = true - else - skip_first = false - end + # Run the batch initialization procedure + x = init_train!(x, art, preprocessed) - # Set the learning threshold as a function of the data dimension - # art.threshold = art.opts.rho_lb*(art.config.dim^art.opts.gamma_ref) - # art.threshold = art.opts.rho_lb + # Set the learning threshold set_threshold!(art) + # Initialize the output vector + y_hat = zeros(Int, n_samples) # Learn until the stopping conditions art.epoch = 0 while true @@ -238,83 +283,19 @@ function train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), pre for i = iter # Update the iterator if necessary update_iter(art, iter, i) - # Skip the first sample if we just initialized - (i == 1 && skip_first) && continue # Grab the sample slice sample = get_sample(x, i) - - # Default to mismatch - mismatch_flag = true - # If label is new, break to make new category - if supervised && !(y[i] in art.labels) - if n_samples == 1 - y_hat = y[i] - else - y_hat[i] = y[i] - end - create_category(art, sample, y[i]) - continue - end - # Otherwise, check for match - # Compute the activation for all categories - T = zeros(art.n_categories) - for jx = 1:art.n_categories - activation_match!(art.F2[jx], sample) - T[jx] = similarity(art.opts.method, art.F2[jx], "T", sample, art.opts.gamma_ref) - end - # Compute the match for each category in the order of greatest activation - index = sortperm(T, rev=true) - for jx = 1:art.n_categories - bmu = index[jx] - M = similarity(art.opts.method, art.F2[bmu], "M", sample, art.opts.gamma_ref) - # If we got a match, then learn (update the category) - if M >= art.threshold - # Update the stored match and activation values - art.M = M - art.T = T[bmu] - # If supervised and the label differs, trigger mismatch - if supervised && (art.labels[bmu] != y[i]) - break - end - # Update the weights with the sample - train!(art.F2[bmu], sample, preprocessed=true) - # Save the output label for the sample - label = art.labels[bmu] - if n_samples == 1 - y_hat = label - else - y_hat[i] = label - end - mismatch_flag = false - break - end - end - if mismatch_flag - # Update the stored match and activation values - bmu = index[1] - art.M = similarity(art.opts.method, art.F2[bmu], "M", sample, art.opts.gamma_ref) - art.T = T[bmu] - # Get the correct label - label = supervised ? y[i] : art.n_categories + 1 - if n_samples == 1 - y_hat = label - else - y_hat[i] = label - end - create_category(art, sample, label) - end + local_y = supervised ? y[i] : 0 + y_hat[i] = train!(art, sample, y=local_y, preprocessed=true) end - # Make sure to start at first sample from now on - skip_first = false - # Check stopping conditions if stopping_conditions(art) break end end return y_hat -end # train!(art::DDVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) +end # train!(art::DDVFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) """ create_category(art::DDVFA, sample::RealVector, label::Integer) diff --git a/src/ART/FuzzyART.jl b/src/ART/FuzzyART.jl index d1bd2c98..7d65b655 100644 --- a/src/ART/FuzzyART.jl +++ b/src/ART/FuzzyART.jl @@ -201,34 +201,35 @@ function initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealF end # initialize!(art::FuzzyART, x::Vector{T} ; y::Integer=0) where {T<:RealFP} """ - train!(art::FuzzyART, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) + train!(art::FuzzyART, x::RealVector ; y::Integer=0, preprocessed::Bool=false) """ -function train!(art::FuzzyART, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) +function train!(art::FuzzyART, x::RealVector ; y::Integer=0, preprocessed::Bool=false) # Flag for if training in supervised mode supervised = !iszero(y) # Run the sequential initialization procedure - x = init_train!(x, art, preprocessed) + sample = init_train!(x, art, preprocessed) # Initialization if weights are empty; fast commit the first sample if isempty(art.W) - label = supervised ? y : 1 - initialize!(art, x, y=label) - return + y_hat = supervised ? y : 1 + initialize!(art, sample, y=y_hat) + return y_hat + end + + # If we have a new supervised category, create a new category + if supervised && !(y in art.labels) + create_category(art, sample, y) + return y end # Compute activation/match functions - activation_match!(art, x) + activation_match!(art, sample) # Sort activation function values in descending order index = sortperm(art.T, rev=true) # Initialize mismatch as true mismatch_flag = true - # If we have a new supervised category, create a new category - if supervised && !(y in art.labels) - create_category(art, x, y) - return y - end # Loop over all categories for j = 1:art.n_categories @@ -241,7 +242,9 @@ function train!(art::FuzzyART, x::RealVector ; y::Integer = 0, preprocessed::Boo break end # Learn the sample - learn!(art, x, bmu) + learn!(art, sample, bmu) + # Save the output label for the sample + y_hat = art.labels[bmu] # No mismatch mismatch_flag = false break @@ -251,13 +254,13 @@ function train!(art::FuzzyART, x::RealVector ; y::Integer = 0, preprocessed::Boo # If there was no resonant category, make a new one if mismatch_flag # Get the correct label for the new category - label = supervised ? y : art.n_categories + 1 + y_hat = supervised ? y : art.n_categories + 1 # Create a new category - create_category(art, x, label) + create_category(art, sample, y_hat) end - return y -end # train!(art::FuzzyART, x::RealVector ; y::Integer = 0, preprocessed::Bool=false) + return y_hat +end # train!(art::FuzzyART, x::RealVector ; y::Integer=0, preprocessed::Bool=false) """ create_category(art::FuzzyART, x::RealVector, y::Integer) @@ -274,7 +277,7 @@ function create_category(art::FuzzyART, x::RealVector, y::Integer) end # create_category(art::FuzzyART, x::RealVector, y::Integer) """ - train!(art::FuzzyART, x::RealMatrix ; y::IntegerVector = Vector{Int}()) + train!(art::FuzzyART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) Trains a FuzzyART learner with dataset 'x' and optional labels 'y' @@ -289,12 +292,20 @@ julia> train!(my_FuzzyART, x) ``` """ function train!(art::FuzzyART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) + # Show a message if display is on + art.opts.display && @info "Training FuzzyART" + # Flag for if training in supervised mode supervised = !isempty(y) + # Data information and setup + n_samples = get_n_samples(x) + # Run the batch initialization procedure x = init_train!(x, art, preprocessed) + # Initialize the output vector + y_hat = zeros(Int, n_samples) # Learning art.epoch = 0 while true @@ -310,14 +321,14 @@ function train!(art::FuzzyART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), # sample = x[:, i] # Train on the sample local_y = supervised ? y[i] : 0 - train!(art, sample, y=local_y, preprocessed=true) + y_hat[i] = train!(art, sample, y=local_y, preprocessed=true) end # Check for the stopping condition for the whole loop if stopping_conditions(art) break end end -end # train!(art::FuzzyART, x::RealMatrix ; y::IntegerVector = Vector{Int}()) +end # train!(art::FuzzyART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) """ classify(art::FuzzyART, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) @@ -351,7 +362,7 @@ function classify(art::FuzzyART, x::RealVector ; preprocessed::Bool=false, get_b y_hat = get_bmu ? art.labels[index[1]] : -1 end return y_hat -end +end # classify(art::FuzzyART, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) """ classify(art::FuzzyART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) From ef6f79916573986e5a450f00fa405c941079cea1 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 25 Oct 2021 11:54:03 -0500 Subject: [PATCH 31/38] Refactor DDVFA classify --- src/ART/DDVFA.jl | 138 ++++++++++++++++++++++------------------------- 1 file changed, 65 insertions(+), 73 deletions(-) diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index a4ef30fe..80697228 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -197,12 +197,6 @@ function train!(art::DDVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=fal return y_hat end - # # If we have a new supervised category, create a new category - # if supervised && !(y in art.labels) - # create_category(art, sample, y) - # return y - # end - # Default to mismatch mismatch_flag = true @@ -285,7 +279,9 @@ function train!(art::DDVFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), pr update_iter(art, iter, i) # Grab the sample slice sample = get_sample(x, i) + # Select the label to pass to the incremental method local_y = supervised ? y[i] : 0 + # Train upon the sample and label y_hat[i] = train!(art, sample, y=local_y, preprocessed=true) end @@ -386,8 +382,62 @@ function similarity(method::String, F2::FuzzyART, field_name::String, sample::Re return value end # similarity(method::String, F2::FuzzyART, field_name::String, sample::RealVector, gamma_ref::RealFP) +function classify(art::DDVFA, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) + # Preprocess the data + sample = init_classify!(x, art, preprocessed) + + # Calculate all global activations + T = zeros(art.n_categories) + for jx = 1:art.n_categories + activation_match!(art.F2[jx], sample) + T[jx] = similarity(art.opts.method, art.F2[jx], "T", sample, art.opts.gamma_ref) + end + + # Sort by highest activation + index = sortperm(T, rev=true) + + # Default to mismatch + mismatch_flag = true + + # Iterate over the list of activations + for jx = 1:art.n_categories + # Get the best-matching unit + bmu = index[jx] + # Get the match value of this activation + M = similarity(art.opts.method, art.F2[bmu], "M", sample, art.opts.gamma_ref) + # If the match satisfies the threshold criterion, then report that label + if M >= art.threshold + # Update the stored match and activation values + art.M = M + art.T = T[bmu] + # Current winner + y_hat = art.labels[bmu] + mismatch_flag = false + break + end + end + + # If we did not find a resonant category + if mismatch_flag + @debug "Mismatch" + # Update the stored match and activation values of the best matching unit + bmu = index[1] + art.M = similarity(art.opts.method, art.F2[bmu], "M", sample, art.opts.gamma_ref) + art.T = T[bmu] + # If falling back to the highest activated category, return that + if get_bmu + y_hat = art.labels[bmu] + # Otherwise, return a mismatch + else + y_hat = -1 + end + end + + return y_hat +end + """ - classify(art::DDVFA, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) + classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) Predict categories of 'x' using the DDVFA model. @@ -404,27 +454,18 @@ julia> train!(my_DDVFA, x) julia> y_hat = classify(my_DDVFA, y) ``` """ -function classify(art::DDVFA, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) +function classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) # Show a message if display is on art.opts.display && @info "Testing DDVFA" + # Preprocess the data + x = init_classify!(x, art, preprocessed) + # Data information and setup n_samples = get_n_samples(x) - # Verify that the data is setup before classifying - !art.config.setup && @error "Attempting to classify data before setup" - - # If the data is not preprocessed, then complement code it - if !preprocessed - x = complement_code(x, config=art.config) - end - # Initialize the output vector - if n_samples == 1 - y_hat = zero(Int) - else - y_hat = zeros(Int, n_samples) - end + y_hat = zeros(Int, n_samples) # Get the iterator based on the module options and data shape iter = get_iterator(art.opts, x) @@ -435,61 +476,12 @@ function classify(art::DDVFA, x::RealArray ; preprocessed::Bool=false, get_bmu:: # Grab the sample slice sample = get_sample(x, ix) - # Calculate all global activations - T = zeros(art.n_categories) - for jx = 1:art.n_categories - activation_match!(art.F2[jx], sample) - T[jx] = similarity(art.opts.method, art.F2[jx], "T", sample, art.opts.gamma_ref) - end - # Sort by highest activation - index = sortperm(T, rev=true) - - mismatch_flag = true - for jx = 1:art.n_categories - bmu = index[jx] - M = similarity(art.opts.method, art.F2[bmu], "M", sample, art.opts.gamma_ref) - if M >= art.threshold - # Update the stored match and activation values - art.M = M - art.T = T[bmu] - # Current winner - label = art.labels[bmu] - if n_samples == 1 - y_hat = label - else - y_hat[ix] = label - end - mismatch_flag = false - break - end - end - if mismatch_flag - @debug "Mismatch" - # Update the stored match and activation values - bmu = index[1] - art.M = similarity(art.opts.method, art.F2[bmu], "M", sample, art.opts.gamma_ref) - art.T = T[bmu] - # If falling back to the highest activated category, return that - if get_bmu - label = art.labels[index[1]] - if n_samples == 1 - y_hat = label - else - y_hat[ix] = label - end - # Otherwise, return a mismatch - else - if n_samples == 1 - y_hat = -1 - else - y_hat[ix] = -1 - end - end - end + # Get the classification + y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) end return y_hat -end # classify(art::DDVFA, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) +end # classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) # --------------------------------------------------------------------------- # # CONVENIENCE METHODS From 2ad14c3caf0498169259be5d1744da124e3a6d27 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 25 Oct 2021 13:41:54 -0500 Subject: [PATCH 32/38] Refactor DVFA, generalize ART batch methods --- src/ART/ART.jl | 97 ++++++++++++++ src/ART/DDVFA.jl | 130 +++++-------------- src/ART/DVFA.jl | 301 +++++++++++++++++--------------------------- src/ART/FuzzyART.jl | 4 +- 4 files changed, 240 insertions(+), 292 deletions(-) diff --git a/src/ART/ART.jl b/src/ART/ART.jl index aeada79e..d34f7476 100644 --- a/src/ART/ART.jl +++ b/src/ART/ART.jl @@ -5,6 +5,103 @@ Description: Includes all of the unsupervised ART modules definitions. """ +""" + train!(art::DDVFA, x::RealMatrix ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) + +Train the DDVFA model on the data. +""" +function train!(art::ART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) + # Show a message if display is on + art.opts.display && @info "Training $(typeof(art))" + + # Flag for if training in supervised mode + supervised = !isempty(y) + + # Data information and setup + n_samples = get_n_samples(x) + + # Run the batch initialization procedure + x = init_train!(x, art, preprocessed) + + # # Set the learning threshold + # set_threshold!(art) + + # Initialize the output vector + y_hat = zeros(Int, n_samples) + # Learn until the stopping conditions + art.epoch = 0 + while true + # Increment the epoch and get the iterator + art.epoch += 1 + iter = get_iterator(art.opts, x) + for i = iter + # Update the iterator if necessary + update_iter(art, iter, i) + # Grab the sample slice + # sample = get_sample(x, i) + sample = x[:, i] + # Select the label to pass to the incremental method + local_y = supervised ? y[i] : 0 + # Train upon the sample and label + y_hat[i] = train!(art, sample, y=local_y, preprocessed=true) + end + + # Check stopping conditions + if stopping_conditions(art) + break + end + end + return y_hat +end # train!(art::DDVFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) + +""" + classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) + +Predict categories of 'x' using the DDVFA model. + +Returns predicted categories 'y_hat.' + +# Examples +```julia-repl +julia> my_DDVFA = DDVFA() +DDVFA + opts: opts_DDVFA + ... +julia> x, y = load_data() +julia> train!(my_DDVFA, x) +julia> y_hat = classify(my_DDVFA, y) +``` +""" +function classify(art::ART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) + # Show a message if display is on + art.opts.display && @info "Testing $(typeof(art))" + + # Preprocess the data + x = init_classify!(x, art, preprocessed) + + # Data information and setup + n_samples = get_n_samples(x) + + # Initialize the output vector + y_hat = zeros(Int, n_samples) + + # Get the iterator based on the module options and data shape + iter = get_iterator(art.opts, x) + for ix = iter + # Update the iterator if necessary + update_iter(art, iter, ix) + + # Grab the sample slice + sample = get_sample(x, ix) + + # Get the classification + y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) + end + + return y_hat +end # classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) + + include("FuzzyART.jl") # FuzzyART include("DDVFA.jl") # DDVFA include("DVFA.jl") # DVFA diff --git a/src/ART/DDVFA.jl b/src/ART/DDVFA.jl index 80697228..d46d0a55 100644 --- a/src/ART/DDVFA.jl +++ b/src/ART/DDVFA.jl @@ -178,6 +178,12 @@ function set_threshold!(art::DDVFA) end end # set_threshold!(art::DDVFA) +""" + train!(art::DDVFA, x::RealMatrix ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) + +Train the DDVFA model on the data. +""" + """ train!(art::DDVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=false) """ @@ -190,6 +196,8 @@ function train!(art::DDVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=fal # Initialization if isempty(art.F2) + # Set the threshold + set_threshold!(art) # Set the first label as either 1 or the first provided label y_hat = supervised ? y : 1 # Create a new category @@ -245,54 +253,6 @@ function train!(art::DDVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=fal return y_hat end # train!(art::DDVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=false) -""" - train!(art::DDVFA, x::RealMatrix ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) - -Train the DDVFA model on the data. -""" -function train!(art::DDVFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) - # Show a message if display is on - art.opts.display && @info "Training DDVFA" - - # Flag for if training in supervised mode - supervised = !isempty(y) - - # Data information and setup - n_samples = get_n_samples(x) - - # Run the batch initialization procedure - x = init_train!(x, art, preprocessed) - - # Set the learning threshold - set_threshold!(art) - - # Initialize the output vector - y_hat = zeros(Int, n_samples) - # Learn until the stopping conditions - art.epoch = 0 - while true - # Increment the epoch and get the iterator - art.epoch += 1 - iter = get_iterator(art.opts, x) - for i = iter - # Update the iterator if necessary - update_iter(art, iter, i) - # Grab the sample slice - sample = get_sample(x, i) - # Select the label to pass to the incremental method - local_y = supervised ? y[i] : 0 - # Train upon the sample and label - y_hat[i] = train!(art, sample, y=local_y, preprocessed=true) - end - - # Check stopping conditions - if stopping_conditions(art) - break - end - end - return y_hat -end # train!(art::DDVFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) - """ create_category(art::DDVFA, sample::RealVector, label::Integer) @@ -382,6 +342,24 @@ function similarity(method::String, F2::FuzzyART, field_name::String, sample::Re return value end # similarity(method::String, F2::FuzzyART, field_name::String, sample::RealVector, gamma_ref::RealFP) +""" + classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) + +Predict categories of 'x' using the DDVFA model. + +Returns predicted categories 'y_hat.' + +# Examples +```julia-repl +julia> my_DDVFA = DDVFA() +DDVFA + opts: opts_DDVFA + ... +julia> x, y = load_data() +julia> train!(my_DDVFA, x) +julia> y_hat = classify(my_DDVFA, y) +``` +""" function classify(art::DDVFA, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) # Preprocess the data sample = init_classify!(x, art, preprocessed) @@ -424,65 +402,13 @@ function classify(art::DDVFA, x::RealVector ; preprocessed::Bool=false, get_bmu: bmu = index[1] art.M = similarity(art.opts.method, art.F2[bmu], "M", sample, art.opts.gamma_ref) art.T = T[bmu] - # If falling back to the highest activated category, return that - if get_bmu - y_hat = art.labels[bmu] - # Otherwise, return a mismatch - else - y_hat = -1 - end + # Report either the best matching unit or the mismatch label -1 + y_hat = get_bmu ? art.labels[bmu] : -1 end return y_hat end -""" - classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) - -Predict categories of 'x' using the DDVFA model. - -Returns predicted categories 'y_hat.' - -# Examples -```julia-repl -julia> my_DDVFA = DDVFA() -DDVFA - opts: opts_DDVFA - ... -julia> x, y = load_data() -julia> train!(my_DDVFA, x) -julia> y_hat = classify(my_DDVFA, y) -``` -""" -function classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) - # Show a message if display is on - art.opts.display && @info "Testing DDVFA" - - # Preprocess the data - x = init_classify!(x, art, preprocessed) - - # Data information and setup - n_samples = get_n_samples(x) - - # Initialize the output vector - y_hat = zeros(Int, n_samples) - - # Get the iterator based on the module options and data shape - iter = get_iterator(art.opts, x) - for ix = iter - # Update the iterator if necessary - update_iter(art, iter, ix) - - # Grab the sample slice - sample = get_sample(x, ix) - - # Get the classification - y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) - end - - return y_hat -end # classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) - # --------------------------------------------------------------------------- # # CONVENIENCE METHODS # --------------------------------------------------------------------------- # diff --git a/src/ART/DVFA.jl b/src/ART/DVFA.jl index a2e1259b..84076671 100644 --- a/src/ART/DVFA.jl +++ b/src/ART/DVFA.jl @@ -60,11 +60,12 @@ mutable struct DVFA <: ART config::DataConfig # Working variables + threshold_ub::Float + threshold_lb::Float labels::IntegerVector W::RealMatrix T::RealVector M::RealVector - W_old::RealMatrix map::IntegerVector n_categories::Int n_clusters::Int @@ -125,11 +126,12 @@ function DVFA(opts::opts_DVFA) DVFA( opts, # opts DataConfig(), # config + 0.0, # threshold_ub + 0.0, # threshold_lb Array{Int}(undef, 0), # labels Array{Float}(undef, 0, 0), # W Array{Float}(undef, 0), # M Array{Float}(undef, 0), # T - Array{Float}(undef, 0, 0), # W_old Array{Int}(undef, 0), # map 0, # n_categories 0, # n_clusters @@ -137,8 +139,14 @@ function DVFA(opts::opts_DVFA) ) end # DDVFA(opts::opts_DDVFA) +function set_threshold!(art::DVFA) + # DVFA thresholds + art.threshold_ub = art.opts.rho_ub * art.config.dim + art.threshold_lb = art.opts.rho_lb * art.config.dim +end + """ - train!(art::DVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) + train!(art::DVFA, x::RealMatrix ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) Train the DVFA module on x with optional custom category labels y. @@ -147,144 +155,99 @@ Train the DVFA module on x with optional custom category labels y. - `x::RealArray`: the data to train on, interpreted as a single sample if x is a vector. - `y::IntegerVector=[]`: optional custom labels to assign to the categories. If empty, ordinary incremental labels are prescribed. """ -function train!(art::DVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) - # Show a message if display is on - art.opts.display && @info "Training DVFA" - - # Simple supervised flag - supervised = !isempty(y) - - # Data information and setup - n_samples = get_n_samples(x) - - # Set up the data config if training for the first time - !art.config.setup && data_setup!(art.config, x) +function train!(art::DVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=false) - # If the data is not preprocessed, then complement code it - if !preprocessed - x = complement_code(x, config=art.config) - end + # Flag for if training in supervised mode + supervised = !iszero(y) - if n_samples == 1 - y_hat = zero(Int) - else - y_hat = zeros(Int, n_samples) - end + # Run the sequential initialization procedure + sample = init_train!(x, art, preprocessed) # Initialization if isempty(art.W) + # Set the threshold + set_threshold!(art) # Set the first label as either 1 or the first provided label - local_label = supervised ? y[1] : 1 - # Add the local label to the output vector - if n_samples == 1 - y_hat = local_label - else - y_hat[1] = local_label - end + y_hat = supervised ? y : 1 # Create a new category and cluster art.W = ones(art.config.dim_comp, 1) art.n_categories = 1 art.n_clusters = 1 - push!(art.labels, local_label) - # Skip the first training entry - skip_first = true - else - skip_first = false + push!(art.labels, y_hat) + return y_hat end - art.W_old = art.W - - # Learn until the stopping conditions - art.epoch = 0 - while true - # Increment the epoch and get the iterator - art.epoch += 1 - iter = get_iterator(art.opts, x) - for i = iter - # Update the iterator if necessary - update_iter(art, iter, i) - # Skip the first sample if we just initialized - (i == 1 && skip_first) && continue - - # Grab the sample slice - sample = get_sample(x, i) - - # If label is new, break to make new category - if supervised && !(y[i] in art.labels) - if n_samples == 1 - y_hat = y[i] - else - y_hat[i] = y[i] - end - # Update sample labels - push!(art.labels, y[i]) - # Fast commit the sample - art.W = hcat(art.W, sample) - art.n_categories += 1 - art.n_clusters += 1 - continue - end - # Compute the activation and match for all categories - activation_match!(art, sample) - # Sort activation function values in descending order - index = sortperm(art.T, rev=true) - # Default to mismatch - mismatch_flag = true - # Loop over all categories - for j = 1:art.n_categories - # Best matching unit - bmu = index[j] - # Vigilance test upper bound - if art.M[bmu] >= art.opts.rho_ub * art.config.dim - # Learn the sample - learn!(art, sample, bmu) - # Update sample label for output` - label = supervised ? y[i] : art.labels[bmu] - # push!(art.labels, label) - # No mismatch - mismatch_flag = false - break - # Vigilance test lower bound - elseif art.M[bmu] >= art.opts.rho_lb * art.config.dim - # # Update sample labels - # label = supervised ? y[i] : art.map[bmu] - label = supervised ? y[i] : art.labels[bmu] - push!(art.labels, label) - # Fast commit the sample - art.W = hcat(art.W, sample) - art.n_categories += 1 - # No mismatch - mismatch_flag = false - break - end - end - # If there was no resonant category, make a new one - if mismatch_flag - # Create a new category-to-cluster label - # push!(art.map, last(art.map) + 1) - label = supervised ? y[i] : art.n_clusters + 1 - push!(art.labels, label) - # Fast commit the sample - art.W = hcat(art.W, sample) - # Increment the number of categories and clusters - art.n_categories += 1 - art.n_clusters += 1 - end + # If label is new, break to make new category + if supervised && !(y in art.labels) + y_hat = y + # Update sample labels + push!(art.labels, y) + # Fast commit the sample + art.W = hcat(art.W, sample) + art.n_categories += 1 + art.n_clusters += 1 + return y_hat + end - if n_samples == 1 - y_hat = label - else - y_hat[i] = label + # Compute the activation and match for all categories + activation_match!(art, sample) + # Sort activation function values in descending order + index = sortperm(art.T, rev=true) + + # Default to mismatch + mismatch_flag = true + # Loop over all categories + for j = 1:art.n_categories + # Best matching unit + bmu = index[j] + # Vigilance test upper bound + # if art.M[bmu] >= art.opts.rho_ub * art.config.dim + if art.M[bmu] >= art.threshold_ub + # If supervised and the label differs, trigger mismatch + if supervised && (art.labels[bmu] != y) + break end - end - # Check for the stopping condition for the whole loop - if stopping_conditions(art) + # Learn the sample + learn!(art, sample, bmu) + # Update sample label for output + # y_hat = supervised ? y : art.labels[bmu] + y_hat = art.labels[bmu] + # No mismatch + mismatch_flag = false + break + # Vigilance test lower bound + # elseif art.M[bmu] >= art.opts.rho_lb * art.config.dim + elseif art.M[bmu] >= art.threshold_lb + # If supervised and the label differs, trigger mismatch + if supervised && (art.labels[bmu] != y) + break + end + # Update sample labels + y_hat = supervised ? y : art.labels[bmu] + push!(art.labels, y_hat) + # Fast commit the sample + art.W = hcat(art.W, sample) + art.n_categories += 1 + # No mismatch + mismatch_flag = false break end end + # If there was no resonant category, make a new one + if mismatch_flag + # Create a new category-to-cluster label + y_hat = supervised ? y : art.n_clusters + 1 + push!(art.labels, y_hat) + # Fast commit the sample + art.W = hcat(art.W, sample) + # Increment the number of categories and clusters + art.n_categories += 1 + art.n_clusters += 1 + end + return y_hat -end # train!(art::DVFA, x::RealArray ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) +end """ classify(art::DVFA, x::RealArray) @@ -304,76 +267,38 @@ julia> train!(my_DVFA, x) julia> y_hat = classify(my_DVFA, y) ``` """ -function classify(art::DVFA, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) - # Show a message if display is on - art.opts.display && @info "Testing DVFA" - - # Data information and setup - n_samples = get_n_samples(x) - - # Verify that the data is setup before classifying - !art.config.setup && @error "Attempting to classify data before setup" - - # If the data is not preprocessed, then complement code it - if !preprocessed - x = complement_code(x, config=art.config) - end - - # Initialize the output vector - if n_samples == 1 - y_hat = zero(Int) - else - y_hat = zeros(Int, n_samples) +function classify(art::DVFA, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) + + # Preprocess the data + sample = init_classify!(x, art, preprocessed) + + # Compute activation and match functions + activation_match!(art, sample) + # Sort activation function values in descending order + index = sortperm(art.T, rev=true) + mismatch_flag = true + for jx in 1:art.n_categories + bmu = index[jx] + # Vigilance check - pass + # if art.M[bmu] >= art.opts.rho_ub * art.config.dim + if art.M[bmu] >= art.threshold_ub + # Current winner + y_hat = art.labels[bmu] + mismatch_flag = false + break + end end - iter = get_iterator(art.opts, x) - for ix in iter - # Update the iterator if necessary - update_iter(art, iter, ix) - # Compute activation and match functions - activation_match!(art, x[:, ix]) - # Sort activation function values in descending order - index = sortperm(art.T, rev=true) - mismatch_flag = true - for jx in 1:art.n_categories - bmu = index[jx] - # Vigilance check - pass - if art.M[bmu] >= art.opts.rho_ub * art.config.dim - # Current winner - label = art.labels[bmu] - if n_samples == 1 - y_hat = label - else - y_hat[ix] = label - end - mismatch_flag = false - break - end - end - if mismatch_flag - # Create new weight vector - @debug "Mismatch" - # If falling back to the highest activated category, return that - if get_bmu - label = art.labels[index[1]] - if n_samples == 1 - y_hat = label - else - y_hat[ix] = label - end - # Otherwise, return a mismatch - else - if n_samples == 1 - y_hat = -1 - else - y_hat[ix] = -1 - end - end - end + # If we did not find a resonant category + if mismatch_flag + # Create new weight vector + @debug "Mismatch" + # Report either the best matching unit or the mismatch label -1 + y_hat = get_bmu ? art.labels[index[1]] : -1 end return y_hat -end # classify(art::DVFA, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) +end """ activation_match!(art::DVFA, x::RealVector) @@ -416,5 +341,5 @@ end # learn!(art::DVFA, x::RealVector, index::Integer) Stopping conditions for a DVFA module. """ function stopping_conditions(art::DVFA) - return isequal(art.W, art.W_old) || art.epoch >= art.opts.max_epochs + return art.epoch >= art.opts.max_epochs end # stopping_conditions(art::DVFA) diff --git a/src/ART/FuzzyART.jl b/src/ART/FuzzyART.jl index 7d65b655..d1a2a19a 100644 --- a/src/ART/FuzzyART.jl +++ b/src/ART/FuzzyART.jl @@ -317,8 +317,8 @@ function train!(art::FuzzyART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), # Update the iterator if necessary update_iter(art, iter, i) # Grab the sample slice - sample = get_sample(x, i) - # sample = x[:, i] + # sample = get_sample(x, i) + sample = x[:, i] # Train on the sample local_y = supervised ? y[i] : 0 y_hat[i] = train!(art, sample, y=local_y, preprocessed=true) From 8a32699723094f30bec37a8040a3b86ae4f63646 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 25 Oct 2021 14:50:32 -0500 Subject: [PATCH 33/38] Clean docstrings, move common ART methods --- src/ART/ART.jl | 98 +--------------------------------------- src/ART/DVFA.jl | 22 ++++----- src/ART/common.jl | 111 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 108 deletions(-) create mode 100644 src/ART/common.jl diff --git a/src/ART/ART.jl b/src/ART/ART.jl index d34f7476..6d0b37f6 100644 --- a/src/ART/ART.jl +++ b/src/ART/ART.jl @@ -5,103 +5,7 @@ Description: Includes all of the unsupervised ART modules definitions. """ -""" - train!(art::DDVFA, x::RealMatrix ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) - -Train the DDVFA model on the data. -""" -function train!(art::ART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) - # Show a message if display is on - art.opts.display && @info "Training $(typeof(art))" - - # Flag for if training in supervised mode - supervised = !isempty(y) - - # Data information and setup - n_samples = get_n_samples(x) - - # Run the batch initialization procedure - x = init_train!(x, art, preprocessed) - - # # Set the learning threshold - # set_threshold!(art) - - # Initialize the output vector - y_hat = zeros(Int, n_samples) - # Learn until the stopping conditions - art.epoch = 0 - while true - # Increment the epoch and get the iterator - art.epoch += 1 - iter = get_iterator(art.opts, x) - for i = iter - # Update the iterator if necessary - update_iter(art, iter, i) - # Grab the sample slice - # sample = get_sample(x, i) - sample = x[:, i] - # Select the label to pass to the incremental method - local_y = supervised ? y[i] : 0 - # Train upon the sample and label - y_hat[i] = train!(art, sample, y=local_y, preprocessed=true) - end - - # Check stopping conditions - if stopping_conditions(art) - break - end - end - return y_hat -end # train!(art::DDVFA, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) - -""" - classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) - -Predict categories of 'x' using the DDVFA model. - -Returns predicted categories 'y_hat.' - -# Examples -```julia-repl -julia> my_DDVFA = DDVFA() -DDVFA - opts: opts_DDVFA - ... -julia> x, y = load_data() -julia> train!(my_DDVFA, x) -julia> y_hat = classify(my_DDVFA, y) -``` -""" -function classify(art::ART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) - # Show a message if display is on - art.opts.display && @info "Testing $(typeof(art))" - - # Preprocess the data - x = init_classify!(x, art, preprocessed) - - # Data information and setup - n_samples = get_n_samples(x) - - # Initialize the output vector - y_hat = zeros(Int, n_samples) - - # Get the iterator based on the module options and data shape - iter = get_iterator(art.opts, x) - for ix = iter - # Update the iterator if necessary - update_iter(art, iter, ix) - - # Grab the sample slice - sample = get_sample(x, ix) - - # Get the classification - y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) - end - - return y_hat -end # classify(art::DDVFA, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) - - +include("common.jl") # train!, classify include("FuzzyART.jl") # FuzzyART include("DDVFA.jl") # DDVFA include("DVFA.jl") # DVFA diff --git a/src/ART/DVFA.jl b/src/ART/DVFA.jl index 84076671..7faad8db 100644 --- a/src/ART/DVFA.jl +++ b/src/ART/DVFA.jl @@ -139,14 +139,19 @@ function DVFA(opts::opts_DVFA) ) end # DDVFA(opts::opts_DDVFA) +""" + set_threshold!(art::DVFA) + +Configure the threshold values of the DVFA module. +""" function set_threshold!(art::DVFA) # DVFA thresholds art.threshold_ub = art.opts.rho_ub * art.config.dim art.threshold_lb = art.opts.rho_lb * art.config.dim -end +end # set_threshold!(art::DVFA) """ - train!(art::DVFA, x::RealMatrix ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) + train!(art::DVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=false) Train the DVFA module on x with optional custom category labels y. @@ -156,7 +161,6 @@ Train the DVFA module on x with optional custom category labels y. - `y::IntegerVector=[]`: optional custom labels to assign to the categories. If empty, ordinary incremental labels are prescribed. """ function train!(art::DVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=false) - # Flag for if training in supervised mode supervised = !iszero(y) @@ -201,7 +205,6 @@ function train!(art::DVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=fals # Best matching unit bmu = index[j] # Vigilance test upper bound - # if art.M[bmu] >= art.opts.rho_ub * art.config.dim if art.M[bmu] >= art.threshold_ub # If supervised and the label differs, trigger mismatch if supervised && (art.labels[bmu] != y) @@ -216,7 +219,6 @@ function train!(art::DVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=fals mismatch_flag = false break # Vigilance test lower bound - # elseif art.M[bmu] >= art.opts.rho_lb * art.config.dim elseif art.M[bmu] >= art.threshold_lb # If supervised and the label differs, trigger mismatch if supervised && (art.labels[bmu] != y) @@ -247,10 +249,10 @@ function train!(art::DVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=fals end return y_hat -end +end # train!(art::DVFA, x::RealVector ; y::Integer=0, preprocessed::Bool=false) """ - classify(art::DVFA, x::RealArray) + classify(art::DVFA, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) Predict categories of 'x' using the DVFA model. @@ -268,7 +270,6 @@ julia> y_hat = classify(my_DVFA, y) ``` """ function classify(art::DVFA, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) - # Preprocess the data sample = init_classify!(x, art, preprocessed) @@ -280,7 +281,6 @@ function classify(art::DVFA, x::RealVector ; preprocessed::Bool=false, get_bmu:: for jx in 1:art.n_categories bmu = index[jx] # Vigilance check - pass - # if art.M[bmu] >= art.opts.rho_ub * art.config.dim if art.M[bmu] >= art.threshold_ub # Current winner y_hat = art.labels[bmu] @@ -298,7 +298,7 @@ function classify(art::DVFA, x::RealVector ; preprocessed::Bool=false, get_bmu:: end return y_hat -end +end # classify(art::DVFA, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) """ activation_match!(art::DVFA, x::RealVector) @@ -312,7 +312,7 @@ function activation_match!(art::DVFA, x::RealVector) numerator = norm(element_min(x, art.W[:, jx]), 1) art.T[jx] = numerator/(art.opts.alpha + norm(art.W[:, jx], 1)) art.M[jx] = numerator - end # activation_match!(art::DVFA, x::RealVector) + end end # activation_match!(art::DVFA, x::RealVector) """ diff --git a/src/ART/common.jl b/src/ART/common.jl new file mode 100644 index 00000000..57b1b01c --- /dev/null +++ b/src/ART/common.jl @@ -0,0 +1,111 @@ +""" + common.jl + +Description: + Includes all of the unsupervised ART modules common code. +""" + +""" + train!(art::ART, x::RealMatrix ; y::IntegerVector=Vector{Int}(), preprocessed::Bool=false) + +Train the ART model on a batch of data 'x' with optional supervisory labels 'y.' + +# Arguments +- `art::ART`: the unsupervised ART model to train. +- `x::RealMatrix`: the 2-D dataset containing columns of samples with rows of features. +- `y::IntegerVector=Vector{Int}()`: optional, labels for simple supervisory training. +- `preprocessed::Bool=false`: flag, if the data has already been complement coded or not. +""" +function train!(art::ART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) + # Show a message if display is on + art.opts.display && @info "Training $(typeof(art))" + + # Flag for if training in supervised mode + supervised = !isempty(y) + + # Data information and setup + n_samples = get_n_samples(x) + + # Run the batch initialization procedure + x = init_train!(x, art, preprocessed) + + # Initialize the output vector + y_hat = zeros(Int, n_samples) + # Learn until the stopping conditions + art.epoch = 0 + while true + # Increment the epoch and get the iterator + art.epoch += 1 + iter = get_iterator(art.opts, x) + for i = iter + # Update the iterator if necessary + update_iter(art, iter, i) + # Grab the sample slice + # sample = get_sample(x, i) + sample = x[:, i] + # Select the label to pass to the incremental method + local_y = supervised ? y[i] : 0 + # Train upon the sample and label + y_hat[i] = train!(art, sample, y=local_y, preprocessed=true) + end + + # Check stopping conditions + if stopping_conditions(art) + break + end + end + return y_hat +end # train!(art::ART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) + +""" + classify(art::ART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) + +Predict categories of 'x' using the ART model. + +Returns predicted categories 'y_hat.' + +# Arguments +- `art::ART`: unsupervised ART module to use for batch inference. +- `x::RealMatrix`: the 2-D dataset containing columns of samples with rows of features. +- `preprocessed::Bool=false`: flag, if the data has already been complement coded or not. +- `get_bmu::Bool=false`, flag, if the model should return the best-matching-unit label in the case of total mismatch. + +# Examples +```julia-repl +julia> my_DDVFA = DDVFA() +DDVFA + opts: opts_DDVFA + ... +julia> x, y = load_data() +julia> train!(my_DDVFA, x) +julia> y_hat = classify(my_DDVFA, y) +``` +""" +function classify(art::ART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) + # Show a message if display is on + art.opts.display && @info "Testing $(typeof(art))" + + # Preprocess the data + x = init_classify!(x, art, preprocessed) + + # Data information and setup + n_samples = get_n_samples(x) + + # Initialize the output vector + y_hat = zeros(Int, n_samples) + + # Get the iterator based on the module options and data shape + iter = get_iterator(art.opts, x) + for ix = iter + # Update the iterator if necessary + update_iter(art, iter, ix) + + # Grab the sample slice + sample = get_sample(x, ix) + + # Get the classification + y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) + end + + return y_hat +end # classify(art::ART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) From 1b4dcc456d48be242f002bee3666febb9a356955 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Wed, 3 Nov 2021 08:31:07 -0500 Subject: [PATCH 34/38] Refactor SFAM, create common ARTMAP methods --- src/ART/common.jl | 53 ----------- src/ARTMAP/ARTMAP.jl | 1 + src/ARTMAP/SFAM.jl | 212 +++++++++++++++++-------------------------- src/ARTMAP/common.jl | 107 ++++++++++++++++++++++ src/common.jl | 69 ++++++++++++-- 5 files changed, 252 insertions(+), 190 deletions(-) create mode 100644 src/ARTMAP/common.jl diff --git a/src/ART/common.jl b/src/ART/common.jl index 57b1b01c..bf14c976 100644 --- a/src/ART/common.jl +++ b/src/ART/common.jl @@ -56,56 +56,3 @@ function train!(art::ART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), prep end return y_hat end # train!(art::ART, x::RealMatrix ; y::IntegerVector = Vector{Int}(), preprocessed::Bool=false) - -""" - classify(art::ART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) - -Predict categories of 'x' using the ART model. - -Returns predicted categories 'y_hat.' - -# Arguments -- `art::ART`: unsupervised ART module to use for batch inference. -- `x::RealMatrix`: the 2-D dataset containing columns of samples with rows of features. -- `preprocessed::Bool=false`: flag, if the data has already been complement coded or not. -- `get_bmu::Bool=false`, flag, if the model should return the best-matching-unit label in the case of total mismatch. - -# Examples -```julia-repl -julia> my_DDVFA = DDVFA() -DDVFA - opts: opts_DDVFA - ... -julia> x, y = load_data() -julia> train!(my_DDVFA, x) -julia> y_hat = classify(my_DDVFA, y) -``` -""" -function classify(art::ART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) - # Show a message if display is on - art.opts.display && @info "Testing $(typeof(art))" - - # Preprocess the data - x = init_classify!(x, art, preprocessed) - - # Data information and setup - n_samples = get_n_samples(x) - - # Initialize the output vector - y_hat = zeros(Int, n_samples) - - # Get the iterator based on the module options and data shape - iter = get_iterator(art.opts, x) - for ix = iter - # Update the iterator if necessary - update_iter(art, iter, ix) - - # Grab the sample slice - sample = get_sample(x, ix) - - # Get the classification - y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) - end - - return y_hat -end # classify(art::ART, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) diff --git a/src/ARTMAP/ARTMAP.jl b/src/ARTMAP/ARTMAP.jl index 739b34cc..7dbfa275 100644 --- a/src/ARTMAP/ARTMAP.jl +++ b/src/ARTMAP/ARTMAP.jl @@ -5,6 +5,7 @@ Description: Includes all of the ARTMAP (i.e., explicitly supervised) ART modules definitions. """ +include("common.jl") # train! include("DAM.jl") # Default ARTMAP include("FAM.jl") # Fuzzy ARTMAP include("SFAM.jl") # Simplified Fuzzy ARTMAP diff --git a/src/ARTMAP/SFAM.jl b/src/ARTMAP/SFAM.jl index b94ca0fb..86438f26 100644 --- a/src/ARTMAP/SFAM.jl +++ b/src/ARTMAP/SFAM.jl @@ -41,9 +41,7 @@ mutable struct SFAM <: ARTMAP opts::opts_SFAM config::DataConfig W::RealMatrix - W_old::RealMatrix labels::IntegerVector - y::IntegerVector n_categories::Int epoch::Int end # SFAM <: ARTMAP @@ -103,9 +101,7 @@ function SFAM(opts::opts_SFAM) opts, # opts_SFAM DataConfig(), # config Array{Float}(undef, 0, 0), # W - Array{Float}(undef, 0, 0), # W_old Array{Int}(undef, 0), # labels - Array{Int}(undef, 0), # y 0, # n_categories 0 # epoch ) @@ -126,92 +122,67 @@ SFAM julia> train!(art, x, y) ``` """ -function train!(art::SFAM, x::RealArray, y::RealArray ; preprocessed::Bool=false) - # Show a message if display is on - art.opts.display && @info "Training SFAM" - - # Data information and setup - n_samples = get_n_samples(x) - - # Set up the data config if it is not already - !art.config.setup && data_setup!(art.config, x) +function train!(art::SFAM, x::RealVector, y::Integer ; preprocessed::Bool=false) + + # Run the sequential initialization procedure + sample = init_train!(x, art, preprocessed) + + # Initialization + if !(y in art.labels) + # Initialize W and labels + if isempty(art.W) + art.W = Array{Float64}(undef, art.config.dim_comp, 1) + art.W[:, 1] = sample + else + art.W = [art.W sample] + end + push!(art.labels, y) + art.n_categories += 1 + else + # Baseline vigilance parameter + rho_baseline = art.opts.rho - # If the data is not preprocessed, then complement code it - if !preprocessed - x = complement_code(x, config=art.config) - end + # Compute activation function + T = zeros(art.n_categories) + for jx in 1:art.n_categories + T[jx] = activation(art, sample, art.W[:, jx]) + end - # Initialize the internal categories - art.y = zeros(Int, n_samples) - - # Initialize the training loop, continue to convergence - art.epoch = 0 - while true - art.epoch += 1 - iter = get_iterator(art.opts, x) - for ix in iter - # Update the iterator if necessary - update_iter(art, iter, ix) - if !(y[ix] in art.labels) - # Initialize W and labels - if isempty(art.W) - art.W = Array{Float64}(undef, art.config.dim_comp, 1) - art.W_old = Array{Float64}(undef, art.config.dim_comp, 1) - art.W[:, ix] = x[:, ix] + # Sort activation function values in descending order + index = sortperm(T, rev=true) + mismatch_flag = true + for jx in 1:art.n_categories + # Compute match function + M = art_match(art, sample, art.W[:, index[jx]]) + # Current winner + if M >= rho_baseline + if y == art.labels[index[jx]] + # Learn + @debug "Learning" + art.W[:, index[jx]] = learn(art, sample, art.W[:, index[jx]]) + mismatch_flag = false + break else - art.W = [art.W x[:, ix]] - end - push!(art.labels, y[ix]) - art.n_categories += 1 - art.y[ix] = y[ix] - else - # Baseline vigilance parameter - rho_baseline = art.opts.rho - - # Compute activation function - T = zeros(art.n_categories) - for jx in 1:art.n_categories - T[jx] = activation(art, x[:, ix], art.W[:, jx]) - end - - # Sort activation function values in descending order - index = sortperm(T, rev=true) - mismatch_flag = true - for jx in 1:art.n_categories - # Compute match function - M = art_match(art, x[:, ix], art.W[:, index[jx]]) - # Current winner - if M >= rho_baseline - if y[ix] == art.labels[index[jx]] - # Learn - @debug "Learning" - art.W[:, index[jx]] = learn(art, x[:, ix], art.W[:, index[jx]]) - art.y[ix] = art.labels[index[jx]] - mismatch_flag = false - break - else - # Match tracking - @debug "Match tracking" - rho_baseline = M + art.opts.epsilon - end - end - end - if mismatch_flag - # Create new weight vector - @debug "Mismatch" - art.W = hcat(art.W, x[:, ix]) - push!(art.labels, y[ix]) - art.n_categories += 1 - art.y[ix] = y[ix] + # Match tracking + @debug "Match tracking" + rho_baseline = M + art.opts.epsilon end end end - if stopping_conditions(art) - break + + # If we triggered a mismatch + if mismatch_flag + # Create new weight vector + @debug "Mismatch" + art.W = hcat(art.W, sample) + push!(art.labels, y) + art.n_categories += 1 end - art.W_old = deepcopy(art.W) end -end # train!(art::SFAM, x::RealArray, y::RealArray ; preprocessed::Bool=false) + + # ARTMAP guarantees correct training classification, so just return the label + return y +end """ classify(art::SFAM, x::RealArray ; preprocessed::Bool=false) @@ -230,60 +201,39 @@ julia> train!(art, x, y) julia> classify(art, x_test) ``` """ -function classify(art::SFAM, x::RealArray ; preprocessed::Bool=false, get_bmu::Bool=false) - # Show a message if display is on - art.opts.display && @info "Testing SFAM" - - # Data information and setup - n_samples = get_n_samples(x) - - # Throw an soft error if classifying before setup - !art.config.setup && @error "Attempting to classify data before setup" - - # If the data is not preprocessed, then complement code it - if !preprocessed - x = complement_code(x, config=art.config) +function classify(art::SFAM, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) + # Run the sequential initialization procedure + sample = init_classify!(x, art, preprocessed) + + # Compute activation function + T = zeros(art.n_categories) + for jx in 1:art.n_categories + T[jx] = activation(art, sample, art.W[:, jx]) end - # Initialize the output vector and iterate across all data - y_hat = zeros(Int, n_samples) - iter = ProgressBar(1:n_samples) - for ix in iter - set_description(iter, string(@sprintf("ID: %i, Cat: %i", ix, art.n_categories))) - - # Compute activation function - T = zeros(art.n_categories) - for jx in 1:art.n_categories - T[jx] = activation(art, x[:, ix], art.W[:, jx]) + # Sort activation function values in descending order + index = sortperm(T, rev=true) + mismatch_flag = true + for jx in 1:art.n_categories + # Compute match function + M = art_match(art, sample, art.W[:, index[jx]]) + # Current winner + if M >= art.opts.rho + y_hat = art.labels[index[jx]] + mismatch_flag = false + break end + end - # Sort activation function values in descending order - index = sortperm(T, rev=true) - mismatch_flag = true - for jx in 1:art.n_categories - # Compute match function - M = art_match(art, x[:, ix], art.W[:, index[jx]]) - # Current winner - if M >= art.opts.rho - y_hat[ix] = art.labels[index[jx]] - mismatch_flag = false - break - end - end - if mismatch_flag - # Label as -1 if mismatched - @debug "Mismatch" - # If we mismatched and want the best matching unit - if get_bmu - y_hat = art.labels[index[1]] - # Otherwise, report the mismatch label -1 - else - y_hat[ix] = -1 - end - end + # If we did not find a resonant category + if mismatch_flag + @debug "Mismatch" + # Report either the best matching unit or the mismatch label -1 + y_hat = get_bmu ? art.labels[index[1]] : -1 end + return y_hat -end # classify(art::SFAM, x::RealArray ; preprocessed::Bool=false) +end """ stopping_conditions(art::SFAM) @@ -292,7 +242,7 @@ Stopping conditions for Simple Fuzzy ARTMAP, checked at the end of every epoch. """ function stopping_conditions(art::SFAM) # Compute the stopping condition, return a bool - return art.W == art.W_old || art.epoch >= art.opts.max_epochs + return art.epoch >= art.opts.max_epochs end # stopping_conditions(art::SFAM) """ diff --git a/src/ARTMAP/common.jl b/src/ARTMAP/common.jl new file mode 100644 index 00000000..c2577444 --- /dev/null +++ b/src/ARTMAP/common.jl @@ -0,0 +1,107 @@ +""" + common.jl + +Description: + Includes all of the unsupervised ARTMAP modules common code. +""" + +""" + train!(art::ARTMAP, x::RealMatrix, y::IntegerVector, preprocessed::Bool=false) + +Train the ARTMAP model on a batch of data 'x' with supervisory labels 'y.' + +# Arguments +- `art::ARTMAP`: the supervised ARTMAP model to train. +- `x::RealMatrix`: the 2-D dataset containing columns of samples with rows of features. +- `y::IntegerVector`: labels for supervisory training. +- `preprocessed::Bool=false`: flag, if the data has already been complement coded or not. +""" +function train!(art::ARTMAP, x::RealMatrix, y::IntegerVector, preprocessed::Bool=false) + # Show a message if display is on + art.opts.display && @info "Training $(typeof(art))" + + # Data information and setup + n_samples = length(y) + + # Run the batch initialization procedure + x = init_train!(x, art, preprocessed) + + # Initialize the output vector + y_hat = zeros(Int, n_samples) + # Learn until the stopping conditions + art.epoch = 0 + while true + # Increment the epoch and get the iterator + art.epoch += 1 + iter = get_iterator(art.opts, x) + for i = iter + # Update the iterator if necessary + update_iter(art, iter, i) + # Grab the sample slice + # sample = get_sample(x, i) + sample = x[:, i] + label = y[i] + # Train upon the sample and label + y_hat[i] = train!(art, sample, label, preprocessed=true) + end + + # Check stopping conditions + if stopping_conditions(art) + break + end + end + return y_hat +end # train!(art::ARTMAP, x::RealMatrix, y::IntegerVector, preprocessed::Bool=false) + +# """ +# classify(art::ARTMAP, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) + +# Predict categories of 'x' using the ARTMAP model. + +# Returns predicted categories 'y_hat.' + +# # Arguments +# - `art::ARTMAP`: supervised ARTMAP module to use for batch inference. +# - `x::RealMatrix`: the 2-D dataset containing columns of samples with rows of features. +# - `preprocessed::Bool=false`: flag, if the data has already been complement coded or not. +# - `get_bmu::Bool=false`, flag, if the model should return the best-matching-unit label in the case of total mismatch. + +# # Examples +# ```julia-repl +# julia> my_DDVFA = DDVFA() +# DDVFA +# opts: opts_DDVFA +# ... +# julia> x, y = load_data() +# julia> train!(my_DDVFA, x) +# julia> y_hat = classify(my_DDVFA, y) +# ``` +# """ +# function classify(art::ARTMAP, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) +# # Show a message if display is on +# art.opts.display && @info "Testing $(typeof(art))" + +# # Preprocess the data +# x = init_classify!(x, art, preprocessed) + +# # Data information and setup +# n_samples = get_n_samples(x) + +# # Initialize the output vector +# y_hat = zeros(Int, n_samples) + +# # Get the iterator based on the module options and data shape +# iter = get_iterator(art.opts, x) +# for ix = iter +# # Update the iterator if necessary +# update_iter(art, iter, ix) + +# # Grab the sample slice +# sample = get_sample(x, ix) + +# # Get the classification +# y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) +# end + +# return y_hat +# end # classify(art::ARTMAP, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) diff --git a/src/common.jl b/src/common.jl index 7a20bb49..c09f8016 100644 --- a/src/common.jl +++ b/src/common.jl @@ -362,7 +362,10 @@ function get_sample(x::RealArray, i::Int) return sample end # get_sample(x::RealArray, i::Int) -function init_train!(x::RealVector, art::ART, preprocessed::Bool) +""" + init_train!(x::RealVector, art::ARTModule, preprocessed::Bool) +""" +function init_train!(x::RealVector, art::ARTModule, preprocessed::Bool) # If the data is not preprocessed if !preprocessed # If the data config is not setup, not enough information to preprocess @@ -383,12 +386,12 @@ function init_train!(x::RealVector, art::ART, preprocessed::Bool) art.config = DataConfig(0, 1, dim) end return x -end +end # init_train!(x::RealVector, art::ARTModule, preprocessed::Bool) """ - init_train!(x::RealMatrix, art::ART, preprocessed::Bool) + init_train!(x::RealMatrix, art::ARTModule, preprocessed::Bool) """ -function init_train!(x::RealMatrix, art::ART, preprocessed::Bool) +function init_train!(x::RealMatrix, art::ARTModule, preprocessed::Bool) # If the data is not preprocessed, then complement code it if !preprocessed # Set up the data config if training for the first time @@ -399,9 +402,9 @@ function init_train!(x::RealMatrix, art::ART, preprocessed::Bool) end # init_train!(x::RealMatrix, art::ART, preprocessed::Bool) """ - init_classify!(x::RealArray, art::ART, preprocessed::Bool) + init_classify!(x::RealArray, art::ARTModule, preprocessed::Bool) """ -function init_classify!(x::RealArray, art::ART, preprocessed::Bool) +function init_classify!(x::RealArray, art::ARTModule, preprocessed::Bool) # If the data is not preprocessed if !preprocessed # If the data config is not setup, not enough information to preprocess @@ -413,3 +416,57 @@ function init_classify!(x::RealArray, art::ART, preprocessed::Bool) end return x end # init_classify!(x::RealArray, art::ART, preprocessed::Bool) + + +""" + classify(art::ARTModule, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) + +Predict categories of 'x' using the ART model. + +Returns predicted categories 'y_hat.' + +# Arguments +- `art::ARTModule`: ART or ARTMAP module to use for batch inference. +- `x::RealMatrix`: the 2-D dataset containing columns of samples with rows of features. +- `preprocessed::Bool=false`: flag, if the data has already been complement coded or not. +- `get_bmu::Bool=false`, flag, if the model should return the best-matching-unit label in the case of total mismatch. + +# Examples +```julia-repl +julia> my_DDVFA = DDVFA() +DDVFA + opts: opts_DDVFA + ... +julia> x, y = load_data() +julia> train!(my_DDVFA, x) +julia> y_hat = classify(my_DDVFA, y) +``` +""" +function classify(art::ARTModule, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) + # Show a message if display is on + art.opts.display && @info "Testing $(typeof(art))" + + # Preprocess the data + x = init_classify!(x, art, preprocessed) + + # Data information and setup + n_samples = get_n_samples(x) + + # Initialize the output vector + y_hat = zeros(Int, n_samples) + + # Get the iterator based on the module options and data shape + iter = get_iterator(art.opts, x) + for ix = iter + # Update the iterator if necessary + update_iter(art, iter, ix) + + # Grab the sample slice + sample = get_sample(x, ix) + + # Get the classification + y_hat[ix] = classify(art, sample, preprocessed=true, get_bmu=get_bmu) + end + + return y_hat +end # classify(art::ARTModule, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) From d61609417b215787206a7d9a3df15edf509703e8 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Wed, 3 Nov 2021 09:15:50 -0500 Subject: [PATCH 35/38] Refactor DAM like SFAM --- src/ARTMAP/DAM.jl | 243 ++++++++++++++++++--------------------------- src/ARTMAP/FAM.jl | 4 - src/ARTMAP/SFAM.jl | 2 - 3 files changed, 96 insertions(+), 153 deletions(-) diff --git a/src/ARTMAP/DAM.jl b/src/ARTMAP/DAM.jl index 43ba572d..506974ff 100644 --- a/src/ARTMAP/DAM.jl +++ b/src/ARTMAP/DAM.jl @@ -17,13 +17,15 @@ julia> my_opts = opts_DAM() """ @with_kw mutable struct opts_DAM <: ARTOpts @deftype Float # Vigilance parameter: [0, 1] - rho = 0.6; @assert rho >= 0.0 && rho <= 1.0 + rho = 0.75; @assert rho >= 0.0 && rho <= 1.0 # Choice parameter: alpha > 0 alpha = 1e-7; @assert alpha > 0.0 # Match tracking parameter - epsilon = -1e-3; @assert epsilon > -1.0 && epsilon < 1.0 + epsilon = 1e-3; @assert epsilon > 0.0 && epsilon < 1.0 # Learning parameter: (0, 1] beta = 1.0; @assert beta > 0.0 && beta <= 1.0 + # Uncommitted node flag + uncommitted::Bool = true # Display flag display::Bool = true # Maximum number of epochs during training @@ -39,9 +41,7 @@ mutable struct DAM <: ARTMAP opts::opts_DAM config::DataConfig W::RealMatrix - W_old::RealMatrix labels::IntegerVector - y::IntegerVector n_categories::Int epoch::Int end # DAM <: ARTMAP @@ -49,7 +49,7 @@ end # DAM <: ARTMAP """ DAM() -Implements a Default ARTMAP learner. +Implements a Simple Fuzzy ARTMAP learner. # Examples ```julia-repl @@ -85,7 +85,7 @@ end # DAM(;kwargs...) """ DAM(opts) -Implements a Default ARTMAP learner with specified options +Implements a Default ARTMAP learner with specified options. # Examples ```julia-repl @@ -97,19 +97,18 @@ DAM ``` """ function DAM(opts::opts_DAM) - DAM(opts, # opts_DAM - DataConfig(), # config - Array{Float}(undef, 0,0), # W - Array{Float}(undef, 0,0), # W_old - Array{Int}(undef, 0), # labels - Array{Int}(undef, 0), # y - 0, # n_categories - 0 # epoch + DAM( + opts, # opts_DAM + DataConfig(), # config + Array{Float}(undef, 0, 0), # W + Array{Int}(undef, 0), # labels + 0, # n_categories + 0 # epoch ) end # DAM(opts::opts_DAM) """ - train!(art::DAM, x::RealMatrix, y::IntegerVector ; preprocessed::Bool=false) + train!(art::DAM, x::RealArray, y::RealArray ; preprocessed::Bool=false) Trains a Default ARTMAP learner in a supervised manner. @@ -123,97 +122,69 @@ DAM julia> train!(art, x, y) ``` """ -function train!(art::DAM, x::RealMatrix, y::IntegerVector ; preprocessed::Bool=false) - # Show a message if display is on - art.opts.display && @info "Training DAM" - - # Data information and setup - n_samples = get_n_samples(x) - - # Set up the data config if it is not already - !art.config.setup && data_setup!(art.config, x) +function train!(art::DAM, x::RealVector, y::Integer ; preprocessed::Bool=false) + # Run the sequential initialization procedure + sample = init_train!(x, art, preprocessed) + + # Initialization + if !(y in art.labels) + # Initialize W and labels + if isempty(art.W) + art.W = Array{Float64}(undef, art.config.dim_comp, 1) + art.W[:, 1] = sample + else + art.W = [art.W sample] + end + push!(art.labels, y) + art.n_categories += 1 + else + # Baseline vigilance parameter + rho_baseline = art.opts.rho - # If the data isn't preprocessed, then complement code it with the config - if !preprocessed - x = complement_code(x, config=art.config) - end + # Compute activation function + T = zeros(art.n_categories) + for jx in 1:art.n_categories + T[jx] = activation(art, sample, art.W[:, jx]) + end - # Initialize the internal categories - art.y = zeros(Int, n_samples) - - # Initialize the training loop, continue to convergence - art.epoch = 0 - while true - # Increment the epoch and get the iterator - art.epoch += 1 - iter = get_iterator(art.opts, x) - for ix in iter - # Update the iterator if necessary - update_iter(art, iter, ix) - if !(y[ix] in art.labels) - # Initialize W and labels - if isempty(art.W) - art.W = Array{Float}(undef, art.config.dim_comp, 1) - art.W_old = Array{Float}(undef, art.config.dim_comp, 1) - art.W[:, ix] = x[:, ix] + # Sort activation function values in descending order + index = sortperm(T, rev=true) + mismatch_flag = true + for jx in 1:art.n_categories + # Compute match function + M = art_match(art, sample, art.W[:, index[jx]]) + # Current winner + if M >= rho_baseline + if y == art.labels[index[jx]] + # Learn + @debug "Learning" + art.W[:, index[jx]] = learn(art, sample, art.W[:, index[jx]]) + mismatch_flag = false + break else - art.W = [art.W x[:, ix]] - end - push!(art.labels, y[ix]) - art.n_categories += 1 - art.y[ix] = y[ix] - else - # Baseline vigilance parameter - rho_baseline = art.opts.rho - - # Compute activation function - T = zeros(art.n_categories) - for jx in 1:art.n_categories - T[jx] = activation(art, x[:, ix], art.W[:, jx]) - end - - # Sort activation function values in descending order - index = sortperm(T, rev=true) - mismatch_flag = true - for jx in 1:art.n_categories - # Compute match function - M = art_match(art, x[:, ix], art.W[:, index[jx]]) - @debug M - # Current winner - if M >= rho_baseline - if y[ix] == art.labels[index[jx]] - # Learn - @debug "Learning" - art.W[:, index[jx]] = learn(art, x[:, ix], art.W[:, index[jx]]) - art.y[ix] = art.labels[index[jx]] - mismatch_flag = false - break - else - # Match tracking - @debug "Match tracking" - rho_baseline = M + art.opts.epsilon - end - end - end - if mismatch_flag - # Create new weight vector - @debug "Mismatch" - art.W = hcat(art.W, x[:, ix]) - push!(art.labels, y[ix]) - art.n_categories += 1 - art.y[ix] = y[ix] + # Match tracking + @debug "Match tracking" + rho_baseline = M + art.opts.epsilon end end end - if stopping_conditions(art) - break + + # If we triggered a mismatch + if mismatch_flag + # Create new weight vector + @debug "Mismatch" + art.W = hcat(art.W, sample) + push!(art.labels, y) + art.n_categories += 1 end - art.W_old = deepcopy(art.W) end -end # train!(art::DAM, x::RealMatrix, y::IntegerVector ; preprocessed::Bool=false) + + # ARTMAP guarantees correct training classification, so just return the label + return y +end """ - classify(art::DAM, x::RealMatrix ; preprocessed::Bool=false) + classify(art::DAM, x::RealArray ; preprocessed::Bool=false) Categorize data 'x' using a trained Default ARTMAP module 'art'. @@ -229,61 +200,39 @@ julia> train!(art, x, y) julia> classify(art, x_test) ``` """ -function classify(art::DAM, x::RealMatrix ; preprocessed::Bool=false, get_bmu::Bool=false) - # Show a message if display is on - art.opts.display && @info "Testing DAM" - - # Data information and setup - n_samples = get_n_samples(x) - - # Throw an soft error if classifying before setup - !art.config.setup && @error "Attempting to classify data before setup" - - # If the data is not preprocessed, then complement code it - if !preprocessed - x = complement_code(x, config=art.config) +function classify(art::DAM, x::RealVector ; preprocessed::Bool=false, get_bmu::Bool=false) + # Run the sequential initialization procedure + sample = init_classify!(x, art, preprocessed) + + # Compute activation function + T = zeros(art.n_categories) + for jx in 1:art.n_categories + T[jx] = activation(art, sample, art.W[:, jx]) end - # Initialize the output vector and iterate across all data - y_hat = zeros(Int, n_samples) - iter = get_iterator(art.opts, x) - for ix in iter - # Update the iterator if necessary - update_iter(art, iter, ix) - - # Compute activation function - T = zeros(art.n_categories) - for jx in 1:art.n_categories - T[jx] = activation(art, x[:, ix], art.W[:, jx]) + # Sort activation function values in descending order + index = sortperm(T, rev=true) + mismatch_flag = true + for jx in 1:art.n_categories + # Compute match function + M = art_match(art, sample, art.W[:, index[jx]]) + # Current winner + if M >= art.opts.rho + y_hat = art.labels[index[jx]] + mismatch_flag = false + break end + end - # Sort activation function values in descending order - index = sortperm(T, rev=true) - mismatch_flag = true - for jx in 1:art.n_categories - # Compute match function - M = art_match(art, x[:, ix], art.W[:, index[jx]]) - # Current winner - if M >= art.opts.rho - y_hat[ix] = art.labels[index[jx]] - mismatch_flag = false - break - end - end - if mismatch_flag - # Create new weight vector - @debug "Mismatch" - # If we mismatched and want the best matching unit - if get_bmu - y_hat = art.labels[index[1]] - # Otherwise, report the mismatch label -1 - else - y_hat[ix] = -1 - end - end + # If we did not find a resonant category + if mismatch_flag + @debug "Mismatch" + # Report either the best matching unit or the mismatch label -1 + y_hat = get_bmu ? art.labels[index[1]] : -1 end + return y_hat -end # classify(art::DAM, x::RealMatrix ; preprocessed::Bool=false) +end """ stopping_conditions(art::DAM) @@ -292,7 +241,7 @@ Stopping conditions for Default ARTMAP, checked at the end of every epoch. """ function stopping_conditions(art::DAM) # Compute the stopping condition, return a bool - return art.W == art.W_old || art.epoch >= art.opts.max_epochs + return art.epoch >= art.opts.max_epochs end # stopping_conditions(art::DAM) """ @@ -309,7 +258,7 @@ end # activation(art::DAM, x::RealVector, W::RealVector) """ learn(art::DAM, x::RealVector, W::RealVector) -Returns a single updated weight for the Simple Fuzzy ARTMAP module for weight +Returns a single updated weight for the Default ARTMAP module for weight vector W and sample x. """ function learn(art::DAM, x::RealVector, W::RealVector) diff --git a/src/ARTMAP/FAM.jl b/src/ARTMAP/FAM.jl index 8efb148c..7f451608 100644 --- a/src/ARTMAP/FAM.jl +++ b/src/ARTMAP/FAM.jl @@ -41,9 +41,7 @@ mutable struct FAM <: ARTMAP opts::opts_FAM config::DataConfig W::RealMatrix - W_old::RealMatrix labels::IntegerVector - y::IntegerVector n_categories::Int epoch::Int end # FAM <: ARTMAP @@ -102,9 +100,7 @@ function FAM(opts::opts_FAM) FAM(opts, # opts_FAM DataConfig(), # config Array{Float}(undef, 0,0), # W - Array{Float}(undef, 0,0), # W_old Array{Int}(undef, 0), # labels - Array{Int}(undef, 0), # y 0, # n_categories 0 # epoch ) diff --git a/src/ARTMAP/SFAM.jl b/src/ARTMAP/SFAM.jl index 86438f26..5390216d 100644 --- a/src/ARTMAP/SFAM.jl +++ b/src/ARTMAP/SFAM.jl @@ -123,7 +123,6 @@ julia> train!(art, x, y) ``` """ function train!(art::SFAM, x::RealVector, y::Integer ; preprocessed::Bool=false) - # Run the sequential initialization procedure sample = init_train!(x, art, preprocessed) @@ -276,5 +275,4 @@ sample x. function art_match(art::SFAM, x::RealVector, W::RealVector) # Compute M and return return norm(element_min(x, W), 1) / art.config.dim - # return norm(element_min(x, W), 1) / art.config.dim_comp end # art_match(art::SFAM, x::RealVector, W::RealVector) From a44f62475ee2a4abd6506a1be4d318415360d90e Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 29 Nov 2021 12:51:11 -0600 Subject: [PATCH 36/38] Add target audience, theory, and dynamics to paper --- docs/src/getting-started/whatisart.md | 4 +- paper/paper.bib | 135 +++++++++++++++++++++++++- paper/paper.md | 42 +++++++- 3 files changed, 177 insertions(+), 4 deletions(-) diff --git a/docs/src/getting-started/whatisart.md b/docs/src/getting-started/whatisart.md index 076211c3..5909cc41 100644 --- a/docs/src/getting-started/whatisart.md +++ b/docs/src/getting-started/whatisart.md @@ -19,7 +19,7 @@ Stephen Grossberg's has recently released a book summarizing the work of him, hi ### ART Dynamics -These are the basics of almost every ART model: +Nearly every ART model shares a basic set of dynamics: 1. ART models typically have two layers/fields denoted F1 and F2. 2. The F1 field is the feature representation field. @@ -29,7 +29,7 @@ These are the basics of almost every ART model: This is most easily understood as a weight vector representing a prototype for a class or centroid of a cluster. 4. An activation function is used to find the order of categories "most activated" for a given sample in F1. 5. In order of highest activation, a match function is used to compute the agreement between the sample and the categories. -6. If the match function evaluates to above a threshold value known as the vigilance parameter ($$\rho$$), the weights may be updated according to a learning rule. +6. If the match function for a category evaluates to a value above a threshold known as the vigilance parameter ($$\rho$$), the weights of that category may be updated according to a learning rule. 7. If there is complete mismatch across all categories, then a new categories is created according to some instantiation rule. ### ART Considerations diff --git a/paper/paper.bib b/paper/paper.bib index 79ef987a..75e92826 100644 --- a/paper/paper.bib +++ b/paper/paper.bib @@ -101,4 +101,137 @@ @article{DaSilva2019 issn = {0893-6080}, arxivId = {1905.11437}, keywords = {Adaptive resonance theory, Classification, Clustering, Regression, Reinforcement learning, Survey, adaptive resonance theory, classification, clustering, corresponding author, explainable, neural networks, regression, reinforcement learning, survey, unsupervised learning} -} \ No newline at end of file +} + +@inproceedings{Carpenter1991, +abstract = {Summary form only given. The authors introduced a neural network architecture, called ARTMAP, that autonomously learns to classify arbitrarily many, arbitrarily ordered vectors into recognition categories based on predictive success. This supervised learning system is built up from a pair of adaptive resonance theory modules (ARTa and ARTb) that are capable of self-organizing stable recognition categories in response to arbitrary sequences of input patterns. Tested on a benchmark machine learning database in both online and offline simulations, the ARTMAP system learns orders of magnitude more quickly, efficiently, and accurately than alternative algorithms, and achieves 100% accuracy after training on less than half of the input patterns in the database.}, +annote = {In this paper, Dr. Gail Carpenter introduces the ARTMAP algorithm, which introduces a supervisory learning mechanism to ordinarily unsupervised ART modules. This is done by introducing two ART modules (ARTa and ARTb) and a resonance-based connection between them, mapping categories one modules to labels in another.}, +author = {Carpenter, Gail A. and Grossberg, Stephen and Reynolds, John H.}, +booktitle = {IEEE Conference on Neural Networks for Ocean Engineering}, +doi = {10.1016/0893-6080(91)90012-T}, +file = {:C\:/Users/Sasha/AppData/Local/Mendeley Ltd./Mendeley Desktop/Downloaded/Carpenter, Grossberg, Reynolds - 1991 - ARTMAP Supervised real-time learning and classification of nonstationary data by a self-organizi.pdf:pdf}, +isbn = {0780302052}, +issn = {08936080}, +mendeley-groups = {ART}, +pages = {341--342}, +title = {{ARTMAP: Supervised real-time learning and classification of nonstationary data by a self-organizing neural network}}, +year = {1991} +} + +@article{Carpenter1992, + abstract = {— A new neural network architecture is introduced for incremental supervised learning of recognition categories and multidimensional maps in response to arbitrary sequences of analog or binary input vectors, which may represent fuzzy or crisp sets of features. The architecture, called fuzzy ARTMAP, achieves a synthesis of fuzzy logic and adaptive resonance theory (ART) neural networks by exploiting a close formal similarity between the computations of fuzzy subsethood and ART category choice, resonance, and learning. Fuzzy ARTMAP also realizes a new minimax learning rule that conjointly minimizes predictive error and maximizes code compression, or generalization. This is achieved by a match tracking process that increases the ART vigilance parameter by the minimum amount needed to correct a predictive error. As a result, the system automatically learns a minimal number of recognition categories, or “hidden units,” to meet accuracy criteria. Category proliferation is prevented by normalizing input vectors at a preprocessing stage. A normalization procedure called complement coding leads to a symmetric theory in which the and operator (V) and the OR operator (A) of fuzzy logic play complementary roles. Complement coding uses on cells and off cells to represent the input pattern, and preserves individual feature amplitudes while normalizing the total on cell/off cell vector. Learning is stable because all adaptive weights can only decrease in time. Decreasing weights correspond to increasing sizes of category “boxes.” Smaller vigilance values lead to larger category boxes. Improved prediction is achieved by training the system several times using different orderings of the input set. This voting strategy can also be used to assign confidence estimates to competing predictions given small, noisy, or incomplete training sets. Four classes of simulations illustrate fuzzy ARTMAP performance in relation to benchmark backpropagation and genetic algorithm systems. These simulations include (i) finding points inside versus outside a circle; (ii) learning to tell two spirals apart, (iii) incremental approximation of a piecewise-continuous function; and (iv) a letter recognition database. The fuzzy ARTMAP system is also compared with Salzberg's NGE system and with Simpson's FMMC system. {\textcopyright} 1992 IEEE}, + annote = {In this paper, Drs. Gail Carpenter and Stephen Grossberg demonstrate how .the use of fuzzy set theory operations in the ARTMAP algorithm augment its learning capabilities without sacrificing algorithmic complexity.}, + author = {Carpenter, Gail A. and Grossberg, Stephen and Markuzon, Natalya and Reynolds, John H. and Rosen, David B.}, + doi = {10.1109/72.159059}, + file = {:C\:/Users/Sasha/AppData/Local/Mendeley Ltd./Mendeley Desktop/Downloaded/Carpenter et al. - 1992 - Fuzzy ARTMAP A Neural Network Architecture for Incremental Supervised Learning of Analog Multidimensional Maps.pdf:pdf}, + issn = {19410093}, + journal = {IEEE Transactions on Neural Networks}, + mendeley-groups = {ART}, + number = {5}, + pages = {698--713}, + title = {{Fuzzy ARTMAP: A Neural Network Architecture for Incremental Supervised Learning of Analog Multidimensional Maps}}, + volume = {3}, + year = {1992} +} + +@inproceedings{ARTHestenes1987, + abstract = {In spite of the}, + annote = {From Duplicate 1 (How the Brain Works: The Next Great Scientific Revolution - Hestenes, David) + + David Hestenes, a physicist by training, provides an overview of the adaptive resonance theory of Dr. Stephen Grossberg and its significance to the neuroscience as a whole. He provides evidence for his claim that ART exemplifies a revolution in brain science by giving a historical perspective on the field and illustrating the key points of ART, showing their most significant ramifications. Hestenes provides this paper to make Grossberg's work more accessible, necessary because of the lateral thinking required to appreciate the magnitude of Grossberg's work. + + From Duplicate 2 (How the Brain Works: The Next Great Scientific Revolution - Hestenes, David) + + From Duplicate 3 (How the Brain Works: The Next Great Scientific Revolution - Hestenes, David) + + David Hestenes, a physicist by training, provides an overview of the adaptive resonance theory of Dr. Stephen Grossberg and its significance to the neuroscience as a whole. He provides evidence for his claim that ART exemplifies a revolution in brain science by giving a historical perspective on the field and illustrating the key points of ART, showing their most significant ramifications. Hestenes provides this paper to make Grossberg's work more accessible, necessary because of the lateral thinking required to appreciate the magnitude of Grossberg's work.}, + author = {Hestenes, David}, + booktitle = {Maximum-Entropy and Bayesian Spectral Analysis and Estimation Problems}, + doi = {10.1007/978-94-009-3961-5_11}, + file = {:C\:/Users/Sasha/AppData/Local/Mendeley Ltd./Mendeley Desktop/Downloaded/Unknown - Unknown - HestenesDavidHowTheBrainWorks001.pdf.pdf:pdf;:C\:/Users/Sasha/AppData/Local/Mendeley Ltd./Mendeley Desktop/Downloaded/Hestenes - 1987 - How the Brain Works The Next Great Scientific Revolution.pdf:pdf}, + mendeley-groups = {ART}, + pages = {173--205}, + publisher = {Springer Netherlands}, + title = {{How the Brain Works: The Next Great Scientific Revolution}}, + year = {1987} +} + +@article{Grossberg2017, +abstract = {The hard problem of consciousness is the problem of explaining how we experience qualia or phenomenal experiences, such as seeing, hearing, and feeling, and knowing what they are. To solve this problem, a theory of consciousness needs to link brain to mind by modeling how emergent properties of several brain mechanisms interacting together embody detailed properties of individual conscious psychological experiences. This article summarizes evidence that Adaptive Resonance Theory, or ART, accomplishes this goal. ART is a cognitive and neural theory of how advanced brains autonomously learn to attend, recognize, and predict objects and events in a changing world. ART has predicted that “all conscious states are resonant states” as part of its specification of mechanistic links between processes of consciousness, learning, expectation, attention, resonance, and synchrony. It hereby provides functional and mechanistic explanations of data ranging from individual spikes and their synchronization to the dynamics of conscious perceptual, cognitive, and cognitive–emotional experiences. ART has reached sufficient maturity to begin classifying the brain resonances that support conscious experiences of seeing, hearing, feeling, and knowing. Psychological and neurobiological data in both normal individuals and clinical patients are clarified by this classification. This analysis also explains why not all resonances become conscious, and why not all brain dynamics are resonant. The global organization of the brain into computationally complementary cortical processing streams (complementary computing), and the organization of the cerebral cortex into characteristic layers of cells (laminar computing), figure prominently in these explanations of conscious and unconscious processes. Alternative models of consciousness are also discussed.}, +author = {Grossberg, Stephen}, +doi = {10.1016/j.neunet.2016.11.003}, +file = {:G\:/My Drive/Research/Literature/ART/Papers/BUpapersSteveGrossbergGailCarpenterEtc/Consciousness2017SteveGrossbergNN.pdf:pdf}, +issn = {18792782}, +journal = {Neural Networks}, +keywords = {Adaptive resonance,Attention,Audition,Consciousness,Emotion,Vision}, +pages = {38--95}, +pmid = {28088645}, +publisher = {Elsevier Ltd}, +title = {{Towards solving the hard problem of consciousness: The varieties of brain resonances and the conscious experiences that they support}}, +url = {http://dx.doi.org/10.1016/j.neunet.2016.11.003}, +volume = {87}, +year = {2017} +} + +@article{Cohen1983a, +abstract = {The process whereby input patterns are transformed and stored by competitive cellular networks is considered. This process arises in such diverse subjects as the short-term storage of visual or language patterns by neural networks, pattern formation due to the firing of morphogenetic gradients in developmental biology, control of choice behavior during macromolecular evolution, and the design of stable context-sensitive parallel processors. In addition to systems capable of approaching one of perhaps infinitely many equilibrium points in response to arbitrary input patterns and initial data, one finds in these subjects a wide variety of other behaviors, notably traveling waves, standing waves, resonance, and chaos. The question of what general dynamical constraints cause global approach to equilibria rather than large amplitude waves is therefore of considerable interest. In another terminology, this is the question of whether global pattern formation occurs. A related question is whether the global pattern formation property persists when system parameters slowly change in an unpredictable fashion due to self-organization (development, learning). This is the question of absolute stability of global pattern formation. It is shown that many model systems which exhibit the absolute stability property can be written in the form i = 1, 2, {\textperiodcentered}{\textperiodcentered}{\textperiodcentered}, n, where the matrix C = ||cik|| is symmetric and the system as a whole is competitive. Under these circumstances, this system defines a global Liapunov function. The absolute stability of systems with infinite but totally disconnected sets of equilibrium points can then be studied using the LaSalle invariance principle, the theory of several complex variables, and Sard's theorem. The symmetry of matrix C is important since competitive systems of the form (1) exist wherein C is arbitrarily close to a symmetric matrix but almost all trajectories persistently oscillate, as in the voting paradox. Slowing down the competitive feedback without violating symmetry, as in the systems also enables sustained oscillations to occur. Our results thus show that the use of fast symmetric competitive feedback is a robust design constraint for guaranteeing absolute stability of global pattern formation. {\textcopyright} 1983 IEEE}, +author = {Cohen, Michael A. and Grossberg, Stephen}, +doi = {10.1109/TSMC.1983.6313075}, +file = {:C\:/Users/Sasha/AppData/Local/Mendeley Ltd./Mendeley Desktop/Downloaded/Cohen, Grossberg - 1983 - Absolute Stability of Global Pattern Formation and Parallel Memory Storage by Competitive Neural Networks.pdf:pdf}, +issn = {21682909}, +journal = {IEEE Transactions on Systems, Man and Cybernetics}, +number = {5}, +pages = {815--826}, +title = {{Absolute Stability of Global Pattern Formation and Parallel Memory Storage by Competitive Neural Networks}}, +volume = {SMC-13}, +year = {1983} +} + +@article{Grossberg2009, +abstract = {How do humans rapidly recognize a scene? How can neural models capture this biological competence to achieve state-of-the-art scene classification? The ARTSCENE neural system classifies natural scene photographs by using multiple spatial scales to efficiently accumulate evidence for gist and texture. ARTSCENE embodies a coarse-to-fine Texture Size Ranking Principle whereby spatial attention processes multiple scales of scenic information, from global gist to local textures, to learn and recognize scenic properties. The model can incrementally learn and rapidly predict scene identity by gist information alone, and then accumulate learned evidence from scenic textures to refine this hypothesis. The model shows how texture-fitting allocations of spatial attention, called attentional shrouds, can facilitate scene recognition, particularly when they include a border of adjacent textures. Using grid gist plus three shroud textures on a benchmark photograph dataset, ARTSCENE discriminates 4 landscape scene categories (coast, forest, mountain, and countryside) with up to 91.85% correct on a test set, outperforms alternative models in the literature which use biologically implausible computations, and outperforms component systems that use either gist or texture information alone. {\textcopyright} ARVO.}, +annote = {This paper outlines several different toolchains that together together comprise the ARTSCENE algorithm. The paper at its core is an investigation into the construction of a system that recognizes whole-scene global descriptors from local textures. It does this through a series of image filters that mimik the processing occuring in the mammalian LGN and learning/recognition processing via the Default ARTMAP 2 algorithm.}, +author = {Grossberg, Stephen and Huang, Tsung Ren}, +doi = {10.1167/9.4.6}, +file = {:G\:/My Drive/Research/Literature/ART/jov-9-4-6.pdf:pdf}, +issn = {15347362}, +journal = {Journal of Vision}, +keywords = {ARTMAP,Attentional shroud,Coarse-to-fine processing,Gist,Multiple-scale processing,Scene classification,Spatial attention,Texture}, +mendeley-groups = {ART}, +number = {4}, +pages = {1--19}, +pmid = {19757915}, +title = {{ARTSCENE: A neural system for natural scene classification}}, +volume = {9}, +year = {2009} +} + +@Book{grossberg2021conscious, + author = {Grossberg, Stephen}, + title = {Conscious Mind, Resonant Brain: How Each Brain Makes a Mind}, + publisher = {OUP Premium Oxford University Press}, + year = {2021}, + address = {Oxford, England}, + isbn = {978-0190070557} + } + + @article{Tan2019, +abstract = {Learning and memory are two intertwined cognitive functions of the human brain. This paper shows how a family of biologically-inspired self-organizing neural networks, known as fusion Adaptive Resonance Theory (fusion ART), may provide a viable approach to realizing the learning and memory functions. Fusion ART extends the single-channel Adaptive Resonance Theory (ART) model to learn multimodal pattern associative mappings. As a natural extension of ART, various forms of fusion ART have been developed for a myriad of learning paradigms, ranging from unsupervised learning to supervised learning, semi-supervised learning, multimodal learning, reinforcement learning, and sequence learning. In addition, fusion ART models may be used for representing various types of memories, notably episodic memory, semantic memory and procedural memory. In accordance with the notion of embodied intelligence, such neural models thus provide a computational account of how an autonomous agent may learn and adapt in a real-world environment. The efficacy of fusion ART in learning and memory shall be discussed through various examples and illustrative case studies.}, +annote = {From Duplicate 1 (Self-organizing neural networks for universal learning and multimodal memory encoding - Tan, Ah-Hwee Hwee; Subagdja, Budhitama; Wang, Di; Meng, Lei) + +This paper is effectively an appraisal of the Fusion ART algorithm, effectively outlining the details of the algorithm, its capabilities, and its limitations. The paper outlines some practical applications of this algorithm, especially as backbone for other algorithms (i.e., FALCON, iFALCON, EM-ART, OMC-ART, etc.). +}, +author = {Tan, Ah-Hwee Hwee and Subagdja, Budhitama and Wang, Di and Meng, Lei}, +doi = {10.1016/j.neunet.2019.08.020}, +file = {:C\:/Users/Sasha/AppData/Local/Mendeley Ltd./Mendeley Desktop/Downloaded/Tan et al. - 2019 - Self-organizing neural networks for universal learning and multimodal memory encoding.pdf:pdf;:C\:/Users/Sasha/AppData/Local/Mendeley Ltd./Mendeley Desktop/Downloaded/Tan et al. - 2019 - Self-organizing neural networks for universal learning and multimodal memory encoding(2).pdf:pdf}, +issn = {08936080}, +journal = {Neural Networks}, +keywords = {,Adaptive resonance theory,Memory encoding,Universal learning,adaptive resonance theory}, +mendeley-groups = {ART,NN Special Issue}, +number = {xxxx}, +pages = {58--73}, +publisher = {Elsevier Ltd}, +title = {{Self-organizing neural networks for universal learning and multimodal memory encoding}}, +url = {https://doi.org/10.1016/j.neunet.2019.08.020}, +volume = {120}, +year = {2019} +} diff --git a/paper/paper.md b/paper/paper.md index a446b02a..b5b43ce2 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -23,13 +23,53 @@ bibliography: paper.bib AdaptiveResonance.jl is a Julia package for machine learning with Adaptive Resonance Theory (ART) algorithms, written in the numerical computing language Julia. ART is a neurocognitive theory of how competitive cellular networks can learn distributed patterns without supervision through recurrent field connections, eliciting the mechanisms of perception, expectation, and recognition [@Grossberg2013; @Grossberg1980]. -# Statement of need +# Statement of Need There exist many variations of algorithms built upon ART [@DaSilva2019]. Each variation is related by utilizing recurrent connections of fields, driven by learning through match and mismatch of distributed patterns, and though they all differ in the details of their implementations, their algorithmic and programmatic requirements are often very similar. Despite the relevance and successes of this class of algorithms in the literature, there does not exist to date a unified repository of their implementations in Julia. The purpose of this package is to create a unified framework and repository of ART algorithms in Julia. +## Target Audience + +This package is principally intended as a resource for researchers in machine learning and adaptive resonance theory for testing and developing new ART algorithms. +However, implementing these algorithms in the Julia language brings all of the benefits of the Julia itself, such as the speed of being implemented in a low-level language such as C while having the transparency of a high-level language such as MATLAB. +Being implemented in Julia allows the package to be understood and expanded upon by research scientists while still being able to be used in resource-demanding production environments. + +# Adaptive Resonance Theory + +ART is originally a theory of how competitive fields of neurons interact to form stable representations without supervision, and ART algorithms draw from this theory as biological inspiration for their design. +It is not strictly necessary to have an understanding of the theory to understand the use of the algorithms, but they share a common nomenclature that makes knowledge of the former useful for the latter. + +## Theory + +Adaptive resonance theory is a collection of neurological study from the neuron level to the network level [@ARTHestenes1987]. +ART begins with a set of neural field differential equations, and the theory tackles problems from why sigmoidal activations are used and the conditions of stability for competitive neural networks [@Cohen1983a] to how the mammalian visual system works [@Grossberg2009] and the hard problem of consciousness linking resonant states to conscious experiences [@Grossberg2017]. +Stephen Grossberg and Gail Carpenter have published many resources for learning the theory and its history in detail [@grossberg2021conscious]. + +## Algorithms + +ART algorithms are generally characterized in behavior by the following: + +1. They are inherently *unsupervised* learning algorithms at their core, but they have been adapted to supervised and reinforcement learning paradigms with frameworks such as ARTMAP [@Carpenter1991; @Carpenter1992] and FALCON [@Tan2019], respectively. +2. They are *incremental* learning algorithms, adjusting their weights or creating new ones at every sample presentation. +3. They are *neurogenesis* neural networks, representing their learning by the modification of existing prototype weights or instantiating new ones entirely. +4. They belong to the class of *competitive* neural networks, which compute their outputs with more complex dynamics than feedforward activation. + +Because of the breadth of the original theory and variety of possible applications, ART-based algorithms are diverse in their implementation details. +Nevertheless, they are generally structured as follows: + +1. ART models typically have two layers/fields denoted F1 and F2. +2. The F1 field is the feature representation field. +Most often, it is simply the input feature sample itself (after some necessary preprocessing). +3. The F2 field is the category representation field. +With some exceptions, each node in the F2 field represents its own category. +This is most easily understood as a weight vector representing a prototype for a class or centroid of a cluster. +4. An activation function is used to find the order of categories "most activated" for a given sample in F1. +5. In order of highest activation, a match function is used to compute the agreement between the sample and the categories. +6. If the match function for a category evaluates to a value above a threshold known as the vigilance parameter ($$\rho$$), the weights of that category may be updated according to a learning rule. +7. If there is complete mismatch across all categories, then a new categories is created according to some instantiation rule. + # Acknowledgements This package is developed and maintained with sponsorship by the Applied Computational Intelligence Laboratory (ACIL) of the Missouri University of Science and Technology. From 877f9d028c69fda3623b31ef8aa92db69758e7d1 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 29 Nov 2021 15:01:09 -0600 Subject: [PATCH 37/38] Add get_bmu sections to docs and README --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ docs/src/man/guide.md | 14 ++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/README.md b/README.md index cf472d63..ff5c1252 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,44 @@ opts = opts_DDVFA(rho_ub=0.75, rho_lb=0.4) art = DDVFA(opts) ``` +Train and test the models with `train!` and `classify`: + +```julia +# Unsupervised ART module +art = DDVFA() + +# Supervised ARTMAP module +artmap = SFAM() + +# Load some data +train_x, train_y, test_x, test_y = load_your_data() + +# Unsupervised training and testing +train!(art, train_x) +y_hat_art = classify(art, test_x) + +# Supervised training and testing +train!(artmap, train_x, train_y) +y_hat_artmap = classify(art, test_x) +``` + +`train!` and `classify` can accept incremental or batch data, where rows are features and columns are samples. + +Unsupervised ART modules can also accommodate simple supervised learning where internal categories are mapped to supervised labels with the keyword argument `y`: + +```julia +# Unsupervised ART module +art = DDVFA() +train!(art, train_x, y=train_y) +``` + +These modules also support retrieving the "best-matching unit" in the case of complete mismatch (i.e., the next-best category if the presented sample is completely unrecognized) with the keyword argument `get_bmu`: + +```julia +# Get the best-matching unit in the case of complete mismatch +y_hat_bmu = classify(art, test_x, get_bmu=true) +``` + ## Implemented Modules This project has implementations of the following ART (unsupervised) and ARTMAP (supervised) modules: diff --git a/docs/src/man/guide.md b/docs/src/man/guide.md index c8b13f09..d8b9cfed 100644 --- a/docs/src/man/guide.md +++ b/docs/src/man/guide.md @@ -39,6 +39,7 @@ To work with ART modules, you should know: - [Their basic methods](@ref methods) - [Incremental vs. batch modes](@ref incremental_vs_batch) - [Supervised vs. unsupervised learning modes](@ref supervised_vs_unsupervised) +- [Mismatch vs. Best-Matching-Unit](@ref mismatch-bmu) ### [Methods](@id methods) @@ -163,6 +164,19 @@ perf_test = performance(y_hat_test, test_y) However, many ART modules, though unsupervised by definition, can also be trained in a supervised way by naively mapping categories to labels (more in [ART vs. ARTMAP](@ref art_vs_artmap)). +### [Mismatch vs. Best-Matching-Unit](@id mismatch-bmu) + +During inference, ART algorithms report the category that satisfies the match/vigilance criterion (see [Background](@ref)). +By default, in the case that no category satisfies this criterion the module reports a *mismatch* as -1. +In modules that support it, a keyword argument `get_bmu` (default is `false`) can be used in the `classify` method to get the "best-matching unit", which is the category that maximizes the activation. +This can be interpreted as the "next-best guess" of the model in the case that the sample is sufficiently different from anything that the model has seen. +For example, + +```julia +# Conduct inference, getting the best-matching unit in case of complete mismatch +y_hat_bmu = classify(my_art, test_x, get_bmu=true) +``` + ## [ART Options](@id art_options) The AdaptiveResonance package is designed for maximum flexibility for scientific research, even though this may come at the cost of learning instability if misused. From 87ba3d2824d362f1a3e2ddce09fd6a3ac3b5b9f5 Mon Sep 17 00:00:00 2001 From: Sasha Petrenko Date: Mon, 29 Nov 2021 19:05:06 -0600 Subject: [PATCH 38/38] Bump to 0.4.0 --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 74d29605..4abdcab1 100644 --- a/Project.toml +++ b/Project.toml @@ -2,7 +2,7 @@ name = "AdaptiveResonance" uuid = "3d72adc0-63d3-4141-bf9b-84450dd0395b" authors = ["Sasha Petrenko"] description = "A Julia package for Adaptive Resonance Theory (ART) algorithms." -version = "0.3.6" +version = "0.4.0" [deps] Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"