From 0da0ac1bf0f881ca12561ff56325bf54fdc10c63 Mon Sep 17 00:00:00 2001 From: knc6 Date: Mon, 29 Jan 2024 09:28:55 -0500 Subject: [PATCH] Add chghnet mlearn. --- .../AI-MLFF-energy-mlearn_Si-test-mae.csv.zip | Bin 0 -> 1186 bytes ...LFF-forces-mlearn_Si-test-multimae.csv.zip | Bin 0 -> 99308 bytes .../chgnet_mlearn/Train_CHGNet.ipynb | 1184 +++++++++++++++++ .../contributions/chgnet_mlearn/metadata.json | 29 + .../contributions/chgnet_mlearn/run.py | 278 ++++ .../contributions/chgnet_mlearn/run.sh | 3 + 6 files changed, 1494 insertions(+) create mode 100644 jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-energy-mlearn_Si-test-mae.csv.zip create mode 100644 jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip create mode 100644 jarvis_leaderboard/contributions/chgnet_mlearn/Train_CHGNet.ipynb create mode 100644 jarvis_leaderboard/contributions/chgnet_mlearn/metadata.json create mode 100644 jarvis_leaderboard/contributions/chgnet_mlearn/run.py create mode 100644 jarvis_leaderboard/contributions/chgnet_mlearn/run.sh diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-energy-mlearn_Si-test-mae.csv.zip b/jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-energy-mlearn_Si-test-mae.csv.zip new file mode 100644 index 0000000000000000000000000000000000000000..7622a114d6bbaf5820617a14ca2ce051c8fa63ad GIT binary patch literal 1186 zcma)+J8u&~5XTb|D5&!d5S_i6*UqD$poxS6QlvC=C`zngi3H?WNR(9cd2%^8$Xo)$*yoBVW1*)*ba3cp1vGSXa!?Mt<8 literal 0 HcmV?d00001 diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip b/jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip new file mode 100644 index 0000000000000000000000000000000000000000..da6c4e446665b4de83231eaa59f12eb553a2aea6 GIT binary patch literal 99308 zcma&v&5m}#a^-apj2LqV%#dx>_gf{40TUzyNJvbWp;os+mbwAC4L8tN#+~u|uh@0m z6WrJh-eim!Y-GB0*{^$Qu|MOq`+yCl+{&)Y+zxzMG{@s84ANBwJ zm)`x?|LtG@5C8pt^WXgS|N4LY!@vByfBV<}=3oEazxap${eStN{{FB3@$dfaKmPT< z`M>`4KmPr{`4@lpH~;eA{@;K9um0*E|HVK2Z-4iXfAxRKObLjUw_-<>+Ad5SC6mXuWzsKFFktk_5Sno=Wh-EdHZ<%`uyqf z<@^2f?dwki-oFib`R?u4&)4_o+jp=3{CRu-^ZohN>(`$@pYN}q?>&Ehe15*XzP#=E z`{(WL^Zm2ouP-kj@1L(5{^#@O{rm0vZ(slB&&Sux$D4}U6%b&MD z#wO_d$H)7hj~+jbef_fqKR^F`ynOvM;`8KfN%{FggvNZ^;p^Mm-+m;=$LsgYYpE@Cz1Vpe!P85OYd)V{!Mv?yj%R`>m`l7zkd9D|M{2-UfAXR<4>Z#oBHef z<0kz6{`&s;_?+@c#|WG8&u41-XghB|e|}zG+JasF`D5=^QW-}e7#vd zi+cQHwvX>`kFQ@JUq5V~7GB?e-rwI|d;M)&AK&lok<6^|wM9PY^y}?A6TH9wdHMMI z_-N|4Pj6}JmU(;o^JX}ee9^?K{ZjV#2Q%L!Z+~7tK0Z$<|M&aNM1A@F_4+4u{VhrO z0?*+%yn#fo(?d4<_nE{XQ+=aPU71Jzy5svm~W4^cu{KQ7k2&3OmE)| z@{@kQ|9t(xh3WTQ=)UpTzWWRVc(Ne|u*IKZ_v2mkyq)$wlH&717I6IGO9}VG^VzpK z{`^oR-|hK>)ThuI^4Vs-Sndy@hzc0qUtSLa{=C1wzVKG_ z!Ka^>_dmsfxaUMu-p|)N`_7%--^5+&qL>$I?C}dQeSBQ-THxcX@-F&+UizME6uMLR ztBrEmJmTZU{$GX!?@*DmpXr(XEp*Ci?=OFf5^H>a*VThF#{ zjP}E~49U~E)R|vMzPv2sF#ab?Z}gW9{G!>{3v<2>B`JTL#ekH)|qLf!7#Sb)Gq;? zo7kgS4nDaE-#AzWeE!qpVecOd%VmKxMe#D4`uLj?^5^Fb=jJ~B_!HIOv0~u;gyhxv z8^J!n%g<{eAjwJsr|q{NDUv(*&afBwvu7fi8Ju|^H2|kyDG0yFkGnMPa#&}Gdxh=T@A)q?(&bIPz1wrqU61M@F()dKa;7hWY3eAv<_0BdtE zMY8Oe-oB6=YtEva{q^S|RV)Wb&-DliF#GZiZg4Z-_3GsZlk$?+59?lSv&_)I_hJuU z^8Ak1(bX*WPE1fdwS`IF2i0u*6;J6)NhcGV_*2k)|6DAH!#Lq(OHp```uYxgpz1gV zX9N+9Kszr#hrSZPJ2qr84lTX~c@y)!m*YREOXh3k;sa#>{Ot)wevdhc|1VLyZKV|p zoiM`G`U|mk%cQ!3*$7st+cDuc@B=G`0TEdB}G7o-x;ntZr ze=yrKoaK?L*+d+9o}>~sY`wRv{r+{x1uaC_xX03;GV=tISdr-sMJ&W; z%Hs9Fn2Wsqygo_j9dOZ8qQCy3lTdN%3YK3Y!6R9<*X6nw=FOi9RHe+8c>Vs7R`+2% z68SU)8TdH8mo}Mhf_+j@w9jncxC}2blpnM5qKO|NF*bqw5Y6Tj4ci3zsZacc!kbID zvPv|VuhH)q2`_3=^Rw$mq=&ZRq7Q!Xj7;dQOvs;)m2qX{2Am5IbrGNFv)7o)B;b+4 z=H=pm)n4$4a}(J#?wYO4fz_m^Zv{pS$n%S6e6^87x|bjO^rf^CjImpxqP~EPjmCPu zN&P042p9hy(kZ{*XF1^i1tTmcK#_?DZ%`+$I1Q_nXzc>buD+LTr8Po;`IeBWUc_6^ zpDz+DlUExi*glgQDE!bX;>hjJ%n{MwVEl}rW)LC5QO^1d0^L_DQMc3^dT}=eOAMRI z&7j82P%`ZM>&q2zZ@3{+aVnzRuRj<5d`*CWt|<~yQ`iP^NUoJ>5gYr(6V7i%mMAzZ z%}2w5b7}Df8%_hC3K1nwv%V`KB+PsdZx!$*6w{(OuQs+>MeA!jFa}Q((h;73_WPSJ zZZDr|)FYTc8Dd@@Ra65UVOr?Cz?PKiL*+4*cv}fB1f@-=VcQw+%g?JI5=V`Iv{IaC0KTvAWAK+*2 z50(6uC*!hLF{24YZFY_+t;%@$yut~|%wNH*-oq3lDGQ1uWui{#@uscHRLiJ{e(Vw3MctPszYOn#t8SNuncuh~+tX_)8#a2!rV)8Z~ zAn}|EBq7MWRpNp2!rUsRVLRtyWv?ekD0%D`NkOgoD~sem*0!&MHpGlmF__nk{8IbV z^B1qVoQ|do_mLtYW;ajwO<^PY2Z{2^_t!5}P_&9Li>d(C$f4r9ia}ym+GJAbteBjJ z)hdPM_M@V%q`rOXih|DhQ4C(jK3I^we~Y!u4)Y6HGAZNTgGUVV$W;`%&vD5VWGB$b9397$JfO=&d6o|fP;31u8W>^J^~O? zHP2Si#8uV?QUUU*gywK>COL1GvMZ^))?2amy#_5rzDZ(`?`)A`LA{)IRnTWa@t5LS zCI(hXs)O(d$lAIv3wH2SonTG=Zw}&4-7F<;&aiq9x{_)p`w_HjjOE^95{`rM)d2Y@ zRs%(HK+(o8z+jKD5{|Jf67%ver!sYY+?)J-N5!@e6%v)@35^U8Xze-J$u38{-gQwM z(%jq$=KS_O5xEFU_@c-IE8M(ho^Z+LG|CkZnq_i)DF#tkuMSTVTeZ$;zWPo|ImKs$ zim)I`MT;OWvT!#2;-d$`EsWiJCWT8Q-)I1A5Kr0w)Tf$11Jgf8Nmjs$X`b=KjcLZR z8A~JLXcV+Uf(=3JWN;xrvsY(hc@xXxrdwi{)X{;VMw0TR*;lR0hb2Nv9McXb0ajs(X>#yFl{9jZg+jpi#l7{fw+sd~@7L{lj zJ+#~ppVd@JlRONWu53%9`X<|n1T_dv*W3{7Ok*8|=qn`%2Z2GtyK@MBkEI(7lxlkq zt@r^D0QDg2T@`j(59L84Fj@)n;u1SS zy!mWOiJ5I`F)DUE3K+Ej?Q&_yBT~A7dWVXFR0i&g;HD~ov4w<0Z0e^lHb|?M%2p;L80uT*g36wZLD=|4q3t5s)y!1#m9NSOf26HOSDx>&6h#Yb@j>?Rf#da z6goBO1xUiD2Hxa=rBe?<27M3J9O#%U}Q%18y7Uq3Yp8H64eX zM4G-L>|k4_p!iEt7$K(00`FKM26H{^*jOC{cHxL1d@AIW4quQQ$Q}>d@iqvt$}|{_7aA=rq3z@%)A*`TqR;LZC*KRqR6u~e~nZE3xXao z6s~o|#IiU5{5ArCf_i68*5dP16WWQzpT(>AYndH0xPww*qADMUmY3^SR+qr7GCT*) zEo&^y(-t?pX>PC%Q}HA;U`Ig^b*TP`2l36!)?C*O;5;p?jyy(Q!$@OtODu2HQ?%Sz zZgy^FE=ZrIlOv-5DL{8z_iNu_X!vTSEpw<KOMT)m&;;03#6rwVr;7yH zM=GxI+Lm%kHy)$@l|-jjXc#wdsK{ooivfr#c2)>2)rd! z9VAIX@-|%M6R4*b&|QnsOAtnf+iuLd8d_{fYYOlvG;%vuNAq;~98Lnmp;_v1goOQk zU4P=wUu72zC|EQ($7I`Wp=%T6b4CGmRX;P33T@dX_kcX?{jO!J24I9d&~*b*^0hLJ z?)4v8|6HQFsT7czla?Z?W;8x4y^8Cx$r4*Q;%uX{Ou(h#R3+rm|6h_Dj~2q>DZXhL zWYbEs4?>Dijt`qxVp>WIb1AmLAPl`&OtOKjB;cwy5Zi$Qt^lhanvYuOd**vQ6rGtWJaK#Fn>|q!3BtG*ELd5>{$fFg{^(3jX;T| z+OW~7y0|kMVxxJ#M+_A?+Xz)=liZPW)q%83M9~Q-@7!~>T2O34pvsZJeR;Z`)AAPw z>-_EVKfouh0S+d*4MM*71B6nKOeibk_+hM*Rd z`mJX%?_}fEQ#B2)DPT6~aTSX0kS)Z+^Ck=a-Vs68lbh~Rc75Cdejj%BMMFlgdWVi>gqmXc^Y$yN0O}qivV62h z>3|0xpU~An;O0{j4?i&n`_c#)ztPCBJ>M?*Edz&Iv|Sr&uQ9T2?liZgVC~9?Jh1M` zI!E%E1r?#T-lc&jU!Vu5;W2kyR=bf@xdyETWwtJHVpE&12*Nd+8jfNBRP5OuDfV7r zV*`4IMJ7j#*`%AwY3Xd6alk~qG}06j`Lh9*fxDv=tSBozhZ3T2d<~q)0V5|}jf-No zvNROcrfQyJMZuByQjC80T0sOh8X0!l6UWu=Df<1AS)uD*wH@D~tTA7~QhSoz)K;RBi zjFt~cCGxNM_s<>LnS)97p|(fS?>jK79#O)`j2{l-*@GU&pxr~!qZ`;ujMsz8NHP_` zYH6Zz-=}ra^&ndAJ)#0Pt*4(=J-+oUroN?La|jW|?!2~2sy>|0fHd$4%7ux%CkwnI z8GzLPtiu@@eY)@ZE8@HIHEcpY<~7t-Yoi*Rv2FCdwz~S+T5cIshHiQ&rsnq;k@d_> zutK#s>W>MQ+5ICUI+-|9;oETvCKEZ``wP9gm$zClYV{-n;9Cak-!+vXS=i;3-tL&V zMluX<%g!e3nKrWxAUZ-FdoO-uFuS~(NmlYdfec>4Y1bLjda-J-fjiZ!xRe99*Y~4o z-A{o&R+jS;cleN@%ujNsb_vp@1*ttbQHn0Bc*$A1Zgw^$f1v2I`T|&OVO0&J+t^m| za40gdASuUz7rnKKs1{v@H~aVM)T>Cl5Jg!*AHRSb<<>+(s?f}! zS@KOk7wC)~5o!b&&{%3__V3ci+{|31%1cTTL|a#xo_eqRP!;+xn#5(xl^^ zL#Xa;U7xkKcVUvN0yeI{ub>xL=(Czj*KsQr2ti))^4#gw)fD{Cj&wxUXu*&=?oD(B zlS!Mh6H1!5wfDbK*AS)?4~7H)>YT;pQ(0+r6JLKTv(catdklqWr5$$-Wf;N)AkMt+h%2r_fD(O z>}4C|5ciyG2yfVbmVzWhg(yQ;R=suJ%DL`5+FUR>Q%J$OG0!Cr*++Cd1uS!_7=0Od zNb1mt$TiBJ@|2f>)&r~vA@PM`_K}z%ZPTk@C7W}f+VS-Vwrn(7u^631{CUBdP^*=H zKjGO4_mNp?woseScs3{*Yn2we+v!fFu{JVmBGAa)_R`aS(r0A(lRRBFxKFJW3g^s#Y z4?b_^{s`hcj`zC+Rzkq%n<=8xkIZe5zKpzENwg-5J%Gjk+HTl1Gw_K8-iaZJEH*&oT3r+(I0lfp>c{C zKuI3oHFWRgu>vrn1ZYlZ_=-aE zaAM$Kl9~UVchSacCDJn^2)WKd9h@!?G>gQcENleEkGPa2SZ3$oPqi60q~qS(IJ$7I zi>N5!3&!}T40B&Prhm>|&}nILZwW0HuL~fY%N$c$2Qzg4tlwD!P<>a;i}<oj%WiTmg7|@+ zmw>3vrVLHLo!@jW*}U~qz+JDk%tR!>1Rfn{Iw9$`UBTT;i#67fCnL;9q|5fSYnhc( z(j9a^hmV2l)h~g;S4R{>#BQ3Y$xTa5n?1W_Fa*n{%yDML0LC=(=I>~YD;0X{Q&6n9F|k#7PJ*Tt}`4g zw)o7C-Id*&4-=i~HnlSaS*W*)Qd_aOvbi6-97@WlmYE7rh7PvQA^V+Dow-yULzFj7 z(!~)BuIO124oJMkUjRgW5L`J0Q8etijvahSrx<4^UZ+#;#zR-XOA?4${!59Sf~Gxt z=^SG*UGWeI7aHmv8l2;_7ypTToqeOFb;vjzEQA0_ZC^n3I<@F2&GuHPg8KOzH03pC zmj%i0p9o=4f63pv-IU9HBWxtuXtg$uuVjI_os~GzG=iFimiQx)$Xeqog`g8%a4Q_} zoZ44yoI#bJBflhaP>_-kMT_Jg91mh-4zDHR+`iHT@>9|^P;}Oi*auex!<~N`qX$E4 z6Sb@LUBHO@s@I--mrgjvxl?xviRY?p7Dz%7#69^;Gp>X(2jEV=-y^7Z-|}=RIDCFN z0y-;)Pd~12s1$P&u}C}QwF_u(?{P4xR!Dp6%*bR?K!$;N-N+oPA~JJd0&63Ng5p_^^ZHo0pJWb5s|=jhK8FK9 zNw&NpP#JPO*{Y*2*U7gdwVtIGAefU<=b{tMRKaZjmBksy_B+UWibK8h=+O$Bf!X#T z+DfCdUWHo8+J`W#o@omvMrhh}-LcW_-RsB!QPM0ez^(`^h4G|)r$`D-H&`cu`HsS- zCQ0*>DHiPh;+{dJ4%|LfY1Uh82kRAUaqBi-1{7Hat4Ibd;-ytWVeS+E#^99+q0;~ZzhviR{)Kgb3`THu5hV8aO`FPe0qOp z0HoWJ=UvdTJ59|jVq$x#9T9e5w-IShmbyi7EW~&3OEVJSZMOqc-fdfMNmQtLgp>?$ zj9i(6r!N)J7gB$v1)p~-Y17s5d_1vBmYCXB)Ep{}3twmoFsktrH72xz9#9~-F=$ff zZNe==*{`4qQ|W@&PPD)pXX<+i(s~hpjvwmQu=K38+3&G#X-TjH@U{})f6|%k6VW`E zEDR0;P&c$`=bBImy`K(XtaTQ#9cRaO`Jf+;)^o6QZd^*rGo2V-SB;@0p($26l77Q; zRhlJEN+@riRJfSzp21`<|7~|&_SfF=&)Rw&T$*jICfhi$lJ^`M23T3dC(Ot@P?6>+)d9 zWVX^sad}yc95}ePA!0BKVsRK`j++ejlsDAeN|3(hHck7PeF7nMPZNGIYc<2;c zF6pTv+QQpUWh)Ncv#w;3nHo&59PZ_DtKgvC&=5Ov0uisa3O^sF9;N8s=;p054ruI0 z0+pfmI@jY4w@tM@)H4Fnkp7?RKP4T@KmGUzFqjX}6QWK5MQIZq6SIpqR@=CxI20prFKAmD(QEg59Q#T8Y$=V{ct}S=>*gTh#o0S z%V&E_55IWmBQ}aQfKxWS1!Zs z=`FL$Fk4$QN)a*d!tp9^Zs*D{Mbf%sAljkMX)t_MdJZxe10JOay@C##qc;>$y30K6 zo(u54%gyU5qZ6hf^Kmw{A?1>dPtA)?sZ6aj1rPrW=ie z%Ryi@z4W@4d5o+zB{T)*Ijp>7BUu?L>i6e>9ZE=++XGW8Qf@zabXlhP;MVU&P5eVx zr!2*TLbt;`(T?Ie$~^bbkf{=zPpf|v6DPQT&t>Ny*pmvY;z`L`@p?x)z#rc_=c_lo zpN9|tNOl=*o8#EJ3|D$~CeF0Wa^W3#v!yO0qPj6Bn~?>t;mJZU=4nsaP`C4q#(5MC zy9=uQt%4c9DGTVN74m?tzm+f*0#6JRSw=yjTUYi-hu>*-R4$cQ^ zTh?9O;;32(JqvfSNi9g3eXI{6%bN<2iJiGCr_Xo4`2nUSt3K|~3oS&oD9$}@BKq7Slo3Vsl;WGx9y z>{z|29RI0z?xqP6Ku3Tg*a4>rk5KrZ=SijHE=9kjDATxqQ8MA!!{|3=R9= z(jb8lJ*d&>QtzlLlAu>}E6NjjH=%)5 zz4?F+lL2&;%>-a{iJ9~$KBC&MlY8LH+qXSg@E&W(37MADs&j2@z!00OSf&_dE8L!K zadxDBAW~}r)t&Xlm`ZZ&Pk%?tZWhw)?G$XQfDq97bf#;7b>P4*5|TX7D(ne}^D7!c z;%XkTI73PEn@@;aQ=COCrERD;BN)(^@FDH|PKXKo9Be(GhcxbJ0kt%@ zK*5!k@RV6Qbf&JZz)GqY`e4g~=QSGNOqWm`hUJ!bB|e!4k;vk!Z|+=3va!Vtp`@Be zi(r@oG}dpZZp9SF>NkOyOGqNR#HVXcryLqab?9={Od??}NaBVI66H`W zNS@C_>R}neG%Ql5$A1v3-C{p!odNLCzD*QR+K0hJ*@%GLsHUf93AXDk7d^q=`mI4= zzm2;c>v46=Z;tYxAf1^gT|zn#x5<$b-J%LEF&ECQfSa6B*OPU2uTUAA$O;j4|12tX z)F)dEcNo5gCh4K-LwM^N1P)$ud}-TLNvS%*jzpUp{z{a}f1Rgu6-S&?P#r43v{08M z4gHcF+e4|qT+dHgvNcbE{Gej*yQ{MVAJ_R1_(&b=fDyQTMY-gK~8;} zK|iZ|YVDj8Vyyd+m6_JWuF1$V`0}Zq$uk3OAf25}hGyPH<;sqynuN5S@ojhgBA4`+ zy1U@BMo@WyybNizNZWH5+EJR^HrX<*OCIx97Y{r4UP!o{9}<#S`H*UR#E#+gU|J`^ zkTZnPL#H`sVbk*@@ zrtewdF6~|L!Wu_WS*X^SJU;PTQivc*lFC3LZ;D*X$l zuA$V*&|0oDn=m!;-K}s3D1O;nT_M)KekzQ2LJZw}+3#D?9M-FLK$MQ^Nv6>w64Q;~ z*w9YV3qMwfqOT&wO62rQ-;BTe=B9;Ab&;AuHB!>^)K4r)-(1j`07bRnVfq!{GFgw* z3p60wzIL~3*Ghb(L!0tusr*D+z|JU%%Zx@kNT)s$R%d8498UGKl>SDU8Tx6AFr+gM zAO`DSU`>fKS5OoPrp+bBE6ht5V~B$w@PuBSt=0?8EdVpc9x+49D%__pg*?h+iGohq z+`*(Iqn9G^l4kvkyCa_y)w(yfUw2|38_~s|1V^acmJkWKBb#tFN&fso;-P>R$GmE1Eh|XW zl3H3Ze{GZjgA!SY4II@IRZ5doqfTa@NEo?vvbO?0ByGB$)GIs+q;&TF)Hqc{vV11g zR;5MiB1hL6MMjUB@3!6?HZ2^Mvq-5KR@G{RgDu8dV05Yef$qR~L|7*$0@wc3?MU`j zB2c2{)FQ(KlH?^d9dJjgE8@9X8G6DY)}`>77>W4HjjApco*ZST-5Lz(YMU%Eaz6lg zwMD(0o!f7-!v5M52o!^_xP!ZPa0gdi-|G;8+>W6As{Q1)M4&WDIFz)DZ5X1&lB5R; z(g|BEK-`K!Hrj!&GV|!?xk+PNa zY3_E_HB*CCU8^o@6^4*IMeHw9tR_l+{bQH!lC=Kxr877r%pUTE#v>;wOgUUlw!L)7 zSc%bxarvi(rL2*pQ^sdO;byzaW-dA$VvcKol>abjjQsf5B zgVbpU{&z7gdTjpQR^5vk130jew+kdibEX;CgXf%o=4Mf@WRt4-?L#Mkf*$-}SAHi_ zny=Y{0u*3Hm*NOhaD&BA;DkDOE0{D5?ukpjxpW~>D5 zN_I2G{V}M8M`WgZJ_*Z*sbZ6;)cE{78YQ#$3tA#wIY(*8q=w}!*@1@?Y#n7i_T3X$ z?et{6+qnl{YDFQ63*G4=kmZ(Va$nU3N|17v482T*y;KoD_#Lx~me7iN0z*E>u#k93 zv#12cfkKJ9+nv7dEijb@rde5YPVKE?Yycye`@MC^-{QQyMpmK%ni|!UDWbCh)!({y zleDtuH=1N8?r`2v&<^lAN~>GQdo_C~bOA|soqbK~Fu=sQmTbtPL(**Z00 zgSE$>YZhFo;(ywMp5pyltg;K2+T3^%cf|x#m07SYWNaQenVR650=KbU?_IvC#_k z&2x#0F7--=%l-XaLuV@p_rQ`n0@duj#h-qgcop>BU7LOo;r=2~OXIyv`!HWV2Z8o! zB?yfgVcklieTfq(m(PdMhl-{q?A{;POtXx@83lu9h$<1y8JVW;^w~1ch9bA!vd9_< zOpor(s-n8%lcp2+{g(3AqxJ3QR+6jPw+bwUkJG4x29S?5>rgVH0_!@F@G+n(>M$}(aY=^+zLDcbGM?r`axWxJGurBsI6sC7Uh&knAhZnQG z*w*y95xOKC+JFv|DkA#MB$1ogK1z<0wK#Z3TbQ-=TQxv1usJT$P-l#qnS*zzQ&0?U6Zikwg+1-j7v z^|p#f>%#nif0S}6Cu2vGeEE9B+m$7M(DwZ+Oj+S$@?)S$~H};`a$ArNE{tyzSCQ+_Q5xPY$V_6P_1Y zydOb%D~>dohx}{6Y$qHR1t|Au5h;F7(oS2fHAW>h=rLZz*Jx$qgH0%1>6pSKJ6bpb ziRM+TACu^|>Sey@%)S#4Mr?2Tl^pj1*J9z<)bAT@hs~^OTV=i|5pz3E$YsDWMP{d*?PZlC6#<$%UNDGjB)T|sv@|9Z`uw&#>Q6u*0{|7E zy%3KDG=8er$Lj#av{ief`3i#6nRT%bt?hijs+iDsU0;6(auZj+DiGr&-6B`1 zfF2B1=+t4vGK7N4WcP~{+Ho|01Q6M^-zz!QrFp)lC)Fms=}Y%R~N?oB2kKB!VUSJzRH zvlDgQ`5X-zLO-=L<&URp0K%ldmGH~gmP$gS>7+T>0|~m;6<^TbIKyKI4rX$-RNY2B zf(1&cjfnv85OmiXc;Lv4WX}dm(9S``@`zM9F5pN!{JQ4-g{+rm+TSL&~K@2%4fY5NMiIugI+SuNs5)3UtAL?vTW zbVR~8lL>^Vkd9eG`kgVB0!j@b9M@I^$S%_Y&BUS1QP*0a?ShGAA(!8*dX3Qt|K$LNfbhJ@*0CGKU{L_xHd|Zwd_<#fD5B zZa25XH)J{22J0r4>6S%;I%v_78f|wG(j#ZCZ#m6k31~|r+_{JYZ8U~p#M#n(?oF(+ z!&SQtn+_FdTCq3UnY|qU;41`)X>FU5yks~3SI*5WTZ#KuO(oV!v)lesyLwy%{|e^*kxEvM&1ry`9%H672%yPzzxy-s7bSv+cRfZ-h#B7SPUvk?Bq`({o0SKwR>N^dkWQ`Bs~ zmYS;1^|W)Pe%@rBRVtnQ({<~WZh`&S#(sZv8Ku1(JRVZXQwVB=6?%oZ^fnlEuwY z+ufRR3HhSW7SWsYd$A8>nP!w$A(~ccM?{Ush;{Yxj)Z_frO7m+{m`A#^I$URw%l{) zL?znkr(=~0cr(U4tM&=L&akNVS`5?&@2$fx7SUnbmyu9MoIUfLEZ-x4!{Rrb8%91i zI^LZ*Hw}gn0`)9V^w_pO-S_93@=K9a1)bY*ui7a&E!i3$M7C8g^MIZrjn-t@g5U-I#=vuTY4(K)O- za=XSkyY^)?IwWhPPo4U1&15yXDV^9&_Y8)2;EO+uQ1LUlYj6f4ta};Y>WlO4AO}t@ z0Ln@iy-O*{l1m2RJz7(vV#Z}rUCk6K?aqZ8!N|PCOJG=W>j@N!>}Kya4Gx*%T|VK0 zb4Tmd^W3CtU8D1GptD2CxY25BK`N_SVYA7V6i41wbB{WD)t zu{~VYzv}NaG1xDRS|T-8WVQ*-jJx*X5Fe79I8p)sJ3TOyQg7m`ri1mpkH_MYn;9dc z%o&g?ceFDrOD~$BXk?NCBfHIG#4Hz`mME5PHhA&CDGZS5pDr7IrgTFil2nPurcKbK zmw?GGUtS%pFa*re0V;B1Vh%3ni_$Ez9X%(zx?f1s@~p#ZyXGrXCxV@}EN2GJICZ4? zE~1)52}0y8fie5voKawt;=)B0Aq_ScxEA7@3%4xAoWi>n_|zi&*5=MLv`T(AB6JXj zwUB7-%%4-#-)nC$N{6A4lVEhyL@;y~}U|Db6^)&(HqD*sn}pL z9H8gJc|iwdIJ+mctr~7{wL3NUz4f0P^B5~V!%#})eztasY|$$zyZghXHlUvoY*jgd z>o1qP9}8CCB&%?uX>m2C(5YTA<&j(!TZ*--2)+Vo&+XQ3YIT)U9+oVyaUL z=uzbh>H~1J+4L$pfHIjFtL>R;t&b3{dP4OCi;y5f#n`fhCIXKgOoQ{d^;ryCjNonx zdj$pQQwSmjGf8mBX?n@+4DCC$dri6fbC_>$opeYal?MJ1=j|x?9tB2MY%(s0Jr556 z4R0t8CDmQl;V{_h#FC--^?bam2Gn%;5tjAKlfHDrGaqg}q5KfR$~$af3B)dy!MDwL z@NY$4=jF!U4}cay{DEiadnqH@LE&*!vI(U7M-uvvaki z+fmI)#1AUyPaBxn=yW7Cg0;b2B0egab0Avxy2~>&f(_P@JshMCA%CjL)miA~h9!?C zO$`Btrey0H#YVt6UARE6Lz%x^^NagPV>gMbaZkG^{Chf+R0aZM^X(y$|7<-Pe`k=y zR+C@RNx}B^tDIVIw|rM4mNW1#xqtZGaV5%hvQlrFY!w3^rBYNg^zNBp|Nc)i{0cGQ z9x3+x?}_od%HBWA{L?CX`{-=XkJ1|P=&aYj8u9q6kRJa%ef+Am*N;~B_!p&ih?4^} z-LD61>c<6o{n*#zuX&r}pRD`qBKz*~k(=Y6oCHapuWr6`)gJ%islU$Ncfa1g=f~ae z{k(ZoKkmHOk3akJH}3ZO3A{Z&k+;<^cyGu>Z_mHs+xkyz_IRPWfB&b*{6(34_rT1a zADrpK2S$4Riz7WgFw%$vq6R!jw8w*@svs1lpFu2qCHxiRd7UFp3E`n!{q7RBE)w*% z@!g<7=f#=9tP1~;fJ+qG@KVhAb7iPxKEto7uADkyP$FouX{rsd$liD1NsDqTl^-8+ z$9p8j^?aN<`9;OBlcUs`TT&{YK1Wwc>OVGL_j@GN2MBbb(8WZz2ianjTga*0mI@T) z5)bq|5$p8Hz=??8+uk`aL{PAe_-H#DGzi|k%%=m`-!KukRNKAO6p=W!3TbH2sK1Je9UW23lb4`PFGCTZr`6`*_)pF|)Bj5p(O&)>A7 zFBMRqRe@G|k+5HY!PEhL*RveRPFNHZ|CkFz18sb+F+ucx9yf9B{%npQ$a>S_KzF5cH zbnY7+G&uj|jn|pq;v=910sSV3XxAY*V{%jqo{(2VV2X;DZKrD%v>XTG zRQ)xTsf65k?U+&cQtPCx!6p|2mG$jd;(i*vAruW@~?Q(6WY^h8SHK+M~ey)8Z zYfAENX*Z;n!n*E8ueg5msJj3aip0r45m{#4fd-CzG!H8Rx0BSA^G6#hg1-ah_W5l$)pj0FGQ z4BODNi#`8tc;XewNxqT`!B!Z1zH;mA6<#I6>Q3!GRvxl&Y%@!O^))aAg+a8LA#_&zz(vzQejBT zU=q!@Rh-dz8~fOA+$gD4RB|nD6=$sr*sbz(UbGxtv)nTM-HB8ig2Vpj6s7Q6QYLPRv`Npw%JZP z(`ZY$5#wnq+*-|lEyF~VR%go1f6ckfu&z?mUq-iqwSp6H^N)6I`d@OB)oU5$;qH=I zV+lR0tNXTeR&^#RbEhB7Ln7Orv#aB|4N^R#W~(Xrh9>w8&pBx8yvK-j%o~6^&3+Ad zj)d~Sx+}l3s5I}4k}O(2hxn64cKwSiPlcB(wJa{fd}t6vIAnwlayu4_V<3FIf@<@Z zZV#Y){Vbw=L2B$Hqev)j^wnmSAUmw`^;Tfz8(Y?NVn5 zuKSo`f@u^krMLqK^Be7>_ zbSBKPZ#M3sX=R5=M9Nx>O+n~-Xx{b{`sYMdV+>7gfSSR~<4w)MYrZ|l|?B`cVQX^#IRaKsARQ_H` zis(59Za#F%4W?Peb*#MYm}^Ho4e=$j=s(-#SQ;A~b7nwNhaw%vYQatHj&iy(WU%vE zyb94|d!WanHyw1jJ28fMs7To|T*=kbzT{J&abc$ASWU7Ja5~Zjn1K{J+n>PLhak)e z;+z(CI{G40bhief*&JTVvX@7>bjNE)N{y^*-4Ob9RC57S1>CQ~Y@OV^`3|5vfkLOv z-PKHld-?-Lbpp%*;-Kxo&}9-C#LNXlp?@c*254z6^8q+1|7m5CUKf6Q>5pw{jSnDP z(NJDpq(eT*45;&U-cRynU3p=zlwK9C8?aP7H&QZ6v z>hP+Zj;?q4k&B2IE;ol)l-L*SP9fZq$9R-SIK~{2({?gyyZz1?nEl>TtJtqA?L$+9 zKy6XQ$c;8Na97n9zCgOli$kXz;ecgslMXA~*?KSveDaNb3TW%~EPngR15axfjW>>Q z2P9p!f(KK#sFrTacFZ92`p^?(uq;*Cv9k%)WRJC2G#fTn*IHRoZMxG+fO*l5@xa{i zg)*Ek&U=K4x-nfjn;}a_5caH?)K<-9oGVD#>ooZ1eztM&o9p~udP)sldLpWg39kvO zjF(3qVj#T*Y3A-?Ul*&*%~GQBP9&a@0+3764;^2#VvPbw*GyW}E44#NCW@dY&O%Co9~pFq+u7 zh4Y6VMLGnW55US5$$1ZFl{Y_e5ncSQ9rRM923Hw0adHa@i`$BvgcO?0UwML;u|WMk z*xbg_lyHx!K>Gu)@KlQ)9%fb3vT$@7dx;XC9r5M&ZarF6S zyi#WEC2lEVj~2t;PJfq;P`07m{+MD%Zl>V{-g=^J2fuB=8JFXm=WalEQ;r9t?wUdm zJ?!8{UdnwX=Ke;@xjL6Y^t=^w80^mHv1dthN`@uRg=h^#XE@;pYFRktePUUno!W$f zpGq}74=2o=32V{*8`SIKbqUnC8nJUw&|wDVjmb`-+R7vNo!EgbVj_%u6! zKadps1T@?=5b1sxQUeNl@@T3gF5&KH*q}iH0p2glGAYS# z4`r2W89Bsi?$r<5xn{ z-9M}NF$?B9c{?B_P{zUyx`XF?+6~isyhF|Gj=Asf-yP6p-! zobj<*l|H#_msRk^^$ys&-y)nRcj=rAbMXFPj|{ZE-i5QxheZRS;R3cSkuK+B zZ|>t9ztr3T8`D3KuviRdc|Ir9c-U3W_KuvRD5;-6cJplfA*Ld$a|c>g$KcNWeIIJ*3iJgh z4bz(Eys~!F<QDtrpwm0o9oi zI6fp0Q3XtJE)s$00#r$ZBJVuEs{~?VmcquYGS6C1<8J2LWMR9^3_nn_I_gku=1L0u8{K(R^IkRCmQ=PZ8 zK|R69()`Z?eBZWAr>`lA&ISmINItKT!Zb=7p`ODGA`tvvm~fP46T8plD#{NTFCYY8 zchG$&!3p~VUcS^dmGFpTE$CUAeXDNa;Y z9%}Z(mYZ3>Srn!v`5{%$MD?XgLtX=}>NTUyfxlo;mwDS6j4+{pX0cU&PPxVQ^_IJM zSQ{)~t$!iJ=S_}8G?(UMC??=OP1aa?{>oF?ODf;Sx^!DlDu)Mu`;ko!Cv570c@2XU z^<@dqEL}a=v&a)Ff`abVO^`nIa2E={{1Z0!!{sa`iJ07`2E1&h~j3jQQZs zW&@Z}+-0-=w!wA~UF9&7!`g(pCa9(vYICx30!8-36LS#Yns9Yb{J%C#)sX3S;3A6j zF|5R+ad=!a#DH%5%L+Z?hHZ>zSSFvDEComTDrqa`x;8+8;s+$nk8INL#VO==sZm{I zFrePxGOp%4TjrP=?tNeNtVO2f1kx5$ts}oKlHND_(ia zl`$gOr&mh`$kEUQ2bdh{IA2G$K}vp$wsW~fHA_?dCZs8e>M9j?2y{PEJhOwgz`sv5 zo%8wiOG%1oOR=?%wA{Bh|A0wvM&L)|#W9VLk(;I`POW>*^p!x*yHPZ=>5DA+ktf-*5zp zukk@0vDJs9bekF3+u*v<+K0ZYIZDBgY$~cN{VMe93>ksNx|=o11HVMzY>tlTA)NjF zpZm#8zTjD^oE2$Zfw`JQ9!IHfhgPKP(15H$u$u}!*D^$^<_z(d;oSTP%%2Bz^UkG# zOe%tO#@@dEO8DB$aLFSVA5HB*OEy~eQ%FJs-^hG*=eGgzXgh6?2=+J;U`c;1BRi-a zM8K*nkgMkRmb~oC^Gh7){V(QnX$HBNi{* z^FcEIamdgB3y38XY5$Hz1XMc^+1C-ye5YS2qVE}qMF9KM!!6{MyGPT>x}6{G(IFWL zjEL@ZBBd!K`&T-(q#VVS_lwNAFN){l)|3K?})hoF$0(KIs9Lhcv|kvPK>1`ISfY5n|XRQVlFI+NnRdcgFJHqg(Uoz;Pj>YzH}!& zJSnMLNKCS6JEoF+1Xnw)^_UD8ML(uY3;Zb?f<(qRK&h^VQO#yn$$EBU z_sWgA5MTfO0ki+BM%dU${Yu2{wz0uH58=4GzFe0CZWT1v5dq_0;TA-yLwk*mk(YC# z$K4sbYq(Jdpl&+ml%>JG0hPP^g8^K{$=><7!d7vZqUvm|oV7mfO}YI|kzcM@Ub!dYIP}*p-x{a3ZXp0!+UG+h2jFWABRp~LcSvm z@>hcGVp87?%F-qA8Q|J^p+s%mbd$POSc#TGK1mBQ#2E_ zBNGdVec0AcBuzHS#lQnhzMq6hdHo@f*%H8WkaI$TYnky^^&EHXr%X_QkzsH1K{j)@ z2632fQ)qv%%q0(X3^VtY)@Zq{s0!Dw#xrfl)WuJT?q*46@QJdUlq1j2a#pGcB%(LS({g((yd_K!sb?SD7oKTz) zzG!R|!?e2Xx8Vz|`qaz3G=(au(|6{;@hjuz5o+arRMGN?n%pP%vlgBqERTAIq)6t} zq)w4H4iqa7>XZAl6Ka?9dgPZ~uN;`{$0x@;kO`?O(p}&=xjSs&R?2P)&QvJbm0%6% z4q*CW0gVk$Ljit#EsL*ykD>2TvDUIK&Eq!5xRv?=dat|f69=Q9j{Rkl8M6i%KpBW5 zg^~Q_fpQVIpFR6U?)j#S&QX`gH3=l;g>Z-Af^@LhVV5(psY2RTqm*E(PINA^zQ(Se z-BX{(6|Nntw}bN?%Ju_m7(a4cC++Fk)V4PJ!ohast}NlttCs`17AuVEXiIC>LBO@F z;%OC!u%I&sdSF>jy_R!Lp68MQKajOH0B4Y&u6j|0+k+mMsV&kaZBv75ZZN>8rn5>5 z$`aaX<5N6Iccy5_fwJ16Hw>t%;KY)5q+{l$b7wD0lU3PuT~a%4%?4K&*oi=$gE2w= zJ>zN4i@*s2`t&Cjb%G1>rb>#pmCjJM^L|cI3ttSW5Y#%oMV`xF2R+nqb7+asUH?5n z;*M#K%&-b~+0Yuo62)SBZFiy3bQ}vBA5e513>Tc({uBnXuvD+gP$FMhqTp6)}*GgD95~?f`r3e6Y zamFD)`5es2y*VBfu}`xGKvIvS#%XHf@$D%N80b5*(6wnTULO&&a$KO57#eg%RUa%s zhNK8JPolxDFn5{9YX?7_y^L&987)r^4pY%KNcPW=>%tbiNbOB6KgdQZLSb7aT`kGc zbQsnr`zowZFVK+&By@&^f6 zwZBQayaBwz(n=90tou^*TK@Pf7eV^2K|!Uq(CS=KmYsH}tV8t^P_wnXZoZ5t|Cg^6 z$cLY5@319z+Ts-b2n%ccITVd&3GU{gdb>F-M&sw z@}Gu7Zf3HT+8#6c{QxXwgN=~K>u$4ES+Rj|?0ES$45P$lU`V0a(Rm=cH{~pNSoo_5r(~UlQea(gjWy%5>jh z{7xe8rqz@MMOkRaaOf0v77kII<(F}()~z2AWN+EkD%DWU*M++|<~%XdVmFSxAkTn8 zD8&LB%;Nwd))h3F3{}~5*ium0hn2D1YkSeFEs6M$iMgvr;yea9Hb=WfJ+(R6z6=F{9$Q&t0DO#2X)uEykWp z7V>2`PogmSZ~Xz6{u6Y>Wd|^xB+Owl2Nn5K9aqQD$6#s#huM85M@cb6>vlT|)5}hxQ0h~& zj>gk%)8LdfcYhRBpFr)ci=7jJ+sEr~itd+>CnQ?s#yrR-Ei>`Q<_5M*&e#_Xit|z0 z}f!DI=Dk=x;JqY^!IkF1_Fd&-zY8BUksxnHIcnmWz?&hKHQ?P&C`KY z<&xKwAabq?l_f;^I0Pt9wwzTdGq>fEwbW-ODfW(!>$Ybx0~v;KF62Egtx^SG_OA|m zW25aBN3)YbtIXu&-GX+g#zfW+oAh`k$D9@RX+xa@!?6@*teqf)O;#_2EOXZGQ(gdR zX{qKZu^1Ql#ac+#eYb6j#&1)Ss_O9UWusD9v-ZntD3Sg!VEY~h>?f8_t;4Ng`?7kc zV|TiP8UeB=2QolQX$5J21-`f}29Z%viRi&LP~XbiB$VxG=Hj|@V_tKyDQnWM%%F0v zeoNaT7$HvB_BSUGna;wV1_Q|LQfkPJPiX76TPxkowtr#Q`gx18mVfqE*UqwLcvN) zQ5~{8y(WZW9c#tJbzusJw;>t{_*a+~x-o$Zne% zj7)H^xs*=%cCQ2l91E(7+?|WSHOa2tleKWHyA7%`+-tQHBnZ7pR32QPW< zQySO%t^q$$5XLT0BscdQ^YN9Wf^zQ^T?7v(+I{}M#iG_Uk8OfXq%zZ#+ zEVkM3gP7EIO)pm#zzKz66Z3?CEnQ0*o%_!gl1;Y|r+AqR2Ov9bP;AxF^0`ch)So_8 zm)iK_f%rfK#DuA)UjS1DS}x}1QDWJBnPQbgR3T2|-4c}R8!R8x>1{IoRCshw%{0_!Sh+tqmI?xWQMlmjgvp#12b==0u9a?ZCt7ei-BFm0 zMUOnIGSw4t9!VnFYdT5>=%YXVWETFdli;^*swxs~Y%ytyqDto?>Icc)3Q@RDk1=om zZ$oOx0NKHW7H~jyl0Z6AE_ZZ%=vK$9*j0%cNi@_W*ngv@tjDPnPqw^3EckiPb0o-3 zd^bNZXJ<{P_l~YAA<1f2rNgr*>fe!hs_eoJqBzgev+FcCHq3L^tq87E<5hi4B3>ng z?b3%5;4;kMN7*?#%w@}2xpUus`=YXk>fU8Splv&>UE#;YA? z%kgK8o8dl``^9KllY8*}lvs$gifOBB_yMnj89Y zuH{5SFq$o+c_Dpm4!ezK%wO9I2^Q~juNoZ90c{v$^Qq$i+<;swR+VuSKg-n>0KG-fvgUzL4l4Bd5zVn;k4l9}588IsklWC+otE$z>qVq{O_w>U9!QKAc?gjTbW| zEeDx(FXc&tMYG76;0hG?3WkT(mrR>tVdst$R@BusMfiOP)MnU1y9DY;##<5GrHo5r zWG0;;bl@dV`*&S#W|&^!9)IZ(p@?aKbLdpV9!Q|9a`)DBPAwp+)>0fy z0mQR7$Cll*S(qdV)+Uq|0r*?#@PG>92)G|ALJFb2Nc6JI+if>tF+r8KqDOz5cW8LrT0Bh%R!}$nwg3u^OXClEV<#GDS<0`D$(Gx&(7; z@R18Qr=ZdN@r|U?Jx}sQIQiSvoWi{#XA9`%C{I_sNg<4xC&*(Qtfkn4O@^ldN0$qt zjCjv+z0&e?LJ=?|w*e@9U=CSgUlyw;$cvCpvK2L^CGK@6+r*GEYynmX3s9S z0cgDy&Ux*aIxr}5d+LM?f$`6hsZ_}g;SL`5bOOjJxVC*+J*I9UxfH%Zu=lDjnR;J| zHqbSdXrT~m-7keT?;KSUhYvGlr}FOfBiX0~Rt9q`F1=iVpa9$v*6v7mvO||0;i!47 zL0gQxxkLBpM^YGhoPksq#37xia4y*Hx!enkeS zp;IjjPgK&0_f{+yS3NZy=$4RniU)03HqCbRP3aRb0vt=6-v~Y)b->sG;+^0H?V>8w z67HA5Th zzRks@6e@3;GWW}U?Fpjr*=7ewl+ivg4MA~?L9US4Z_&DyBF_k1#cwr=D$EpS4{szX z1nS~fAU~%pVr?-g_Ao;*4w&#c6SSs)b~-XMcM_YzYy<)5aEo~TTHdY~%1BszsP)-h zNwTqJA3U$my89RZrbx~pw8K(Xwa9aSL76VEq?f{>ix^d2;zIUq=UO+p@gQDkJjc-( z8`T35LyM@L8CCFir`uPoQi7SkkWth1_rIp&JDQ+;jKCf=VvseVZ*T2*lXc)^*!)-X z8dX1kC%Znt760lcdr50HtP;5j1p-T;S9D-P5|{xU+aaetDt^H+fbyAQ6l|mvh|+0W zA>I`)D#@00;GN(tDaOhxg6P`r>Wa=V-KS6Fv<=Mb2Kf-10$l52&}0{ZX0Xb0dR_Q+ zTwXHDx{#~ZuDRYElDSo8{vK zI?4G17vdR9J~UQAKAT0O2{a310-eCOtLjA+M^1+wJ_izDTNh_V23_M#*M<~LKBM8x zE_f=n=q|qp+_|4P>@3B+%>nRw_Mo>7#E7Uo1WwLT4E*8yoH#obmc5Gt&O}G z>`8@Dd+=sGq`}t<)uv*#)+7ldIc}MTvI0BMLRr26XBk z+POMqlp8^8^78W;w0i@Lc2cE~)ZX#;ex7XaHJP#fd5zdWM$QDCM=~^`+H7-TaN7YU1ReXxC0Y|^;7`)MR$u0-0&#oz*x;kw@=?~Q$ z<8kQ8#;o1@Yr?HND?-S4H6I(n_X znr$fw2j3oLzo*@(Pw#`Hw4A+?X&B56Le@>9;;k}R@gY{PRUoP03Io1Qb`NTl3prD3 z#Q74c8KNBKUes}q{G!(kZet5C$PLsEO2SqRpczK>;U8w*ey7VB=EqSFy_W5Z(mC^R z*-(2q)acG1JxvYW)Zwj(rIGEn#RX%upzKOdJh3w%k6PhUHI>nXw7rOZT+PV6NVE&BnU9`E%jJ);#7J991AZeaZN^@olH7=RmyD8i86W zfQ-WU@T}kCp2O5s<2%ZOZM)_&d+fHYJl>47 zB=ZjFJ0M#QjMPO`7^f%JJ7kfV$xnVfgj7!G&qSE~=C7Rf0zGm7b$C{f?J@y&*sSL1RE`&F16JoUAb~eI4 zI|{hQmR{J@HV}r(s6`@EgNE8=_L@!|5VxLPaMecCmI_wAm9xOyT*T72#HD$F-8HsD z+aU8v20$cWN{y8v&TTwtc|hLBWCr)^j^U?w)=zAdfKzU9M(p5lmaMOGnK_B6d{Wc1 zNIedwcc2A#el00O+EGNGl`ZhEYm5vQzO*jDienir^1+ztx#dm)df8#&22WV(x`t0EQhmTbH2}3=L6%pe3^C+$kB+ zfj#p_JKZzNp;pqaBC-BH6R(3TPe6$cRy01pT86RDFLB%hBi<3A?#?dl5RXI3)7zjT z1Sd=)@Bw;eQ9)7b)7$oesb1tFK^WqbBEn<-*_bTXFF$)U12xQvYStb3Fq`z=DyT;X zHW!CnkMBLa8(P$7&Vy?Rk3NYP`@8ENe26kQ>4=6jjvkzrWH!WVuX!p6?=|`)N;}oD zs75k0+vFHZ9b3yN99;2htSHCWBsQvv%RK!x-7lu?tz5&y4^sIw@9eW^wtm44(Chk@ z$NZfi7e^VTc3%_Yznw6*o&zUgdQb}Xp!k%7)yg}(u|aGc%nd>$H%0H#iQ1CGZc$Zh zn3}so^Dz>ct$?{SDcg03`5-fY=fH z+HJqtkhl10^)4M?Kgi21-33G(BVfckomzU}Vld*m-NMb>7qK?&@aSyJyCl7-sGr_E zKNONoYhMgzyUg3fv?vwSMBPrrX7BItrf$QmJbKez9bQ7VYS#qGU2096qt;C2PJ%|s z(TfeP4Lqy*rj8Va%6kg(b?ctJ|h0EIqjG-AZfmWaB1P z2$eAEs0NPdfYM9N=l-=Rc&Z`#C*(YaPaeVdYg_&J=XWZCNG%2?;vFIc32q&`HtBSO z8*-z^U;+g)jW4*af!z0qOYo+PGQm02~~m_TDi-_pwG}bY*KGwBJ^zlnsX?I>=YZDxrwIA`i!| z6}LUqtNCTJX6tm4o>c912wO&1t^6{hM~qVsp-cF83gwK1iKc-+QwN(OFGfeCV#v7j$+e41WBBAV5QQ3|oL55Z`7 z;6o|2KmL&RL^#t)K_II{mdNJZvWAp2MPSffzMARn)y>k(fZKGRB$o&Mhd&q+ZvK#H zjDgtO0PmB%R+_na4oB-X{_IrMV$>>IztNG5)cP%)RF95Hw~HwK!W2^IHU6UdDN zNTr1UPOJD&2|e)?5Rtg%K%tc zbW+TXpp|8s0oGG`?&Eth&)#bKS23#f6^RNi{Q&n~zCHoZgWhaK=gZx9m4}j))Qu@{Y zY6!NPE7_418J{hvGkWi_%t#yCU>oHg)4wv&>c?W8*LC@9{)pwG%d>bX2hb%4=~-qR z+9?)18)NYR=vPDv6-ng#tHYOoN7**zuskk91rp#8)4%hQo$ziaVO^YPW;*eO6A<$6cWK`ySopZ$0f5N^WhLv}3Gg5**>T zX4Ul6c$rCLAoI0yCq^j9F}7j$91Pjr^{>c zE6;T&I{dbbuAaHKLwpAXI4==Uan9sm8&hs81$W(twqn3sA&;zVpT+?NTse2C17eSd zAiVwQm(dr`f1v6T$?Xx>jUW{sXa@bZc!xO;agm$RpaZRb($3e6z_@E9^aOF}@jwm2 zbviqaV8Q27g8Tv3N40>n%ys8mQXf@5%?-?<1MBe;K_IXe$>o)53>pIlsC`Rfj+jC3 zI>45_Q$qbLjxdMd+2t=IaFg1(o+5b`J2;P83$R~&<5=S=0IORxvPsiG9+5X_#9wq! zZjbB@4+dsbj{KUOLhB#T7%DFb@LW^;sBg0c`k<1SlLFNKq|HPvqRDuISXg%2ZX|qp z=;Gf7Ax8@;r4g``Lm?a}kW-%SfABt@x0%G7NW& zfV3?F`eDw~dqMKMz0wXvwc~@<>qMcWwjSNf_$^rQ0w8|7B4>ZSVbT$UtkX?hs~DIs zb;YQ|X89fL>~z6&bq@6SJW81@vkiK5YyGkVZSukPLG-6zLW4Q1cLGU0b|rxH!egFF zS~tvQuVT@9=#FYqXtn3`t-TWcjDqj?yXJ|nB1J9FnvR9)79L`#F4-c))V~yE39bJQ z{*UW&Tv%-1rZzWXm!rrvI`$Xg;!&8EQM3=>hW%ri)H2ON+0|MRdLca=t2&UMrdDFv z>!5;bp<3rR@+5UNBGRLzyU}%bmH;fj)Kj=~u(Pd{!XM|-dTmb$?&}aT`Q`dFUi=`J zgL4nnA6vBCAIUdFlyiu^Rb!Ix@K6{q__F4QDNn~+Nhg? zFQ%`I^%Trd3n-3H;O6YIN4Zd*n&(n8e;y1`T7L=qb4`!;7k_yRYRaJ9#p=jK^6s*W zMq+|A}k?<^Zd`OS(3EJzN%I>E80>j#SyjJqx>ctU!L(^7!Fj z8eHDW$JH`%iMzIR*51CMnFo|!6BRp*?{b7(y9L||ltz!S}k5M>akWub0qXfS;%z7gM< zKi{=>#1qdy|EDUYZu%6J`9#Ey{j&CY`K^~7iF@hR)dFaziiHeU2^dN}aLCFsrmc}u zt$fx`N}8%2N6Y>aX==dPWed!oU;`ABk;GAD2*ozKJ#e#tPB3i&orc1;O-=%5C%dMalOSd7go)rY{A70zA8jpExK#Y6R?0m#69 z4PU_btVPDcV?niCEmQL=*}wE0aK<4*J_rh1GZdKH{?*KqospUe`IirWafqG<}R(M+Ar*_|Z< z7IR#IHuNf7np(pxQX>5&r|P;`&ha_=s+2U!5K43xD{SPD2IFZgHnQw|$TT?$GjW^Y zP=i8{b~VB-#aGY?8zS1GO*{b)52Nz>?e7i)*4TpioeSBTW}gIrf^3ll)Fr1wC_B#S z%W5(tys@@n2uODD(c)p~fHbW_m9B=ox0|XW))y*98JA$(0;nf;7>@A&7?hWX;TJD5 zcns(aLkc8I$x9jSNeP~H=ZxtOEhO^$(+KbegfYlZ8x(6Ama;Shw|Tg*t853 zRnf4qdWCZlILO9}oJ+6|?BJC3^&&Uf8}O-_&>w!!0!Xdd=(8~?I5=Ra2+|koS!%n9e3#mkz;=<$q)m!Ft$Lq_C(1bw{A|9ThsS8oF z%vmdfHiw&NL~~dv7!5n#1+7RPL=Z>gv3-lIs6oLLjd3AF4qXmIRwHr9T4~HgF^vJD zes3Z^$Um8lqC><4~5<{aB!?a(Cgut&PKK(E>4vrpJ1{Ggw`3vvr)#I%m_ zf{meXn9n|MR>s>}V&J{N19Aknz%Map%SH)KJzRr=Rillh%RtT<&Z_>|;$ z9gNEI(PfT`ir27Aj4ad&7_^Y^*^vO~kpA7m18ZlJ=@7$MA6tr*DSGUbFFHH`-czXE zOoH`lHJ9)*L?Z9AmBkFgP54T%1K^*nwyUg1-KPa0MvkNDgf;ke{Y+OaJSim+CL`{jUC;27}SlH0$KsbdfOk{qOl(J4IGKv}4!kDRW zHd8kfp?b)`Og7tR-|B^o@Q_z|6mDcAhcFZzzcMpi2t(=I%rsYP(tyEA1YaL{Z4o+! z!|fV;+op)B5yvx%8r4;wv>L}_)5c=kaQ3JdZqFiXbD~kORTj(W+1wR8V1$o3q=ap_ zVjDFhnWyZL#u11gT}$H#fn#SqFr+5|RWgwNSymHq!P*0@@hUwyGljyhvJ?Zbf$Ln^ z7}jMxH+w4dMybtur$A}JT``q{BOBQGy)SP_iqL~pa6YshEOKO1I5w&>5?k~vc|8nj zMOBN;?~)cQ;g7K+Q7UJoHEUaG*i65QS--mtN2&fgkrH=7fTpHy0*`Hum-^sV1_vk@ zyTZKmCJ18B$7+iJ63y|+ISa)RhS_;Z%-tfDCWQWNZ5B3!Re!KAzFADmMHA><*bYn+ zxrGP#lcroWlS^dJM#Bm?lpRPVRMcl?5vX`n1=D_Fal5!60n$Ctk=~@zCwnYd1yHZk z16Juex|;PtF|ySx-*O7ESAjBb68)nb=X71@G21AaP{( zq_v6yOn1P64TEcfzG<8j3aiXE-!hP97RQ_Ix1{sD$y{dAY;>sB&uLwb`w|#t$Cj<& z>cBY5l2E#s&{`j=#i^OxC=;M7#-+j;WncLXBfD~V^!_eWAP^9l35=gmCO*~1h%gQ* zJkrh9&UOH2jQI{~V@T{q4YK80)wxOrwqqR&f`aQON`sgsV?zN{5|uJOh94qr0fIiX zP~dg}6ej_vE!fEPuTn};f=i>K0V^P_-O0vtVEakcLxrnKk(kFhYlPPD#h_2rv?nO_ zBZ^c4JUqfTClVQ2G;38Ayjn{|TQ)EVO1oCN79)~KYtq=Kf?CrE)?f%G9P^X6Ml6h} ziy{M?GNn-Cah(a-P+RK<3F~^W*(3@OnO5$};uQ}hROK)x?v(Njy7MrqdrO@9v0QF^n@2 za9oz4yBtxW@@3d|7({CYWQ4%)h%{hF$eOCxs<0i`hG3@rv1k#6%$VI~;l0{CK>^Bm zyf)k=DIlM=fgWV0M_NmxmFHU!?{LrAHQQE(u=}mgiFh58>VC@-?m{8&) z1~m9Ni^>0iP?yQsD2~L2LEt#a_bC=(!ESJ@L>PW&a!L3quTxru$gGF(b8gInx*1nDm~tmI)LCtK&>C=cS)4v>^0M zBVi<^mNEmz=do8hI1`oV2G~vzQaqA%!+?A#;YtK)f#qs9B7_`-vp7^@3UH76)8H9x zNJ8rpxB{Iskq$Ew!{`xm>p*Nj@lvL(IcZwSZ7s6n;`*~j072IaY$$R7Ym6Ms(zJS! zDrAZl)X_poWyGO35Ms%IcU%7Kh6orjw*$F5)KaLuUi3h1{a7JK7OkqMVrQjQ6DQEe z-j2M5PdhizAUT|iE#X+MBNX=|Lr~Tu!ej&2xg#na3u`Fv7e;P3nH?Hs=RV)?0upKh zMw#atN(d;2QFo-SVrTCKB-rEbu>cHv%R%Clji+oM=+FR^7^Jb9-t0OsHOnm&N2x6V z$)v!5*7TM=8ZA)pxI#2mA{jwf`Vgf8*}u^8zN7tZD~I+Cd|E z8LM5Xcfh0=c6TKM$X;!W91!K1A<69s#6-CGy@dpaGNeN9y+`cqd*eDuaGXZkW+G8D znm|Pb8_0~rQY@4F=2HSXbr6h0v3dp2PpKY9sANnxO|Rh90F5%C%Wm1M0XbTb7glSr zXwo1S)o3Ie7cN3&o7P^!w0O1!%jU_}FT|)SC9aN{u<;-?9Ty8WxlvMdO+dyoFGSH0X>ig@IH<6#QE4`D`Y5mM4}DE=359v=HWd zL{c9#9KgSv3Pxi3$%$=7$(r2ZIgb7TH1T16BXv;I4O5{5ygZv&(G}492eM)^J2OO2 zr>?-tSfR|cCB$}l;6TWFvxZTSf*6~DYz7<^UC;+FHE=Om&~>DRql-eZujqg%Yd8f< zbbPN>8d!I0mw-8(OJ~Kc;P_D6u;N9f6ykMOX|eI(iq)qTK9t<65V;JxVXF4 zLxcueW#>D%)m`RHlXe3jAto!E*ogSg@9MR2cUo31n4i!pz=|?!Ez?i}!mDF*0nUzN zw%m#(wx8_T>_*4RSCym;CR|&+lC@1|lzt#hw*;?HVRzA&#h<(8hzo|NKq*vTK%Ty% za+dJbSRi6+qAu;-EDx>P-fUKpNnvXqzUZ$%UfGHYb6I5edK(cN}Godx-6{tZ)X|+Hn)-7B8ZM#RLnx zD|E>}96iGA2jk`^&kt1D*92N>d#NR zRs?UfjNDzd88u-3%yJ) zy40=}GNtQ=iC8b0#-VvUcki4$B)V0MAI_*dlR(>H(NgV<=gf&6 zqQhEER!P*boCH!qADc7KAz&OP=r;Nl(C~{vu5fY|i77c8Ay+T9dbZi{c7WgxoFo)X zFfy2lsi5KNA?V!}>%w-Q(_Y@J1G*PQ}vm; zljsl@DS=SehBo9tMxsF1Z;-Szt>Z^#VJZ8>O#s5s3+_`SvNRhW7sxoZ5$;yMJ7aT` z8Ot!H(a}y|cEg?3sIf`h4jvE%IZF&>lgiP0{kxfB5xa8u(BfM;6~UyYL$Lv(tv5H3 zldv>qz*$6l*2sfMY)ke#DvXY+_fRpwIeX0{=Z(z-F)g#Wu_PkF&aaGv-hjg-Ct=k@ zC4)v1=1h>^_=00L%nF@@k(XUHA{(GNU=wGA#_(;m%d=pt6`!ogi|9ZF)4ZGrVho=P zjB{Z6N>asxs^838*#HwanE>0@k;n;%no2R%F$F{mYj8Fq8|ywwdl-=ZfMAA?=mhv= z7}{nwnVA-Erd^0zMV@p%6Qpwycd@=57S~#MB*4lhp^7XCkc}{_2WY;ux8dai6XD@` ztG!mtal%S7qQC)*ND_@n#6gykTlpfeaU7q*dB&ev@exEEgM8B0yvtzza2QP>c`=`y zOjg=89SZYRKtTLbCe*Z8diRMxRMCC1C}zUu{8T!n{Lmz|s#L-qAq9*^mv5ZM#+&c- zj09uj^uVnvjW`p;#C(&(Vfs69D%uE}Oe_M^b6gKTrRqipu0mKC~N=A>6Fa|{_h8+ruF3z2J6sQuD@Y9Iv z?ltvi^pvE@iJ>jFf{^sRhC{a~GJ4cH&wY zVyF5~0GIS`{7J}~5gI*Kpp#oLnHXG+)Kkh(SidabD1SzZj$5}QuY_%EYN^Fl^2#p) zR&L6za*g{%WfzHUqW%_(kC!MdLrqx4+Y4Ybc0hMjuGFgxhs~jC3M&m4;VAKi6SeQ? zKlfoCh_2(pfpEq!_jZtD1Og16616vtHHfSh`?Fws*BZEJ>Usg)& zWT`9uMHpr+#h=%EL~%M{z=#N0K5|R2!>m|8F&L0Hcj0ojXzU4vA!I%YKk9&Nt^nEI z%{AJLjBZ4rP>8`86D&*<%<@urQX0c1;+oY|p}UFOx>=CzinraRrp4nCt7VoZY%E}$ z7OwxwG#Zsvu+_4iy>6>l%}0aIs+=+~8WQ=&pIT|3!V_BJ zI)I}S|DoyTRfK~X*EBa7N{acR>NV}+I0ayujzOv2_)YAAhGSb}s4&uSnbBMM{AS0c zDT}-HA-~cYnRp}=KC?FJi>^E6ff<(Ing*b*$jH);G?c~~I_jxVR^+uZLN(lo6US{a zL@A>TEODic4#dKbVtj_vvHyrvbKpW3Sa(lw76_XGybm}phfzvmfCI_}Hz)Sint?UY zdXWm13{6wWbRGH*p)G7YMG6I1SYu_5m==xKDli$0TyHX(yZ?ENC8)Xl6^K*kx3BC8Amvy;b( z6gIx>sbT?oVRxu>?Fr3B)9SjywX9#hhL2@3CpJs>HVqHWu2r+2*=lrp6~TtQHeMWb z63!k1 ztC^muVcTYw=TVjW^uz>WwcjHv+(BeUX#fn=A9Zeu#p^dX9d}{drB^;Zp9KNW zfQBxbFu(0CmKo!i#UVq98@zZ_mG`x^3~anR1!6V^b!Yvmo+!1*nA;M zr%rPVQl6B=BH3(`iPb%tGSwdA0sED6V*Da|TX4+#%0qBd<%7uo**1)za%!m4stPU5 zDxr@sqS5%#v6I=3UprccjHP9UAXqw>J&eac!4lIOJ!GBBN-Q?PUS*4XMX*M7x1X7} zWRPB)pk8aI$CuVsjBepXkq_?herMx{9~?Q!sHMbv9VlXbM;Ra!ku%?PDI}Kt))@TE zi|sD0$PFGwEb0T1%?66j6yBKCGvC?c;Z-WF!ZB}hukq}-g*J|jo=^isu{f8hNre^g z4f{`!c2dyp2xz3hXmn_FqI47xZF#UVgAa0#JVKm+)4GBpDHtK1q5}hRDWb|EVs3Yf zuuk+mYOr1LmqFTR8}BFHmS-JS?0g@B3ZhDx38}o5A9Koh3-aY(sI_#^I4k7^3EME59cDvTNXqzF@!Ti0#Clm99Ixsl zlAvz;zpR@Lv(rsi}B(Q>mMn>+NwsC zsO@dyjsu73@pH#{#tvv*D%i9bT=%IMiag4Sk2WiI0AN@M%ICM#Sp(*>@v}^prjYTF zoM(r*)vhvY!HIz;FxaHx+@b+BX)Y zQ>dWnP~eOrE9hn`D})!S@oMogeA2H_8T{cVh$tjij0ltBiv+-JCISwbG6R7UhVrB? z%vw5PdJcV1_7Pie!$PraMWhX$cOz~xzv&d(K*-rX9@2L7(pk=qht%&F+M|9cx*yVt+GIYy>wsw5^t0L+U>H*mNB}alei^~ zbsj<~s5qOGIS=N<+(fy3YY}WaP*rOzQbobY2VSK{hv_IoaJ`?VC%hy>P!Hjl(Zm5k zdL{)ZoI4r3$D&@zjNMrgH;Ioo1wt#Axs;qLl z*wdA9O{7>T!DTxU;iOL0Ub*9*-)gnh*GcOiw zs>E-IEruF2Y-Nx~Wq-r|gQIqDn2eD92w4UBY0h3HHypuMmzD}i9;jl;Q#Rc$P~1t( z?1=4v;D_;;h+^)uBwI$f6Ggr_bx9WzKp30|AD5=6N!~{m4`>ZM`kD5HJp3dqWzdER zzyX4|0YqtCtn}q8M1n0rgdwQE?8V@|>eg9m0jASk`aA7Yut6>E&#+3_>U8rahq{6VqX6(2Tq@+I!}qo80TLp0)k zp&tGi3x33|NN+tLgWa@8(>Ni*fc?&cyAF!bXB(GsUxX*(#t`AAW2kNI1@!G2e6MRk z4!oSWpdsPbU?rmY+lBT9Xsc_jc@SXZ#D2_E&N^~>I)ZOMAPajwENr?7U5o@#-nHhCX%H$P?0I9kv!I~RJ;Q&k*5-YIxY#&priS3Q6zy(+omrpJs zRysVD~f%|hhtlS0tGqi+(?L#wb2iSq(%Q15+swQAVYRiBR1jX1eMQlD2 zN5L{x)Nu|U@&l#xW60Jo2B`p>w^Ps}NW)#d%l{ZP*YJ#t7Bm4iKs;hdKyXcSnasoi zW8y?rGR|`O#cOj(1%VuMUKA7%o#7OdEk?XLpOLMLHOTh{_{fU@;)LzO^`m#^6!39o1S`0C(HR}E>5`vq zBA+7F~~rA+Y%)NvIkILqG6Kd5o_cS2j8?{jVEub)PuDd3K}qbyj21C zxA9PzzG7=;H>AR8k<}c+4mtIS1#O-}Gh0L%d&037uZYrB_)I*c-iz3cZ9%~xq30f3 z?IIf>usrK1WuvrO9gr<7;1?{5T!Z60vVC?*EmYQ&p#4bok{!(S1&gxj%<0OQp`$wF>%Oq~7+7?e-G6pH*S}7A+q=Uo$2}x%h(^@80K_Ye=)?`%E zBJKi#sgI^X`!ZPbyzo~npCvAEumS_p>!Su$Zd|dVVV}tXrl~;unwUkogs4=U99EsZ z@g8fCppatX(JmPnl})JW*b<|)V`v_Bi2NLfIAK6_1Y@zn8^Ud1LmDz~1a%s=AFqSy#T*W+vkbYmUOp&-+ zST^2usauaUMyx+x3&BkM|!~4Er;lZ_e(^&)TzjzqI3CrYmP3%jbHrvQH2Z_aVd|@2xa8(D6yWWHPScUNRVaKUc;Hwy zcX-6ZAQ|uCm&1`iLn8FRUa6c>BL?M6yLPhDnAy6Y3bCUUpK?a<}V~o zD0avAI2%b1e$2{CoXykz@?sE*#{ZU9LQM>a%`^V!omPcELY!8#{8*Y&?|7%b7SsF8*DmG-AhZ zl8C&CUb&sv*vu!g4#0Oc>?#aUsC@d31XR|Tm|;my9Y5!ggeK$+3L{NNKj)QJ96MKb z1S2s6XM%6M^b7r3dSY6Vt;we^T``?dulW5uW7EptpS}CpRq2L##DkHd9HF!RBBi|4 zvm3a9F1<}0$AU&W(=-YTJ{%_hQaYnR^>k_slqht)mo&d%G;24Pc(ucrXRhp7iIt0L zkx;x!!=IR6Y2`ytydWB?9;-()Gr_Wo38zaGRgUt9)m5=#M<$n1=~cpitLHZY|0HH2 zls%;QN>EFLupT=?JCB`qwR3t{p<`R|)x@k$=y%2jFNB@AR;$w3>Kxl;CQv|V<&tM4 z6EooZ&3o9{E~o)@HE~HG&(_bC4U`8I9h;Vx&bwCEYqYXDN4ZYRat)r%EGx|zxjz2j{IgY0 zH*nDH1!Mor#oOcFxo_M*?z?m6Pu+fR@Vff;o%cTf)YaR&HT<^m+uiHpZua)$PhZ?m z-v<5sV(xzUqxYZx|M2*Ac{Q3lZx`Ql=k0|*eQ|g9Up#jGzFvC$dcS{-e&2oGxNqLG zxbIxe-k#h~-|pTQ^W*i$x2<2#KKu1Hn`yxmPABgd}Oegbb#ob!q zX#LQNoWZmO1L<`ZW3IBr1u3tVg4!aPtMB-&1#4?Ky(kEwUk^ns%9_~A=_XS>d6vBb zK^}OO6@pH{>R;&f`!a%eYn4>tY&cBP1EN%HHpEWIKOm*$Rk zeIQ_XHRnM%+`GF0*pIhRYHKC{cm(QEJ>BSl{%Y#NRjBfB=6lT&9NwR z(CX6(YXY#-*`E-O^xelQ9KK%t|E9!K{e1XZK`7?;{k+WWosHSgh zZ#vHy4t9Nd(3Fm}kV=smlFF?_{Sfc#ek1y54!WYi{5E{wn!{8VD!8zKJv8(d?7@?oJMw^jTUE`S1A|cZGK(#%V5f59VWApl?;Xe_g>%Vm)kud?_<`bQSKO(<#@Dz#FjRcuvOmH~eS+fV7 z9(>%`3?F~~#0HfE(onB}0*RiZ|M<4y^}_Y{tHrnD-FL3WAOC*6+>^KFuSfUoPj20>-Ho0@ z+&6#a&G)z8TmO1Lzy9Pk%+=<5?!3?9zPh^j=Ek@4yzhL|_P+6&$m`cN!u|T|(d*YI zJ>0jh4u0+LS1+Iay55>+=i)aob2Y6;_J0!Y&P7}KrZz>)DlHksAmN}60Y-53RTbMt z_~#MRMJcWG^i}mbR4ahEx}O~vd4*WFB_qomD+--U3Pm0GNlh@^K+a&!QJmF2A2Uiz zGZNyG^VR^s$_uY9WzuN=H7`ZMX{B*`eiqWIrtY%0r79tpgIgFoiU@SjO^Q{@tupYr zvUcu+fc2^{N)gJGp`3?sOCbMfUGUFYi^2F)^M!oMNOx)?ed?{&Jsdmq7O+Q}M=FL9 zuax&dj%P^Jn@@X>IBlPMC5|q_K0&e;Z!nM_2(KK2%kh$DeIXmD`-=6yhyE$*I}yoJ z0-gP9+6TN9l4cezOCYfAaNSyh+@3ozV=8ZWJ#;9#EJ%n#KS`^}Sm!x9`B*=e_rvPnHM&36LgOhmdY@H4(T z#AWckc;p13Bsw;9pJVk()0G{EMd9X^p?App?hXxb>;Tvyd@QBR|5^=m` z5wWfgIbrbA6=jE1-et7z+n{)i$uJw7{7*%4%gub=L9xQ@@4e#i*WW) zjTyGr%{xb05`|?l2dPPtsK-z|If_ zia$=6@Jrjd533C zjm#yaOClcb-796Y1k5izL-KUE1`ZbN1Z)zkbxac)uwsj*(d()ahWaIMs8guY^M>4}=0*q+b}j{YG_}|JFjt7X zaEqvx3T{>CNy*V2gxlP4*~1fMIaMTI z=9q{U<2g+$SU1~Ui4lb+PYNrUv~yRVsQSpD<)`zkuKXR<{0K?9dMXeBSnkZ>S3VsM zoJ9pG)N2=1+64PCdznRwFn8|%y|2J)G^|9q=_df4)-u#}|zrV{F=pVMr&j$bA zd-rr6l)T>k^S9>hN3$0dA2(;Q{qY_5J~aEZzfW)e%A7x);Aew;$Gw_-+TW))KXmxn z%ia5=*@s)x`-gkq^=3{yD0qk4c=3$xu?fUftsi{XmtCP=SZa+k_zbyT(Z|!O^9k%t zuI^wDmmEpiA1I54UYt^Qd%&mQqdE{z7>;}Z0l-&6b;hmwp8-&91b=I|U|0t2s*61% zhX?W)#PxTeDq%XC_%^In0G^%rIF+B4&g6~xcuj60uQQPs5`=wxw_t`cw8MO>qOeSzx$1|H}i6Y&2-f*I;X!2{MMUjP-jH=r?1Ll8120TLN&RabEeShv)TT3dg=erUkHW@cG)Y<=zp1ISTZ)OW5QwiECJ=$Ka+% zR^<`ocn#|?Qju^mj4O@s#*BAoA*N0=ZlYtR!vj=#d_%NovK#RnR0nG6eCgy6{Oo)9TcsZu&ULg%zbNswFu=hpXY7O!_ddH+S#M%kiR; zY>?i`$MNOvV#3!ZfXdZ>0J*0=z$CaMcU|Gd;T;QnD}Q~jm)~Zc`+Sq(4>_fXZ&ENXI2A#Of!_$5v^oz2o+`JUI#qadhD~$A?U?*1@b}Q!)vVdkP@IGt zn2Txhvo7>K{Lx7-B51=drCd(CV`A$@o;CE<1zgP)6vVoekMrxkAaq^DZ5;-yJfG`* z)gu4QGgn~Spz;3*YUabPcJ}Y`!b!C9nX3ZnYG+hFr%=b`M|#lVz2_1*TqzOWg6Pqi zOil)$_A#}NXjk3rpyM6I;JwPvJ{v`|_ly+;bB8`(>J<0p-&ICCuSe*P6do0ProYEU zs|&x%M%mD3GXJ#OZ-4U1JNL5vVdndM$JN^$w0o-tdP{?zW^BfLQMmxvqm=*Z%nq;` zMfeZzzSoSOW*x_@URsRd`1Kf6(4%*5YIN!|hfuBTmB7{+cDQogS7#k1*N+1s>-dTW zbyRQ*hVJg-61v&)uU+nwIx^nRjq11~JkpWUnaXT{{QAVz=7SEYX2;_xNlL-@?=-Wy z*z6IAITK^DZL_JAjox-u40jCpO$gG=cwWe7XNENMajTue>CAcJY>O!9$sU(@z~@5#|LN-=Z+`dNSHs6BpWONgTU*Qw*&pBW z>JwDI6XNmmlIuf{ubY3C5ch<>X}O&|hWhoU^W?i){yjVWIM8(W@#a6?JR9lb=$}sM zzwqX#RQfp3pB((N&G>My_aC=*%+GFqxOa{FUGGk>A6tIt@FvcqT}{5{-Ot*6GQqz` zvtOHCUH(^0_&d9sW*-S)NQKEx6-hna5PSfH4=0qa;EgP<$e&RLb_#ll_OxP`H~7XxMpLPOog^TwMLRFR?p8&Z{?7w@lTsXVeg{-%3n%#e=04cyM~UmT(|lL1u+Ig{R9t)Z z@*`gyW~U$dxZy)fyv_pOy}|46n^v5@Z(m%Amy2e3;0cZj{T;zg9cd-I`cyt)s;w0ENPL7$EUyv{9u z-d`VI;&wxncPY#V*L~JIF3Oz)PA=X~N*?0%J(hQ{{w8_X8hi%iJ&y29D8Dw$H)Y;e zFq-r}pL+GyS90Fli2^+iI^XTaoqX1In`Z^D=CH~OS!i=0mo6{ zq`1uRz#+mwzgrmO}PEQqsacRQeuKD~d55&8fq;_!v}* z@*w}yTc6Cq?)YL;bh=aj)IXVcN(xT9KGyf4P@`n65|=mcbNrLi)b#sI?s1OxQqC$S zX~;c@d%P$*NO0jQxZENCP$S;%9x5G<=>#r6>Or+}$SZ(#RAz3YO_iHhVefY3Tpp?E zGX$50;o%Fx@Ngb|<+!MDwuP4kD`3Z|nrvdaXj!~<6b!m;HBVQC=&1-kt)f%y*^ zsv=_EpTkL|>PTErfO;LnamHRHYp18RiyS~<-(?s}G|Nj3o@P8i{H%oP9GB7Av-;w+ zn(u?EQL(1z)eQP7G9G&pVm^b_!IW3TN)pX+cHG`f#tJr)um4(s@cY$>X2)N4PdSnmYtq#j_GF{?w&*}-s{UM z^-`j8tF0N&tfabS@K5F2y0X9ghRkeQ7GvEA^yAHW@M!o#eji)zlRw*ZntklG>yP(d zBYo_%mXCY$;)i?pC?DE=XR~?z@#?R2w{!fg;gdS|+s~WLWM=;7-kwI^-SWE|elzvn z{I0iubvfU3`H$9eNB(s7-%M&+eP7c*J^#-(?s4xP=W*}u@Nw@St=$a%4>WL-?*AXU z`{dTgQRn)<{^s`${OKT{y!xlwr5}&JhTs(#UtvU5Ob#7BPW*+Ce9cdLRW$(NaX7=E zTQ0*~Y+uLSREFko$;-WXB$@7pbI^6F+13!TvCM?DW_ao4h6wqBD$)*jUiQ5{>0X36 zfMV>-BkJpj?N#G+t<^H}vQ$~#LEoJ4YfV?PY7+(U9m-w!CWfkzcfa6pW1phF<#}IU zQ+e|b?snn2Z&H6x+<%SA!6?by_uF?^?Dt8yf4ZCRDvcQ)EG#&De=g{B2b!6WgtVO8 z0VTHfe46Q=T&+5}>~nu7G4lqjufBl6_e3jZc$_Fc&HA3VpgKeV+u6s!;hkx^xrE)1 zyw5!A(|voj^OZmz+p`p1m6`V@`2K3v2SDMHx8s(tk0QNz3GDsGjr#C)pam3W$Js8| zHEZye%6;6qP~~DdE{)kezZmom)2?>GaumKl`-Mpx*=RfRuQ;spRW#qq zx{exD7wVkhdlY6O0`IQbTfOErY+r)rHq7zpYrW6%=Br&_k>qp(!lz*W&4;{NO>X=Z z#i`=>!^z~KabFRA4)TukuFgoSgdHh7sk9GH-z7KGjLH%wm<7Bq`s!@B>FMRaM-Z-N zymHL>tQvQDl||o7H^hCTMtl4$?Y<^API;-x>sY1-cbPF>IPHSgFD{!xZU2_laaUfA z1R!2#F+NSj_t|2hCkUS(cJ1ef^Tx9Ug$tC|I&H2rb{oooDWuqM+FTl<^fS>H`hfbg9E|Sl~RX=loi2)O-x!FpY%P*6k&+Hwyhb;^KG zMuK*pXUr|(!Hwv)l3M+!1zhgXnzugfuMUCN(%Tc?^KVQr6mxa@;+cI#+M`h4s&B3q zeHE6Jh>7-QPRe|g`P8d#tG*qJ5m4vU*vyhp^#0mUbK+8uDw3kTN`c-5{S3L8e+ErG z@UfB{dM9_zS*O#ie>6uKu)1XP8hhFIwZ;v+Hqj?|vQ=ue)%k8SlEq2W@<|4-*Nnlx zRM3+v@7{DK%;$?_m}SPqpgdZi;-9OFVp-At9hCb-y6U4%|KGWHu?PyHtm~D;#kfB8 zv4VU$iW?vUl~Py#IPg9L^=xFH1$a%O%3@)2r9m$4(Zr2d0QC%eICP{BH}-8i&F&sa8kQ4aoUo5x| zp{K)~Dp|7pcmMKV{N;c1&;H3j`-}ej@Bik1`d5GV|NY&6`0{su`4|2Ff0(=b$N&5P z^!NY#zx?)p`(OY0KmYCj`G5V#fAhz``R!l-yFdQx|M>6!kN^GO{`PPG_&0z1+rR!# p|L$-9?O*@vKmL#Z=5PM=1.19.5 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (1.26.3)\n", + "Requirement already satisfied: scipy>=1.6.3 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (1.11.4)\n", + "Collecting jarvis-tools>=2021.07.19 (from jarvis-leaderboard==2024.1.16)\n", + " Downloading jarvis_tools-2023.12.12-py2.py3-none-any.whl (975 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m975.7/975.7 kB\u001b[0m \u001b[31m6.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: scikit-learn>=0.24.1 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (1.2.2)\n", + "Requirement already satisfied: pandas>=1.2.4 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (1.5.3)\n", + "Collecting rouge>=1.0.1 (from jarvis-leaderboard==2024.1.16)\n", + " Downloading rouge-1.0.1-py3-none-any.whl (13 kB)\n", + "Collecting mkdocs>=1.5.2 (from jarvis-leaderboard==2024.1.16)\n", + " Downloading mkdocs-1.5.3-py3-none-any.whl (3.7 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.7/3.7 MB\u001b[0m \u001b[31m40.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting mkdocs-material>=9.0.5 (from jarvis-leaderboard==2024.1.16)\n", + " Downloading mkdocs_material-9.5.6-py3-none-any.whl (8.6 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.6/8.6 MB\u001b[0m \u001b[31m61.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting pydantic>=2.3.0 (from jarvis-leaderboard==2024.1.16)\n", + " Downloading pydantic-2.5.3-py3-none-any.whl (381 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m381.9/381.9 kB\u001b[0m \u001b[31m44.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: markdown>=3.2.1 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (3.5.2)\n", + "Requirement already satisfied: plotly in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (5.15.0)\n", + "Requirement already satisfied: absl-py==1.4.0 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (1.4.0)\n", + "Requirement already satisfied: nltk==3.8.1 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (3.8.1)\n", + "Requirement already satisfied: click in /usr/local/lib/python3.10/dist-packages (from nltk==3.8.1->jarvis-leaderboard==2024.1.16) (8.1.7)\n", + "Requirement already satisfied: joblib in /usr/local/lib/python3.10/dist-packages (from nltk==3.8.1->jarvis-leaderboard==2024.1.16) (1.3.2)\n", + "Requirement already satisfied: regex>=2021.8.3 in /usr/local/lib/python3.10/dist-packages (from nltk==3.8.1->jarvis-leaderboard==2024.1.16) (2023.6.3)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from nltk==3.8.1->jarvis-leaderboard==2024.1.16) (4.66.1)\n", + "Requirement already satisfied: matplotlib>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (3.7.1)\n", + "Requirement already satisfied: spglib>=1.14.1 in /usr/local/lib/python3.10/dist-packages (from jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (2.3.0)\n", + "Requirement already satisfied: requests>=2.23.0 in /usr/local/lib/python3.10/dist-packages (from jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (2.31.0)\n", + "Requirement already satisfied: toolz>=0.9.0 in /usr/local/lib/python3.10/dist-packages (from jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (0.12.0)\n", + "Collecting xmltodict>=0.11.0 (from jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16)\n", + " Downloading xmltodict-0.13.0-py2.py3-none-any.whl (10.0 kB)\n", + "Collecting ghp-import>=1.0 (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16)\n", + " Downloading ghp_import-2.1.0-py3-none-any.whl (11 kB)\n", + "Requirement already satisfied: jinja2>=2.11.1 in /usr/local/lib/python3.10/dist-packages (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16) (3.1.3)\n", + "Requirement already satisfied: markupsafe>=2.0.1 in /usr/local/lib/python3.10/dist-packages (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16) (2.1.4)\n", + "Collecting mergedeep>=1.3.4 (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16)\n", + " Downloading mergedeep-1.3.4-py3-none-any.whl (6.4 kB)\n", + "Requirement already satisfied: packaging>=20.5 in /usr/local/lib/python3.10/dist-packages (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16) (23.2)\n", + "Collecting pathspec>=0.11.1 (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16)\n", + " Downloading pathspec-0.12.1-py3-none-any.whl (31 kB)\n", + "Requirement already satisfied: platformdirs>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16) (4.1.0)\n", + "Collecting pyyaml-env-tag>=0.1 (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16)\n", + " Downloading pyyaml_env_tag-0.1-py3-none-any.whl (3.9 kB)\n", + "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16) (6.0.1)\n", + "Collecting watchdog>=2.0 (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16)\n", + " Downloading watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl (82 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m82.1/82.1 kB\u001b[0m \u001b[31m12.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: babel~=2.10 in /usr/local/lib/python3.10/dist-packages (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16) (2.14.0)\n", + "Collecting colorama~=0.4 (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16)\n", + " Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", + "Collecting mkdocs-material-extensions~=1.3 (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16)\n", + " Downloading mkdocs_material_extensions-1.3.1-py3-none-any.whl (8.7 kB)\n", + "Collecting paginate~=0.5 (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16)\n", + " Downloading paginate-0.5.6.tar.gz (12 kB)\n", + " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: pygments~=2.16 in /usr/local/lib/python3.10/dist-packages (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16) (2.16.1)\n", + "Collecting pymdown-extensions~=10.2 (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16)\n", + " Downloading pymdown_extensions-10.7-py3-none-any.whl (250 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m250.8/250.8 kB\u001b[0m \u001b[31m26.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=1.2.4->jarvis-leaderboard==2024.1.16) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=1.2.4->jarvis-leaderboard==2024.1.16) (2023.3.post1)\n", + "Collecting annotated-types>=0.4.0 (from pydantic>=2.3.0->jarvis-leaderboard==2024.1.16)\n", + " Downloading annotated_types-0.6.0-py3-none-any.whl (12 kB)\n", + "Collecting pydantic-core==2.14.6 (from pydantic>=2.3.0->jarvis-leaderboard==2024.1.16)\n", + " Downloading pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m52.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting typing-extensions>=4.6.1 (from pydantic>=2.3.0->jarvis-leaderboard==2024.1.16)\n", + " Downloading typing_extensions-4.9.0-py3-none-any.whl (32 kB)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from rouge>=1.0.1->jarvis-leaderboard==2024.1.16) (1.16.0)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.24.1->jarvis-leaderboard==2024.1.16) (3.2.0)\n", + "Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from plotly->jarvis-leaderboard==2024.1.16) (8.2.3)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (4.47.2)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (1.4.5)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (3.1.1)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (2.0.7)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (2023.11.17)\n", + "Building wheels for collected packages: paginate\n", + " Building wheel for paginate (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for paginate: filename=paginate-0.5.6-py3-none-any.whl size=12666 sha256=517456dd89a7c9640d4e4972a0d06e84b29d559715e835d6809eb5d5b218feb0\n", + " Stored in directory: /root/.cache/pip/wheels/47/d3/18/0b5bebc873f29bea61fedece1e92cbcbef416839dfe5bd0eef\n", + "Successfully built paginate\n", + "Installing collected packages: paginate, xmltodict, watchdog, typing-extensions, rouge, pyyaml-env-tag, pymdown-extensions, pathspec, mkdocs-material-extensions, mergedeep, colorama, annotated-types, pydantic-core, ghp-import, pydantic, mkdocs, mkdocs-material, jarvis-tools, jarvis-leaderboard\n", + " Attempting uninstall: typing-extensions\n", + " Found existing installation: typing_extensions 4.5.0\n", + " Uninstalling typing_extensions-4.5.0:\n", + " Successfully uninstalled typing_extensions-4.5.0\n", + " Attempting uninstall: pydantic\n", + " Found existing installation: pydantic 1.10.14\n", + " Uninstalling pydantic-1.10.14:\n", + " Successfully uninstalled pydantic-1.10.14\n", + " Running setup.py develop for jarvis-leaderboard\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "lida 0.0.10 requires fastapi, which is not installed.\n", + "lida 0.0.10 requires kaleido, which is not installed.\n", + "lida 0.0.10 requires python-multipart, which is not installed.\n", + "lida 0.0.10 requires uvicorn, which is not installed.\n", + "llmx 0.0.15a0 requires cohere, which is not installed.\n", + "llmx 0.0.15a0 requires openai, which is not installed.\n", + "llmx 0.0.15a0 requires tiktoken, which is not installed.\n", + "tensorflow-probability 0.22.0 requires typing-extensions<4.6.0, but you have typing-extensions 4.9.0 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0mSuccessfully installed annotated-types-0.6.0 colorama-0.4.6 ghp-import-2.1.0 jarvis-leaderboard-2024.1.16 jarvis-tools-2023.12.12 mergedeep-1.3.4 mkdocs-1.5.3 mkdocs-material-9.5.6 mkdocs-material-extensions-1.3.1 paginate-0.5.6 pathspec-0.12.1 pydantic-2.5.3 pydantic-core-2.14.6 pymdown-extensions-10.7 pyyaml-env-tag-0.1 rouge-1.0.1 typing-extensions-4.9.0 watchdog-3.0.0 xmltodict-0.13.0\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install --upgrade git+https://gitlab.com/ase/ase.git@optimizer-tests" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "y0cmiCNb870a", + "outputId": "93bbf0d7-5fcd-41c4-efa4-fa62787de752" + }, + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting git+https://gitlab.com/ase/ase.git@optimizer-tests\n", + " Cloning https://gitlab.com/ase/ase.git (to revision optimizer-tests) to /tmp/pip-req-build-qdlv58l1\n", + " Running command git clone --filter=blob:none --quiet https://gitlab.com/ase/ase.git /tmp/pip-req-build-qdlv58l1\n", + " Running command git checkout -b optimizer-tests --track origin/optimizer-tests\n", + " Switched to a new branch 'optimizer-tests'\n", + " Branch 'optimizer-tests' set up to track remote branch 'optimizer-tests' from 'origin'.\n", + " Resolved https://gitlab.com/ase/ase.git to commit a9012957be4fe649aedef9e8e626d332dccdb83d\n", + " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: numpy>=1.18.5 in /usr/local/lib/python3.10/dist-packages (from ase==3.23.0b1) (1.26.3)\n", + "Requirement already satisfied: scipy>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from ase==3.23.0b1) (1.11.4)\n", + "Requirement already satisfied: matplotlib>=3.3.4 in /usr/local/lib/python3.10/dist-packages (from ase==3.23.0b1) (3.7.1)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (4.47.2)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (23.2)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (2.8.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib>=3.3.4->ase==3.23.0b1) (1.16.0)\n", + "Building wheels for collected packages: ase\n", + " Building wheel for ase (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for ase: filename=ase-3.23.0b1-py3-none-any.whl size=2422389 sha256=690f31bc0a6ec0b051471247bd57b46af596e1a213d836cb40460a4c733b6190\n", + " Stored in directory: /tmp/pip-ephem-wheel-cache-u_a9z7gg/wheels/02/41/aa/7f35c006fc1c7a98036f78766e96ed43a92fae3dfffec81fcd\n", + "Successfully built ase\n", + "Installing collected packages: ase\n", + " Attempting uninstall: ase\n", + " Found existing installation: ase 3.22.1\n", + " Uninstalling ase-3.22.1:\n", + " Successfully uninstalled ase-3.22.1\n", + "Successfully installed ase-3.23.0b1\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install numpy==1.23.5\n", + "# then restart session" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 423 + }, + "id": "m_m1uNro40XM", + "outputId": "947d8f84-4250-43b1-c27b-9305a3c1ac44" + }, + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting numpy==1.23.5\n", + " Downloading numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m17.1/17.1 MB\u001b[0m \u001b[31m35.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: numpy\n", + " Attempting uninstall: numpy\n", + " Found existing installation: numpy 1.26.3\n", + " Uninstalling numpy-1.26.3:\n", + " Successfully uninstalled numpy-1.26.3\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "lida 0.0.10 requires fastapi, which is not installed.\n", + "lida 0.0.10 requires kaleido, which is not installed.\n", + "lida 0.0.10 requires python-multipart, which is not installed.\n", + "lida 0.0.10 requires uvicorn, which is not installed.\n", + "pymatgen 2024.1.27 requires numpy>=1.25.0, but you have numpy 1.23.5 which is incompatible.\n", + "tensorflow-probability 0.22.0 requires typing-extensions<4.6.0, but you have typing-extensions 4.9.0 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0mSuccessfully installed numpy-1.23.5\n" + ] + }, + { + "output_type": "display_data", + "data": { + "application/vnd.colab-display-data+json": { + "pip_warning": { + "packages": [ + "numpy" + ] + } + } + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "!wget https://figshare.com/ndownloader/files/40357663 -O mlearn.json.zip" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XTOtokdn424A", + "outputId": "7ebef737-b988-4633-afe9-edef24a92cc4" + }, + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "--2024-01-29 14:08:23-- https://figshare.com/ndownloader/files/40357663\n", + "Resolving figshare.com (figshare.com)... 54.155.30.132, 34.249.162.182, 2a05:d018:1f4:d003:d154:8468:3af7:d7f0, ...\n", + "Connecting to figshare.com (figshare.com)|54.155.30.132|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://s3-eu-west-1.amazonaws.com/pfigshare-u-files/40357663/mlearn.json.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIYCQYOYV5JSSROOA/20240129/eu-west-1/s3/aws4_request&X-Amz-Date=20240129T140824Z&X-Amz-Expires=10&X-Amz-SignedHeaders=host&X-Amz-Signature=ffe714d51f8d6abe1cb20ae7dc8b12d39d11210addae408d0b6846dfd870f38d [following]\n", + "--2024-01-29 14:08:24-- https://s3-eu-west-1.amazonaws.com/pfigshare-u-files/40357663/mlearn.json.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIYCQYOYV5JSSROOA/20240129/eu-west-1/s3/aws4_request&X-Amz-Date=20240129T140824Z&X-Amz-Expires=10&X-Amz-SignedHeaders=host&X-Amz-Signature=ffe714d51f8d6abe1cb20ae7dc8b12d39d11210addae408d0b6846dfd870f38d\n", + "Resolving s3-eu-west-1.amazonaws.com (s3-eu-west-1.amazonaws.com)... 52.218.56.227, 52.218.61.195, 52.92.16.176, ...\n", + "Connecting to s3-eu-west-1.amazonaws.com (s3-eu-west-1.amazonaws.com)|52.218.56.227|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 2542319 (2.4M) [application/zip]\n", + "Saving to: ‘mlearn.json.zip’\n", + "\n", + "mlearn.json.zip 100%[===================>] 2.42M 3.24MB/s in 0.7s \n", + "\n", + "2024-01-29 14:08:25 (3.24 MB/s) - ‘mlearn.json.zip’ saved [2542319/2542319]\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "import json,zipfile\n", + "mlearn = json.loads(\n", + " zipfile.ZipFile(\"mlearn.json.zip\").read(\n", + " \"mlearn.json\"\n", + " )\n", + " )" + ], + "metadata": { + "id": "cLYOlQDZ44yr" + }, + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import os\n", + "from jarvis.core.atoms import Atoms\n", + "import json\n", + "import shutil\n", + "import warnings\n", + "os.chdir('/content')\n", + "elements = ['Si']\n", + "max_epochs=100\n", + "models={}\n", + "for element in elements:\n", + "\n", + " benchmark_energies = (\n", + " \"jarvis_leaderboard/jarvis_leaderboard/benchmarks/AI/MLFF/mlearn_\"\n", + " + element\n", + " + \"_energy.json.zip\"\n", + " )\n", + " temp_energies = benchmark_energies.split(\"/\")[-1].split(\".zip\")[0]\n", + " energies = json.loads(\n", + " zipfile.ZipFile(benchmark_energies).read(temp_energies)\n", + " )\n", + " train_ids = list(energies[\"train\"].keys())\n", + " test_ids = list(energies[\"test\"].keys())\n", + "\n", + " train_energies=[]\n", + " train_forces=[]\n", + " train_stresses=[]\n", + " train_structures=[]\n", + " for i in mlearn:\n", + " if i[\"jid\"] in train_ids:\n", + " # print(i)\n", + "\n", + " train_forces.append(i[\"forces\"])\n", + " train_stresses.append(i['stresses'])\n", + " atoms = Atoms.from_dict(i[\"atoms\"])\n", + " train_energies.append(i[\"energy\"]/atoms.num_atoms)\n", + " train_structures.append(atoms.pymatgen_converter())\n", + "\n", + " test_energies=[]\n", + " test_forces=[]\n", + " test_stresses=[]\n", + " test_structures=[]\n", + " tids = []\n", + " for i in mlearn:\n", + " if i[\"jid\"] in test_ids:\n", + " # print(i)\n", + "\n", + " test_forces.append(i[\"forces\"])\n", + " test_stresses.append(i['stresses'])\n", + " atoms = Atoms.from_dict(i[\"atoms\"])\n", + " test_energies.append(i[\"energy\"]/atoms.num_atoms)\n", + " test_structures.append(atoms.pymatgen_converter())\n", + " tids.append(i['jid'])\n" + ], + "metadata": { + "id": "5K3KZB1U5DAx" + }, + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "len(test_structures)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IHzj_PBt6GMO", + "outputId": "18dd8f47-5dd7-434d-f16d-960cf17a5661" + }, + "execution_count": 8, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "25" + ] + }, + "metadata": {}, + "execution_count": 8 + } + ] + }, + { + "cell_type": "code", + "source": [ + "%%time\n", + "from chgnet.data.dataset import StructureData, get_train_val_test_loader\n", + "from chgnet.trainer import Trainer\n", + "from torch.utils.data import DataLoader, Dataset\n", + "from chgnet.model.model import CHGNet\n", + "from chgnet.data.dataset import collate_graphs\n", + "chgnet = CHGNet()\n", + "\n", + "batch_size = 2\n", + "train_dataset = StructureData(\n", + " structures=train_structures,\n", + " energies=train_energies,\n", + " forces=train_forces,\n", + " #stresses=train_stresses,\n", + " # magmoms=None,\n", + ")\n", + "test_dataset = StructureData(\n", + " structures=test_structures,\n", + " energies=test_energies,\n", + " forces=test_forces,\n", + " #stresses=test_stresses,\n", + " # magmoms=None,\n", + ")\n", + "train_loader = DataLoader(\n", + " train_dataset,\n", + " batch_size=batch_size,\n", + " collate_fn=collate_graphs,\n", + " num_workers=0,\n", + " pin_memory=False,\n", + ")\n", + "val_loader = DataLoader(\n", + " test_dataset,\n", + " batch_size=batch_size,\n", + " collate_fn=collate_graphs,\n", + " num_workers=0,\n", + " pin_memory=False,\n", + ")\n", + "test_loader = DataLoader(\n", + " test_dataset,\n", + " batch_size=batch_size,\n", + " collate_fn=collate_graphs,\n", + " num_workers=0,\n", + " pin_memory=False,\n", + ")\n", + "trainer = Trainer(\n", + " model=chgnet,\n", + " targets=\"ef\",\n", + " optimizer=\"Adam\",\n", + " criterion=\"MSE\",\n", + " learning_rate=1e-2,\n", + " epochs=100,\n", + " use_device=\"cuda\",\n", + ")\n", + "\n", + "trainer.train(train_loader, val_loader, test_loader)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2LY5p0ku6Nry", + "outputId": "7d864a14-5169-4fef-f449-b09a367da97f" + }, + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "CHGNet initialized with 412,525 parameters\n", + "214 structures imported\n", + "25 structures imported\n", + "Begin Training: using cuda:0 device\n", + "training targets: ef\n", + "Epoch: [0][1/107] | Time (4.033)(0.505) | Loss 2.5361(2.5361) | MAE e 1.182(1.182) f 0.670(0.670) \n", + "Epoch: [0][100/107] | Time (0.160)(0.047) | Loss 0.0118(0.4400) | MAE e 0.058(0.219) f 0.050(0.340) \n", + "* e_MAE (0.243) \tf_MAE (0.346) \t\n", + "Epoch: [1][1/107] | Time (0.124)(0.000) | Loss 0.6876(0.6876) | MAE e 0.245(0.245) f 0.503(0.503) \n", + "Epoch: [1][100/107] | Time (0.083)(0.000) | Loss 0.0316(0.2385) | MAE e 0.052(0.179) f 0.096(0.257) \n", + "* e_MAE (0.282) \tf_MAE (0.306) \t\n", + "Epoch: [2][1/107] | Time (0.078)(0.000) | Loss 0.4482(0.4482) | MAE e 0.281(0.281) f 0.392(0.392) \n", + "Epoch: [2][100/107] | Time (0.077)(0.000) | Loss 0.0287(0.1919) | MAE e 0.054(0.170) f 0.089(0.241) \n", + "* e_MAE (0.658) \tf_MAE (0.538) \t\n", + "Epoch: [3][1/107] | Time (0.074)(0.001) | Loss 1.6055(1.6055) | MAE e 0.757(0.757) f 0.633(0.633) \n", + "Epoch: [3][100/107] | Time (0.078)(0.000) | Loss 0.0734(1.5978) | MAE e 0.049(0.442) f 0.148(0.552) \n", + "* e_MAE (0.144) \tf_MAE (0.425) \t\n", + "Epoch: [4][1/107] | Time (0.081)(0.000) | Loss 0.5444(0.5444) | MAE e 0.165(0.165) f 0.458(0.458) \n", + "Epoch: [4][100/107] | Time (0.073)(0.000) | Loss 0.0489(0.5145) | MAE e 0.029(0.249) f 0.122(0.377) \n", + "* e_MAE (0.150) \tf_MAE (0.389) \t\n", + "Epoch: [5][1/107] | Time (0.096)(0.000) | Loss 0.4475(0.4475) | MAE e 0.166(0.166) f 0.416(0.416) \n", + "Epoch: [5][100/107] | Time (0.078)(0.000) | Loss 0.0430(0.4194) | MAE e 0.053(0.185) f 0.111(0.355) \n", + "* e_MAE (0.122) \tf_MAE (0.348) \t\n", + "Epoch: [6][1/107] | Time (0.070)(0.000) | Loss 0.3375(0.3375) | MAE e 0.142(0.142) f 0.341(0.341) \n", + "Epoch: [6][100/107] | Time (0.076)(0.000) | Loss 0.0513(0.3327) | MAE e 0.146(0.164) f 0.096(0.319) \n", + "* e_MAE (0.107) \tf_MAE (0.322) \t\n", + "Epoch: [7][1/107] | Time (0.084)(0.000) | Loss 0.2703(0.2703) | MAE e 0.132(0.132) f 0.287(0.287) \n", + "Epoch: [7][100/107] | Time (0.076)(0.000) | Loss 0.0345(0.2482) | MAE e 0.119(0.150) f 0.082(0.276) \n", + "* e_MAE (0.112) \tf_MAE (0.286) \t\n", + "Epoch: [8][1/107] | Time (0.072)(0.000) | Loss 0.1825(0.1825) | MAE e 0.134(0.134) f 0.230(0.230) \n", + "Epoch: [8][100/107] | Time (0.071)(0.000) | Loss 0.0210(0.1906) | MAE e 0.059(0.145) f 0.076(0.239) \n", + "* e_MAE (0.125) \tf_MAE (0.254) \t\n", + "Epoch: [9][1/107] | Time (0.070)(0.000) | Loss 0.1555(0.1555) | MAE e 0.147(0.147) f 0.210(0.210) \n", + "Epoch: [9][100/107] | Time (0.090)(0.000) | Loss 0.0279(0.1673) | MAE e 0.103(0.156) f 0.076(0.218) \n", + "* e_MAE (0.125) \tf_MAE (0.242) \t\n", + "Epoch: [10][1/107] | Time (0.072)(0.000) | Loss 0.1489(0.1489) | MAE e 0.152(0.152) f 0.203(0.203) \n", + "Epoch: [10][100/107] | Time (0.076)(0.000) | Loss 0.0303(0.1524) | MAE e 0.121(0.147) f 0.072(0.212) \n", + "* e_MAE (0.125) \tf_MAE (0.237) \t\n", + "Epoch: [11][1/107] | Time (0.077)(0.000) | Loss 0.1434(0.1434) | MAE e 0.154(0.154) f 0.195(0.195) \n", + "Epoch: [11][100/107] | Time (0.077)(0.000) | Loss 0.0272(0.1434) | MAE e 0.114(0.139) f 0.069(0.209) \n", + "* e_MAE (0.125) \tf_MAE (0.235) \t\n", + "Epoch: [12][1/107] | Time (0.071)(0.000) | Loss 0.1390(0.1390) | MAE e 0.153(0.153) f 0.198(0.198) \n", + "Epoch: [12][100/107] | Time (0.071)(0.000) | Loss 0.0260(0.1363) | MAE e 0.111(0.134) f 0.068(0.207) \n", + "* e_MAE (0.123) \tf_MAE (0.233) \t\n", + "Epoch: [13][1/107] | Time (0.071)(0.000) | Loss 0.1359(0.1359) | MAE e 0.151(0.151) f 0.206(0.206) \n", + "Epoch: [13][100/107] | Time (0.082)(0.000) | Loss 0.0253(0.1303) | MAE e 0.105(0.129) f 0.069(0.204) \n", + "* e_MAE (0.121) \tf_MAE (0.226) \t\n", + "Epoch: [14][1/107] | Time (0.082)(0.000) | Loss 0.1339(0.1339) | MAE e 0.148(0.148) f 0.213(0.213) \n", + "Epoch: [14][100/107] | Time (0.076)(0.000) | Loss 0.0245(0.1259) | MAE e 0.101(0.127) f 0.069(0.202) \n", + "* e_MAE (0.119) \tf_MAE (0.221) \t\n", + "Epoch: [15][1/107] | Time (0.078)(0.000) | Loss 0.1303(0.1303) | MAE e 0.145(0.145) f 0.213(0.213) \n", + "Epoch: [15][100/107] | Time (0.075)(0.000) | Loss 0.0230(0.1221) | MAE e 0.094(0.124) f 0.069(0.200) \n", + "* e_MAE (0.118) \tf_MAE (0.213) \t\n", + "Epoch: [16][1/107] | Time (0.073)(0.000) | Loss 0.1257(0.1257) | MAE e 0.143(0.143) f 0.209(0.209) \n", + "Epoch: [16][100/107] | Time (0.072)(0.000) | Loss 0.0207(0.1187) | MAE e 0.083(0.121) f 0.069(0.198) \n", + "* e_MAE (0.119) \tf_MAE (0.206) \t\n", + "Epoch: [17][1/107] | Time (0.073)(0.000) | Loss 0.1196(0.1196) | MAE e 0.143(0.143) f 0.199(0.199) \n", + "Epoch: [17][100/107] | Time (0.082)(0.000) | Loss 0.0184(0.1152) | MAE e 0.071(0.118) f 0.067(0.195) \n", + "* e_MAE (0.120) \tf_MAE (0.201) \t\n", + "Epoch: [18][1/107] | Time (0.071)(0.000) | Loss 0.1155(0.1155) | MAE e 0.142(0.142) f 0.192(0.192) \n", + "Epoch: [18][100/107] | Time (0.077)(0.000) | Loss 0.0167(0.1119) | MAE e 0.061(0.114) f 0.066(0.193) \n", + "* e_MAE (0.119) \tf_MAE (0.196) \t\n", + "Epoch: [19][1/107] | Time (0.070)(0.000) | Loss 0.1109(0.1109) | MAE e 0.141(0.141) f 0.186(0.186) \n", + "Epoch: [19][100/107] | Time (0.072)(0.000) | Loss 0.0154(0.1089) | MAE e 0.052(0.111) f 0.065(0.191) \n", + "* e_MAE (0.116) \tf_MAE (0.192) \t\n", + "Epoch: [20][1/107] | Time (0.106)(0.000) | Loss 0.1059(0.1059) | MAE e 0.139(0.139) f 0.179(0.179) \n", + "Epoch: [20][100/107] | Time (0.073)(0.000) | Loss 0.0147(0.1055) | MAE e 0.048(0.106) f 0.065(0.189) \n", + "* e_MAE (0.112) \tf_MAE (0.188) \t\n", + "Epoch: [21][1/107] | Time (0.069)(0.000) | Loss 0.0990(0.0990) | MAE e 0.136(0.136) f 0.167(0.167) \n", + "Epoch: [21][100/107] | Time (0.080)(0.000) | Loss 0.0150(0.1014) | MAE e 0.055(0.101) f 0.064(0.186) \n", + "* e_MAE (0.106) \tf_MAE (0.185) \t\n", + "Epoch: [22][1/107] | Time (0.077)(0.000) | Loss 0.0911(0.0911) | MAE e 0.131(0.131) f 0.152(0.152) \n", + "Epoch: [22][100/107] | Time (0.082)(0.000) | Loss 0.0157(0.0978) | MAE e 0.069(0.096) f 0.061(0.184) \n", + "* e_MAE (0.100) \tf_MAE (0.184) \t\n", + "Epoch: [23][1/107] | Time (0.073)(0.000) | Loss 0.0861(0.0861) | MAE e 0.127(0.127) f 0.154(0.154) \n", + "Epoch: [23][100/107] | Time (0.071)(0.000) | Loss 0.0143(0.0938) | MAE e 0.059(0.090) f 0.060(0.182) \n", + "* e_MAE (0.095) \tf_MAE (0.181) \t\n", + "Epoch: [24][1/107] | Time (0.105)(0.000) | Loss 0.0808(0.0808) | MAE e 0.122(0.122) f 0.142(0.142) \n", + "Epoch: [24][100/107] | Time (0.073)(0.000) | Loss 0.0168(0.0912) | MAE e 0.080(0.084) f 0.058(0.181) \n", + "* e_MAE (0.093) \tf_MAE (0.181) \t\n", + "Epoch: [25][1/107] | Time (0.072)(0.000) | Loss 0.0817(0.0817) | MAE e 0.119(0.119) f 0.155(0.155) \n", + "Epoch: [25][100/107] | Time (0.076)(0.000) | Loss 0.0197(0.0891) | MAE e 0.087(0.081) f 0.062(0.180) \n", + "* e_MAE (0.089) \tf_MAE (0.187) \t\n", + "Epoch: [26][1/107] | Time (0.069)(0.000) | Loss 0.0860(0.0860) | MAE e 0.118(0.118) f 0.176(0.176) \n", + "Epoch: [26][100/107] | Time (0.082)(0.000) | Loss 0.0113(0.0911) | MAE e 0.054(0.081) f 0.052(0.183) \n", + "* e_MAE (0.093) \tf_MAE (0.182) \t\n", + "Epoch: [27][1/107] | Time (0.069)(0.000) | Loss 0.0853(0.0853) | MAE e 0.118(0.118) f 0.164(0.164) \n", + "Epoch: [27][100/107] | Time (0.070)(0.000) | Loss 0.0158(0.0939) | MAE e 0.020(0.081) f 0.070(0.186) \n", + "* e_MAE (0.123) \tf_MAE (0.234) \t\n", + "Epoch: [28][1/107] | Time (0.073)(0.000) | Loss 0.1580(0.1580) | MAE e 0.160(0.160) f 0.254(0.254) \n", + "Epoch: [28][100/107] | Time (0.076)(0.000) | Loss 0.0121(0.0931) | MAE e 0.040(0.088) f 0.059(0.182) \n", + "* e_MAE (0.091) \tf_MAE (0.174) \t\n", + "Epoch: [29][1/107] | Time (0.072)(0.000) | Loss 0.0838(0.0838) | MAE e 0.117(0.117) f 0.171(0.171) \n", + "Epoch: [29][100/107] | Time (0.076)(0.000) | Loss 0.0129(0.0793) | MAE e 0.057(0.072) f 0.056(0.172) \n", + "* e_MAE (0.086) \tf_MAE (0.175) \t\n", + "Epoch: [30][1/107] | Time (0.075)(0.000) | Loss 0.0797(0.0797) | MAE e 0.111(0.111) f 0.167(0.167) \n", + "Epoch: [30][100/107] | Time (0.082)(0.000) | Loss 0.0118(0.0753) | MAE e 0.048(0.063) f 0.054(0.168) \n", + "* e_MAE (0.079) \tf_MAE (0.179) \t\n", + "Epoch: [31][1/107] | Time (0.068)(0.000) | Loss 0.0809(0.0809) | MAE e 0.104(0.104) f 0.174(0.174) \n", + "Epoch: [31][100/107] | Time (0.070)(0.000) | Loss 0.0103(0.0755) | MAE e 0.039(0.059) f 0.052(0.169) \n", + "* e_MAE (0.086) \tf_MAE (0.187) \t\n", + "Epoch: [32][1/107] | Time (0.070)(0.000) | Loss 0.0850(0.0850) | MAE e 0.107(0.107) f 0.178(0.178) \n", + "Epoch: [32][100/107] | Time (0.076)(0.000) | Loss 0.0125(0.0838) | MAE e 0.039(0.067) f 0.059(0.176) \n", + "* e_MAE (0.074) \tf_MAE (0.180) \t\n", + "Epoch: [33][1/107] | Time (0.069)(0.000) | Loss 0.0858(0.0858) | MAE e 0.100(0.100) f 0.183(0.183) \n", + "Epoch: [33][100/107] | Time (0.076)(0.000) | Loss 0.0082(0.0737) | MAE e 0.015(0.063) f 0.050(0.165) \n", + "* e_MAE (0.077) \tf_MAE (0.183) \t\n", + "Epoch: [34][1/107] | Time (0.080)(0.000) | Loss 0.0842(0.0842) | MAE e 0.100(0.100) f 0.181(0.181) \n", + "Epoch: [34][100/107] | Time (0.077)(0.000) | Loss 0.0078(0.0734) | MAE e 0.019(0.057) f 0.047(0.165) \n", + "* e_MAE (0.061) \tf_MAE (0.172) \t\n", + "Epoch: [35][1/107] | Time (0.100)(0.000) | Loss 0.0727(0.0727) | MAE e 0.079(0.079) f 0.173(0.173) \n", + "Epoch: [35][100/107] | Time (0.072)(0.000) | Loss 0.0077(0.0721) | MAE e 0.030(0.057) f 0.045(0.162) \n", + "* e_MAE (0.080) \tf_MAE (0.191) \t\n", + "Epoch: [36][1/107] | Time (0.067)(0.000) | Loss 0.0887(0.0887) | MAE e 0.098(0.098) f 0.187(0.187) \n", + "Epoch: [36][100/107] | Time (0.076)(0.000) | Loss 0.0137(0.1011) | MAE e 0.029(0.080) f 0.064(0.192) \n", + "* e_MAE (0.103) \tf_MAE (0.179) \t\n", + "Epoch: [37][1/107] | Time (0.077)(0.000) | Loss 0.0878(0.0878) | MAE e 0.123(0.123) f 0.169(0.169) \n", + "Epoch: [37][100/107] | Time (0.076)(0.000) | Loss 0.0066(0.0724) | MAE e 0.005(0.059) f 0.046(0.160) \n", + "* e_MAE (0.065) \tf_MAE (0.171) \t\n", + "Epoch: [38][1/107] | Time (0.071)(0.000) | Loss 0.0810(0.0810) | MAE e 0.079(0.079) f 0.186(0.186) \n", + "Epoch: [38][100/107] | Time (0.076)(0.000) | Loss 0.0064(0.0692) | MAE e 0.008(0.058) f 0.044(0.158) \n", + "* e_MAE (0.066) \tf_MAE (0.177) \t\n", + "Epoch: [39][1/107] | Time (0.075)(0.000) | Loss 0.0824(0.0824) | MAE e 0.081(0.081) f 0.189(0.189) \n", + "Epoch: [39][100/107] | Time (0.076)(0.000) | Loss 0.0066(0.0684) | MAE e 0.019(0.055) f 0.044(0.159) \n", + "* e_MAE (0.061) \tf_MAE (0.177) \t\n", + "Epoch: [40][1/107] | Time (0.074)(0.000) | Loss 0.0731(0.0731) | MAE e 0.074(0.074) f 0.176(0.176) \n", + "Epoch: [40][100/107] | Time (0.076)(0.000) | Loss 0.0068(0.0675) | MAE e 0.024(0.054) f 0.044(0.158) \n", + "* e_MAE (0.056) \tf_MAE (0.170) \t\n", + "Epoch: [41][1/107] | Time (0.072)(0.000) | Loss 0.0648(0.0648) | MAE e 0.067(0.067) f 0.163(0.163) \n", + "Epoch: [41][100/107] | Time (0.073)(0.000) | Loss 0.0069(0.0640) | MAE e 0.034(0.053) f 0.042(0.154) \n", + "* e_MAE (0.055) \tf_MAE (0.167) \t\n", + "Epoch: [42][1/107] | Time (0.069)(0.000) | Loss 0.0652(0.0652) | MAE e 0.062(0.062) f 0.168(0.168) \n", + "Epoch: [42][100/107] | Time (0.073)(0.000) | Loss 0.0065(0.0629) | MAE e 0.032(0.054) f 0.041(0.153) \n", + "* e_MAE (0.054) \tf_MAE (0.166) \t\n", + "Epoch: [43][1/107] | Time (0.074)(0.000) | Loss 0.0662(0.0662) | MAE e 0.059(0.059) f 0.171(0.171) \n", + "Epoch: [43][100/107] | Time (0.076)(0.000) | Loss 0.0063(0.0620) | MAE e 0.033(0.054) f 0.040(0.152) \n", + "* e_MAE (0.052) \tf_MAE (0.165) \t\n", + "Epoch: [44][1/107] | Time (0.070)(0.000) | Loss 0.0648(0.0648) | MAE e 0.056(0.056) f 0.170(0.170) \n", + "Epoch: [44][100/107] | Time (0.078)(0.000) | Loss 0.0063(0.0611) | MAE e 0.033(0.054) f 0.040(0.151) \n", + "* e_MAE (0.052) \tf_MAE (0.164) \t\n", + "Epoch: [45][1/107] | Time (0.071)(0.000) | Loss 0.0654(0.0654) | MAE e 0.055(0.055) f 0.171(0.171) \n", + "Epoch: [45][100/107] | Time (0.072)(0.000) | Loss 0.0060(0.0602) | MAE e 0.029(0.053) f 0.040(0.150) \n", + "* e_MAE (0.051) \tf_MAE (0.164) \t\n", + "Epoch: [46][1/107] | Time (0.078)(0.000) | Loss 0.0652(0.0652) | MAE e 0.053(0.053) f 0.171(0.171) \n", + "Epoch: [46][100/107] | Time (0.072)(0.000) | Loss 0.0061(0.0597) | MAE e 0.032(0.053) f 0.039(0.149) \n", + "* e_MAE (0.048) \tf_MAE (0.162) \t\n", + "Epoch: [47][1/107] | Time (0.105)(0.000) | Loss 0.0625(0.0625) | MAE e 0.049(0.049) f 0.167(0.167) \n", + "Epoch: [47][100/107] | Time (0.079)(0.000) | Loss 0.0059(0.0584) | MAE e 0.033(0.052) f 0.039(0.148) \n", + "* e_MAE (0.049) \tf_MAE (0.161) \t\n", + "Epoch: [48][1/107] | Time (0.074)(0.000) | Loss 0.0633(0.0633) | MAE e 0.049(0.049) f 0.168(0.168) \n", + "Epoch: [48][100/107] | Time (0.078)(0.000) | Loss 0.0057(0.0578) | MAE e 0.031(0.051) f 0.039(0.147) \n", + "* e_MAE (0.049) \tf_MAE (0.161) \t\n", + "Epoch: [49][1/107] | Time (0.217)(0.001) | Loss 0.0641(0.0641) | MAE e 0.049(0.049) f 0.169(0.169) \n", + "Epoch: [49][100/107] | Time (0.102)(0.000) | Loss 0.0056(0.0569) | MAE e 0.030(0.050) f 0.038(0.146) \n", + "* e_MAE (0.050) \tf_MAE (0.161) \t\n", + "Epoch: [50][1/107] | Time (0.070)(0.000) | Loss 0.0651(0.0651) | MAE e 0.049(0.049) f 0.169(0.169) \n", + "Epoch: [50][100/107] | Time (0.079)(0.000) | Loss 0.0061(0.0563) | MAE e 0.037(0.049) f 0.038(0.145) \n", + "* e_MAE (0.049) \tf_MAE (0.158) \t\n", + "Epoch: [51][1/107] | Time (0.093)(0.000) | Loss 0.0607(0.0607) | MAE e 0.046(0.046) f 0.163(0.163) \n", + "Epoch: [51][100/107] | Time (0.072)(0.000) | Loss 0.0051(0.0544) | MAE e 0.024(0.048) f 0.037(0.142) \n", + "* e_MAE (0.054) \tf_MAE (0.162) \t\n", + "Epoch: [52][1/107] | Time (0.073)(0.000) | Loss 0.0692(0.0692) | MAE e 0.054(0.054) f 0.172(0.172) \n", + "Epoch: [52][100/107] | Time (0.076)(0.000) | Loss 0.0055(0.0551) | MAE e 0.029(0.047) f 0.038(0.143) \n", + "* e_MAE (0.051) \tf_MAE (0.157) \t\n", + "Epoch: [53][1/107] | Time (0.074)(0.000) | Loss 0.0601(0.0601) | MAE e 0.049(0.049) f 0.159(0.159) \n", + "Epoch: [53][100/107] | Time (0.077)(0.000) | Loss 0.0056(0.0536) | MAE e 0.031(0.047) f 0.038(0.141) \n", + "* e_MAE (0.050) \tf_MAE (0.156) \t\n", + "Epoch: [54][1/107] | Time (0.071)(0.000) | Loss 0.0586(0.0586) | MAE e 0.046(0.046) f 0.156(0.156) \n", + "Epoch: [54][100/107] | Time (0.078)(0.000) | Loss 0.0050(0.0525) | MAE e 0.025(0.046) f 0.037(0.140) \n", + "* e_MAE (0.052) \tf_MAE (0.158) \t\n", + "Epoch: [55][1/107] | Time (0.099)(0.000) | Loss 0.0663(0.0663) | MAE e 0.050(0.050) f 0.166(0.166) \n", + "Epoch: [55][100/107] | Time (0.075)(0.000) | Loss 0.0064(0.0527) | MAE e 0.041(0.046) f 0.038(0.140) \n", + "* e_MAE (0.051) \tf_MAE (0.153) \t\n", + "Epoch: [56][1/107] | Time (0.075)(0.000) | Loss 0.0542(0.0542) | MAE e 0.046(0.046) f 0.148(0.148) \n", + "Epoch: [56][100/107] | Time (0.077)(0.000) | Loss 0.0046(0.0511) | MAE e 0.013(0.046) f 0.037(0.137) \n", + "* e_MAE (0.063) \tf_MAE (0.163) \t\n", + "Epoch: [57][1/107] | Time (0.069)(0.000) | Loss 0.0756(0.0756) | MAE e 0.061(0.061) f 0.170(0.170) \n", + "Epoch: [57][100/107] | Time (0.078)(0.000) | Loss 0.0069(0.0523) | MAE e 0.044(0.045) f 0.039(0.138) \n", + "* e_MAE (0.054) \tf_MAE (0.152) \t\n", + "Epoch: [58][1/107] | Time (0.072)(0.000) | Loss 0.0515(0.0515) | MAE e 0.049(0.049) f 0.140(0.140) \n", + "Epoch: [58][100/107] | Time (0.072)(0.000) | Loss 0.0048(0.0503) | MAE e 0.016(0.047) f 0.037(0.136) \n", + "* e_MAE (0.060) \tf_MAE (0.162) \t\n", + "Epoch: [59][1/107] | Time (0.075)(0.000) | Loss 0.0737(0.0737) | MAE e 0.058(0.058) f 0.165(0.165) \n", + "Epoch: [59][100/107] | Time (0.083)(0.000) | Loss 0.0058(0.0509) | MAE e 0.037(0.045) f 0.037(0.137) \n", + "* e_MAE (0.050) \tf_MAE (0.152) \t\n", + "Epoch: [60][1/107] | Time (0.070)(0.000) | Loss 0.0612(0.0612) | MAE e 0.043(0.043) f 0.159(0.159) \n", + "Epoch: [60][100/107] | Time (0.076)(0.000) | Loss 0.0050(0.0497) | MAE e 0.030(0.044) f 0.036(0.135) \n", + "* e_MAE (0.050) \tf_MAE (0.152) \t\n", + "Epoch: [61][1/107] | Time (0.073)(0.000) | Loss 0.0592(0.0592) | MAE e 0.042(0.042) f 0.153(0.153) \n", + "Epoch: [61][100/107] | Time (0.072)(0.000) | Loss 0.0058(0.0487) | MAE e 0.038(0.043) f 0.037(0.134) \n", + "* e_MAE (0.051) \tf_MAE (0.149) \t\n", + "Epoch: [62][1/107] | Time (0.096)(0.000) | Loss 0.0528(0.0528) | MAE e 0.045(0.045) f 0.144(0.144) \n", + "Epoch: [62][100/107] | Time (0.075)(0.000) | Loss 0.0051(0.0476) | MAE e 0.024(0.043) f 0.037(0.132) \n", + "* e_MAE (0.051) \tf_MAE (0.149) \t\n", + "Epoch: [63][1/107] | Time (0.072)(0.000) | Loss 0.0534(0.0534) | MAE e 0.044(0.044) f 0.140(0.140) \n", + "Epoch: [63][100/107] | Time (0.084)(0.000) | Loss 0.0044(0.0469) | MAE e 0.020(0.042) f 0.035(0.131) \n", + "* e_MAE (0.052) \tf_MAE (0.152) \t\n", + "Epoch: [64][1/107] | Time (0.076)(0.000) | Loss 0.0623(0.0623) | MAE e 0.042(0.042) f 0.155(0.155) \n", + "Epoch: [64][100/107] | Time (0.077)(0.000) | Loss 0.0059(0.0471) | MAE e 0.038(0.041) f 0.037(0.131) \n", + "* e_MAE (0.053) \tf_MAE (0.147) \t\n", + "Epoch: [65][1/107] | Time (0.074)(0.000) | Loss 0.0484(0.0484) | MAE e 0.047(0.047) f 0.132(0.132) \n", + "Epoch: [65][100/107] | Time (0.073)(0.000) | Loss 0.0040(0.0468) | MAE e 0.013(0.043) f 0.035(0.130) \n", + "* e_MAE (0.059) \tf_MAE (0.155) \t\n", + "Epoch: [66][1/107] | Time (0.084)(0.000) | Loss 0.0707(0.0707) | MAE e 0.049(0.049) f 0.159(0.159) \n", + "Epoch: [66][100/107] | Time (0.082)(0.000) | Loss 0.0045(0.0484) | MAE e 0.017(0.042) f 0.036(0.131) \n", + "* e_MAE (0.047) \tf_MAE (0.146) \t\n", + "Epoch: [67][1/107] | Time (0.075)(0.000) | Loss 0.0504(0.0504) | MAE e 0.034(0.034) f 0.134(0.134) \n", + "Epoch: [67][100/107] | Time (0.085)(0.000) | Loss 0.0048(0.0513) | MAE e 0.023(0.043) f 0.036(0.133) \n", + "* e_MAE (0.047) \tf_MAE (0.156) \t\n", + "Epoch: [68][1/107] | Time (0.069)(0.000) | Loss 0.0645(0.0645) | MAE e 0.039(0.039) f 0.153(0.153) \n", + "Epoch: [68][100/107] | Time (0.075)(0.000) | Loss 0.0089(0.0480) | MAE e 0.057(0.043) f 0.042(0.130) \n", + "* e_MAE (0.052) \tf_MAE (0.144) \t\n", + "Epoch: [69][1/107] | Time (0.070)(0.000) | Loss 0.0458(0.0458) | MAE e 0.043(0.043) f 0.125(0.125) \n", + "Epoch: [69][100/107] | Time (0.071)(0.000) | Loss 0.0049(0.0471) | MAE e 0.014(0.043) f 0.039(0.129) \n", + "* e_MAE (0.047) \tf_MAE (0.147) \t\n", + "Epoch: [70][1/107] | Time (0.076)(0.000) | Loss 0.0496(0.0496) | MAE e 0.032(0.032) f 0.137(0.137) \n", + "Epoch: [70][100/107] | Time (0.076)(0.000) | Loss 0.0047(0.0453) | MAE e 0.018(0.042) f 0.037(0.128) \n", + "* e_MAE (0.047) \tf_MAE (0.144) \t\n", + "Epoch: [71][1/107] | Time (0.072)(0.000) | Loss 0.0513(0.0513) | MAE e 0.033(0.033) f 0.140(0.140) \n", + "Epoch: [71][100/107] | Time (0.083)(0.000) | Loss 0.0049(0.0449) | MAE e 0.014(0.043) f 0.038(0.127) \n", + "* e_MAE (0.047) \tf_MAE (0.141) \t\n", + "Epoch: [72][1/107] | Time (0.072)(0.000) | Loss 0.0459(0.0459) | MAE e 0.035(0.035) f 0.128(0.128) \n", + "Epoch: [72][100/107] | Time (0.072)(0.000) | Loss 0.0040(0.0442) | MAE e 0.011(0.044) f 0.035(0.126) \n", + "* e_MAE (0.045) \tf_MAE (0.142) \t\n", + "Epoch: [73][1/107] | Time (0.093)(0.000) | Loss 0.0463(0.0463) | MAE e 0.034(0.034) f 0.129(0.129) \n", + "Epoch: [73][100/107] | Time (0.074)(0.000) | Loss 0.0039(0.0437) | MAE e 0.013(0.044) f 0.034(0.125) \n", + "* e_MAE (0.042) \tf_MAE (0.141) \t\n", + "Epoch: [74][1/107] | Time (0.076)(0.000) | Loss 0.0452(0.0452) | MAE e 0.029(0.029) f 0.127(0.127) \n", + "Epoch: [74][100/107] | Time (0.076)(0.000) | Loss 0.0039(0.0427) | MAE e 0.018(0.042) f 0.033(0.123) \n", + "* e_MAE (0.038) \tf_MAE (0.140) \t\n", + "Epoch: [75][1/107] | Time (0.072)(0.000) | Loss 0.0444(0.0444) | MAE e 0.022(0.022) f 0.127(0.127) \n", + "Epoch: [75][100/107] | Time (0.082)(0.000) | Loss 0.0041(0.0415) | MAE e 0.019(0.041) f 0.033(0.122) \n", + "* e_MAE (0.037) \tf_MAE (0.139) \t\n", + "Epoch: [76][1/107] | Time (0.069)(0.000) | Loss 0.0430(0.0430) | MAE e 0.018(0.018) f 0.126(0.126) \n", + "Epoch: [76][100/107] | Time (0.070)(0.000) | Loss 0.0042(0.0404) | MAE e 0.022(0.040) f 0.034(0.120) \n", + "* e_MAE (0.036) \tf_MAE (0.137) \t\n", + "Epoch: [77][1/107] | Time (0.071)(0.000) | Loss 0.0418(0.0418) | MAE e 0.014(0.014) f 0.126(0.126) \n", + "Epoch: [77][100/107] | Time (0.075)(0.000) | Loss 0.0045(0.0396) | MAE e 0.025(0.039) f 0.034(0.119) \n", + "* e_MAE (0.034) \tf_MAE (0.136) \t\n", + "Epoch: [78][1/107] | Time (0.072)(0.000) | Loss 0.0407(0.0407) | MAE e 0.009(0.009) f 0.125(0.125) \n", + "Epoch: [78][100/107] | Time (0.077)(0.000) | Loss 0.0047(0.0390) | MAE e 0.028(0.038) f 0.034(0.118) \n", + "* e_MAE (0.033) \tf_MAE (0.136) \t\n", + "Epoch: [79][1/107] | Time (0.074)(0.000) | Loss 0.0397(0.0397) | MAE e 0.004(0.004) f 0.124(0.124) \n", + "Epoch: [79][100/107] | Time (0.072)(0.000) | Loss 0.0049(0.0385) | MAE e 0.031(0.038) f 0.034(0.117) \n", + "* e_MAE (0.034) \tf_MAE (0.135) \t\n", + "Epoch: [80][1/107] | Time (0.108)(0.000) | Loss 0.0389(0.0389) | MAE e 0.002(0.002) f 0.123(0.123) \n", + "Epoch: [80][100/107] | Time (0.079)(0.000) | Loss 0.0050(0.0380) | MAE e 0.032(0.038) f 0.034(0.116) \n", + "* e_MAE (0.036) \tf_MAE (0.134) \t\n", + "Epoch: [81][1/107] | Time (0.074)(0.000) | Loss 0.0383(0.0383) | MAE e 0.007(0.007) f 0.122(0.122) \n", + "Epoch: [81][100/107] | Time (0.075)(0.000) | Loss 0.0050(0.0376) | MAE e 0.030(0.037) f 0.035(0.116) \n", + "* e_MAE (0.037) \tf_MAE (0.133) \t\n", + "Epoch: [82][1/107] | Time (0.070)(0.000) | Loss 0.0377(0.0377) | MAE e 0.010(0.010) f 0.121(0.121) \n", + "Epoch: [82][100/107] | Time (0.074)(0.000) | Loss 0.0048(0.0373) | MAE e 0.026(0.037) f 0.035(0.116) \n", + "* e_MAE (0.037) \tf_MAE (0.132) \t\n", + "Epoch: [83][1/107] | Time (0.078)(0.000) | Loss 0.0371(0.0371) | MAE e 0.010(0.010) f 0.119(0.119) \n", + "Epoch: [83][100/107] | Time (0.071)(0.000) | Loss 0.0045(0.0370) | MAE e 0.019(0.037) f 0.035(0.115) \n", + "* e_MAE (0.036) \tf_MAE (0.131) \t\n", + "Epoch: [84][1/107] | Time (0.083)(0.000) | Loss 0.0364(0.0364) | MAE e 0.008(0.008) f 0.118(0.118) \n", + "Epoch: [84][100/107] | Time (0.084)(0.000) | Loss 0.0044(0.0367) | MAE e 0.019(0.037) f 0.036(0.115) \n", + "* e_MAE (0.037) \tf_MAE (0.130) \t\n", + "Epoch: [85][1/107] | Time (0.077)(0.000) | Loss 0.0356(0.0356) | MAE e 0.013(0.013) f 0.115(0.115) \n", + "Epoch: [85][100/107] | Time (0.076)(0.000) | Loss 0.0043(0.0365) | MAE e 0.020(0.037) f 0.036(0.115) \n", + "* e_MAE (0.039) \tf_MAE (0.128) \t\n", + "Epoch: [86][1/107] | Time (0.070)(0.000) | Loss 0.0351(0.0351) | MAE e 0.016(0.016) f 0.112(0.112) \n", + "Epoch: [86][100/107] | Time (0.071)(0.000) | Loss 0.0042(0.0362) | MAE e 0.020(0.037) f 0.035(0.114) \n", + "* e_MAE (0.040) \tf_MAE (0.127) \t\n", + "Epoch: [87][1/107] | Time (0.074)(0.000) | Loss 0.0349(0.0349) | MAE e 0.018(0.018) f 0.108(0.108) \n", + "Epoch: [87][100/107] | Time (0.076)(0.000) | Loss 0.0040(0.0360) | MAE e 0.020(0.037) f 0.034(0.114) \n", + "* e_MAE (0.042) \tf_MAE (0.126) \t\n", + "Epoch: [88][1/107] | Time (0.073)(0.000) | Loss 0.0352(0.0352) | MAE e 0.024(0.024) f 0.104(0.104) \n", + "Epoch: [88][100/107] | Time (0.089)(0.000) | Loss 0.0039(0.0357) | MAE e 0.021(0.037) f 0.032(0.113) \n", + "* e_MAE (0.046) \tf_MAE (0.126) \t\n", + "Epoch: [89][1/107] | Time (0.069)(0.000) | Loss 0.0357(0.0357) | MAE e 0.031(0.031) f 0.103(0.103) \n", + "Epoch: [89][100/107] | Time (0.071)(0.000) | Loss 0.0038(0.0353) | MAE e 0.023(0.036) f 0.031(0.112) \n", + "* e_MAE (0.048) \tf_MAE (0.125) \t\n", + "Epoch: [90][1/107] | Time (0.113)(0.000) | Loss 0.0360(0.0360) | MAE e 0.033(0.033) f 0.106(0.106) \n", + "Epoch: [90][100/107] | Time (0.072)(0.000) | Loss 0.0037(0.0351) | MAE e 0.026(0.036) f 0.029(0.112) \n", + "* e_MAE (0.046) \tf_MAE (0.125) \t\n", + "Epoch: [91][1/107] | Time (0.071)(0.000) | Loss 0.0358(0.0358) | MAE e 0.030(0.030) f 0.108(0.108) \n", + "Epoch: [91][100/107] | Time (0.077)(0.000) | Loss 0.0034(0.0348) | MAE e 0.026(0.036) f 0.028(0.111) \n", + "* e_MAE (0.043) \tf_MAE (0.125) \t\n", + "Epoch: [92][1/107] | Time (0.073)(0.000) | Loss 0.0353(0.0353) | MAE e 0.025(0.025) f 0.108(0.108) \n", + "Epoch: [92][100/107] | Time (0.079)(0.000) | Loss 0.0031(0.0346) | MAE e 0.025(0.036) f 0.027(0.111) \n", + "* e_MAE (0.041) \tf_MAE (0.125) \t\n", + "Epoch: [93][1/107] | Time (0.081)(0.000) | Loss 0.0350(0.0350) | MAE e 0.021(0.021) f 0.108(0.108) \n", + "Epoch: [93][100/107] | Time (0.071)(0.000) | Loss 0.0030(0.0344) | MAE e 0.024(0.035) f 0.026(0.110) \n", + "* e_MAE (0.040) \tf_MAE (0.124) \t\n", + "Epoch: [94][1/107] | Time (0.107)(0.000) | Loss 0.0345(0.0345) | MAE e 0.016(0.016) f 0.108(0.108) \n", + "Epoch: [94][100/107] | Time (0.075)(0.000) | Loss 0.0029(0.0343) | MAE e 0.024(0.035) f 0.025(0.110) \n", + "* e_MAE (0.039) \tf_MAE (0.124) \t\n", + "Epoch: [95][1/107] | Time (0.081)(0.000) | Loss 0.0339(0.0339) | MAE e 0.014(0.014) f 0.106(0.106) \n", + "Epoch: [95][100/107] | Time (0.077)(0.000) | Loss 0.0027(0.0341) | MAE e 0.022(0.035) f 0.025(0.110) \n", + "* e_MAE (0.039) \tf_MAE (0.124) \t\n", + "Epoch: [96][1/107] | Time (0.071)(0.000) | Loss 0.0335(0.0335) | MAE e 0.013(0.013) f 0.105(0.105) \n", + "Epoch: [96][100/107] | Time (0.075)(0.000) | Loss 0.0026(0.0340) | MAE e 0.021(0.034) f 0.025(0.110) \n", + "* e_MAE (0.040) \tf_MAE (0.124) \t\n", + "Epoch: [97][1/107] | Time (0.074)(0.000) | Loss 0.0333(0.0333) | MAE e 0.013(0.013) f 0.103(0.103) \n", + "Epoch: [97][100/107] | Time (0.076)(0.000) | Loss 0.0025(0.0338) | MAE e 0.021(0.034) f 0.025(0.110) \n", + "* e_MAE (0.040) \tf_MAE (0.124) \t\n", + "Epoch: [98][1/107] | Time (0.068)(0.000) | Loss 0.0332(0.0332) | MAE e 0.012(0.012) f 0.103(0.103) \n", + "Epoch: [98][100/107] | Time (0.076)(0.000) | Loss 0.0024(0.0338) | MAE e 0.021(0.034) f 0.025(0.109) \n", + "* e_MAE (0.040) \tf_MAE (0.124) \t\n", + "Epoch: [99][1/107] | Time (0.068)(0.000) | Loss 0.0331(0.0331) | MAE e 0.012(0.012) f 0.102(0.102) \n", + "Epoch: [99][100/107] | Time (0.077)(0.000) | Loss 0.0024(0.0337) | MAE e 0.021(0.034) f 0.025(0.109) \n", + "* e_MAE (0.040) \tf_MAE (0.124) \t\n", + "---------Evaluate Model on Test Set---------------\n", + "** e_MAE (0.033) \tf_MAE (0.136) \t\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "best_model = trainer.best_model" + ], + "metadata": { + "id": "-uwIrYD76Nm0" + }, + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "out = best_model.predict_structure(test_structures[0])" + ], + "metadata": { + "id": "FkRCehT26Nj4" + }, + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "out.keys()" + ], + "metadata": { + "id": "8W9vPeDISw0O", + "outputId": "a294f043-2308-4e5d-acac-ce98fabfcba7", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "dict_keys(['s', 'f', 'e', 'm'])" + ] + }, + "metadata": {}, + "execution_count": 14 + } + ] + }, + { + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "import glob\n", + "import numpy as np\n", + "def get_chgnet_pred(atoms=None,model=None):\n", + " pmg = atoms.pymatgen_converter()\n", + " out = model.predict_structure(pmg)\n", + " return out['e']*atoms.num_atoms,out['f'],out['s']\n", + "\n", + "best_model = trainer.best_model\n", + "df = pd.DataFrame(mlearn)\n", + "for i in glob.glob(\"jarvis_leaderboard/jarvis_leaderboard/benchmarks/AI/MLFF/*energy*.zip\"):\n", + "\n", + " if \"mlearn\" in i and element in i:\n", + " fname_e = (\n", + " \"AI-MLFF-energy-\"\n", + " + i.split(\"/\")[-1].split(\"_energy.json.zip\")[0]\n", + " + \"-test-mae.csv\"\n", + " )\n", + " fname_f = (\n", + " \"AI-MLFF-forces-\"\n", + " + i.split(\"/\")[-1].split(\"_energy.json.zip\")[0]\n", + " + \"-test-multimae.csv\"\n", + " )\n", + " fname_s = (\n", + " \"AI-MLFF-stresses-\"\n", + " + i.split(\"/\")[-1].split(\"_energy.json.zip\")[0]\n", + " + \"-test-multimae.csv\"\n", + " )\n", + " f_e = open(fname_e, \"w\")\n", + " f_f = open(fname_f, \"w\")\n", + " # f_s = open(fname_s, \"w\")\n", + "\n", + " f_e.write(\"id,target,prediction\\n\")\n", + " f_f.write(\"id,target,prediction\\n\")\n", + " # f_s.write(\"id,prediction\\n\")\n", + " #\n", + " print(i)\n", + " dat = json.loads(\n", + " zipfile.ZipFile(i).read(\n", + " i.split(\"/\")[-1].split(\".zip\")[0]\n", + " )\n", + " )\n", + " print(dat[\"test\"])\n", + " for key, val in dat[\"test\"].items():\n", + " entry = df[df[\"jid\"] == key]\n", + " atoms = Atoms.from_dict(entry.atoms.values[0])\n", + " # print(key,val,df[df['jid']==key],atoms)\n", + " # energy,forces=get_alignn_forces(atoms)\n", + " energy, forces, stress = get_chgnet_pred(\n", + " model=best_model, atoms=atoms\n", + " )\n", + " print(key, val, energy, atoms.num_atoms)\n", + " line = (\n", + " key\n", + " + \",\"\n", + " + str(entry.energy.values[0])\n", + " + \",\"\n", + " + str(energy)\n", + " + \"\\n\"\n", + " )\n", + " f_e.write(line)\n", + " line = (\n", + " key\n", + " + \",\"\n", + " + str(\n", + " \";\".join(\n", + " map(\n", + " str,\n", + " np.array(\n", + " entry.forces.values[0]\n", + " ).flatten(),\n", + " )\n", + " )\n", + " )\n", + " + \",\"\n", + " + str(\n", + " \";\".join(map(str, np.array(forces).flatten()))\n", + " )\n", + " + \"\\n\"\n", + " )\n", + " f_f.write(line)\n", + " # line = (\n", + " # key\n", + " # + \",\"\n", + " # + str(\";\".join(map(str, np.array(stress).flatten())))\n", + " # + \"\\n\"\n", + " # )\n", + " # f_s.write(line)\n", + " f_e.close()\n", + " f_f.close()\n", + " # f_s.close()\n", + " zname = fname_e + \".zip\"\n", + " with zipfile.ZipFile(zname, \"w\") as myzip:\n", + " myzip.write(fname_e)\n", + "\n", + " zname = fname_f + \".zip\"\n", + " with zipfile.ZipFile(zname, \"w\") as myzip:\n", + " myzip.write(fname_f)\n", + "\n", + " # zname = fname_s + \".zip\"\n", + " # with zipfile.ZipFile(zname, \"w\") as myzip:\n", + " # myzip.write(fname_s)\n" + ], + "metadata": { + "id": "NIx3D0rBUJ8Z", + "outputId": "bb55f847-ea2e-4b03-8196-def522cd47c2", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "jarvis_leaderboard/jarvis_leaderboard/benchmarks/AI/MLFF/mlearn_Si_energy.json.zip\n", + "{'Si-215': -297.62773938, 'Si-216': -295.77170067, 'Si-217': -291.28958206, 'Si-218': -296.24088456, 'Si-219': -294.41361742, 'Si-220': -334.75283939, 'Si-221': -334.69215136, 'Si-222': -184.71808052, 'Si-223': -121.41180043, 'Si-224': -338.93899696, 'Si-225': -338.83557056, 'Si-226': -335.68901422, 'Si-227': -333.7064957, 'Si-228': -344.85564046, 'Si-229': -344.81108268, 'Si-230': -298.83222646, 'Si-231': -298.96501782, 'Si-232': -295.20943762, 'Si-233': -291.86293882, 'Si-234': -344.74080048, 'Si-235': -344.74080047, 'Si-236': -344.74080046, 'Si-237': -341.22165747, 'Si-238': -341.22165734, 'Si-239': -341.22165747}\n", + "Si-215 -297.62773938 -295.70447158813477 63\n", + "Si-216 -295.77170067 -293.5783681869507 63\n", + "Si-217 -291.28958206 -293.8524899482727 63\n", + "Si-218 -296.24088456 -292.3929605484009 63\n", + "Si-219 -294.41361742 -294.08515548706055 63\n", + "Si-220 -334.75283939 -337.6295700073242 63\n", + "Si-221 -334.69215136 -337.80278491973877 63\n", + "Si-222 -184.71808052 -190.18782806396484 36\n", + "Si-223 -121.41180043 -124.60493087768555 24\n", + "Si-224 -338.93899696 -338.8770446777344 64\n", + "Si-225 -338.83557056 -338.87109375 64\n", + "Si-226 -335.68901422 -336.1199951171875 64\n", + "Si-227 -333.7064957 -333.7171630859375 64\n", + "Si-228 -344.85564046 -344.50006103515625 64\n", + "Si-229 -344.81108268 -344.46112060546875 64\n", + "Si-230 -298.83222646 -299.8096618652344 64\n", + "Si-231 -298.96501782 -300.45489501953125 64\n", + "Si-232 -295.20943762 -298.00830078125 64\n", + "Si-233 -291.86293882 -294.3046875 64\n", + "Si-234 -344.74080048 -342.12744140625 64\n", + "Si-235 -344.74080047 -342.1274108886719 64\n", + "Si-236 -344.74080046 -342.12744140625 64\n", + "Si-237 -341.22165747 -340.90899658203125 64\n", + "Si-238 -341.22165734 -340.90899658203125 64\n", + "Si-239 -341.22165747 -340.90899658203125 64\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "en_df = pd.read_csv('AI-MLFF-energy-mlearn_Si-test-mae.csv.zip')\n", + "from sklearn.metrics import mean_absolute_error\n", + "print(mean_absolute_error(en_df['target'],en_df['prediction']))\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "plt.plot(en_df['target'],en_df['prediction'],'.')\n", + "plt.xlabel('DFT energy(eV)')\n", + "plt.ylabel('FF energy(eV)')" + ], + "metadata": { + "id": "tLzFJFQDTyTW", + "outputId": "0654c572-79b0-474e-f3ea-a2a117b6af3c", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 485 + } + }, + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.729472648798191\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Text(0, 0.5, 'FF energy(eV)')" + ] + }, + "metadata": {}, + "execution_count": 18 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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QE1zOBzdcsstevDBB6ujFgAAAKdzOBwlJydXRx0AAAAuweExR5L0008/6bPPPtP8+fN1+vRpSVJeXp5+/PHHKi0OAACgpjncc3T48GH1799fR44cUUlJie699141aNBAb7zxhkpKSjRv3rzqqBMAAKBGONxz9Pzzz6tHjx46deqUfHx8zPW//OUvlZ6eXqXFAQAA1DSHe442bNigzZs3y9PT0259q1atlJubW2WFAQAAOIPDPUelpaW6ePFiufXHjh27KR4fAgAA6jaHw9F9992n//3f/zVf22w2/fjjj3rllVd0//33V2VtAAAANc7hB88eO3ZMsbGxMgxD+/fvV48ePbR//34FBgbq66+/VpMmTaqrVpfAg2cBAKh9HPn77XA4ki7dyr906VJt375dP/74o7p166bHHnvMboB2XUU4AgCg9nHk77fDA7IlqV69eho6dOh1FQcAAODKrisc7d+/X1988YX+9a9/qbS01G7blClTqqQwAAAAZ3A4HL333nt6+umnFRgYqJCQENlsNnObzWYjHAEAgFrN4XD0u9/9TtOmTdPYsWOrox4AAACncvhW/lOnTmnIkCHVUQsAAIDTORyOhgwZovXr11dHLQAAAE7n8GW1tm3bavLkydqyZYsiIiLk4eFht/25556rsuIAAABqmsPzHLVu3frKO7PZdPDgwRsu6nI5OTmaOnWqPv/8cxUUFKhp06YaOnSoJk6caD7jLScnp8LaMjIy1Lt3b/P1ihUrNHnyZOXk5Khdu3Z64403HJrZm3mOAACofap1nqNDhw5dd2HXa+/evSotLdX8+fPVtm1b7dy5UyNGjNCZM2f05ptv2rX97LPP1LlzZ/N148aNzZ83b96sRx55RDNmzNADDzygJUuWKC4uTtu2bVOXLl1q7HgAAIDruq4ZsiXp/PnzOnTokNq0aaN69a5ruqQbMmvWLM2dO9fsqSrrOcrMzFRkZGSF74mPj9eZM2e0du1ac13v3r0VGRmpefPmVepz6TkCAKD2ceTvt8MDss+ePavExET5+vqqc+fOOnLkiCTpN7/5jZKSkq6v4utQWFioRo0alVs/cOBANWnSRH369NHq1avttmVkZKhfv35262JjY5WRkXHFzykpKVFRUZHdAgAA6i6Hw9H48eP13Xff6csvv5S3t7e5vl+/flq2bFmVFnclBw4c0Jw5czRy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uxYvXmz3maWlpTp06JA6deokSbr11lvN7TabTSEhIfrXv/5l7uPAgQNq0KCB3b7PnTun7Oxs83VERIQ8PT3N1/v27dOtt95qdzns9ttvt9tH06ZNNWDAAC1cuFC333671qxZo5KSEg0ZMsRsU1xcXO6S2nfffadNmzaZPUWSdPHiRZ07d05nz56Vr6+vHnnkEf32t7/V8uXLNXz4cC1btkxubm6Kj48v93vy8fHR2bNnr/KbBHA5whGAarFnzx61bt3abl1gYKB5SelG/fjjjxo5cqSee+65cttatGhh/uzh4WG3zWazmXfS/fjjj+revbtdwCoTFBRk/uzn53ddNf7617/W448/rrffflvJycmKj4+Xr6+vuT0wMFCnTp0qd1yvvfaaBg8eXG5/ZUHK399fDz30kJKTk83Ldw8//LDq169f7j0nT560OxYA10Y4AlDlPv/8c+3YsUO//e1vq+0zunXrpt27d99Q2OrWrZuWLVumJk2ayN/fv9Lv69Chg/7yl7+opKREXl5ekqRvvvmmXLv7779ffn5+mjt3rj755BN9/fXXdtu7du2q3bt3l6tp37591zyuxMRE3XXXXVq7dq02b96sWbNmlWuTnZ2tc+fOqWvXrpU+NgAMyAZwg0pKSlRQUKDc3Fxt27ZN06dP16BBg/TAAw9o2LBh1fa5Y8eO1ebNm/Xss88qKytL+/fv16pVq8oNyL6axx57TIGBgRo0aJA2bNigQ4cO6csvv9Rzzz2nY8eOXfF9jz76qEpLS/Xkk09qz549+vTTT80706yXEt3d3ZWQkKDx48erXbt2ioqKsttPbGxsubvOpkyZokWLFum1117Trl27tGfPHi1dulSTJk2ya1c2sHvYsGHq2LGjoqOjy9W5YcMGhYeHq02bNpX+nQAgHAG4QZ988olCQ0PVqlUr9e/fX1988YV+//vfa9WqVZWa2PB63Xrrrfrqq6/0/fff64477lDXrl01ZcoUNW3atNL78PX11ddff60WLVpo8ODB6tSpkxITE3Xu3Lmr9iT5+/trzZo1ysrKUmRkpCZOnKgpU6ZIUrkxRImJiTp//rx+9atfldvPY489pl27dpl3z0mXAtPatWu1fv169ezZU71799bbb7+tli1b2r237I64U6dOafjw4RXW+de//lUjRoyo9O8DwCU2wzAMZxcBALXd4sWL9atf/UqFhYXy8fEx12/YsEH33HOPjh49quDg4HLve+mll1RUVKT58+dXaT27du3S3Xffre+//14BAQFVum+grqPnCACuw6JFi7Rx40YdOnRIK1eu1NixY/Xwww+bwaikpETHjh3Tq6++qiFDhlQYjCRp4sSJatmyZbnHrdyo/Px8LVq0iGAEXAd6jgDgOsycOVPvvvuuCgoKFBoaas6iXXY3WkpKihITExUZGanVq1erWbNmTq4YQGURjgAAACy4rAYAAGBBOAIAALAgHAEAAFgQjgAAACwIRwAAABaEIwAAAAvCEQAAgAXhCAAAwOL/A9A1UXfmOq4IAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "f_df = pd.read_csv('AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip')\n", + "target = np.concatenate([np.array(i.split(';'),dtype='float') for i in f_df['target'].values])\n", + "pred= np.concatenate([np.array(i.split(';'),dtype='float') for i in f_df['prediction'].values])\n", + "print(mean_absolute_error(target,pred))\n", + "plt.plot(target,pred,'.')\n", + "plt.xlabel('DFT forces(eV/A)')\n", + "plt.ylabel('FF forces(eV/A)')\n" + ], + "metadata": { + "id": "SWxlMW6tTnnp", + "outputId": "5448aa6e-9512-40b5-fe89-e6ae5e095954", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 485 + } + }, + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "0.1355192138227571\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Text(0, 0.5, 'FF forces(eV/A)')" + ] + }, + "metadata": {}, + "execution_count": 19 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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pAgMNURERKQIDDVERESkCAw1REREpAgMNURERKQIDDVERESkCAw1REREpAgMNURERKQIDDVERESkCAw1REREpAgMNURERKQIDDVERESkCAw1REREpAheFWq2bduGXr16QaPRIDAwEMOGDZO7JCIiIvIQt8hdgKPS09MxefJkLFiwAP3798fNmzdx7NgxucsiIiIiD+EVoebmzZt48sknsXjxYkyaNMl0vUuXLnafV1FRgYqKCtP3JSUlbquRiIiI5OUV00+HDh1CYWEhVCoVevTogdDQUAwePLjGkZrU1FRotVrTV3h4eD1VTERERPXNK0LNuXPnAAAvvfQSnn/+eXzxxRcIDAxE3759ceXKFZvPS0lJgV6vN30VFBTUV8lERERUz2QNNcnJyRAEwe5Xbm4uDAYDAOC5557DiBEjEBcXhzVr1kAQBHzyySc2X9/X1xcBAQEWX0RERKRMsvbUPPPMM5gwYYLde6KioqDT6QBY9tD4+voiKioK+fn57iyRiIiIvISsoSYkJAQhISE13hcXFwdfX1+cOnUKffr0AQDcuHEDeXl5aNeunbvLJCIiIi/gFaufAgICMHXqVLz44osIDw9Hu3btsHjxYgDAyJEjZa6OiIiIPIFXhBoAWLx4MW655RY8/PDDKC8vR69evZCZmYnAwEC5SyMiIiIPIIiiKMpdRH0pKSmBVquFXq9n0zAREZGXcPTz2yuWdBMRERHVhKGGiIiIFIGhhoiIiBSBoYaIiIgUgaGGiIiIFIGhhoiIiBSBoYaIiIgUgaGGiIiIFIGhhoiIiBSBoYaIiIgUgaGGiIiIFIGhxgV0+nLsPVsEnb5c7lKIiIgaLK85pdtTpWXnI2VTDgwioBKA1OExGNWzrdxlERERNTgcqakDnb7cFGgAwCACczcd44gNERGRDBhq6uB8Uakp0BhViiLyisrkKYiIiKgBY6ipg8hgf6gEy2tqQUBEsJ88BRERETVgDDV1EKrVIHV4DNRCVbJRCwIWDO+KUK1G5sqIiIgaHjYK19Gonm2R1DEEeUVliAj2Y6AhIiKSCUONC4RqNQwzREREMuP0ExERESkCQw0REREpAkMNERERKQJDDRERESkCQw0REREpAkMNERERKQJDDRERESkCQw0REREpAkMNERERKQJDDRERESkCQw0REREpQoM6+0kURQBASUmJzJUQERGR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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "hrHpS1VgTnlX" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "T8zLxVLfTni6" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "XRKpe0T4Tngo" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "HFpUXITaTneR" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "Za-gJ5q-Tnb4" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/metadata.json b/jarvis_leaderboard/contributions/chgnet_mlearn/metadata.json new file mode 100644 index 000000000..696163aa8 --- /dev/null +++ b/jarvis_leaderboard/contributions/chgnet_mlearn/metadata.json @@ -0,0 +1,29 @@ +{ + "model_name": "CHGNET", + "project_url": "https://github.com/CederGroupHub/chgnet", + "date_submitted": "01-29-2024", + "author_email": "knc6@nist.gov", + "database_version": "12-12-2022", + "team_name": "CHGNET", + "time_taken_seconds": { + "AI-MLFF-energy-mlearn_Cu-test-mae.csv.zip": "", + "AI-MLFF-energy-mlearn_Ge-test-mae.csv.zip": "", + "AI-MLFF-energy-mlearn_Li-test-mae.csv.zip": "", + "AI-MLFF-energy-mlearn_Mo-test-mae.csv.zip": "", + "AI-MLFF-energy-mlearn_Ni-test-mae.csv.zip": "", + "AI-MLFF-energy-mlearn_Si-test-mae.csv.zip": "", + "AI-MLFF-forces-mlearn_Cu-test-multimae.csv.zip": "", + "AI-MLFF-forces-mlearn_Ge-test-multimae.csv.zip": "", + "AI-MLFF-forces-mlearn_Li-test-multimae.csv.zip": "", + "AI-MLFF-forces-mlearn_Mo-test-multimae.csv.zip": "", + "AI-MLFF-forces-mlearn_Ni-test-multimae.csv.zip": "", + "AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip": "" + }, + "language": "python", + "os": "linux", + "software_used": "jarvis-tools,numpy,scipy,torch,m3gnet", + "hardware_used": "nisaba-cluster at NIST, V100 Tesla GPU", + "git_url": [ + "https://github.com/CederGroupHub/chgnet" + ] +} diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/run.py b/jarvis_leaderboard/contributions/chgnet_mlearn/run.py new file mode 100644 index 000000000..7abae658b --- /dev/null +++ b/jarvis_leaderboard/contributions/chgnet_mlearn/run.py @@ -0,0 +1,278 @@ +# -*- coding: utf-8 -*- +"""Train_CHGNet.ipynb + +Automatically generated by Colaboratory. + +Original file is located at + https://colab.research.google.com/github/knc6/jarvis-tools-notebooks/blob/master/jarvis-tools-notebooks/Train_CHGNet.ipynb +""" + +pip install -q chgnet + +import os +if not os.path.exists('jarvis_leaderboard'): + !git clone https://github.com/usnistgov/jarvis_leaderboard.git +os.chdir('jarvis_leaderboard') +!pip install -e . + +!pip install --upgrade git+https://gitlab.com/ase/ase.git@optimizer-tests + +!pip install numpy==1.23.5 +# then restart session + +!wget https://figshare.com/ndownloader/files/40357663 -O mlearn.json.zip + +import json,zipfile +mlearn = json.loads( + zipfile.ZipFile("mlearn.json.zip").read( + "mlearn.json" + ) + ) + +import os +from jarvis.core.atoms import Atoms +import json +import shutil +import warnings +os.chdir('/content') +elements = ['Si'] +max_epochs=100 +models={} +for element in elements: + + benchmark_energies = ( + "jarvis_leaderboard/jarvis_leaderboard/benchmarks/AI/MLFF/mlearn_" + + element + + "_energy.json.zip" + ) + temp_energies = benchmark_energies.split("/")[-1].split(".zip")[0] + energies = json.loads( + zipfile.ZipFile(benchmark_energies).read(temp_energies) + ) + train_ids = list(energies["train"].keys()) + test_ids = list(energies["test"].keys()) + + train_energies=[] + train_forces=[] + train_stresses=[] + train_structures=[] + for i in mlearn: + if i["jid"] in train_ids: + # print(i) + + train_forces.append(i["forces"]) + train_stresses.append(i['stresses']) + atoms = Atoms.from_dict(i["atoms"]) + train_energies.append(i["energy"]/atoms.num_atoms) + train_structures.append(atoms.pymatgen_converter()) + + test_energies=[] + test_forces=[] + test_stresses=[] + test_structures=[] + tids = [] + for i in mlearn: + if i["jid"] in test_ids: + # print(i) + + test_forces.append(i["forces"]) + test_stresses.append(i['stresses']) + atoms = Atoms.from_dict(i["atoms"]) + test_energies.append(i["energy"]/atoms.num_atoms) + test_structures.append(atoms.pymatgen_converter()) + tids.append(i['jid']) + +len(test_structures) + +# Commented out IPython magic to ensure Python compatibility. +# %%time +# from chgnet.data.dataset import StructureData, get_train_val_test_loader +# from chgnet.trainer import Trainer +# from torch.utils.data import DataLoader, Dataset +# from chgnet.model.model import CHGNet +# from chgnet.data.dataset import collate_graphs +# chgnet = CHGNet() +# +# batch_size = 2 +# train_dataset = StructureData( +# structures=train_structures, +# energies=train_energies, +# forces=train_forces, +# #stresses=train_stresses, +# # magmoms=None, +# ) +# test_dataset = StructureData( +# structures=test_structures, +# energies=test_energies, +# forces=test_forces, +# #stresses=test_stresses, +# # magmoms=None, +# ) +# train_loader = DataLoader( +# train_dataset, +# batch_size=batch_size, +# collate_fn=collate_graphs, +# num_workers=0, +# pin_memory=False, +# ) +# val_loader = DataLoader( +# test_dataset, +# batch_size=batch_size, +# collate_fn=collate_graphs, +# num_workers=0, +# pin_memory=False, +# ) +# test_loader = DataLoader( +# test_dataset, +# batch_size=batch_size, +# collate_fn=collate_graphs, +# num_workers=0, +# pin_memory=False, +# ) +# trainer = Trainer( +# model=chgnet, +# targets="ef", +# optimizer="Adam", +# criterion="MSE", +# learning_rate=1e-2, +# epochs=100, +# use_device="cuda", +# ) +# +# trainer.train(train_loader, val_loader, test_loader) + +best_model = trainer.best_model + +out = best_model.predict_structure(test_structures[0]) + +out.keys() + +import pandas as pd +import glob +import numpy as np +def get_chgnet_pred(atoms=None,model=None): + pmg = atoms.pymatgen_converter() + out = model.predict_structure(pmg) + return out['e']*atoms.num_atoms,out['f'],out['s'] + +best_model = trainer.best_model +df = pd.DataFrame(mlearn) +for i in glob.glob("jarvis_leaderboard/jarvis_leaderboard/benchmarks/AI/MLFF/*energy*.zip"): + + if "mlearn" in i and element in i: + fname_e = ( + "AI-MLFF-energy-" + + i.split("/")[-1].split("_energy.json.zip")[0] + + "-test-mae.csv" + ) + fname_f = ( + "AI-MLFF-forces-" + + i.split("/")[-1].split("_energy.json.zip")[0] + + "-test-multimae.csv" + ) + fname_s = ( + "AI-MLFF-stresses-" + + i.split("/")[-1].split("_energy.json.zip")[0] + + "-test-multimae.csv" + ) + f_e = open(fname_e, "w") + f_f = open(fname_f, "w") + # f_s = open(fname_s, "w") + + f_e.write("id,target,prediction\n") + f_f.write("id,target,prediction\n") + # f_s.write("id,prediction\n") + # + print(i) + dat = json.loads( + zipfile.ZipFile(i).read( + i.split("/")[-1].split(".zip")[0] + ) + ) + print(dat["test"]) + for key, val in dat["test"].items(): + entry = df[df["jid"] == key] + atoms = Atoms.from_dict(entry.atoms.values[0]) + # print(key,val,df[df['jid']==key],atoms) + # energy,forces=get_alignn_forces(atoms) + energy, forces, stress = get_chgnet_pred( + model=best_model, atoms=atoms + ) + print(key, val, energy, atoms.num_atoms) + line = ( + key + + "," + + str(entry.energy.values[0]) + + "," + + str(energy) + + "\n" + ) + f_e.write(line) + line = ( + key + + "," + + str( + ";".join( + map( + str, + np.array( + entry.forces.values[0] + ).flatten(), + ) + ) + ) + + "," + + str( + ";".join(map(str, np.array(forces).flatten())) + ) + + "\n" + ) + f_f.write(line) + # line = ( + # key + # + "," + # + str(";".join(map(str, np.array(stress).flatten()))) + # + "\n" + # ) + # f_s.write(line) + f_e.close() + f_f.close() + # f_s.close() + zname = fname_e + ".zip" + with zipfile.ZipFile(zname, "w") as myzip: + myzip.write(fname_e) + + zname = fname_f + ".zip" + with zipfile.ZipFile(zname, "w") as myzip: + myzip.write(fname_f) + + # zname = fname_s + ".zip" + # with zipfile.ZipFile(zname, "w") as myzip: + # myzip.write(fname_s) + +# Commented out IPython magic to ensure Python compatibility. +en_df = pd.read_csv('AI-MLFF-energy-mlearn_Si-test-mae.csv.zip') +from sklearn.metrics import mean_absolute_error +print(mean_absolute_error(en_df['target'],en_df['prediction'])) +# %matplotlib inline +import matplotlib.pyplot as plt +plt.plot(en_df['target'],en_df['prediction'],'.') +plt.xlabel('DFT energy(eV)') +plt.ylabel('FF energy(eV)') + +f_df = pd.read_csv('AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip') +target = np.concatenate([np.array(i.split(';'),dtype='float') for i in f_df['target'].values]) +pred= np.concatenate([np.array(i.split(';'),dtype='float') for i in f_df['prediction'].values]) +print(mean_absolute_error(target,pred)) +plt.plot(target,pred,'.') +plt.xlabel('DFT forces(eV/A)') +plt.ylabel('FF forces(eV/A)') + + + + + + + + + diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/run.sh b/jarvis_leaderboard/contributions/chgnet_mlearn/run.sh new file mode 100644 index 000000000..250a2b095 --- /dev/null +++ b/jarvis_leaderboard/contributions/chgnet_mlearn/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash +# python jid_vac_alignn.py +python make_pred.py