From 8a8f566e89db556a07fbc78063483c085db88bad Mon Sep 17 00:00:00 2001 From: HokageM Date: Sun, 5 Nov 2023 20:14:41 +0100 Subject: [PATCH 1/5] refactoring and add arguments for testing and training --- src/irlwpytorch/MountainCar.py | 70 ++++++++- .../learning_curves/maxent_300.png | Bin 29514 -> 21355 bytes .../learning_curves/maxent_30000.png | Bin 9575 -> 11276 bytes .../learning_curves/maxent_test_30000.png | Bin 0 -> 20265 bytes src/irlwpytorch/main.py | 133 ++++++------------ .../results/maxent_30000_table.npy | Bin 0 -> 9728 bytes src/irlwpytorch/results/maxent_300_table.npy | Bin 9728 -> 9728 bytes 7 files changed, 108 insertions(+), 95 deletions(-) create mode 100644 src/irlwpytorch/learning_curves/maxent_test_30000.png create mode 100644 src/irlwpytorch/results/maxent_30000_table.npy diff --git a/src/irlwpytorch/MountainCar.py b/src/irlwpytorch/MountainCar.py index 253cd06..3e63af0 100644 --- a/src/irlwpytorch/MountainCar.py +++ b/src/irlwpytorch/MountainCar.py @@ -1,10 +1,76 @@ +import gym +import numpy as np + class MountainCar: - def __init__(self): - pass + def __init__(self, animation, feature_matrix, one_feature, q_learning_rate, gamma): + if animation: + self.env = gym.make('MountainCar-v0', render_mode="human") + else: + self.env = gym.make('MountainCar-v0') + self.feature_matrix = feature_matrix + self.one_feature = one_feature + self.q_table = None + self.q_learning_rate = q_learning_rate + self.gamma = gamma def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): pass + + def set_q_table(self, table): + self.q_table = table + + def idx_demo(self, one_feature): + env_low = self.env.observation_space.low + env_high = self.env.observation_space.high + env_distance = (env_high - env_low) / self.one_feature + + raw_demo = np.load(file="expert_demo/expert_demo.npy") + demonstrations = np.zeros((len(raw_demo), len(raw_demo[0]), 3)) + + for x in range(len(raw_demo)): + for y in range(len(raw_demo[0])): + position_idx = int((raw_demo[x][y][0] - env_low[0]) / env_distance[0]) + velocity_idx = int((raw_demo[x][y][1] - env_low[1]) / env_distance[1]) + state_idx = position_idx + velocity_idx * one_feature + + demonstrations[x][y][0] = state_idx + demonstrations[x][y][1] = raw_demo[x][y][2] + + return demonstrations + + def idx_state(self, state): + env_low = self.env.observation_space.low + env_high = self.env.observation_space.high + env_distance = (env_high - env_low) / self.one_feature + position_idx = int((state[0] - env_low[0]) / env_distance[0]) + velocity_idx = int((state[1] - env_low[1]) / env_distance[1]) + state_idx = position_idx + velocity_idx * self.one_feature + return state_idx + + def idx_to_state(self, state): + """ Convert pos and vel about mounting car environment to the integer value""" + env_low = self.env.observation_space.low + env_high = self.env.observation_space.high + env_distance = (env_high - env_low) / self.one_feature + position_idx = int((state[0] - env_low[0]) / env_distance[0]) + velocity_idx = int((state[1] - env_low[1]) / env_distance[1]) + state_idx = position_idx + velocity_idx * self.one_feature + return state_idx + + def update_q_table(self, state, action, reward, next_state): + q_1 = self.q_table[state][action] + q_2 = reward + self.gamma * max(self.q_table[next_state]) + self.q_table[state][action] += self.q_learning_rate * (q_2 - q_1) + + def env_render(self): + self.env.render() + + def env_reset(self): + return self.env.reset() + + def env_step(self, action): + return self.env.step(action) diff --git a/src/irlwpytorch/learning_curves/maxent_300.png b/src/irlwpytorch/learning_curves/maxent_300.png index 4f8cf4bcb07921cab5e7379c76e804797978f531..c444b6ba7d968df9d45b248bdf6b9cf06d1eb214 100644 GIT binary patch literal 21355 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 literal 29514 zcmeFZWmJ@H^f!6~0@6|vQV$|v&<#>bN(ds|NJ)3e1R_cb2+}1eAl(gvgmg&`E!{)M z3VV+?-s!oZeco`Pg`PzIAmG;uYr=c*17y z<>lrn$;apXe?GwL>S4$Cr-=F~xCoJ(ilHX}P*~pl;^fQby#)Y|T2%%4*M4ccbN+s` ztKVezQA9CioH$feF>tot&+N@s`vqFDSyNWqKf;Z)-FfE24-4NLxz#7=73dW^nwCwH zRqK}AdqHcmj7vp%=MnKo9yl8j+a0ze%rbxSnYyjN-JsKY|Jl(~e?bYm!L&1VO~Hku z5+X%ynmd$~l-f=!A4~yu@Q3&=9^1_u{rmtG__vev|9|=aA#Dg#Gy=&*-@f786LV2$ z^x2J3;b`L}2koS)MT0NpyQh%IYZ?YC+~Bjz z=p*p#7m)PPXLlM$r6uU_=;%2w8Mr`CeqrHrLqo%5@28*Xfzd2c%-Z_8(2Wn+B#HYj zgxj@?-MB@h!2b)ku(k%8u%|NuPE-6D88sk9q9MeHkpKmYV~0|w^i(eBH?|MosE6>hp-{1r?u zWJ|iWy?rpE%=)*7E3;z5lWd~P|&v06X)LZAaQX(Y=Lyk z=En6y*uQayQ~CTenA zW_zNzdtjjRWYRo(((D~sUjmO~;H<=YS}^!Mi}@!1S3~Cd`k&sv#~quP@ZhmvXU``6 zwe9#W^MckILH!u)(W8=D`S?q|C*pBfq( z;`!K#_1R-Djp~LmZzz~kp8CA~dDg|rPOPIx(3+Bx62DKFb+De2!q^Ad+S)3!8)9i+ z9!!&<#>dBxG6$_L6Q2<}d%pRyS#~WilM~@Ozk@9g3vHuG2E@I$UUN_p^_6~otpCyI z_uJ9jZ#6YF2aatA}jO8%3r9d9sER( zU}FY8$+RW1IP^W_;c;%#nB|g{Wi2+U7JTYrX2x=Oc=)|nPT?S4g##fJL!}+B$O+t~ zqsytQn~Hn$H8FAdbjGzSfya3Grw$j;dU9B8(av-=3Bd0# z#(lg!NrAXJDLv?i9_fFb#aCi4P?@7zm-miX(L4^C4M?=dg zjwM7#KPa^cj1gut^HmR=?(*OQ!j2Q9 zr7h@3DI$&^4-Y-kU{@D)i|%d+z{jYg+msTcMGV8kF|#Zp z#C}HuV~gu+2@w;lXl$ zS~b60cl5~&ex*i63vqS^rbfS z_}Od8vB}qZ1h4h;U`=ZSLBWJ^!3iB&FOk8Mt`h*2;>2vdWn$~>oUh{yU-QZyJ<`vT zmJsU3n6&6Tw>98S&Z3UhjE|xR!q~SCy4rbz>Rnq#YUZGRgTFZ~1OVGNtx=Mdj01mO zWoe{Z^gW~TCWR|dRy!F^J>ai(POaG$-Jl;Yx!ezKe4`k0o+5sm!_OAS?Z|eqi#7H1 z`GasF0=ewa!vcvu3fZfC=SJr(VPg1@ENag{`=1GiiVOY#nd_%JRCg2!@z}H#6zeIH z4Yt>P+TOUove%^{)DZvM>3{It%*-RJW9;W9v)#I;GqQ!7z$E8v>@)MU4}EpTg9kmo zIFRDIls2L_JB53&3YPyI=;K@*FPvk3{HOz<`T_s`aYPpT@Z?m)F^$=7;)(OSxrXCj zn)qtRYUlDbNp9mBjs?2qF2d_s1-%@xMgv_8(D!W4cqEX>%%8b8Ez2wl zVK|S%gMM$MMXZu~T4;)X4#?~O4X7x*71;7!)qCwQFiVA}@|yQtZ=h)bhT1W(YK`(> z)g4LTnf6IS#N{`!hQ0<>9)GtMXL!S1drQntQ5!C{;AFJSakaD3hdv8?jVC?A*?j3DgPw+tRRbQuQ>>h972V$H(FpKhR>%+=# z4@|nv_Q!4do6LOF5yu&H9Y#gdMyTja-kh^&gF$}Bzx2RE2Ln8nm2X`vB#pO5svz&C z9_%MDUI9FpI6rZQ-zE)wn0{G4!KdQ@bV7fCq4EdRhW`fAP6q~EPj~C3Ksy~xBOpwqK z2z&ZHlW}QhbiFmA~!9P{#CWBTBT{oD{yaNG$t9YTAG_ z+ETRL2rD!0$*>WKgbd2k?pQ1q&U>iJS{BlAVAe*?J;qa3-0N&PvjmL z=?m+vA*EoI4$fZnwXSOdEk$GyPE7ZM>YCE3*Nqz26i>qoAAFE^ z`gruEu3z7vL&jFS2`=Vn3qeS}TvVj{G4FD01lmiTVT_IU`mPr@9bs1Y*oM*p_Bk>F zTt_+CBlbAeyjt;|=((o}mlvBG5$|Vc zZGbHQxi&p`lx|)n!19 z&f1m`a`pWRvwWoEP}?cbAwLO(&*5diy08A-3gGat984=ylY_&8)zS=VHD|~h2-f3X zR_*>!i#jVW#1WSIq*SU%Dv(@pw~YRE@D)~^3|@ruoeiwR>SG=bm?Jf9Y24WV4prDc zI$-A`Ub5mnZJ(*=^kZ#Yv#snx@{H4cWt3}VW3;6%JBPJxVOtlKEiC|!>_{6i*XdYg zhZ)3GwX6-l<41CKr_dbrf%o=>dWT(Q%eKXD5J<@FJADjZKqUIMd$<^w{d*03;wVea zik)HS-(+oKidPSU4KOx$KN!{4$b5_gxKF=Dyr6c|h&sVqC4-`dt|vgikh)QEEcbDv zjzn^J2QPP>jcA!1tLUWxnPS?qW}1h>SWWSzfPxPMXgAT*us(y5RuX7EtpyL6ZwYX) zEAKTt-l4Kj6Ml{!cO8B5dV}xW4opR!5d%Y3&T;fUmD0dgqWKt!ke>kXDjrme&F!3O z!}k4BScoZZl%byhl@Il-*n%HS-5nl0#qn4saqg9y%aG-3+$>XSpQIdkI)U6r1!5{Z zwphaVNipY0J1mTxLE8YTVKYv#dxZ&p{D~6VIU5Z;YJrwZm^j_#c~S))Hf4lc6Yq`a zx#EKai4FLJl4osh%G&LK%1Y3})x`Ds`4Y)>=JStp_+lzc_=*IZAXJ@6D!aQ8?+7k zE6`qsca+c2^%+GOBZ@qa=u8mEfo)D=NgCM6*UJ{GeZM^kR3B~<-vFm*#Pk5(#tM^? zJC6ky4u8LP>!#ltgT*N4q8Q>}%})UUE%;-*L=7tux@iXAFfnQ0Ux_=!5cp>}I7T_z z+MJ6#h%$^Tilcp%c1!NyBKt6?qr_2xQy8Z&L7Qpzc|0#c>+M&mOu~CC~V$qeR zo+p=+{LNG)~ zY_|&;4Qu)l9vwZk3%#g&EBNk5wrAT!GXuKo35IN*uY|Tl0j1UFFXENoN8k)c9CZRJ zW>!FCorGr_uY8l?I6oP~7xdAbFUB~*DdzqG>pBLt8ckb#vQGFkevSu64DkLyeJa%BG=>r^{MAM?>>-dtiAU!lI^OlRkG%}fxU_VGrJ z2WHMA;$WA@cv^Ns)z3XZUfqs)nOUkSGt!t9C@e^mo-ZPrD%FbL)M%AYL~e5~=BIh~ zk~1&>t_Z9T={-@>V&ht+Z@*rwn+G1?|BhyjuBZ^Kau_FuU`{)w&t^xh5g{aWOH*&6 z6~Rs=;AATVS!stcKaVjukw28&mpDm8Oref0)_=-o!dmzg57aYdrca$~L-ff@O#^-& zbz|xaoBBG6IOf{;w-aY(5n1!Ty%Qu#U?zjuS<{k_6uH zTXo!it*dK!xYAR%@s5^QvuJ2fTvd05c zha`_LSHI1f%SE|z?X7?B54*MBig##3eX{Wn0(E{ceQJKqs9EU^g$8J>ZM`wB)x6rN ziC*5Vb(~RVd5b{IaH=w(n(iY?Tk3t!_Qpo4%`P=hf?uThAo!*9<<+C9zlQbXFagb1 z(q#lOPk&gKab@^Dd&tclGkqq8xQG(8>InUvS=zWK`2%)+^$?Q=IYquuR17&jnw*$; z1jJ8I8*O%p$6k8Ag!b&^?G+*hHWQtap;w;EU53n<{r2KM)UluDV9w5)ezVesxg6y~ z&|_0s8a3`MuY0%cI#xew1na2DUb~NcpEN?=ORl>wot;QgTU(Q5-K(yy-e9Ye z)z#Cpx@p`oH?2JAWEty%f*BHdu3~%#T%WuJS zr~$CQRrs?y#d-SsgwF%2R@Q57Skrn2UW0GqOl>abMX5o0L5Kb8{08FZclt!5m`VE6 zHnHv}!O>JUQ;a)6SW+-+rztwDCl<98eJkX~lQ41JL6U0Ha^A+Bir+I14h~w` zYQhg5JOFW^_6+HFq|ueG3o>Kl<39owW1VEP+bLd_cxme=O2U6dLiwLhmS~*$A8T9m zP}Q#|ia5mAq^kgLeha4`>&Zes#svv4cX45?dW1JOpYvPH7fD#a0~u!P)>5ni#9snf zrt+#{e%Th@RKeF8XYY{=DKQD7%hQ>3v2qE2vYDD6S53aITZ@nQlmfOfG?M8AN-Ls( zB$0}3kdV4IxuO~2!M{NtO9a=+(^O=SExR<@w35Wy^d(sCOqGMtL!cC<+7^;5WS5wM(pWnh)y#gL5iv@nPni9*2?Hi(Q+50;b;myFKreM@QPC%^5SeYV#)T_et) zV_dt@-#l4gc>($H<7a7M&E2{)vmo*0C4i96v^x`gd+9|3d4rul5<2X`zUW$5g@Aq)6by4SW3cPEgl=X0dLeZWD zbMN@}XBHe}U8l#qSPNlE!Gx&`Vh-_@uo@oY-U0XZ2M0?PR`|oEtZqwTJ((dmsDzS6 zUJ;coW%SyLJzW5T?|k6F)jjExc!bTJO^olvWL`#LJ2@VR%+#CeCkDQ}N4c=hWAy#> z{@9S^`grIBn*)$T1vHZznw{<(pqT`KFNy3rcpD1d-XaAB1zM)2QNe^1*#!l}AjCA~ zoiA;JtgxXMu)3ub#TeoU>Q6*OB>(5nUlYZ~_o6{ONq=$1718NEY5EC-)0Tn=Sz3>V zWTPER>N$%N$2-a_*Uko#M~^enU985eFPjY{{?W9{KD7FA2ic;zNU#jYbNRvrR93&vMbYLIHZD`7o;8k zA)EV!_=wQa`1ts@tSkV`=iOqC*Q#;-TxV+o)w%Zzu{O}rifCWsoGk9O=yWN%^NXQ@ zXw*u&!>M26GOsBy6Qt_kU^Wmf`mWfgv~%xr%e-$0mhlv(nK`uQ@8KDhIQ<8FK%MKY z8(xc_tly7T|NL9eu`{ywiKp2yCVXJZwoAmLji^&usm z*t67xm)h_e=j!Q>Ll3$1w=cB6=zgb|KT})&*>XumFWlY4lr8G~ig0MEnQj+)%^H~H{UZjs5Po&`_{cYZ zA+NzGHTRM10_G%t`BCV$@0eo#uaMb856-{?)=XNg1*vzW#?jj8eeX{1Fhz%Rl0Wxc zzh6Bu^HNwU;Lu*NZT{O%Ub)a!sB3K&I0DU_C~h{bR$8qwG+ekfI~>Ev(dqb6`&#F# z`0(><^f7j_ANPIS2ukTvycFs|<>avRo=hxsTa(QO<6N zRT!J*EohDY+C$o3mc!j@XveUSrcUX zROR~2wmPAfGMUj(tYaC?p!8vHx~6H5ZhbXi$Sm!CdBWHKN@;h^JVqLQq}HUH_wtCc z4lIF)M03;jZ@I9odce@hVV{Pp5XR2o_4AA2=bO@qh2x_h|4x)VYRTbYvGF^h`ihJh zAU`vEwH4>+EV5_zKqEA$p=9uB)5hd&&Dx*ig%-@Of#YrLll$pCbtg@?^GM+ElgPtyRBfQ|Gq); z0-=`kfG~YOhiGbu-%4~`_s(hz*^yuqcd9z;Gj=g{AquwS$2`tP_bn7Jxnf=T%g~>W zBFx1xpT3)m(GRCY6o1zt`5}8M&}BU@JF;Z8{YwarMO`#(S3NXOYr3j&UOn@Ep7y4q zPQ2O3QOKn|TAR8ISs#}kp-GyvJ=u57naqB&MD9 z%l52on{05gah&DeVPCqm%aN@`E3l}KILtFa{x1E2cxsZ?6*En8D94% zlHuTF7fEeGmZcAo2u7#g76Jk!iW5>RHVMC#QLtTvh`<#H*7}JWZw;P%Tkf;N4JrA2 zx>!<+R`rSvmj^ukXn|(72_XEa5vf{BFzn2ePb=FVY95?o{Q-GNDoh4nLS_8x=PK3~ zvvp-^i;?DZA6cX?B}!g2)m6Jv#K+sqmYVHe)h#voyKr4hPM$NQzfn}(U3XAUBOF%E zk7KrR`W-zo3;jsxZWEo=7rR%lnb>kFv?KT82AT_1PxtzQ=$d?4KT=&-v->?d%}n=e z&8{vWylnm5%kmpoetmar(1|;jPLG~!BegUW#cAA3`9^^N;Z+0(YFu;|($cqijA>u7 zm@kZRmDDX+^NKgG_JM%5A(9B&IkB^}{oP-eX?5p&@~BIEEi;yw!v&vKt|={I=x3Q7 z^DqduStk9@0iUIxi>1RFk_E9!2CHL}$4u{v{uL>s&ZlIm$SKd?vshLC^la~Y^f&SR z-#y{fn-edP8l}s&JZ}*MEI5BpagHkphRGmg7D<*#6~-S;GC~D)a>sy=x|-NdJ(G_^ zsA9gfzGvWm?bzIBu&PZ#2dnT=$ovOSMU{5v}E zNg3-%CPb>^^9JBJjAcD4{n2M{SYGA;6e~^V3bCe61wN7bV(295^NiHn=ca8>H<=n` zj&+*6wPXF`8{5W^hU6Sh+KbwHX;U=N&1rE+0wN*N*;5zL)!y9N5Zc$p?=>VvSgkC? z*XZjRHMt(cLeq{*sR_S}Gt4Es09C0u!@DNw(2;B2_oQ&kXxtiNxB`esa2#qM-PWu& zGejQOl=Z%)b^24kA2!ex65@fQRnwzi`kZjn>c=fPE)k6zE#bFD-5Zr^nLI9?EQrpY zthTb81hxpjg$`VUhU5cbo(q+WkD@kGQpRM-^gCPd8tAtX~d$A!f94|C_XO;l=Xt1T@M27(+aEB7l0 z&oTq4oFo*+$2DA!98&J&6@iBx$Uv{XNd~yhie#@0uIeSdzbxpla4hD|+;S45%Z`&E z(uGbaZJL+Haay=jx$$L4*`v>RQ{g>)AP^=)#dSps!Fp$Ps#psDs)*}}Y__IlZz6>Y zLYO+&jVlzc>N|p%HN`iVlU$}MQb|Sz;P+(lvSgT~i1Ihd?TH$R49u75eAs^MfWQtY zV2i%eK$*ODo&=?Y;b6a--aqW=wlA@Yvzu&*sFt{e$rAtZ$T*UB4H~Vc4F(IST!P`3 z=*jKxVbdGfU4s4oSy!?#c4JOGm}# zeAgxwN2FU4Z>QD702cQTC)myY`VB%XYDg8);+0E*+g9p6is0)wbh~rgKkNoK2Z6o7 zcS$%}FaZsY{=Q8ygadFw=U(|s+}6hZ&$_w^Vv2}M{{9>Z!ju}38bl2SIkr6gLxUG# z)p>ne7%5~DUWWJ3h7Sb3SWi%{;8G&I=;^NtxEqsvX%&7N%s>{xUXpobi9=zEtc;%; zY@oFPn!Mj(Mr2u6XY1C39bV>YV<~V3;6L4?hpvTN=6di49ML2un&fVORR6|zhNm*- zRy#(qKCU$Sbe_ZpmDM!MWUY1vF*74sA?&s{)mBqOyEgpzwTd3D0@i#r2w%@l8J$yee=q|VFhfb`4e z?^3rrhGgJ^Hlv7%G7QJ7Q!spp<&!eEPUzzA^2{+7G5&bHN+9zSZF zYmCC?JR5mZ%}a^+GtCdqm#aZ+4qT@epg--_mxlPK-5TSb1SZCjsP_N){)Y=)V?D#4 z&UAE*?_6qaj)Z`eD1er$At8B1A~eEfN~3iN#kX@68n8JAgp1e`&Q?UQirs zleif(XWu?@{7_PN*S*%|H)g6hbK47I`ZW_rEB92{HlvP>x54tPks1cmCSgDyiW99^ zQJ3|Hx;E#J14_HT&ym5P_1Z3p;p5}eHAp5nxVk8Sme`H#zdg*)_4jTF#FEYtXy=V! z=E{lhgw#48wLIC3VZiU_wD|Y@AL`SyI|nCPA^&8E^%V1=f(}&Rht<^!&)I1s=f;<;%aDI(BQtJW z`uX@P=x{}w@rW|M9jIvMy8%^JMR)TYU?bN&OW#^1P=O~>=d?EqhNE!6HZfT3usY-! zI*_HP_#0E@>{oUDjb7{!4 z`$N|K=&BZTQV(6--xzu_Vf%&otNOVwL~!l;tZ+oI0(-q=MBTH9g^t|w{4{D^$$_k; zcdgt_NHW}mN+N?b11H?vENd;kJK27BQgx!m+cMWMr<#gBN#Ytn^rFylpJ-6FI~4`x5ip$3Q8_C&Z4LI=_oG<9j3xAs;${tD{c zK{ik1M_T3ecL6Fi0!#RL=CaOG8^Ba~4md&6DVcKO5llHo4uL}k->k{&tB!>rbI(J= zX1mLs2nNoBCPs}$t6D~7Frs`!;DUu=cY46dUO0U@@@RW-`=Hl?2dGpO(Wpu>KjH16f}>rF6>G7gF^{$ z`W8-KS>Lwf00cA10RR@`IAc3tt@JC`(+<{)XRQa&^lj+_RRKdu0|Lpak3UQa5W5O` z9)wwQx+d7XW@!ZSuO%Ki8tSa|b<3WBFbQ+}N3!Q2e@ff_NWf>N#(879`Y~15EuW2# zFdmb-J6$aAo`B?`;X-}B{tW4vT0!a_!9w@4)H+|JAga$wap%7MMESh^AR;IFH1DZg zmDI3thya4qrY1mBHg&0at%f2?n=GsU^%Hi!L~>#D%mkr&<76**5Rl39e{y(zAj&r&d{`8~Eks%*k5hpEAl*Sm@%cHZ9iap$b&&DDo`L%WlPF2Aw zNe;nqNwi(O_(gL#hA~8}kx>rosaQ-j)yJqBUK^Q4u$Ex#f&gWBUq!U#~2KS*p#~mSu>uIz?HF}+BfdQpAcIX#uOAFB>m_IITAFrfWY!(HH;hK&> zx~L^}au1l?86N8uwHDXTha;}BsBVFcu~&wMVX^m>b7%FmwS#(lUyQ!lo2jMn_V#{g zu3#qA2uy{1C^l~9i=fPbTli=@kM}mNV=p~1kZdNP*uf2J#4=Q1tIgDLKimrNGRCt9 z{rdCPiHCK)w*PT$IYG?(FJE!o7FrSaf)MAK9*~ zujhR2={f)@k1IBRh_~Wn`+0#Se9U%f>OAY%hFs3ti-R^!a-{>0l6v)0P^z_op|f>~ zIa1y*&;<8(qFC0eeh>706^nE@JE;bXd7Aj{Tdhk=Ry6Obl*VMQ4x;02XNP1kq;%$i z0`stI2$Q?L`#4BmYq~;jKa5V5g~{~x^+`X(i=FJaIJ(Q@5P(R0eAnRZNcN`lQiwA) zz}eV@m)Eqq`V@0Z7jJ`;!w_E%EEwC9EF_(LG+H%Ny|Cn<%h7|?++z@(*Sz6&VorDe zFQOhkurXdpH(ldALx1>sfz^op#w<}s1ZFqHylwOA@a>XD@_&W%UuS*_n(Kx`_df8U z!XE&_5MpNjvM-T)9mH2dsUJUJ0m7j4GJ$nt0s+SxK{qtcNfS@9z4~<) zuia_dXc;tj9{gK3qqx?Ls8IknLvJ6oMPVN7u1UZ%s_L|Lt2LMiRqqW zqvry04C8eYSSfdmug!5#f5hP}-O-mwzWaEKAP<$fcv>LveE&BTj-E+;Vz^}46M8vX znpxv4Osk-UQ|7%5PWoYHOC}+*7h%3bjv|CsoMnuZ&Vq*W)3di)ovdD`u6Y^J)sD70 zE%5q2fn-${;#dQqliSkpQyNk?b~A=Z^Q}LQevo83 zsTftin5iLdhvK)^iQ(MCYKWWiP45yu&XHGB8e(3X?x1l6AMl24n;`={Imo0Al45gt zo)zMEgn{9mK%*`gAbD&L6sTI3Q{5>45Am1_G>5yrHAQG{(N9Nc|P zmNiFArMYexw>s%Q7el7Hgzi^VoKN^=zvSvpd$%=kQB_n7CnEBSGwmw9u6RV$=;2s| zTrZ>C;Z2#EaQhK(igJY@%tdJA$vk2$tBX=q(j4cvV_QT-G+e3k7I7j8ccyy21NJn7 zJ1HQ|gSS>>TPZjp^7HC3>cI=v58RbEY>}`m+^o4VUZ{wo@@5;?%&kCs;#Yv&WXXJj zQ1&dDk z6Zd$_>Vi)yOt*&%6Kiemq$cWmd;k1rSOe()&M22-q$Q=fpzN~Xt8}Et7$TL2BlJS# zZ#?pbBclV=P^SI?a2u;}63CT00#QoI&}-@a0kP>J+xyYQ&&)WZa79z@n64B35jO?@jV3AmAB6(+qR36%%e1EH{AfdGX9sRUl5|TE99F2`;kg-EsDLD) z&-)ZYEpQB1JQDHB+@RO#zin}|{ASA>0UPB>G}6Rw>{gSbzQce;p62i9YKOIxN`n1H z)R%?Mk&#XQ6o<~wqi1jqNZi6|xU;v_Ue@Dya z612Bdh(U{xDB)PQ+CUS7>_0am9nOY{j8@LS|TUn z9==G<8$*0`cNW!T>}a{aXGI{z)5W2KhXH~cFVjQY?s&2BlQ_Ge0W>WT5wUuDR9Qcm z5Bodc{PSCP(a-6kOmp^sWVV8_DyrJ2zU2vFjfK&C^p2$>5wv0HiL!0tC&c2w7 zz?C5E4^2Q-SwGwW>+8S@>=@`~6*&f2Qn(V`7#0)7#WqnX2}>TkwPPD!JqmDFUgv5| zpDMFHK=hFV6$K+gDQmx@8RgvfRAg}%m!t7O=D+890L;lF8iePb;7jwRsRN{qM0G{# zF0!&19>x;^DK|M@nq;h|r^h7*QuwP|tpbNX{Vb>-<%aRO;gqiUBBxagv$#dq3rl}R zQ_w!vcbHjnJm`IgdJw$*iS>W44J3Uk$imC&?=-4Whep{~8&epr>ceo(o4q4kTF zx_#^V)ccS#f0#Nl=qP zq$Wx!F;9)`E0ig976i=Lfwf<1KI0^%-5;co7VG*)-nA|smMm3N?V^R zkDGJA&>(?6zSw3PIeLCNk`oj{5+ono&-$3Uu4B#b z{nS7zjh<@xf#G=@?r%UW3G{;7KpmjtW_M}2cj>&yES?9OEC^M8Ri`4l9z-Va%(ISe zRfl5-N*a36;#So88R~%Wqfa}x-9U8_sGZ=Yu%aH8Q{=D)i;OYK5wzOhlZ*wV}%gZ9HyjU|`UlJ+^4~)emYwzqq1hA%gAA_${WDCQmd_XB8p_0ip=%&%sZg ziX1x}dU!Xl|4^&e`bh!bT8!gE9Ir|AFo56`E>PtFk~4SUpS(h=&8)-)QV7XnD14Tn z@}>5;=QqXcEgD5$gXHn88vEF3rwmPmbUA0wKp;f0s4aZ1{$*`$VT+7^OTe*xz(PAk z-W5v`G*53;Ske`GOHN?poxnhU5Z?5KDZ;GLbm3M}iC2XW&!jjx9++Hl_)*)F)rHqX zJfg8-B3ettBz8mYmohXWRrLxGjz(R~Ohe2&6$S%Q4H{GM^YAvRWc;Kh)5*_p{Kdzm zXVBfA<`~qvS4ui!Z9oU}K3B;3lL2|T61OSH9%43 zkSd^6&YDEY)fYXGoFo1FiM2*rzH{L}$}bnZ8m&S={;9^2-nuP#@c|@*%k%0LhKZj{ zA~^f}*3(aI_&raNtu@ZAuCSTo7TER7rTfw+VgaDUY`2Lto(06WVjjK_mXxDlW}Nqo zX2@~&MU^Z^|4I5`)f1#@ z$-w+$LDaWDua;+wYt)&^_N)!d6xdJHtZNB&q)^?m(cL@My<;X@eH@kV!@Icy!|zWu z+k-{Q#ss!n%X(z(KW+-H@B#j~?`-u_wSD0=)pL8^r#-Ex_&RDik z8>y{)i%jFOZ^1P@B{L3pna0K+M21!qcd?c_|0m6lv&gn+U9zn6Mp4I!>s?nJLOcmF zMcbXvZ^Z1f7|QPsZlL-LM8^v#GD&lCecUxH1)2=Mwm%wXz?Z9Kr5cC&N6QpQ=e7Ja zvJtK@e9090gQ8roI@p11@iX(!Qf#X0`)h#77feMmm5zU?9Urqm#uh3z6q^mlcAl|+ zRFFPs;}ylh)aRBb-j58<#}OtOrsn+q@i}4*H7ew|MK`p4GAY))U>{$UU(|moF?Z?; z60}x)a~6gDD{6Q$r1Bs@CRCDPu!$7z;14^OmjW*@{a!aq&q9XN1D#iKRxv{8R2{r5 zv}LXL_R4iPD@+*18Y2rnc>-6U0M~aZJDaD}*`crs{b3dylCgKd2 zdW0h!b2u06GM&+voBenjAJom;rS|O6&}x$Bu&c_N;%nx5(}QQGRD;}g=>Y{bJdHGI zBkqH;vJ%5Rg+QGpsB@^CgFQdXCA$z;<~cgy$w-atIopLa7gx2Y;hdi1$v9wORNy^s zA>>xZeuc{9K1#+Onb#C;I@?mSVjgS_WZTlcEo`-!kTCZ-v~SLOUeW)`4}QdHao@q& zJmPMv#5zZ9r~gqCBfeADj{h;ju5i-!IODwZT5w@u_d^#7;c9lb{BdyimbCS0%IS_O znc?QGR@jx$N!^m?J?v0<%CgpjE9WgoAjq0kUH~Xyojw+UgJa=$gFW_cFIYj)f2cpj z@cN`Qx7J@|>s5jw;H8sO4QV`!<7wOsw!I5<5`DHoi~qDXi%TpuW(wJUkRu4ah6vsY zT{i^pVBFi>`ie*R5rRqLxw9*py)*nEWCR; zbJvlHw)5Oo-n47-#(F7I-mB3GJUYs$U=%M|?Ml0h9w%rjeRk zI;1*DGXA)!I>hx@yp^}HIAzFGRDqAD!eT5-3Uftrb;!v zM3oGV=3LBXCul9ZnWFX=B@E=ZS56+`OotFv+G@KCuJYG|&mKJG4w0x6>T&4F*NX$| zXQ7}oIc*9`=LO5nen5kr5d-ol;5UQDnfGY(-`(2PQ>pDIN0>;ozLB?VSwM85h`SY8 zUMgTe{=HB}S@ZKKh}=Otl*GhaB?RSB}8=2wG9msFskR6})HluP_=W z9CMBi=KO{A4e;D*pRMJ#G%BSP+d-j9uv%Ez_FecfZ+FrdlPo*jH!^1HdHkbKLxt?! zdk^GQ;>)Ka$0x}rU6ldkIneq?2j_a2^gxf%nSc|)1@l}2t#qz2p27>Jakr_a`cs*j z)LKdvh->JPcL7dm8NYW`i!Q6&1n?0Y5_H?yLK^-U+UX|Djd9s-Ula5cB>d5E{$yys zvtT|mG1(HH!*ODrYjaRRpaphDYA(+T^pAjs2U7mNeF+*c!s`RppR%dg&mBirx;hCe z_9Fgztm-ZeKR2EAM(_5N%%y2kmyL(oowUDnDe-Bs;RNW0g2au?ca@Rf@c1p@K8@4( z?FB^Q`ENgQ-^}9dmQ=*G8>mNm%Tix;Y_-wEn`3(~W%v@BUom?|))b?5Tt%*vOnDwH z?moJ&%(6LGuHb@eF${SXG`6OUl%NdC#X+>B3=UBL~YDoUY6wfEeogiqpYXLIKx%T-M#+w{Amb5s#ZS^Yc}I zcN$k7jux34deV2+9n{WAJ2i&bsMrF>fKQ&gphOeuC*gOe4&$=;fw~Ga<{b_@t+dXM z+awlrNyBW0cJ!=9$>ir>e>yy>rjQbZ$eyqcl1q`+t+VVhB_wcOUq3Oq{q!V$V$OPf zaK+yeApI}!(WCeyO%pB6C)np7&&@x2omUITx8!zhwcXcI+X7`v!NdykQEYtd9_v8b5^SjjD2cW<8@~R z)`uo*q8uv65#`zJyU=8cJTzi}#~7aKI>Azi>U#tQX3B$cz-sv>SL@|aD-gbO-=e+` zL4(3@|Cw|%7`UFOEyW&ysULbViTGmKrF!QWY$a|>5uAM2cOSpTl4^IDa@)1e1 z?OO)wLtKY&JW@r^L~rD%XObb^j&_IBjSx&otYcRTiG?7m7Yq zapAnE&Y^(YV!sbQ9c`k>>sB=v;c9};HTvf9&e*K?@x_7g1^?(jLi#ItnGQ3yh1tT6 z2__Aiww=UZr#Ol<<#9RiLY;O~S_}=%IT^;sTUQhBEu3}VZxtHiNYy!+od60%oCi{k zqa*j`O-by1ST#Gdo;uL*d*+^si_rU^=8xSSc#0SgJw3iyCXTj#_%|l42;E}o22yRi z^b{>)lxa4l>QlV~V4Dx>@9^kUu6~?Z-EPViHBO0TZbmlNVr7Io{`z%zt|TIth<0LrTOYPIJ|O{h$3Yva^A*>H!$D&Q=q%m(I3$K&T)OlW&i7W z&_mgUI=zei_SE^@8kPJb7oUxoKvO1srq7Y2@Y)5a)JL*=A3?Tf&hXOm#m%*H`(d^! zCnQz6q<7nQ)woxC<_%sCHJ=_R+`I{1yslgREEUKr5&JuWvc!jaavHy*jQd4Jn2K#D zj_d|TJWS-hln;kvz!*ufdhypuoPAdq9&a66^V@*_wM?(RN0CNk*_4L(+~Z&mUn8y< zBW}>1WVQ4*=ZqTkMt&^gRBzw5(ZQ4uZ6>s}wpwnj4i?E7YjEN{PZh0TgP8%v{H z)>B@mdP@1IW99NuHT-^McRPxDeHZ1nX!MvRIff!yKK|M8{SF%Eaa_J^C6PE2czt4f zdt1O|R@}sY^=mF>7NoP*finsL@TT|^knekqoH*gmxq;fU>iZZ-zwj&=( z1W-uU7zG#1X{ae z=My@^4GO=yXi=uFQ%F5wcr)hln#*vsFZX`x1@-qlr%_#v~<^fUcYbevG2L}>@&tWV;ufb7HiEl z=X~dU^7s56wvg#KzHhJ^){{fG@~%~=hAQAJ6}G6eczUavM@9Vp@tWtJ!h*TFJPNzn z880v}9BsFvGv$GC5J)hqRqrTvQm(hM-2NgvBA=~fj3U$oP6H_5p&%k6+WpFS>{W9( z!{Y=6{Q2$&4p6I50-?)JP`|;x3S+f%Xt4Rf~0dQixE?U3q6|HF8@x9;WN zu|6*OUJ&~7KrCuus!gJj-jU9#O&~*?LdWIyFoPi1o;K0jNmqrcw&(Q~G^pO@xNo*h zA&&(YJu^?n49QVP9}dDl1Sq0nuG?Qe=l^P^|4#AffZWZS*xM^(p{^@cl(6~2$GcN& zONAYii@7xoFLBO1j)}Dk~X*~Ok|`%;Q;BWr-$YDBwz1c>`qm>X<=b86*Z8oNKWxy zHFI7KGaV)2MkVmgD4;zyoN{Yxu{$0!ocrOfJ1S`CRrk>W+n6Vy(Fa*oBlbtnc{)tJ zGkhCrPj+D$R~8rSuj43TdtV*|Rq@gy))`?Ze@` z*HQ6+wmC!ZCE0sVwr}6Qu}AK4Vyx;Cv=lV6AHL4FMW6YuF_!rln{abRUf*T8v<8PbxVc5xOeM5{ zZ{s}M6Z-{>hjWl0C2)UK=|&4_b81|w3G60?fY-uyjd!^n*N4vS>5nnP7 zUzW2D7y5UF2PX5X^7OCs4I3vHvT_^b8QotY1uk{3@aMYINaTX3&?w=ZpSEGq(SiPC zYzBMlGe|KHlEQlIx?HSZeXYgj^Bt3)4$*tn4g$mr=WN5-((Wf0$r#a4GRw_&eDZww zSs_kKDKDCM?JyuqQ>HD!=RB(RHRZ#V#jOQa<+4}>lFpW8hwG7ci$Y6SAE`2QWgOkJdv^-7D3xAw&a{ic7%n_>2IcE$5V)Q6Zp z09aYZr^8j`fK7wfaW@^ z4pwSHt6X;sj`p|8Aft-y!9wn+L1|y{;asST;*%>$4?_calvmyvi%UI;6t=y&q`;#5 z=2=?h&yBTA6l z(_CKr`o@K!{)A(n#w0&dGle8&VVtCp1PxUYeP;Y9A5LaSkd@>utUj|#xOYJ4GZ+-f z5o9Kws^aL#wdHuRJ)c#LjdT0MK+!XSMa=G?K-ewq1+LQ?M+@yDYtW7jO2gMNHbx z;kjA-9N47VN9}&+udVm@dfwYhZZ>D$#U${C|E~~~jD`T4T>Nfe;7F)l5N*;!l2T&2 z(!yg|s37`4Ed(rvPyQ#U&EQiPT5hX`yk}R{O z-TgfoJv5@F%+)FqB3mYD=+5TTtJ#lUXcZR42Y>eW8=(k_BVo!B)X3D5R(4Yn6L?csqDR;)WfE0z74KM*Ya=w4&*7aC@sD# z%}=0UFzB7rToQd@DBz(+X*aijckT4Fu;;RYQ`M2fqPyb?ZeNbl^XRr^#~#(85{Vcr zrGrE2U_A%*Xii+Ium{+?#|O=*gRzq~XY>)ER>@W8bJEX7swTZvO4aX}^ZbG{AyGqF zU;TQLAY#(5l^r0D*-e{mk zHw*uGu;Y6xkl56QtI*W29__b}d5+mJ3Kf_0q3>#&JDqp{&r6IXUNhtw0@4*@ZPwd_ zy5k=Vo*B%$M8LHGKbN8kFx86XsYY){w~4g zmmC{0OjB0!uzY%p_$iI}b>|rCDYYFkNw*Q#+`YAiVE&Vj)0(Jz=EYmy13_39-aOn; z8U+YsK>E#%_u--S#(C*vJPWE>XgjrGPUY8^aBDwCdqY`d>~gL{GZmjqMVsmSUYZW; zsh?G&l7|o)`&mA8O)a;|xYD!Gc)PV?K4a!w6b3se?S(b}3m0eSb&;N8|NCaB!{4HM zYX-{>xKby1QKYIeZSTn(@C(MOc390-*@Y*YjPs+thtCVf3>C15d^G+}WfH3H9X1f! zX-f2Kw5k@5@zOz>#9ne?W9IrsIQBJ%-#unSZTrpC!N#>ST7k&iC z5QpoNzg2H}bwOBom*355*6Liu?loifVSbsR5za&j^+PYt8dwOdF ze<345QJbiqqnOThJ9+f^HOcs>q^_+a*<7$A<93f-r@qKws{KxyNsSn5Scx>|c`hv+ zT8+6)t!%h7n=Uu)&9<&oxK}tR^S%EpnALl#OZ8IU=K%f3jH!tfr-NI<+i$s-=C1s- z&0aZKYn(oq4C4PuuY09GPQ2N9H#4(nYQdQr)k`C_RhAZ)xz%OFpC`$*%_fIA0(KzJ z(0HP(SHjs^&P!K4Tcm+$=x&8$e+gg|k_1UoRR?VOPv4l?Ua_0LwbQ|IlgR7jSjg(z z`P%U>&GEf7(rW^u^tUZ!3BB0jW8C7BLY0rdqvjBRsFzaA+{#*#hV7(Ws`87Q?T1Gz zLnYPtcL`6aUJyh_VJ_7`fcSUl?Dk5}ir%McWowQy$I-5Rx`0J>*FDj5p#o<2)(@;3 zS+LW)3PNCO+#8q@?Tl^`=}DvW%rys6F4Ry7)GQwGEzJ6#iKapYYkaf197|#*B656X z&xD*8I9`fCk|bx}{;i4nlzz*jW_xIwa*z4U0)bzF%Jum5!UWvA&uEgJI(hQ@YCMH! zc&Cg9`8nqgV`-G~h@3ViRF1}&eKu7jd$H06d6@MMvBFB?Nkg!%KZMI`^%y zbS!lT26J*xD41&WA`-Ht7;1y~XT56Cpv=iZ;KR;fHKOrX_zk75q^Rs;&*|yi{!@xy zAY0plwXlGaaIXz}&0Ud^VT;AYl%9F|*(Yrbmk^bi!5T@i=}YDpKM=NOZrqB3kp#_DB&uXiHS<`;&6I~#Y!-EhUZev z&LSS2@c6N?uE)HR^N)%9**@p9&dhwHlrNOyYhlLRR>u57lNUeF&c<7oz0lop_35=4 z!rA#&;=@uI@|QYQMa#O!e3dp%ZO;>2c%B#pYq3VYS98|Jp1U7jFhJ4~DB--{E55nG zueJ^FQGzf1y4a3mM9)U)9BxpRM=aothI7@mSk0BGsnGtCs`Tvcj)N$Ff!~+duume+sm2&h z;xuP&vy+)$n`&CT&$FpiJHLru>cLOX-7yxaO3!V&F$%ggF=( zBxfz`chs93Qz@;j&Nx*uN>Y!9qgUFN8am=+FshZrUeeb%9On%@7|l`q-u>v##hrZ3 zdI?WAOJkv97k~C7CvlqY#VP9f{*FTlohR@XrKEitppqzwz&ss(KQQugdQF#v)QCLS z+@SLJu+cP|WLL=+<$n6(-R2J-uY>HItBPVY>rM6etZUCV!$nJMBD?vvU%)|{%U%G9 zgncqsw{}F;`{vFlLITu8#uKTd(g+v6w2|N7erpr!`1f&pC2O6y(#DOO zXGfUX#SZ&#%7n4CE0x%1l{S`S#%_35H%Fm)KWx@e=3+-nJeJMp^y(kE!v1hK*Vm8f zcI5@-=u``p*oEbd!^7E8hK`JML7cZWd=oo4x|Ht<&Qv&^Q@tc$j!P%}=4Tu)`aucd zKslN4iJN7-e9d;oqvGOPKhoOCZ+*og`v(Jfym6JkTgLHnj|JI3Kya1)t&MFlYM@$t zbuMWlvQgQ?gYR%qpNto+gsq1e#annX^Z5Lw3fZ|U@-oTgi#ed0gA|_@lA*5$SyhRXH+Yc6&3m+shfPsYci}c$9aIS6y_Zd9romKe2KS`zL{n^bH7Q>T*8C}1h%o-pY(@$Yc#*1@>8C%cYT^#&bU(VdhAFIdO6%P8F zb6s%2sFz0`#V6|;7$Ot`DU(8)#_%qN>X(- zL#X7ju#K&4SB^S|_vUCO+l1>rtPDh5Y@AOoj` z!X6Wo%?;0lejyw=rN`d>W4Vtc3Er_k)uKiX7n}PctS}jAaW}FwvO7yG9(|7%BC)Jo z!~GznqT$l_H)z>9vo$5aV7*R zPq4;&GStIvUE-?I$a&0R|4H0+TMt0z!V|B^R@WLCr(kCFUTADyut_1L+-OgorWEZn zG&IzZYybW_DK+V9InRX9uV!pA0b|5Tyn(l+$;(L=gX~5ZDb^QG} z#ixS8&Fdoa`{CR(*zM zSDR0ao`<9&A|kg=d#WyU5cwX5BaEE@SFb-lI_R3bt9=NBom~}|RRFwPY|fB*yJHwm~CptfGvY4rj^r~vewaN5u)W$~?hNCfuXHPdrQ)CmbJQ)=6h zeh{(@A!U|Bq1wfF9#8-JWdQs1pxR9Y!eid9zsvCeoon%qC)lqbrW!X-Aqpn1pgUT2 z`uZE7`|3mjDD?=S9s&u1$6~O@8n4@~6}*a?^y3 zv>xd{wc*K;j;{M!N(Yi7=2RwoQ_;HdWgim)C{2S`3d(VLqj}$`mVhK-BDkBng?={3 zw{-56cX#dGKd-Ha9oNN~3V3BdYF%kPJH^mJj}r_?zb5(p_M`V2Nqwooht-4E-dvoM zid32n;lm!Yk&%)3p*z5zjmx`0cHiU-P}_Baxb<^OCUH|X>q-2W$BT>)TyDeQpOEg| zlAL4a;fb*+>&;Jsp~wvePALwCSc)()G0qc^s>Q*rm6UWZJ)M1PR`HQzwWH;pJGH^j*3?zS_b)tikm>Y)G#a|b>weI( z60LNRb&j`nRZ)8CQ3#B7w4ZVuV~WmGXZw#I+HY1-^L#!g5o2@eV)PBd1C(0HUmyAE zn|8eP#I#tk`xCHvt}1uF;EJx}H^PMkCrla7eGc#SlkjJm-@v9Y60M%`^TYZhlJjN- z51*(LUC_izcm`IU4Ee{e#6S#r+?y;g`?IJK zpLmKZl~?570jK2f8Ym>0I6agdAaGtbz+)wKPITUYQfqqRzekpdYic6`9#;I%a@^6l zop+5vJ2NGc?+>vL4rM&cL=!Rrk}g82mi!trJNDPZznT;u%?=R!V~Kuhn{&We_Ka%s z!r2{o8q&zwNF+y`sXndRDBbI>kD~>TF>Hj=czp1kAB|K)iI|wyTLO8mdlKTkC~Jh; zJsO~f^lN(ijH>08eTY#$$=_SiL^eo{`bHyCQ+Gigt^N*KGZWxJ*`xPS0WY}xhNNKK ze@=^7YR*pd6-xU-)V;gomLf07W#&Nnz4rH(^79kZcti_Cljj?0YCp0Sx2N7N;^1H9 z$0H@xdQ0R*FS`FIcK~$#F*r1eKn=~O-bL4LYKa=A2Og)Bdw3@ajae zJ&@jzURo2tQ>8_U9%=r3B}d4_B|mBEN$21xkyNWck1TRh_=dooYAsSUh8+B`6k%K` zYjWPGmr2hcjsssiNu~Uf;ncZCTg8c%GE|wv@AATo zgO>9@QiRv)$$*Vb0kq;o2*7h}K2hp8p@F7a8d#*S0_!zWhap`>$dnjF+W4#a0)$#S zNb4)TWfFtVcyVgx$Ushk!DCk+5uJ`>?m`SMa~FSFeI*J$Kx%1v(pBe1t3)Yybb_=B zjVFFZTQ)FJ$p0`WmQm z71D9v>TQ^!^E_M={`Jlff`cTt#Vx^<0A&dkH-U%G9%6$~VbR&;pOCaVIj#*jzkOg- zXC5ZtA-4L{ws~35!b`iN(lg{G*2f&~a&i01kSX5jkZy1~YOke{Vn&#^IumYAbwor& z2+t>n)BHuGt=F4*e|N%{k!FWl#O6thH5f5>wX~=e6a4-7Wa!LM-g6K<9(j0G3)*+#Y*6thu@yIezzDg~aZo*lk_rQfcWWFu7_SYHQ9ztxuy z@LzdLu`7n{eZTszwLyi}u2T)c2)7UIh!0qy zkcfV;WPfk()l=tG`^e0{PTl|{K`(Or5kl_=z|90jJ{j&p&j!3emFhLUx#$G8;hUs` zMJ}Gd80H|Une;6o^ghDT1iU|8z+~0nKI(B`p%^DtzGnRo>ZXlfGcy-?LKt8Bv-b@Z z0jI}A;Ydj*|LSqtU4zx8JV#2P{<(N z(+<3j1nN)BP)2R>l8jlJxeW`wSzX2E{g{IuY700+t9_3w^?xMars8{YIv^l`7s$Dh z1a0sEG4TE&HqrCX^Q_2y5C%JSZM~Jpu+|IxqMCszG2MJvaOvDB9>0|Fdc9_-nka$` z1$QsOLRT6Em4IhQp%|*w9eI?%D(`%ck12799LnzVOI6Macp=w6|HpejKdx^8T)cW( zhA@)u)Q!Kz3B9O~_RDd9z~EW2GDJa_r@ z$^n+sal$;hXO(J!A@!eP34$bWfz42ZP+s##G$k_=W38FLHNLuO&2sjSy-=*msEcTUKH%`1kkh0mO+ghE5vO`NvYonkqi{!1I2}B$Vxu}vkc##1rXl5 zx9jQ#2F*LriZT!mQQ(GCO>TlbB$W}Xibo;(e$6|lFqwt^41pupC!F+_H@J+>=Vi56k}a@wCy zi>6zAO{pUlFX7$^iiwa;_$ab=;d|5-NlRMoeJF>>M0lra~o&QNjmHh54>KzcF{6 z4%ZqXcO3HNCW-i^tx70Th1|K6g~b(UVA1VLDkDScu+>}ZzJuneIu%4u>tO2lL&JAM%9w0T}W+hnf(L}TXqQS zPCL%Wd$VhUCh-%Af!t=5*$57Sg@xlF0)zROn%b}_%x}^zBP}gGr3vjb_IbRJozweQ za>8;OqZUI!kj-65@_%?hH-9J)g;wZ&!Fp`hCA&L3cI*SrRoeaks}+MOeJC;z;s4Wy z!DMP1Zfb2UbY?-$SQo{=(Hr62MNGC6b+3h|g7{a{B#-c;v>mj<4_aGW*PwfXA&`;= zmm)HHW@aWw7aM5{!s@4p!W8R&#U*5vpac9^Ba#(;HuAZ6O`>@FIaFIBLs@P0YEFGB zY&To#kBW{S7Ct+TWVWGON08`BC7EGE&==bdabMX$iuZl2Nbeb=z@TVc7dGo z`yW3jX4xlv8d(s#@gI5mZ=?^E^v;;4B(db76#{X)=}Y`AE#8C1A&hATY)m<(uv>cz z-DxUQM{rTU0V1w5-%!5DVwl1t)}8{6Af17~_s*#6%7lsJ0rh9Q`Ij3s-!IyBA_3~QRk+P4tah3i>%5qey{~NyO&>@IF52xuGX=x zRKZP3TOupn5VZZJc-ZK9h&Kc=9H{x8_|D%^51}8m?XbP*PtYI)*g!i!+nd`h^x)SV zjI3CV142Rf&c`S1!>bctqbtXNPbvW8KIt&Z;I=AFNOLXS+GZ9hhz9gq@XkgRYbcu6 z0Et8(%#TPHklA?8kfcxv8i4c+fWRD(4aC6RH3VQxur4DEG3Aa_66-k6oQH{?aoQPi z%(tGBJ6w;dA!kR`<3uUgg*483w}bLs3nRQDwi=kqlFz3(Kenx+lL{z76@HVCO~dB zK!_$E!gxV60t6L~E6;y6{Zo0K(oTzd>@uIiu~I7fyDVv~S~#v08lFss zdLA+(4h3Aw2@nJv4I%V_Gp$kB^fW+AZ-9|*Jrkj605loFJ8P9_aDGr;#PruuZw{hA z{nbba`V##pQ<0U$0f&Xg+@T=$xH2QoW8akg{CRz_eBTLL(0G8_Y&e+o7$s&9^P7!x zC5H1L=j<#pW=<>st)!Cojt^F>SI56#gji7+3`P$^w-+NWyCCo!AjVFDnCn21DH#$% zivf=UJVt6*${WBO)z#Hu8sQV50a;_Pemy5c=NAm|-h;PT00w5_try#*mUf|tBz1ffcl#y}OO)_)G zNHl2!7X=gN{_MCC0tZYF+-L+_lW*30`EVot}a` z;{olSCSBXmxKb^`X|WCur?x*zd-K}O-L+d8rSFhD5qk)DNP}kf;aCWn1`lK75!b^T z{`l;O>YKr+-{8`^hJ**fIainuSJ?jE9zEb_2NGoNXE{F-ly?J9MtIVX`6ajUlg-~F zv`AB;?CfuWJk@^qWUS*OkVdO`K<%qkOR9G7-YZzF0Cj#5@H_yl&gWj{948l7J%aJ- z&C*ONDk29nZ2&}Pi-edj&6e1Mst)i5qY1^XTaBYiEXUe6*yjcd*}(6~1LFj>CSj?m zZGRq-3|tTLP#_>JDz$%E78DirtRAJ0Mzz6Y!xC=#Vo9|eTnU-I0=U*Hm#w-t7jN={ z$o$ii2zGT>$JP(cdjq2ISD!SUMS61um%`H+UoIVkQ{wE$5?BHwPefZ*OM~5ryr<}C z7t;(~&ck9P#4G0O3rPfQxVjv(aQ=zo-PUhUiChMkGlX6=&uMKETudNxKvbd5tJ4o^ zJj8+d!KXb|6x(msS)Cl`&k9`TSt>W$Md5hJw;b_#hJ#VD3%;9r-3ExUzgt7$Y}~*y zb{q|YJOLV6(DT{0TL`{#dAM=sgSvj`jf8t0;yW>j*Z}63M_Ty?uWbg6qBx+#7zcCY zPF3PSz6w*D1aQ&b{t6odsb!-EG>u(V-Qk}JNo(wd=Ps#g0tBIk1&Ek+=bnB zd&yL+0ag_OqLCAJ#(y1xDeUqL&dGcphr4+obU(EZ!(K$3?3^6O0~bpMh(9?f4>(St zb6v`B36p2YSQ@D)U8AxVwbaycPEosi_ajJ$yMslh>QnuYJsBtq9T}T`fsKbjW8<Vx0v;PjEHTIjcZd ziF1a69reLY3Al+>G1K>W5n`GMV1{Ag;ZYHR3y8U&rIA8s2zR;#TnXR`AHKY|x7Q*| zshzw8SMZf48C}-KHfX%d$l?P610yJ|JY)y+Q~e^7!?JhoOs|hxcuFTZHay4_7A_4=0B^N4;#_ zu?{X6q||vSnKMW4dU&{Em8GSf|K|=;F7Ecy9r*`U;UK$QubE*H2=3dgZ?FeneDRt~VbwlUcU`O&U}a+rbhw7FhG?Kml8fB#ym z09v=JJ{KIP`-WgpmR^d1gG0^|m6|g9=FOXEJiaJ0GSb(@(9*Kt);Ycs*0B^xoZrdT zxPrt)fsD+|Cl>g`L`lN1HN|j=7cKh)IOX%@xwe*&s_i}P_TEXB0yc`IG_CNNGq+alo z^;>b`Ieb_-F8KYep5yJ~yX%~qACt>7VmF3HRG(^lZYAHuo;~gm@MAP7FzH&NM$pPg z)ns~xc7s|-Q+PRBd~$OB)YM&L6O$(v)@EiB_%>6Dv#M~os<8e|owjd1J9LC^up#2o z)B`@K1vf>NuAC^3e&>$iEpeVh*Q9G*S2olG(!29AW(!s5%HwlR)46%+Peo#X{7Aov zao8GgbCW`UV4x3LNfS0p4xcp_BMcYS2he9S;;alX7)%;Qa4%;}M8vBLM~@bf``=J^ zuLf(Mmm7Z|uWX*1<1n~h_NZFJl2@fjo9j76#f!PsK`IDK(hO+C+^zT2oZlQxWeR4z zj-abc#YHEd37{E|5-Ve$v~pjdcP54p&p)QI^$2m?Y7h`q;2LC464d2Y@j|(V#ki9Ewv2%Z z3eIK2`S^7|I&LVom2u`1@rj=}qFoktk8a_faOMdtIAJhk`~0_;9wKZ(6UPzKNUl1o z!V@ocAP{{T+kVPk%$B!ATesaWw*Miu#7#sX_AlP&{b?Jt<|vq=^3+QG{vY#`?LFT5 z?1=XLscanejTwP@A_&CG=k|yP;^%pTH`jR)?Wv1rELlukmvJ9Ec8`Xii9zvaCKOC8f8% zzP>S6+Gb800A6tX;>Yc;#MJ0>rONkzzA9B)`YhU7f9qWKYt5&*j^skgvuC^C{2C(X zGNj5_@Frl1{%a#o1?2BV6T?M{ock*rKK_0{K<3UPuZ4l>P_wtLudRHiPn@-^HcC=- zA@P`6yngs_TZ*briEbMYtYkq|sEqhPRCeCYN=%}Hb7H1$k_lzY)XL{qeKlJ2W*}hz zQz_;^$~W^J4O1+$Zxcp!e10kF2_vzNvC`i<&$&-18|KWt>5dFp;;FM|bvv{4$)n*K zQmEY=+q86byO+kBJeiDD#e0SCZ~eAw*Dlz+Oamo(>eO#OK2wrNMgy~-kynwY4>#F;s5Ev?95ig#h23X!s^GCDIn)TpA3d&sQ%J1?3$&#MD*?u;#V* zi{U!@@8ohNs`*uHdk|C_us$9)lKKmDOjP+7WDx6l^%SE8g`#3&j48CLsw!pdL}>lm zk3F{b_Dz%2oRSh*o93z}b$r{pO8|OiLBrcJPRjBUae2Of^$m9UzUtC_RjyPRFBj4s zqYyeM)O9VbuO|j8^7D1BU%x&xP*o}>AuX-XT24K@dO>_VAIjkR^_L~3r7_XbW1$jK zQu};FQLtrcX-N!~kdUyn?k_1N<@HdSZ|^^%bL^1};V6StTWU zC3I(F4$QW)gx`G+{@ytH?K#hBR{a~Bnw~}?4dLuJt__?J6Pv1A9qNphFpQ3hN*f!q zX-Pm{J$O>jgSb~f?iy~bL1cNkQ-Ai$NqmNaY=LYs_VNbY43JtULrW?35x^N6K&S8CNJP~RC0%B+xhmC1{T(0+U0GYoOx&=t{y@i3QjkVG6?ks%~oA2L< zVoi#y3Urecrr$kaubxcxGpCHfQ#}57S1<^Rgh!7a?J2ab@hW)s{JCr(VYq4`#?(s2 zs)%f4YAT2hO^`u9neNUr{XBo=g^U*g5x}GtAU+lOlI@#g~=IA#q#&=ujDB zV`Fh~abmtzT^~PnItwp=%1lpB|2BDGCr7B*!JQle0ZGJ&`hFM+P4@~KDJx=ctk`cD z7`z#(^E)js-(6Ms>eU69_cdPg?!>Xl$)^LX4JS^Vh-_7Fx?yfEAS*5@sRgLl8sE`j zkfI)-Y@-t{tQP(937Wc5w!S^mtUi zwc*&^)zzhvxgaxuS>0ZwnXi(mPMvHsy>#heX+~C-b%zhg>PLp9?5+S_?o}3C7{8S{ zhi6q!2IqQ9d3JIn&o@aE_O3=lBPZr-V!6)+Y63)AviY}f-)Jv#{6b-ob6{wUnZ2t<&x|hKhguTwl!Al4 z%2eNsgY57ZLKOQ zvVY!0Pfzc2d|#hA4==9@+TGp#(7}TTWixAQEqHi%TKNFYnv6^FY);RgKi_>s-Tww` z&CSWVZf2GsmgBd&Fw;|<_GI6YTsZbjqsCV8VJVAKpart1cdqqP8PCwZv*@7;?)%yWydqeGkc&>wp6^X8!6p#lJBYpq;D zj*!PU796)IP)H@_vx_xq&$7cGK)YO+75$g>@}J=S|91?kOkMV$afHnbPA-A;wYB>v z#KlP}#Bq1aKMHOXAGc{Hh6#2TS!?*H3VTw9ESut_3E$6a$DX-fi5Wa3D3}MF&$+kc zgbnjc)Jb{UuZJu>yNy}Buu!*Z1vWxOR}S38<$MLMcdWTwPhaR9`w}H6RO!?!dqnkq zd+(J{zLB~9N*6q9bgL}9)wH#>Wf9`QjZXZ`p!cvRG2f!f;PKRW4Q+H~jD z?c292drUL|d+66|qq4;KimgnzW^$QBr;)L- z=g1=qsk*I=*<;^K$v|<-?OFup2dX-&7PjaVQ)A;8Qo+rWsIM(8-7Sj4`Ek~PW|2lW zZ{{s8d$80%qP$})RJehG!SYj$&5O(>Y36ZMU#Wd~;Ll)@?DX`@>^t^3b@^}vUj$Bc zYX8p9vowX<+XW`v16DoznZs;|?@J_eQ0=J8^_;F>qb0QT^hiN$?8`HGMY))?*y!j} z8X6il{(mv+lz`Y`00tW!Bco`R!6cKBk)aI3@^iefn(rx5(FT5CX0BB;`xka4Q+n<3 z-5Q$>8mH9NttfS?sltJ4w~wfJ>1fb<+r&_T1nZofoMV+JU0vgId|lAk9%G*m{5i+% z+EUe8{~F~wy1FsL6vEU1FlS>+%Xy1^oWU(h#_%NnxVwT3Dz$6LT@4fTti+CV^R=l` zLorq3hX*}6brY4anRdK;iHyD9m!~`Bz2jGS|yuwo*HSFCGVzw@jsF-@EAOLmBDmWgjhOpzHtu#GqnP23A(7q(VzU z+05+hYd$_ckz$qo1e%+ZxZ28&Q?IR6O;iK1J=)v`(BCEYAg#a%z1(ibvwze58W!BTff`@5S z!bXfRZqsd&FG^gu18^^&A89xBeuqfc25q+dUbkd{St*g<@Wzd788k5)$J`P)cPq&1 z{>b(t8i5w0#IPtaD5SfaYm0ERM(_m2Xuh=1qT#2crHj5%5P;KnD|G|~kanRjJ>FN` zZr}t0L8+y_nC`DEnuZpv`tkg<4qiQ=xg$ec7rs8bDLD1q+E|%)1abN0>sQ&P*t0d? z{mxp|_So3i@Bt!l?&Z6szA=>s)Jre<97wf4P+D5Di;IgB3pEsl9o)iB9qSz1*hIf@ zYivx8R=MEaN2{{LUTpp&%y zJFm6>>&4MVmX>pKbE{tIbCma9ut-t%l(ZRGneX@PcdnFBP%r@--~6rX$o59_I^S~N z<*C~nm>Q*OuQsc+EDS~@yiYm1|v zb3Mhe8g5VyJ3H;z-hvG6CXr?;35)`-`MwP1S~#;E%9J)1rLT;B`2H1(N`a2eEh{q$ zIefOG)`z-WGt6k^r;a=ox!09_T|gtSw!*nT^ML4;yI{QZRbjJ`b|W7i`%Y)Xm3d4X zI1kmDnOe9#2D0t3G={Qop8A$n?nstmwdH)}Fo{kf6u}&>Into{A}T4#QP_9t7&KdXc{y>CngDZ8 ziJq668`?N3Q&hK-C_{`Ntnn5^O-SR`Ly!|G-a|4{aZPi>1j08eH^;Usk-Ipyh1Kh# zuMInc6J%RX8uj-3g+xYhZe#PD>H1P-0fZiiR@1zf3K?`rHc-&3FNECwB=kaAe-Zlh z0Q$-o%Iecl)U|8BVK9YA7cK#j)!qVqvhx6o?*4 zlUr@fVse!p0|QKUVZfF!Jp4Vrnm#+Ua0jjIy&zOV(0saY27GX2rh0dG_ioPMW6iCxB+3%jsgtLV9edx~(b?Ic2IfVO z_-y+CJ4_)<5OB_}IwmHuR2mRhkH#b3cR?#2b6JQG!?$I9{rWXxw$*ZF-Jk14P7QOw z)3VxQ7k_7^i?w|-7;u+fxJ@+k1MTjq3J3tqDge)C()}Et*fuuAg&MfBzxgj(X~czL zg0=U6+fyL$Wxz3h{q?arTLO^ftW;mEEPcEQ%y_XJ0E6D%UhuEniHCT39YGAX&I7Lp zQVry4}%e@1}l7a^MkOS4Iq@)y?PMam?RaBUOX~dgC0Q71cb?B;M z@tj-*Kd$ePVR+K#D^H7xY7(|+MYL{HYt~BDPAojwAso>^Pl9$})nWk<8|nJBJD*E2 zz__!4dt`yK)C0Zr4eGtjbJj#RMcFuV%)Ls^xlfMqgO|{rn5v9Tl*ZMd@i!p=0WQP8UVC>q8yVCl=r z3DQj$dB8RcNVM$0L**56?9Mfw*qAL+#8mb#&vZBCo0W>&;2_lTnMknLxpyyj@xH3v z=ZIsViBxTx6^H%NSHc8rmA&Tf)>;+uD`JwBe3$P=wLW8U{a1_;^sP`gezeZoQfa^* z&R}2!za8BlL7sIk9<8<*4rpN+kme?iYJrs}H*da!F8qIz%d#>}1h1_401~bs4*8$5 z<>9gZ6W9L&9I(k_=PE}Z5*;cg!MFE`k2th@ajO~z?A|4q9nrl4&z z1#Q2=x~cyWwDP@%=nq2D)8UN=7jiDEl5!Vsn7$HQ?YCK7GZQUIC*zuUN@!Ex8hUXsqjeKxe>JuAjDdp6 z_M_C90=YWYm<@aj#x9SDNKtEw%Ivd~sqG0!`%6Tpfw$Kg8?>m#(d(-VgXR9~OBLtq z?0mrSrs*@6^|iFMqngG$1YK$mlnnEwDPbqFA;4u3%fP^Tb+Gs&WS(-1kN_0MX}&S> z@!0@_vtS4R!yqBP>FkmEYFCPe51IQCn470~bsW zd^q|h|3>kLw}TiesDnhy8n1+12gTz*e!OgGX2!peQ=VIeolLZ<^Gyie!L8hHY8@~> zhX;cJrLV6DIBYjdDzN+h?tvXl*w!tieQUfR=IwhhgpwerNPyXs2sSMeqGJ1IYvzXO zK@ky`-Fx=507A6<_!OcG(~e10U9U%@GUx-%<$9c<@j<`#vS2**vjo_0lv&i)_> zG>ClK)o=wB?*%y)SUw90K@u4AE-5l1{y!f)d+|bH53iJ5jWUxQHwfF`2?1BNDl zH=lAd4`_1y?S?0h2io?Ds0+ywW6L3!I0rNq$vPY;#|aVUqKNL5D^HZX=Hii=1%V5F z4U{@!KA9W0rir}$;ZX$L^yq%qmHrYdm-_Wgvr@aTbpn&FVQ6KAN%dbsf#rjS0LLM8 zB#=j9=ewQATkjA^P_>ipU@oGxwUMyG+@tyC!vj@VU7*%8gPPaMQ zU{@E3B!F+ThYWelf^|@6J)iks*P5zVLyH#1(F}E0StUzkga6CvI z`+`szJFr&8RaE+`Hq%5HpZAKWtJe)Ay#h$SD1elvw zB74gmqGU3iaSMH;lsYQ8DZZ3#4OY!+SwW%5)W9Hey^Xo459RnsgY9Yr%W?w%WVwf) zKrX(vwV9$&C_a0V0yGp7)TzYj)7r4KCV;tOtUUp4_nF20rB==2AWdSiMo^-y@sNdW z5573xSKh>LxXL$4ESoGJ1P@>{5ck=KC7u-(6>Xes`z4lb|?c3N;2B4h8$_Lvl z{TOxLTfQk&R&w&?%a`hrCxUX&0|9{5t?Gj0yv)oir%m$PVHChC42=xQhpg%SGo^^I zWiBr-f6Ut##R}Gd`h1Yft9Y4|lsDcKcUnc|Cg`HBHry6=(5v5>MMVFW-oe%X8EV1H z9@3~KI)hf&UlqU=_Lq_R#e1s#BCzk>{Lo82?`2x& zAr7ma+DK8k;&;xe=iDH+O%2#d*CZZScoOe#;63D%1svwkkt5FY=D?=!0gtI3kG<*9 zz@>Q2Ac-+>M9DpUkTI0!QYSVI)Z;fuhJX-c&i7Y3Lb0$Op9pj9D$1*X4EmMjD1wik z3p~x2K_hpU+Uvsvb|XCB&vEql2OzQ2{sE9hN-8Rv!Z-q|kk@A$e@u1|$7HmU>-<(p zFb%RDi|S0k-S3JxrupG~>CZ%2+vm_uIU3CMwvkk=8rNc4;(50>RB)2&xsI#Ol zb-c7r>F#hCiIy;w`f9w3{MGS#5D4Vv=0?bPl0QvSyK69$EAn#0Sz1N^XH{k!&zd9sl)8`t z(*Ssv=!C@BmTi-7)gXrDhyfu?gn)8mc{&aB)JwWC$1#NH?|=HqF92{-X74#V8e3T8 z*VfjaYt5f$xiYLpmi#DmQl2`D(#S*Z%o5wW zR#Py*W@hd!n7$Mnpj^6`&2!p>FT4>QD{YPOq6|4hdUuyq>O)+fN{Q+L)xB@s(t4ql z*S`mIvlF3A-w|12GNUIbG<0uiAj7v5sBKhSoINC;$^CeGPY^KtM95o9F@wrc zk&y(YG+w)8eHtG^mpr%w7xcLC<3%&R`kq$NQIJMewDfmt5Y?YREMQUn++KXG0xW5A-MNfjUCHPk=`!53#E} zTpenX(k@vbzbrz$qj?#Qv-nxx8 ze@nZnN%a3mVx!si@5M%DcPrgMuFPaOkY2#A?2!%VA_HHU;4|2Lc(jXGl@BNutsp8r z0{^UHvnphH*l)Pf3KYE^+*KyP6LEAgp2amzrrtk3hDC%Gqw9qIe_re?cQhUKs?pWb zdd@Fv^ZP*@(UtK0kQ6%9p=MGLVu}5jTF(E@uZlJ^+4(ZNHd}7V-vAPhK>ezBx$x4h GhyMmBXmuh0 literal 9575 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 F_#Xt9Ai@9u diff --git a/src/irlwpytorch/learning_curves/maxent_test_30000.png b/src/irlwpytorch/learning_curves/maxent_test_30000.png new file mode 100644 index 0000000000000000000000000000000000000000..8bee37a4160b91b33daf3f60b8603cd8db3d32ac GIT binary patch literal 20265 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 eh_W;P*^~QR)Bk+g`3hKYGkCiCxvXn>zRa literal 0 HcmV?d00001 diff --git a/src/irlwpytorch/main.py b/src/irlwpytorch/main.py index 76ec1cb..07ffd32 100644 --- a/src/irlwpytorch/main.py +++ b/src/irlwpytorch/main.py @@ -23,7 +23,6 @@ import argparse import gym import matplotlib.pyplot as plt -import numpy as np import logging import numpy as np import sys @@ -39,70 +38,9 @@ _logger = logging.getLogger(__name__) -n_states = 400 # position - 20, velocity - 20 -n_actions = 3 -one_feature = 20 # number of state per one feature -q_table = np.zeros((n_states, n_actions)) # (400, 3) -feature_matrix = np.eye((n_states)) # (400, 400) - -gamma = 0.99 -q_learning_rate = 0.03 -theta_learning_rate = 0.05 - np.random.seed(1) -def idx_demo(env, one_feature): - env_low = env.observation_space.low - env_high = env.observation_space.high - env_distance = (env_high - env_low) / one_feature - - raw_demo = np.load(file="expert_demo/expert_demo.npy") - demonstrations = np.zeros((len(raw_demo), len(raw_demo[0]), 3)) - - for x in range(len(raw_demo)): - for y in range(len(raw_demo[0])): - position_idx = int((raw_demo[x][y][0] - env_low[0]) / env_distance[0]) - velocity_idx = int((raw_demo[x][y][1] - env_low[1]) / env_distance[1]) - state_idx = position_idx + velocity_idx * one_feature - - demonstrations[x][y][0] = state_idx - demonstrations[x][y][1] = raw_demo[x][y][2] - - return demonstrations - - -def idx_state(env, state): - env_low = env.observation_space.low - env_high = env.observation_space.high - env_distance = (env_high - env_low) / one_feature - position_idx = int((state[0] - env_low[0]) / env_distance[0]) - velocity_idx = int((state[1] - env_low[1]) / env_distance[1]) - state_idx = position_idx + velocity_idx * one_feature - return state_idx - - -def update_q_table(state, action, reward, next_state): - q_1 = q_table[state][action] - q_2 = reward + gamma * max(q_table[next_state]) - q_table[state][action] += q_learning_rate * (q_2 - q_1) - - -q_table = np.load(file="results/maxent_q_table.npy") # (400, 3) -one_feature = 20 # number of state per one feature - - -def idx_to_state(env, state): - """ Convert pos and vel about mounting car environment to the integer value""" - env_low = env.observation_space.low - env_high = env.observation_space.high - env_distance = (env_high - env_low) / one_feature - position_idx = int((state[0] - env_low[0]) / env_distance[0]) - velocity_idx = int((state[1] - env_low[1]) / env_distance[1]) - state_idx = position_idx + velocity_idx * one_feature - return state_idx - - def parse_args(args): """Parse command line parameters @@ -119,6 +57,9 @@ def parse_args(args): action="version", # version=f"IRLwPytorch {__version__}", ) + parser.add_argument('--training', action='store_true') + parser.add_argument('--testing', action='store_true') + parser.add_argument('--render', action='store_true') return parser.parse_args(args) @@ -147,36 +88,51 @@ def main(args): args = parse_args(args) _logger.debug("Starting crazy calculations...") - car = MountainCar() + n_states = 400 # position - 20, velocity - 20 + n_actions = 3 + one_feature = 20 # number of state per one feature + feature_matrix = np.eye((n_states)) # (400, 400) + + gamma = 0.99 + q_learning_rate = 0.03 + theta_learning_rate = 0.05 + + car = None + if args.render: + car = MountainCar(True, feature_matrix, one_feature, q_learning_rate, gamma) + else: + car = MountainCar(False, feature_matrix, one_feature, q_learning_rate, gamma) theta = -(np.random.uniform(size=(n_states,))) trainer = MaxEntropyIRL(feature_matrix, theta) - if False: - env = gym.make('MountainCar-v0', render_mode="human") - demonstrations = idx_demo(env, one_feature) + if args.training: + q_table = np.zeros((n_states, n_actions)) # (400, 3) + car.set_q_table(q_table) + + demonstrations = car.idx_demo(one_feature) expert = trainer.expert_feature_expectations(demonstrations) learner_feature_expectations = np.zeros(n_states) episodes, scores = [], [] - for episode in range(300): - state = env.reset() + for episode in range(30000): + state = car.env_reset() score = 0 - if (episode != 0 and episode == 100) or (episode > 100 and episode % 50 == 0): + if (episode != 0 and episode == 10000) or (episode > 10000 and episode % 5000 == 0): learner = learner_feature_expectations / episode trainer.maxent_irl(expert, learner, theta_learning_rate) state = state[0] while True: - state_idx = idx_state(env, state) + state_idx = car.idx_state(state) action = np.argmax(q_table[state_idx]) - next_state, reward, done, _, _ = env.step(action) + next_state, reward, done, _, _ = car.env_step(action) irl_reward = trainer.get_reward(n_states, state_idx) - next_state_idx = idx_state(env, next_state) - update_q_table(state_idx, action, irl_reward, next_state_idx) + next_state_idx = car.idx_state(next_state) + car.update_q_table(state_idx, action, irl_reward, next_state_idx) learner_feature_expectations += trainer.get_feature_matrix()[int(state_idx)] @@ -187,28 +143,29 @@ def main(args): episodes.append(episode) break - if episode % 10 == 0: + if episode % 100 == 0: score_avg = np.mean(scores) print('{} episode score is {:.2f}'.format(episode, score_avg)) plt.plot(episodes, scores, 'b') - plt.savefig("./learning_curves/maxent_300.png") - np.save("./results/maxent_300_table", arr=q_table) + plt.savefig("./learning_curves/maxent_30000.png") + np.save("./results/maxent_30000_table", arr=q_table) - else: - env = gym.make('MountainCar-v0', render_mode="human") + if args.testing: + q_table = np.load(file="results/maxent_q_table.npy") # (400, 3) + car.set_q_table(q_table) episodes, scores = [], [] for episode in range(10): - state = env.reset() + state = car.env_reset() score = 0 state = state[0] while True: - env.render() - state_idx = idx_to_state(env, state) + car.env_render() + state_idx = car.idx_to_state(state) action = np.argmax(q_table[state_idx]) - next_state, reward, done, _, _ = env.step(action) + next_state, reward, done, _, _ = car.env_step(action) score += reward state = next_state @@ -217,7 +174,7 @@ def main(args): scores.append(score) episodes.append(episode) plt.plot(episodes, scores, 'b') - plt.savefig("./learning_curves/maxent_test_300.png") + plt.savefig("./learning_curves/maxent_test_30000.png") break if episode % 1 == 0: @@ -235,14 +192,4 @@ def run(): if __name__ == "__main__": - # ^ This is a guard statement that will prevent the following code from - # being executed in the case someone imports this file instead of - # executing it as a script. - # https://docs.python.org/3/library/__main__.html - - # After installing your project with pip, users can also run your Python - # modules as scripts via the ``-m`` flag, as defined in PEP 338:: - # - # python -m irlwpytorch.skeleton 42 - # run() diff --git a/src/irlwpytorch/results/maxent_30000_table.npy b/src/irlwpytorch/results/maxent_30000_table.npy new file mode 100644 index 0000000000000000000000000000000000000000..ba4d3459f7ae66d69c2fe0a63b29a1d740353a6c GIT binary patch literal 9728 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 C#Pk&a literal 0 HcmV?d00001 diff --git a/src/irlwpytorch/results/maxent_300_table.npy b/src/irlwpytorch/results/maxent_300_table.npy index 54bd0a106fb3c326f3da0a23689466a4be44dbc3..63b2f3ccc99b3d0312dfec9a2764e3dda5c53912 100644 GIT binary patch literal 9728 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 Date: Sun, 5 Nov 2023 20:21:10 +0100 Subject: [PATCH 2/5] add help descriptions --- src/irlwpytorch/main.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/irlwpytorch/main.py b/src/irlwpytorch/main.py index 07ffd32..851e348 100644 --- a/src/irlwpytorch/main.py +++ b/src/irlwpytorch/main.py @@ -57,9 +57,10 @@ def parse_args(args): action="version", # version=f"IRLwPytorch {__version__}", ) - parser.add_argument('--training', action='store_true') - parser.add_argument('--testing', action='store_true') - parser.add_argument('--render', action='store_true') + parser.add_argument('--training', action='store_true', help="Enables training of model.") + parser.add_argument('--testing', action='store_true', + help="Enables testing of previously created model.") + parser.add_argument('--render', action='store_true', help="Enables visualization of mountaincar.") return parser.parse_args(args) From 2d6bd97f82624fe9c36c4a7a18d856bac96169cc Mon Sep 17 00:00:00 2001 From: HokageM Date: Sun, 5 Nov 2023 20:23:49 +0100 Subject: [PATCH 3/5] add console script --- README.md | 25 ++++++++++++++++++++++++- setup.cfg | 4 ++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1512ca5..05006eb 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,27 @@ Inverse Reinforcement Learning Algorithm implementation with Pytorch. The implementation is based on: https://github.com/reinforcement-learning-kr/lets-do-irl -Mountaincar experiment from: https://www.gymlibrary.dev/environments/classic_control/mountain_car/ \ No newline at end of file +Mountaincar experiment from: https://www.gymlibrary.dev/environments/classic_control/mountain_car/ + +# Installation + +```commandline +cd IRLwPytorch +pip install . +``` + +# Usage + +```commandline +usage: irl [-h] [--version] [--training] [--testing] [--render] + +Implementation of IRL algorithms + +options: + -h, --help show this help message and exit + --version show program's version number and exit + --training Enables training of model. + --testing Enables testing of previously created model. + --render Enables visualization of mountaincar. + +``` diff --git a/setup.cfg b/setup.cfg index 192bfc4..5294ce5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -76,8 +76,8 @@ testing = # console_scripts = # script_name = irlwpytorch.module:function # For example: -# console_scripts = -# fibonacci = irlwpytorch.skeleton:run +console_scripts = + irl = irlwpytorch.main:run # And any other entry points, for example: # pyscaffold.cli = # awesome = pyscaffoldext.awesome.extension:AwesomeExtension From 8674f41be10126a0f4473ce1fb6e088cc0bf1d88 Mon Sep 17 00:00:00 2001 From: HokageM Date: Sun, 5 Nov 2023 20:24:09 +0100 Subject: [PATCH 4/5] update gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 68bc17f..6df2f41 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ __pycache__/ # C extensions *.so +.idea/ + # Distribution / packaging .Python build/ From ee3f1dc3758fcff68b7567b48eddb61a683769e0 Mon Sep 17 00:00:00 2001 From: HokageM Date: Sun, 5 Nov 2023 20:24:44 +0100 Subject: [PATCH 5/5] update main --- src/irlwpytorch/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/irlwpytorch/main.py b/src/irlwpytorch/main.py index 851e348..4ef4a14 100644 --- a/src/irlwpytorch/main.py +++ b/src/irlwpytorch/main.py @@ -27,8 +27,8 @@ import numpy as np import sys -from MountainCar import MountainCar -from MaxEntropyIRL import MaxEntropyIRL +from .MountainCar import MountainCar +from .MaxEntropyIRL import MaxEntropyIRL # from irlwpytorch import __version__