From 37f44605d2b26f4ef64392dcef7440296c7c5473 Mon Sep 17 00:00:00 2001 From: Arec Jamgochian Date: Thu, 3 Mar 2022 19:53:45 -0800 Subject: [PATCH] purging unused files --- checkpoints/bc-intersimple-setobs2.pt | Bin 15383 -> 0 bytes .../gail-intersimple-setobs2-03-02-22.pt | Bin 14187 -> 0 bytes .../gail-options-setobs2-15-02-2022.pt | Bin 15019 -> 0 bytes .../gail-options-setobs2-Feb15_18-49-05.pt | Bin 15019 -> 0 bytes checkpoints/gail-ppo-intersimple-setobs2.pt | Bin 15319 -> 0 bytes ...gail-ppo-options-setobs2-Feb15_22-05-38.pt | Bin 16087 -> 0 bytes .../sgail-options-setobs2-Feb21_13-30-45.pt | Bin 15211 -> 0 bytes .../sgail-ppo-options-setobs2-17-02-2022.pt | Bin 16279 -> 0 bytes ...gail-ppo-options-setobs2-Feb18_12-53-23.pt | Bin 16279 -> 0 bytes ...gail-ppo-options-setobs2-Feb18_16-25-08.pt | Bin 16279 -> 0 bytes .../wgail-options-setobs2-Feb16_01-06-27.pt | Bin 14763 -> 0 bytes ...gail-ppo-options-setobs2-Feb16_04-02-56.pt | Bin 15895 -> 0 bytes config/networks.json5 | 42 --- config/value_dice.json5 | 85 ----- experiments/experiment.py | 203 ------------ experiments/experiments.sh | 9 - experiments/train_vd.sh | 5 - src/bc/__init__.py | 1 - src/bc/bc.py | 191 ----------- src/data/data_utils.py | 96 ------ src/data/expert_data.py | 210 ------------ src/discriminator/__init__.py | 1 - src/discriminator/discriminator.py | 101 ------ src/discriminator/test_discriminator.py | 45 --- src/main.py | 118 ------- src/models/__init__.py | 0 src/nets/__init__py | 0 src/nets/deepsets.py | 117 ------- src/nets/util.py | 14 - src/policies/__init__.py | 2 - src/policies/options.py | 65 ---- src/policies/policy.py | 164 ---------- src/util/nn_training.py | 11 - src/util/transform.py | 140 -------- src/value_dice/__init__.py | 1 - src/value_dice/value_dice.py | 300 ------------------ 36 files changed, 1921 deletions(-) delete mode 100644 checkpoints/bc-intersimple-setobs2.pt delete mode 100644 checkpoints/gail-intersimple-setobs2-03-02-22.pt delete mode 100644 checkpoints/gail-options-setobs2-15-02-2022.pt delete mode 100644 checkpoints/gail-options-setobs2-Feb15_18-49-05.pt delete mode 100644 checkpoints/gail-ppo-intersimple-setobs2.pt delete mode 100644 checkpoints/gail-ppo-options-setobs2-Feb15_22-05-38.pt delete mode 100644 checkpoints/sgail-options-setobs2-Feb21_13-30-45.pt delete mode 100644 checkpoints/sgail-ppo-options-setobs2-17-02-2022.pt delete mode 100644 checkpoints/sgail-ppo-options-setobs2-Feb18_12-53-23.pt delete mode 100644 checkpoints/sgail-ppo-options-setobs2-Feb18_16-25-08.pt delete mode 100644 checkpoints/wgail-options-setobs2-Feb16_01-06-27.pt delete mode 100644 checkpoints/wgail-ppo-options-setobs2-Feb16_04-02-56.pt delete mode 100644 config/networks.json5 delete mode 100644 config/value_dice.json5 delete mode 100644 experiments/experiment.py delete mode 100755 experiments/experiments.sh delete mode 100755 experiments/train_vd.sh delete mode 100644 src/bc/__init__.py delete mode 100644 src/bc/bc.py delete mode 100644 src/data/data_utils.py delete mode 100644 src/data/expert_data.py delete mode 100644 src/discriminator/__init__.py delete mode 100644 src/discriminator/discriminator.py delete mode 100644 src/discriminator/test_discriminator.py delete mode 100644 src/main.py delete mode 100644 src/models/__init__.py delete mode 100644 src/nets/__init__py delete mode 100644 src/nets/deepsets.py delete mode 100644 src/nets/util.py delete mode 100644 src/policies/__init__.py delete mode 100644 src/policies/options.py delete mode 100644 src/policies/policy.py delete mode 100644 src/util/nn_training.py delete mode 100644 src/util/transform.py delete mode 100644 src/value_dice/__init__.py delete mode 100644 src/value_dice/value_dice.py diff --git a/checkpoints/bc-intersimple-setobs2.pt b/checkpoints/bc-intersimple-setobs2.pt deleted file mode 100644 index 944cd705c479bc17f112edd03f109b7080d9d275..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15383 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 zij diff --git a/checkpoints/gail-intersimple-setobs2-03-02-22.pt b/checkpoints/gail-intersimple-setobs2-03-02-22.pt deleted file mode 100644 index 1a9454705954c0c8e3ecc437b50eebc4ecf719b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14187 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 diff --git a/checkpoints/gail-options-setobs2-15-02-2022.pt b/checkpoints/gail-options-setobs2-15-02-2022.pt deleted file mode 100644 index 76f70affaece3b8c27dd16f790999eaea4229729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15019 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 P<$%o~k$?36rTc#XiF3P} diff --git a/checkpoints/gail-options-setobs2-Feb15_18-49-05.pt b/checkpoints/gail-options-setobs2-Feb15_18-49-05.pt deleted file mode 100644 index 76f70affaece3b8c27dd16f790999eaea4229729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15019 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 P<$%o~k$?36rTc#XiF3P} diff --git a/checkpoints/gail-ppo-intersimple-setobs2.pt b/checkpoints/gail-ppo-intersimple-setobs2.pt deleted file mode 100644 index 800c6798733214d421c5d917d7ba6e3fb37b8f91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15319 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 L^7Fg@-+li-?@uPD diff --git a/checkpoints/gail-ppo-options-setobs2-Feb15_22-05-38.pt b/checkpoints/gail-ppo-options-setobs2-Feb15_22-05-38.pt deleted file mode 100644 index a2bd8b6b5901e0e37e9c1d2e16493220fee34b3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16087 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 Mh>83o|1a791H#Kz!2kdN diff --git a/checkpoints/sgail-ppo-options-setobs2-17-02-2022.pt b/checkpoints/sgail-ppo-options-setobs2-17-02-2022.pt deleted file mode 100644 index 33df960884d6f3b421d3499c80a2c22cf667288d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16279 zcmbum2{@MB*EejQ$B+z(sHDuKxc1tHQqmwzN`sW56j!98NoJxllqu094HBi|+G{tU zkDb44ocr3pwb!}NW$(4u{w*(0NhvWgIXSWa zO;DGtzK_Sb+6eccT5U@O8 z!N{Qb;R-^r!QMh~Qy;}1(aV-uSXrzL2wD^vE|i!b9?~P%V(yCYpx`itxyu9mR|Eww zm>V9jEG%UC+z1;5p`@v)k8BSttf%F?MFB#ozaa|l!6Ea)C;wfkAe8nI?`dNtl<|@5 zxz7(>A(S2OBM~l?o8&3xY2&FBFO>IG@)VC3DkKH|)z_BW`R9##{~^Lgs2wOf zzD7P=*ynFWY~qDFJ^J)0qWiZTy>Owvx3KR&ir85ErHH{FQf!6&{#L~BzZ5b0tw{gB z1sI15O}vEz{!zs4A4LZKA;L~Ls7H}G;^9Km-!gh$D_%JGZ$-@hmNO(=IMiEc{*NMd ze=B0~hZK9EWsf4V;X*@P<@%rD| zzlxaVANFr)AMRoeG{B43N*R&o^7zk zb1U{sm&0vY)i9uP5X)Aw=V;rG#!9}uvd;;9_(Zl0w zJxKYA)2J-mf-ZwqFh|M{f)yz)6Ao1pz8sn8Mp<(AOrDzg1lf>$;O+I8nw+AMHVDwFV{^Z(`+!3OGx411|if zMrSQeXBQ@~fOQuIyiSl$++t*ilVr8%{rGKoHm(VFjcXQ#rsUzlrg%ZdmHnVS|1rCH z^cKdqB=HjmOW?zRQf4+~3Z`C}jR`f3><2M8n`j7Kxzos4_L+3f>Le!ZyRqOcrSbKE zgDo1twJ{M4Z|oy!d-PH1n=Onv#mK8{Rg!spHmu~uEK3@@5kJSzM0dSef?rd&;Fm&CRmF-oc-wI- zIJTb$n|oqJ-cp?&-TH`Cr}f3=2W1!>#YAXI0ozwJ5A>Kghy-!?@(~O7i?r8oZye zki0cjCa-TDB@K%c@pNBtT)Q>IYMl&83!()(Uu=XgCe`@h zQX#rcTm&=3N=ZiZe$nNIGPIErlIc3xqV8U9_|6~!UbK}|kz;_amllHLw%5=nDiuC= zRkAt5Qi%S79kBGBKX(Y&2D#sstsgNskkV}{t|vnC%r;NA8BzH@{Qliec@HgfV1tmXm- z)6?LF!8zQ1DwbtC9VF#R*`l(0rO;XY0<{bD>5JrBP+HQ5WXp=djDReGV@4_F>db|c zL*`-Dxlw3+#|Z|W-iprtL$RVhg^zpIA)4Nh0Ut^;M75>u)g{GSVL6|Kt|xS1=!Yp_ zx}gN4w6yV1R1l6jI)(1`Xu`viLNF40MrIjiLP*_3JiR)NZCsWPn~iP=4s^z%M{f~s z82bfYjvB|!Kedx9tyL)5M+Ws3`oXLXQnWp^hMD$8>@zJ6_de|>2-u(kbBD#V&l6&} z@yu+P78VHN$=ArSl}ZrxDTBGpdmwP>a|z{Ab1><{QV1=sB6nA(q4ZTB>hwJYk16H~ z$iYEi78egnjT-pEHJNotY$1_rJehJ-2z#Tu80SsD0=r|!^3vxO?A%~8?3l0(TNbZ@ zE(bp_{BRgnj5tQt#}}de(j0c)WFRQa-it?95_EQ!bf*VHpY?(PDtF@Zh(~L6F_NJrIw%yW6G9nJ% zzqyQd&r)%GzjN$Yh$bu>6$_`o*x=>Yli94)VmRLW4fEUko&50M1CNTYVbX#ZWLeKz zq2G%M=KdT&HIh6a?NSNe9b`}3o}X}{ZWF$w>ESAbQQGjs^S>&Xpm|gO0SomBeJh4A8^75jN9(O z>!Aag@zglx{%9}pu8zWvy?zj~^)#@^^Ki~coKBhc1atfO@asw5Y_fS4Y@hvzg!Zf( zN50L+kG+RO<6&LqeZ`HGbef?b4~A7k?QqG)H8f#M8vL9dgC|Q$aQ67s?3Uh1mLHS^ zKGB+@wPUxDvKj7Z88sEor6qvHbT4r9vxF~Y_sQEuW?qK-rJ2TLqb5K#U5(Xt6BMiR4`qBiadD0P{QOIDyX_bqW%HW zX%LQ9%Gp%LG>1HkaE9mK3sB?pdhBv|f^R+-iu&ZnquJ}Da3ABLlUad#q%nr>h(Wcv za`d9B8=4lC!7R^_ERm@~zauxGpGGz_S$T!^k^RZ$&gzA)Oe=7j)Fyr}J_Qb{SP_*O zy#;j_jbNk80vM^W0$q)#;sQYt+DU(}_INQKzK?!@HEz26NXSQ29JLabDNSUkGJh<`KS$G$#JBry4M1jF-{c-I^)UeXi}#_x8(juDK^s2%}7a~nks zHtMufu!THW+=Z`(XyHKr7)U+3nZK?1j5faI4k7+aw0ao zzsj_8J`0>wj*#E}+R^Jlu6{jE`|t8U`D-SB`fJwiu7>}MzxK!GrRQPxsRLwpgg1Ov zKO$JW@26<<#xHQmax_TROW@+o1cy9a1Ycc7vRYAO%YYc@cC z(*#`BtV-X@=#o2Udidp9a#L9TSQ{)GK-rS7oEaIio89;c+QpXOZX@t}W~|7n~Ae~y!lyX)}(&vE+q zxc&3&KSLV&E{cYoWfr6?V>~{nk*2p}&l1Ogov0+cj5POghXXf~Sm$nYJUh^UhWRfR zJdryov5_=?i7Wo5+3f!KAtD2FB%AVbo_G z@V%qUrJNtZ-tr9AaCJVoTvz~4=7?eQqgl}Q?jZEJy@=nK(ZKpgKg3qWd*uDDFv!d8 z5Vfr@RaPh1w4jFy~$38E25_>d>>c%bvKJ6$?SxErXj)}yMjb^tF8$tW= z3Vd{~3a4rhAmhjN#kpT~`N$9Q45rIbl*|?#xVHt;)?0{r?eXCYLL#xzOoQe0k7e#V z7UJ&6>v-{=0Uk1543;yWqf4YdeW^TzR_qYq7>B1U{mvX6Q7qeuMG55n z_jUMvusGFRRm8>{kB2+Qngs6;-Xi@U9K-a?A@p{u6kHxSm`>|Iixw7!Ld#1PXzY$< zh1EataaT6FDsF(CVP<@<>1!Akl}@zZ#}lO!ta|hN-h#`&j)P-oA$&K|=C?!qN#QYF z4B9Y>G|YNUPa|~-&TR>Ib#KPDq+bA&^N~OlE z1IH&%1g&><_zd|}P&XX}hZR)uL%lgooUKbkChODD!3Mm3gCR6)ZU>V$Cj<#<=@6`W zo+a8nM)hiQS}L|1lx*~9jJ-9TakG$I@xbLb*wVsA7)5U#ka|1SBfq-P>}_-@{@S>d?eBSyaPt;TLU*U%sAY$XGU?O z>BP;QxN4aKR4NRjWP1+i^}9-Vmp(1+c3@o##=^ufQzz{{AMp09pCDD!1fx5ZvCv+M zXODUVkM28ylI=^ZS=~fDjO_(8zKkNf^_rY6TODFvQQlBU%qB|d zRQt&Uh>A-LcqlDn%85ZRZfdOHW1tf6NF0Jw&PmWSC(GEGOm)~{_yty%WVRQ6e;E$wMxE>b+@dlUhsPR|Uc3%Q6XqQw+k6DP?<9~<}D)NZmKo>r)`xP!7 zJ(atikcKIDB&okv5qK>K;t4JlXwV(VwdV@?tGO&<-?5|`pH{co5=(hpQoGBUe zD~J}<)-t~*C&~OzsnBgTkOd7cVr308x$%*Q`L$`C8*kV3~P{n!d;nBO$FGihL1c~8E zNoU^HHJ{&n94;7iQW}Rlx08Z`qp&}v4GzxD=$ShN)LUUVf0kE>`guq3QoO4`DP|Dc zrW%gRo0aj1?@O@w_Js6#SqXJbW_YN56kMOIjNK`7=sktquLqi2O~=WbN{OEE6^wi}0#uu02=7KPNv#4ya}$iOkR_#+saUx}f(;z6gD2HQ zsBo_ZR!ooR={g+W$7Dd3v^6~tiU4}wvW-Ow-l z8$ONPirrl)#Axbu931P7Z);m09 zBPyma6&228;-)Ay7^j?zdtdJc$Bx73KTeB38)gVL4%$#M@I6bZe9c^Y$FP8*ed*Gx zLj^ayBC+$l4lJ8<8HUL9$dKSTHu)wqm~Tbs<{0cZz!xX07Zcx$Lzv;UUf?@PjSrD} zLaOg^xTq-0hucZ%wzj$U4l>{StcHCx0^mH-nO&W-l*5d@V9blE! zhr5ZiVZdw-wtalC!SS|W|CJGN?p!an#KnRtO`agy`EdvOj!J;FtHWTnLD2p;Rd7wD~AL+)HMpf4}l6HR_rbfO@qx++?NXKMF{+4C;KuCCq~_@fj`i(U)D zhaLfsZPQ@x-3U^DN0I00DAI*jI$%M26MOUIFuA6l1mD6dL3~Ow=6q6xGv*gr{SG}G zuSRI#MKQSQ6N3`lvPkpyOem_?rsEgx2b#2nStr}jcFUfv=j7{qGu?`|XDqUkz5>O(8BTeA!lPbt8?CtFc& zK?t)-BQ!W=FuPh9K|)+@>7M9DxU=m(E0%DB*n?*1dm{%T&3X~zAM$+qc}Xgf(T~ct zH8S?$DfZI;4AvXwL7`=To_49nj@R5}=Z<|8jjR3zXQC|OB}>39K6!%pmjfaHls^5w zMTHKVzn!hvWlzVu8gQxBiF~7K5&1Yj8D@7TGF_8*#Qou6+?{An@5TEgF5HCEL#M)B zJ7SMl`XLIi;FW!-W-W+>-MwE4vCTFK&gG zMlYC4yfy4C+ee1yWWd?lv*_JV8teNVh6Ntc?14IG(Ob_mx6f{{OsEdp?@HOg^OVYr z-VXM0y{L+#GqEE_a9dY8hUvP|mi{L}#(4`>Jh_y<_SA>jYu^bJM`WT`NEwd3XULT= zDbSppNIpDZGL84zMZQ^OgZG+ESl*^hst>#;hfCJLzPq((rxVB;)61FbI#;k!odIVL zeI$WRGx^{jqhQL_`{b!*8jkQ^Np`kfU^`3Z()X*&p?z2y?RfDDlKZYAhpgVR5eIw5 zR7;lEo!pBty^n%Mmn-}#`++}4?;wqfn!)?f1T4aC8&P*Ds;L}h9TAsY+C;=^!jMZkLmP- zhvxz2TD)QwO1t6uI~6$5J4WE%5|69wr0DA2;h-|70f*{D39Q=&vZuMrASsfPGZuzu zFxmqStB>Mm?`rYrhhE&YmmH}ls&t%XCu|6q!{7Sl;-oh*yuWrD&z_o&OQQ79cH?@I zG)adRr3|I^RoeWQS|UC4Ae^uFZ)G>fN#f%ZVI+%&lXHg+*oq}4$cI%zy!truvojsm zXt?3G;tLq3+agH*zL+M<%3)Sw5D6^U3;98#z^kZ*ojBpfJqC;MoufAL<~k`FQ+yH{ z&y2y(MRxp<*eftl>xnNaj>n{Fcfn`QHJEN}{{=@w>c4ErB|8&FrtD zlRKoj`<;C-``J}U-u?krHPphl7-{r1452r7>heSDqIt!18G1_H0FE3fM7y+jIJQ-t z?<<=}x4d3Pqhb{J-g#Z%I$|?Z*6;C4&&~o*y{SC3SQf-j#=_bU`LL_48apwJ&9cy^ z0Z~SLR(oIIPZ!Y91NOtM;6gI8P>h;49|8J&DVeY&nq_KT!P(s};90d4U7od=%Ks>H{uJ84U-IFmTn^qYpfHLc+dD zEW&UB?eKBs@0^l(`T0gzYcUzdUI{@AYa!#jTk)%s1sz>7m0p!om-|Jp7KWR{D6{ZUDV^`Y`U;cb16TThIf6=`c8@o_)J} z3(W4A&}RkFa6sJ!%fbs;jPzEF@I210WgdZ;#kV0|rx+(LTMosNH&}r6WE>Gi;H^w} zmExijqH-w_D_%~+M{}+-k2VYDbNr29#VJ`dnwuq>d&5BVCg3O;6}OAk)I7t3RemJG z%U6)xPz7rPN0SoO<1j$X79MO@cWN}Pf?LgoOjY6|+pnffG{%aNkc9)_{mw^N6zGOe zz2*4Tz+$}kWjApR(dN1mJHR+nnvQrZ58ur@Sh~0=XtqUQ;GU^aoU6_2@12MH^H0Os ziN{b+!c_Ee(H8h>Bn~$lO=)-BTHMpH7eQ=0M6J0FBOOOGS+{I#8L10hIbvw^VjenM zcc9+X*X)hSOe`v5s3CH~xEN1Nc|42?Y)%j*4_SUfObxHzw&990ov5p+&KH&6gK6Rp zSSwe7>}e#kYn2x~q+Z1Cd_I+{8^-4a>GAc~J-FkevAlcUS&`wGTbS-S1Nz=@p^*i_ z+(M}qD?iDzJpn^`uW%!(m+ZkW1n2Q>ZA$cq;{mjd-p7I+%As!SWxI5nKj8Nt1#D=I4n5p40$P9O zFx6e3QNunDHIuaXzMLzh%X%F;`X`f`4covt-cHmaZ_E`cYhh#e3v|pI3U7WbAxCQ? zSn8JuSXnIvQWi4!e8zGjcW4`V-WnpfnV^7%R^3?JyaS(F93rs|ThTpI3j*wR2$p`I zC+OJP#9qW7!aBWPqTy9itinSJopR;z>$R7nyX&0kf;;8db>SrHv`%4;kJ2F4SCP+E z?!vRFbzo&-b4sCOzi4UL6Vc?rZ*21Yr)=B1!7!pG3+;!yDJ`1}xq-)#Uz)k{c^m$BS2nsm_ZrTDauHSyiQN%Ved z78q3N(#HqhS1(b_N8tfviJG0@Jk%>1p7g8hLmGGd)Kd+OzYS%pnx(Bj?@rfNs5Vscqo?_74leFx@SUhj#SO7rUV zqoL48gEkb^!Mee!ob|noB_Az$+=;=wbk01C5YHydg506;d2f32SU!1o{Rg%MKZUa* z7aqCY2p?rBp_1z`g!5;~v6q}p5N^U@HKyRxb%1;rI2B b%jH3h+~3e{?7tLK6ay z;!zb{j2+p%5491EdyY4q(V zEoveaL*s>K;ZXNh_Hm9py6m?C#oRvJ=V=ly+Y$$cISTYt@&()+HUKwB4xqDs++wz- zMUdqiO=K*dW42=|_WSjLc;qKmvs4>Yec*yA%`5O!??a-6^Tc?Vwj_Ogv={vt`Uz(! zj77h3m4x`p!ktrvpj}|a)z9^X^uynXV*D+pWoOJ5JzN1#y)~JSu@PPBV}wf#53z@> zn;_Hg1yOIA2eShjuyM|5oO9j~q%>^U*SVJvyp7 z2~E#li4*H(`99Ync<^*ON&I|_DD6*R$&HoZ_l*$;M|XIHmYC<2Nmfn#if(DHw87RJ zT21EA@h+2k=4xG0md`cj)^`vDOBLea(;c|4u}xU{piZ4TgV0F{qS&U2~)LD z0jbbE(9gnxJk`IAewSmI*MyCDb8mlU6M95s?w(G}UT@&L!ewy71Q$5+{62O~2tv)? zPphgWdei=|T_C9JAoZV_&f*;8@Z8omGD>Y36TK1R!bEeF49$X1*CTNHoCH)SDxmUB z2d0cL=Az?nf*eb8{5igZO%8m;mQ|`y71s&;W8wtV$REp-3^(v$w|bG5q1OcgV=IVM z-DPO@IRQgY?!iM+lj-`^Cj8nkeWt3Pic2(Y*r$dBa%ARm{5WIG*0~KSsnl<+){H28>V`3QmtK$cTgPe4R7HuoC1Adks+A;sB97 z>C7spZNa0js^Md6Z~Aa+U$m_3LiaC8@N%sxoI8McD4@wH_-r@Jb6X+kf1{3cKi)%L z&M3r?fiVzNjj%JxgbuATq|tGCeK|CDD3&d5| zpFxV*Ubz3`EY`gd!o^kjM7NJDHs#8p>0D>-c1;;}gpGu#dLy>%Mh$*?luEXY>qF0s z*b9BHItuLXZ-v>Vl~8!xi+$Hz3+cgw@c85qyrdZb_hkma9oUb7YaX+`h2zNO!#7B` z+ZIvwnIUkZF%6nd{=hZHKKN;h43F*~O~hvSfPr!?YUFL#sa@GIu5V* z>{-TCu3!NwU0^eKB3+bo2;1a*X~U5v+)867`?XX9pFR+g@g3h8S(}LMVG}U9x)lzZ zmkX{c*+8G^H`o`}2m2&nCO;lbqI=$}pyifvSfc zw%ZAM)lw$<;skeF86KVLhI*{_$PSZoP2ZY8+4!I!w{d7`&l z9vicL6fD==L~q_{M>{7gzIsL$e^!vmYhTY59JQ&(rWZS)Mc13oDP`=vwmPp<3I*Ax z`uxT2&G7QjR~GQ`60UE00501s;LWULTv2)*9QGuNs_6^po*s(6vHDzZPY3H>szz^j z%i*QU&1hTx0>z0c9Gq|-uQodHtjW%B+G`@tl$%HIrf30lk7N%&#bQ9;A=nUMMv|8( z!?zD1wC3R%5Gs9z<>g1Q@3Uk${P7IDOMSuOeN*9r!UuNu0ms?(k3lZO`7P1{AJ-W3J8P z1;a-+!r~EzsI@v0_xYy~+FpdCer|(;7iLuLvpZfjI0&~sorf8xs-Qum82esJfa+Js z20RajC+52$x51S>UgE%Gdg9Yo21Dt+*CIM5BbK_o)I^QFr4Z&&hRN<@`SxOY$f_uW z=^ZU>={yhmNX-ZpPgaq<^20E2&p{Lq%*E#;9*Oq+D!{SBU!u5;0pC@(mGsgKftM$o z@Y;P_{#_s)OD1@9#00P(uLi@<4-gf!c<^;?2GlLv znEJXNr;bJGbhv~biyQkKRMW+IvbF`!9&?8EIhY5_f80W;FS^vBehbP?ih`Ws!N4OV zc=_gQ?B}T{c=EuM@0>al*Y}*))PItI;n&{4@Wu#y7;VZY2iU@e(c6Fxu7TpD$!NDI z9Q}+< z<9NP*^i)`XkwV;Yb(pQ6C}^zNBfx7*x#NVfv^}mj9hTDx!_)*+e78OvUO16Dteb=U zhCauaYp9QI3;3)laL|DP6WXp4syZ`)Z3$wQBkd9$XVN|hR1(Jp7} zNjYh$zXFDX4nyet6ih!JEi#@UPRG{{g_4*`c(pqjj1L&Gd1mo=As`4QmWXp1xWe|m zX&@n?`Q+-7TDVgZ0NVp=(O|DJx~(5bi_^y7jgnmKdfYBr^XwE0O|c+$O`2#e(1K&C zW102*7^stNp7_V{CN-DY-2J)8s$lCzstQqrHQT8u<;sed|xyhyjZem$fRft^cV!M8n(fv>l;x_rvM|1 zzLA>hp1AB*f7GorhAW}>S;~VTa`B|6&etaR?ni{k`RRQUX|7899{vCyu3{}F-(8Eh^kpI6 z{~a?aR-{sQOu6Gccah8B5}5Zu6?M&x@QL1RC~R@U9aS;3M9U6WUam#0{(dl3*$cXR z&Ttat6?v(1Ec(B&5G^U#gFCOv^RGj~fM$j>wMEz9rn4a(^*vtH-+Cn9*?A84Bu9$I z`B~Gkqmr>&&5dbvR)h77Ls*hkN7VY9CY=}6+2fQaaBj@b>T|<71O~}_p}u09pmgn2 zQGTByRL&j%@omkp=)xQ{zo$ey?UZWS$o|Ko+%P*5&|eF43Ikw#VkEoo7=ybF_v6ZPc~~cPQ}jl! ziacCWM-0EtfmKn<*$tZ|IPsw+bNZA|RFdzaMxH5VHUz<)!Zkhdy_+~`*Ky`wxE_wq zlIIx?(Rg&72KH7^!<_k%=#s5RH@_3`!&k54x3C=kb@XmN&Ts}>^LZoc?h=PrGoM4C z!ASUcKNdGWx1w|VyKuL|n~1d2Ewr9+mgR+hB^lK%W@9tlp9Rj;&g z$HYDOalbUYH;$#3P4#f!sVcOxi6Gzfnn+}80c)ur$R}MJhGubFxUJhbl-}MSU2RRs zw}HywH?|h%gi7M*10rbO^@AnPX+=-_a2EO{2A0PT<7p#$diIX^nEB# z+jRVRvTQLLeOtu~e+c=IuF4jK2zRQL^?Dva2n70}4Z(#T=QUk8$yN1dmYm zhmYpDkl}QU-OV1#hfHr^D_$h=&YD&hr2YdWAKD0XZ-2sFT`F|$=mE50%Ud+FN@mx- z%Fy{vjgS*CgvW>8gu)Y!*zA-D?4c{{y1fySG+g-c79aXn-GG+MRZ|kUiFSWECOFy? zNA60xfvv*+d}{G6w%4ryoIk7b9|y!~VMzhz-_C%2k4i|tF`d|E8YilBOa_(h`uyF! z=j^J>XIxYJjx2Y|0fi?UG0iWC7t9<2+8X6hxZfQXhe=?e-#hZkYaC5b9>ms_mczHv z^GWNTP4HE$3Jk)3jh|#(C)b z#uEiKbI?~!oo9VqM=!t6Co;Qy==1ha8viXBCOAsMqQl{W4C!X<^|(Lx(S8c$`zCT< zzYSDs$XxjNEE2MI%|(Zp`J&a%x{%_n184fD;ev(T?EE6Y5Br0`EM=15_2cs_ck3`- zJjNPkt(Xmmnp07@G6<7g&$6kS(e(A|cW^8(m!7eB0bdg?gURJ2qV68ROIfB!zdi{{ zdw(TshL^#u6H#j$}(hW1wW!2ylzL#iF(aV8Om-yq~+0=IADa!NOtm zwVXX2qK5|^?|4stAO?M6p>-JFRc;S@~w_-&>_76TC`ViHLb1S zC~1JEzeWqTcI-p_N@aX+pN7Zg8!p9AkT z{^tHu)baG<1wUFvP1a}O=7t7X7B!B)a7so0q*yMm9?zGRyW{w!BSbC1{v=bl6XI?X zy65EwjQtrxuUy)|pE%euhkHA*b&ns>_^b|R-)+R+A*)ewpfT)zU!f*BdyYW)(K52OfE%3&rJyZ4hV#ThMswBHEAZh;ikzi zd?l5GANrVb_x|%yvLn1IqQ#znS<(hyw{4;B$DiTekQAKp&>EzU^~DRU3J%qK^4JPV zzS>ril9YQWS*wC$&dE_KrHz^~X4E3q3#DS0;*(JsxN~z8yt<_i!$nHmIZ}^Ktm_c1 z3o+&sT{>Csicg|}ZGHK?@Ld8SACJQJIQDDKYj`X64J!wG^4s5b!i3^dQgtpB*SyO{ z`9@XR5)q3xhUr4zbA@<2aR;Y|6NEv^y9!=RQW?8=!E(MoR%>UAt0+7fDE z#*&F5$+ENPax(>j*)00$+bqnjPQ{_md*c_y8L(#S6ufw4BERdjo#dE*#-{75$s)gl z_(SEJK>o~OaPKnV57rs;jHV$#yN1!`U=il+al^5TO=9r2;t2RhX?05N}czAYy^6+fkU9J9q^Y9KuXTo;ZTv5%G!5~}xguETR zjODD~iLXs(qDgp~)1b0^vTeQ}IyR>=uQ88Uq=GFR9G^x~qXNL^x*|K|pMule(n$i# z5}4gc#LUn*w)3lrz&d>!({^hW=`7uiuTbWl#FfBzKDS=B=WuUjZI#^^5B7?dC`9Nc~ zQ92pF#%QtoALjqX^At}Qr15{iU$pzb;V+h~RN_~MXQEB--rVw$8XfyBf{10Gg^rGH z*!n5O$!mBZdkr5oG$KvNhI&L z9hLT8gx9IhL|UB^)x%C*Av)(9NeW8?{cF$Ryi`vvN|_y>*5F8_#Rt%mE?sV;d;xY% zpH2k%QW$y30QBWY^Dp;)kdsFuXymXX(3$#}ybP3Nxrw^e`Qtsf*qx7_OHBE*#ti;4 zGKlV%x1lHAOd`weZFsGwierDTXqsNLp1xk^!hQ80p+HrP=NBBn#%(h(!)YcZn;UBrT!K;ynK(fsb1iJ^*GpnZ2ooiwt>6kq)^j6`g zYY66kjK!hX;vjo<7E7{N!$vI(#ckHnJhh9WYKa9mNXvn&MKNGq6bn&R2cUMxBn&Tf zqSD%n(5#1-HO^5$1rzmXeEd69-ZP9h&ufHXZ89R)SUKu`KApsi_s8T~#PG5_OuduL zq9Sg=D9u6qwQ&OWZMQpxRHnN839tjg8&YT?Il2XxzKi8EDyfs#cgh^gmM=XV=WT`?O@ zziP$mX}Ub7J%QTYD1;d|#=yY11kkr02-V@c@p0O8+_=aIuc)PAgRUy=7M{oT+wQ_T zO=k?U^}ud?icDe*iM$krj<=Vf_R@vStvZXrNHS&mxV_@5 zlVMst?wgZ>YTjb>cyb-d8d)XE-*uSH&k_oT3G{j4`=^k(-woBQUV~@#N#beJv)|9$ zjFk`lF;Ds#E0?&9*vwJ)mKfK!{|L1|eZg7nlE8Gr8XWRD6szy+!FR20keRoc#Uy*- z{hf}uu-8P`^V|nC7bwwzX9h!3XCPEAHw3vep|JPa4)_FZP-piY>Fnwrj(j%OM|}pv zycE{4vj*d*)#KaXLnu6xjlLBjXe4(S*3XX>kRH3bx~T&7Ixgd`*RJq+wiU)-NnxY6 z-4ncbVQ^vQj-EJNPwdt%o=pJ_ zT$Q9h5y9|2MtFC?DRyCF9#IZIj6J$wcJ5tN3X+G) zxJFc$93*P@-vIJc>(S+zHMJ~Az{@{V1Tm}n(AJurXfeDC9|r34#&{WCb#Ols)83A6 zUWkFYy<4@+t+jNM;zsH>Y&f4-I|$9DU1gi^^~E_;Dxl#Rp}UJz;0F#z`$v8FcBA`{ zQ#+ckiaN;@<+7Pe#~11w6H7HJ^KqU;B6_cU4r>qOk?yH$q3o<1p7h$o3RE8Q(qehR zt;7#BA|(Pph|ZyD4@dc?Wj1tO1OL@@3|8rH=kJaC(p|^n z*?vI-HPJ1C#BL|i;k~!9)sbVz_&BEA-W&2)>f^yPMX+<+c+|Dir{f+gP-%(xNE6QU z=f|{2=JeUXa{x|kNeV9M7ca{HzwfQ&pKiBa;v3~ad!rJ~D`=2)P zCpLT7zp!@y#{TEG{u7%h_!rjx-`M~Bf~tRv^UMFh{+DfddCJHP{jWv_lIH*2{GTlP rf9~zS^V54SZ}RuO2lqRxUCf^T{rvl9FHdQi-%oNqf4|%R-S+rMocGL`<(xUk$x%{DOiWf* z?05Ml4U+ZslOq;?N_c|66E@KVQ*nCH}Rf2CPHa9 z$)4P6O|VdAx|>9hP}bQ|%+b_QAzCQssNg6bE$kiZ`J=bE=Z{UHzTIeLX94NdKl6Co6f)>;UE{`;C~n~HU5hctv{%k35Wd6i1vRmqVt=P zp??$54HD|P2#5W{i1|N^4F7|Kxlq4{kwxM`!V$k|^n6yd(BN-IM*dA_RFKfnMQHR7 zBj$fIV*Ce{vBJ?kjK~BDP5vUXRXFB1Bc^{7Fbfizy9mbyhYQF3MP%_RpP(hbrA27* zSC@|;;nvgHV!{dGLd(BKG{h$$ut!paR*vF|B9XO}1NroCXlZc;J(Mc|(hS#pbHD2P-G{1nby_RH7ULzDPYQgp|b8D@y ziP3%o3~}|`zG!=Gnbo}$%1qK!2Ap=^6zo^)BqPM+Y4)oo^m)5Wux(T*81_4h2|{1U zxoZObZzp0z|H&}4<}H@`q<~KtLZ3M|@xkJcP#658_Tutrdd>5y<({uigf&=Ur(_CQ z(QuH#-Z5a{Bm+jy{$P;u3tPUfL+QhnB>C}7zI9SBoO>yqjBLmOSx86ct9hUvHUM|c zY#_FQuHYg4o`_EBv#F+MNr%G%`mx*^ZKZ11?had#)O7_^ic=6dTYV!^mt?GBBm2Yf zhD>a?ILyrNydXbswt&_-JMcG>!OlL#czl0f6uiBP6Titr^FaypRUg3LZjTiW@L!Ha zyONmdgqbwQ#2<%97c)|`MUXk5S#;$39(2rWhIM|Muxm&VIU3Rgb`QePSat_EZ(K^% zTSlX2f(hp3`Vb4tD40-~!L};=fZqGJ<5R&_@Njm+#)mU7*K{;1y*-nMc*qIR$Qm-d zCKB_3U4rO7Dp0yQ1B<%Ok)UU0A`qrPsweytk1K z4>!2}RfBiBtHbh)X+YimaN2;ou%uo94*MaX9ys1YKQe zzykfOz^9)Aw|cZ5E9+~)vR;Gg?I?rB_X=eG&PJS2a*xU0jAEWqSAed0iix7`zm3fFo3&yk}WsIuG4*Vlhq6EIb6H8qv;$Hh;baDL2J zaxA3;9zWhJTD{&{)Tgpo6jC(}>NTc`Rw>(|GV>tHCiCdqJ z+Xbe^_lZKqJ62F!LYnty;`_E3lvG~{MPnjq(%|i6)*46P1Losd?+EB)-AGQvR-tC? zbrP4L2v;@sV8}sx)Og#(hHiZVjwe)UAPdFXZLJvA`IZHZI!G>TnuOLL!!f(*8_o}{ z6xBDE;lvfCkmyha$JCw>{Z@O-9Fc==qV+gWWhn-)F0_JbMeIcl`QF|$F!O>jf8V76T|#Cpv^>5)xn=01Zw_S0bZo>sz|$Oo*-ySLzVgd7!9 zFu=T9xp1Xc$oGk9;cD>@MCO_qYJMJrr5R%IQt>i=J~sz8O_l^}J4fgaOJRY9`Xo_d zEmgOU2F>G#1v~pCqy2Fu+;A=qm&sazhJm`^^dc>`>XHR)9Or~3hN+MxHjqAb*p9*% z5rQSPrJ#Sei7C&v28-gQ2sfl)0Lj9%11eb6F@apIYXS8Wt+=l<0|NX{3dZU;;DE_R zxUba}9;@cTvmYHyVqGH!@qCzf`4dUMw;d-ndegcIgJ9!`5V#+?J*}$D$u5839PgUXLj~ytrvYbsjzXL1c=8+ZOdXd0jJMQ=Y}UDG=rji)58q3B3F5IGlQaI3&N^i50yjk(EPsz}BB`_{}y+^lZi&+&f8}n&oUJ z{S1$@-{-Y4&(~>t^c>oMr~m1^ruXN0ZH&E*_WyET`$Ku@dHErpMf#7`XSOny;QqA= z`f3%zoJq;h~GW0c{IA$wV(xm|--BG^(Xz?y>=xQgHwe zWl7+LsWN2IEy^<2#^Lm3%P`Y-6L6gkM04|aHrizXIO(1ujrt?--ZEEKI;R*rC(X5# z&l-a0TMgH&wtzrzA6tSpf#!v7Hm7j~Xg*qs)awiyxXVJ#BoV1xcA1RMQota~=j4s1 zCU(ts5ezMkg8(|S`gcF6g)hlJ+jD~co&KkO68zauruH`D|3CZb-~IN_`^Bp9WUTuF z7=F`E#0Q-Lx0^3}=B_4{xO)#gXD`KHA&F>u-~g@M`xyr|Rm1y0MPm1^9ReIP;gZZg ze5KTc$$e#b;iE?OpANAtmS|>3#W)Mj2Uo4Oirm+3v4&nu)Xm&F%4S#J% z9Gkoyza7%VJqlm&w$UVd{__S1St;O$gFB$<)+(;IQxf`-DE!s=4f7oKk zHyOX^6de9>n#X$&r=!-r!7K%1SpHg?%fIYbJ3BWH;x@j4Reen8=KeXjPSTaT$Q6Nd zs~QcMyBMTDY!Zp?sS>AWGepWG&clkuRqUYWTyP@x&>h|ksUCYFxMLE1+HJ|}_ua-{ z3+!p~3T@uLG=>@!pF)ZD0_a|;MwfNPS@~ZY&TC_q^CKF@FmP5mv2f|lR=n_M8dG}n z2Gb^X`GPrbZ<`0+qx|@wNsr-jl^N>Wr$M2-5OzC9@nH8d+&`?Z$mM1@Y<8+;L9T=k z{^ddHht*+<%09AhfgRbx4T*_n9Tct`h((toQFOx?)H`bvg02@hMPP;<986vBFtdeEo=Uy zR*pyO{(w|RMRLVf306#1=NVG^G&xiq#>gha?r|~n!^l@5OruA@Z(@?%$1u=VT z2X=%GM%ArHptG)lT$)jXi958QK0b|Xh8p-e+XJKf4@92{+iTA`?;^v7J3-@71++UK zOAb9sf>|pgiTT`i@|IbH)Y&TRKfeIZ?b;8=R38&R=UP^>vCGQhn*@B9F9)~xT2PnH zadUeiyAfx>+}CB|t7$SMYHFikl?rJJqg1J3jy7K*@+gvi6LgP`dG0> z2YkD_@Rw#5zAN!3uMBJ9+4P-c(IyjUYu5(tC7p2jt12b>qwzwWH2=`jOs{hlekr&U z4wu<7s}5Ii4~e$%mhik@D z8N?gHjBfb|z1~&?#6myY}*#-S}Mv-rRS$J0~gUO?K*djtljRe0~~V$jjZfu1}%fN!(@N!q91!3wwicy)a$H5}3jy5kB2 zau*v!^{Zo{ez`6+jGuwHG7|DNn%Sg%Rcwpo52B|z9j}O=A{EA+(Eh|49UotWy>iFl zqtbPJkQ@nGo)zGweHMm3SWB+pQ&y6D8RCQI(@~2TLwkk{S3d1To!Z8rPNWJq>>Ny! z2cCyx7f<3AHD~H|dJs)7=*73k4aQN`r6e(ZDjk}q!-L^1%dNbI#;BqJK5i&DW)J^xm)VAALJU|2ZOk*

tmihwl)EWn}fnvOSff(JJWMhr5AXL3Jt2EHx4(R-C}%*VkaCc16utt03ev4&n1V z+M>fhuY*ue9beCO#z@5-JlS9fA2>;g8{Rr4m{T{AKYh^*?{wNlHDP72b7Cp9TBY;K z=Dk??W*Vt%y+dMi53_!C#yqEBI~*B%7Ar<26TiXfWaIqFSUf`}t=lcYvbXrviS)lz49?3`0 zaWeu13(GC3;)YqcBe6#x&lZ91m?EmP*?@l4?!YzsPoTi)D3pRL9<8}dE@&Acle$Ju z7&c;@t~2{2=g;%Pw(^l>InZu)f%M;#hjMBU@bbI)$S)VM&Dy=_s&7Nld2I_S-d!c~ z=-tc|lRB6I_TrWXN7?iBP9Logq;=b*sO&dAI<+DS=S(u9*EIF{x(#30lsjU4 zxZ+IQcRqs-sZ4<5-}{T|I<{e;Q4oAEH=!ouI#~Gbc=+Ow%=$WXl8|rSwOdYaXLs5} zK$660%z#u9_u>ImLI#A|rJ`4`JZy}-3{De|z*ogR?_J|rE>L5+)p%J>eIUcc6p}Kw_z(402mVKClW`)fx`=Ba45v|9c7{6tg z7k$BCmjwP}b)E;Ke`p>(ANi(AG=oKY2p4*GY74E?; zDwEL@v{A>|mW>qHVW;;PzQVkUT~zFiL+5RwI#R>%=TCdA{$NeLV#af=;g<05=Wuv& zArm$lJYZ!<27+V6X)wIL7?or-_{{6a(G^tbz0c#Q@x$#PJa|(ufsKnQPp;m= z3WQ;ho4K2MrRp&k&rd9KTpudaYd1E?tR@FHWI_G$6&UQhnEeQ1WXW@D5+dIV$EtqD zyUS8>us{`_#}1?0&lkh43qOd9wh|v9SqFFJy}8)hS9t2iT)twm0%nDu0m1j_;F7fs zeMW>4Ia38Rf42>)UDYrsQj3ZIdPt&FCxEy44VW}V4oHlP+*{_GhNEPX{!oeFM#TiSR-)S#YaoJ{bFo9( zD7!9&b^W8TGw&X3*)JlGM>SxR)f|k;j9_z@q=5BZQ^Dw6u}r4dEIz4^Eq^FV#htTm zLCw`_q&gn-$tiWJ^~!~&C56E8t4h53!+lmS&*0gZOM&IKiWiO?mZN zFmi8SK6K(!{P-!76-UI<#MX7>S{7&XCK7sdN(YA4-V)_c3xLO|kI{X5Uz}pA2pct> zVfArI929jFKgnAO#y8r-{uBrL$;OFB&)SZ<%QdORXH7m|lt{JozQW#FuGDC~C!l%+ z8nq?kuUH8>=A;%|s5A^_-F<_vugnA8+*CoI5q$+R8MZj2Y&g#uPy|NhX=FBr^2EEN z$X0iK%u;p0f?Jxj%z7{v1ljPR#lx^l_Y4_TPOxHYKDw8Oq7ohxU3Y7<55(CgF}1_ue8-wIBz9~r%yw7;oc9}IW8JK1BOGy`7Mw>I)qx@OaW1+H^y{b5G}cv4)2?%pso2YL9a!6NN;$< z&abC%@^*0?B4fbI>*w(uIf*bc{u#Mmas-Qua`DX4dHC^X2iY&U4K<+$QLSh->pBw4 zdRvWUdhh$9sK$VQ(!EYBcCBEj5<|b9cS0M!32jeH(41Hk-n1@|?0i^8e8)PF*S8Nb z?ep>EP*x=DHyVfPjc3sQ?OP`GR)+TPH=mx5jR5Onb1-=zhGefF`=z>-RZ0NZ`Ng2i zBMCmP_ABu%&j#g|HjEzJ47ZepXrQ!^4R-e9x{kex+0Vsg}g(=Z{UvEKhMkK8r2w3_w zfw-n?P#^oZ*cqElOE)MG|BDH*`?EZ4Fe@STmj?2v6~pTox9}1e=vYBaQ#6m8vJhJ`M?S#n6=58 z!;Mx9Zrl!qYp;+OTOC+}#9nj=kfjIiTp`L;^`I=AOSj0KAc0=TNce-9c+`9Yo1kil z!pMuDbG#d7T$e$Iq8oU`K!FyTUqVO@gWH?31TOPqsQ&Pm>`mYyTqc=}{jEK*aPb0> zL)dyS*Ly&09UGC!h48_%Q$@0O24l$cczjJMqa^sB*edP614 znyCpvlUL!o+cB^qzX~f^Fu6X}pODDElCzg0WnoELjY-KS3A z2STuJ@GIa(6 zZI%Prlh&W4!@7~VmMnnaqZgseXeFu~dy0y1k1Xgmr9E39-68CP1+#9mmfSRAJ7jO| z^u!nJnN9`P95@b3%3gq0ogvQO+Kbn^^qAnOGDdBS2Z^p);{0M8UF*8vs$p&--j4Uj z^#&QZ$ma>Uf0Ka2!ay>lXg?;~QSP&@oCKdO5Cm)wW3qz|i|(BMOfF10fbD0`Vaoy~ z{&rLahT4blsfYK$Zo^Z|`iu?-2{CGZC7n-c&A06Rr5=xaH(;zxIlCXe1HOGUqO-z& zura#7@X?h)%sSu#Ib>G?x8+8_ZRxKpeM|}aY5b}7B33Yg{Ty)7J%Xn8=doyK8JN3v zLB8H@Z1SoCvFR~5_33UAZ%E+l_GK~2?e*~J(IVKdcM5)hKCXJybix++Dz8QhN)@=Si4_@hZ!m?M zjhGU?l=fa(%XBw-Kv#?u?Wg@qkbJ2RH`->%1F~PhqRM`B`H6XG(_n(yF>VJ}mw?_Pgr>PpXT-bXzBy&$EF+`xmpN!u8N&W=5&| zt3~UpQdnQNazN6Tb~q3mZkhd>} zl`ZTPHP8J4-A0$;h>jU7tl7q$`Ur4GTRRcFo5wx8Zo|&?HML9L7GbK)UC7dt6KRYv z!`XqccyU#;AXeu++zJ{_{IXkdLP0uzzukd5?bamqN^*2ub~HZxvH*Vi0kNfus*0*YA6)%JjC-d3FJWCig=mAQ}Y70IkkK{Gejrm6U6&!b~!ME^Rrp@cLM>rpyX(J%@dG>yRSR|Kq(ETu)|op9yY50np>j%Vuo!v#fUmc8$~)jL53 z28Y>0-_??QrOr1NGt!=$jE~@LQeWlNSeQ+7QkBrSJcQ*wX23WYsWrvTKy!v zGhIp3zI}qKNqIP05P=tPF^uZJSG4M_KCo3~IC@bbc|PD7`tNItGuqUH=<@%IQuEHOVH(Cmh2^3Gv=X2 z^?GV{&lrPrJn^}SCLLvw#A|a2%q$9LG+Ym=f2fH*t_y*|#*g4ht~yFbXz{WewIVDS zN5`#NMa91KqVqQ@Fvs|@d_vd(xH&Wd%OcD0(e1t5)>@mh%NcOp)Dw(8SK+02O*qwH zgQp`FLgMogsQ&FMXxiw3?nMhatHYMMuR77Ar*3A&gRj69tECX0kplTwkF(XjD!gHe z3}}3t39B*#$r-hSBy9^o?Zhe6t?@gX7wZgoKAy|&+e^a01Qbff^PH?u`a#^BES!-{ z1f-sAH!=sES1l~EyBf=-Wng@#4z;=w3EkiNa?y(|T9NzCYQc9>SE{Uc;l*ouD76 zPA9K#!OfNyc%x+uHEQWbwY~@G?m7X=oOCBmNAuudUShRh_6;21oyaGe4kormKS=b5 zM6k=5&AbCm(Q99o=*@dMv=!H(vgtUrAb5bw^Xbp{i&qF`GTjAXL}XnlE4Z zSd`>YDR|Siu=d$@N#=KH7^F9zfal{aaO5#{-p|+xFCP90<-crbv56v$%e^iT9bd+B zj*eiBgWn5o7%qo_pFD7pwHiO$?uw_S#c6nJ3>LJng!bu{=zp+`eTZ4b=Y`*6sa0#> zBJF@%>4s3`Jwa4xHWu&CUVvA|yTkDrv#4#hJn_{nV6oZ8WWvULrk}o#2~R8q#jV-k zm)@T~H_wMC;zI3O{88-6a5%F*9~xBKQ0?eSdardLyOv-8%Z{}}`=nwb>7vY+tWx5l z+Seq0!&A5qXUVkgmFO$|Q>2$MkUaDo4pTNr^LFiz@K*T*OAdC#YloI{F>@K-Iq4c` z6lTL7yEKe?X#y5kuQDsYIQSSFhk1SPfuXnxX~~^W%_Lmta7}q`A~6GPjauMyLLMkz zwubz2T_%=v3p>k~z;*2_koB$JYLECOvf;pS@*v_PD8xyD=0XX&?z0zHxKU-5V!8(! zKWp%Ig*a+D=?G(6E(zwH7>P!5@}RRw0v)52c?q|M_J{Ix*dBQ-&g{*d3Ou>U<0kgH za*2h#)2HW^icnK_GktMp9KE8pfWDtq2QIVaabeNy9{X1pj7?L+URXz(T07BuZ634* z^@AS=7&{}Mg+5aU@?#hCK+~)r6NHcE>xMg`w6h5gzcUi&COv?)`fpLS@*)Lj z+ZIedRe-`twT*nLlX)m#~R|wKc18_wCR4be5cz{Du!@4?)4xf#4A7O_cIZ)b5+@4pn{z6wiGi$&<&!gVFhX zt5+2Y07-+z*SVmh}GWsk;=%#^X$X{PqHw;lb!P4hw_6L!OwX^Xo{jMtgzJN ztr?5BqP7g*YFtUSW(TqLW5QXL*JD8%ZY16PQ!zy*o!M%tV4*LCE6E9PW6wx@^HmG- zN6EpATX%8R(K5k}!2ZzoPAK|*DTloBw<5=VK7ewnWOlgi278!;> z>>WKaD}NTVT786UO1(x-@)(GmG}iLPo1J)QTpFt+ZKU}8``V355=0kg#u3-?vr%yN zmuSJSW;ihSDU+`-CRTOvqGI!TAZj=cTf@i0ChGxscV;v$-q6f8W}L%>y&ZzPR)+k- zmxc7idmDJ~D@k9(s6pk=EUuImhPb(ctq7k*)(mfF2}5-FsFoynVw8sO*9>BUm-&Ke z)@Rv@o_mbO*8w=eMVmhrd?8{s^?2}V3RYZw4QqS$c7+kq=w(ri%YsUX%3KxDey)po zN<+EI3@%7WyU?h+rALxgi9klB)6R?9ntq+mg9j>F~UU zcaZexJA92DiuHN|dc{_Zt{wRr6)yc`>y6I~#{HO1uM-{qKC=W5rZaR7+`>I`lF8Ij z+Wg^HE0E5Y!8naW2qyb^%S#RJBykF68~h-j`)gem{6*6Dh&B&aa-*jQ>EKwWon%D3vnZ|4V)jO34kjfj z^TVgrVU0x3nSUiG#-*}%h8`s;^2K+v*!}_DsJ>zE4u2~ z0`V6VXtmjMR-SN-b>^fK6dw*1t&v2o{w(~;@_-d)&mcGJJZMZ0q!XXY^T{;9%0hP# z-B@)9MFktFO4D`Grpj$_*G-D9^cqbr>b^q0Z6sHcSPqJT+AG6th4i%T% zFuT0o{QVhbyA zhsZw1GblD#6+HX&hRd@a2&M{)Kuhs3&hbmYA#<-19gjpD9QXuXUZq0W2MZhK!rB%S_#p+_J~fUQQrMPot}5eA(d8X5Zx=5wtF9jK~e%fv)4U{+n>&Rd4E7N zK?sjwqtINn$8NoA8cEjg#GQdmw9bAzdvU!UoD9;iXsa}O@4dwgd*;kN<4^F){V;1f z@Pyq-2TCH}lbTUEP*FbzUQAZy=O63R1D!Ioy+RVsTpf;)OGHHO*$oXl>0cm*~SbIJ3# zZ%i&{JwFgNjn8{4O&eCpLu3_!=#g-&WWMwnPYxqM`9uVTo-&`fWlg6kQt1#j2&L5)Z`kUlP12PJ`~+@e<_S z9I+%yK(FsqqZ4a(puh8GCik_7g*ez#qjr1#rfLGZ8J1(R<8Z!YS1arL@RT66dn~R? zn1f{%tI^?6DQUd23O1d|#MVt?@l(JTJQH+FFk-weo+|MqMzj}oS6hz~KUxHI@iS(b zr-fB-tVH(m9vJ`V5(sY|$I-9NxtaPMHptN#vLcSM8@rFN_{)bFpB#rnZh>g{Qik5g zPYNPZma$Lwkp(xM!(9pe$tQhzlpXF+yL8!c64(;S@SA_nJ;6=3Ovay8xo%=%TFJO$ zWg~try+{%Smq0Gc3c7s?iRyx(@S-RT>fiSz%0Cw2=o7slBkw&?KW)gu#&nZD26t*5 z8^+f98SR?jkq@vZ*_kXlR*T1S^F^;ueG=R~y&o-(xuUN{8g$!k1^MeaqB`|;#60&Q zob0115S3OEr&GEhh$W&RuR^eRY04TKGFaclQjpRqfgd9jpI(TxnG!p zUt15tzz2&U_x5F0wcCL{o-hI?zBERQEpfPGSd&#-vZLT@*a_@@-Nqhw>}Dle+gOO^ z8@9`22&z=ui6YNlWA&*gz%aup@0LgND6KXR6nk%*y>OU=@^JNa8P5eVq#u_oY$l@Wcm^Fo-Zd)YUG(H}dRVY*ED~f0l zd>va7M{>F5*D%3;2z_Oc!InpLV9LUHOkUa_`z=lqJRlbQTJK0$c%v4N8?<5m;u3!B zT^H_+?a@hxHp7)^ad>HX0a^A|9&;z?5%pO+Ftp=4qz|4Cw{<<}^Q#MJiI*flsuhVL zn`&X}gbvtyEDv70JZ1r*5Aj?72uN9-0n5f6BQL&gu6@TBL;V#S`t*GZ+56T7Rw?b| zif^@he7TEZ=r$GJZ>$Zq6V+HP9H4=IQp(m%SVK50WC2&bfpC1p!<+-Q&u)asV~`n85T`OY=dkne^OR9eyI^ zGfaFfVoBN~X#0{>GFbmE8@nL2$9AsF&ze;eujzxShQSPsl#%A@^9pg~uMDzRbrd{3 z_?E4dormqca#^0lK}>zP0{t!apqTG3?7zv7fACeI`rUUxeuy)dGccq!N)h~(SkHPY z>x&zfjp2ebO8D}OCLNpUL8q?LK^c#Y$OFcs$_Q=N@9J~Nsr3Mt_#r%X&Ok^Hn8@43 z-ROfuA~-+k4NN~a5pI`9^F>RS<2QPV?7dH5n~EiR9yI68#_>JAtlO}1tgTSlLaV(7bh1D1%n3lI6D@V5A;j-5-RjnR7tPl10t;gf#QCe(r=UajKtjid? z=?6*%+!FPEe;z91AE647g;uizFh27W>h#<{J~z%OJ9u^lgGm6iZ-~ja|Y6T2bj5YGJjbq>=@pZvJ z1qaGDgS@UbwHaYdv*y&``c-bcX-_z$lxS1)ormDioS*Du%5b#kx0ZCu?1rmZ;k7OY zwm{W|VUVYK9y;F@!LuVlR3gll+vG~{edbH3>Xl(!v3vvl7*vP`=@CTNMuFZwsLEE{ zQ|3QRW^!M5H7LB)7raJ&5lL-G6TR^4$6K8yihldyZFQ`CrK~R|_B;Jget718`r(<` z+nD_S_QQLqyby{PZbFs)!|{7=21{BT2U69YY|Fzj@Os5nQBbo6`mVl4!Y$*;xQzgJ z<33tF$s32)=f$$EHnOn#Rio%-ZXtSIm_~M&F;HE(r@G*JE+`gRAPHW|mX`Mwlx`jk zZfdVc^Cx$D&z|c^=aFRm-ET%YV@LiU_%E9O z-}o;&_^83hgk~aT8v~a+GRep0qoN`GPKxgOerKz+b@9!ZcsP7!AC%11L(#S_(&ecI zZ7o*tZtWY<(h)}?*zg%4N8gbe)6sA%S`{TvCK0zQM_7MRJqgN7N3`8Zo(%GUzF7c^ z%^qQunKUduS^@8)jmh4Hx@gk*vBx%$gHOt;ad6^6!Qj$GxL|=k`aWDvs=L;)Zc!^c zcxgU6`Qy9j%IB{l_h(&Xsljs$PHPsZ$b^!UH&)}uKCeY9>-WOVfmv)v{cC!?B$9`0 zEQg<$y0A6tBe%OSldrwdP5ZnJ0_{x?`N|I!Jn`> zYugd}O+y393?t$A02eqTE5z;lRrr#3{oq7Y1=wX~gQeFgob^Kkrs4ze5KtmlAdT<( z_ov?l;g}&_%D&D#PYvihp7d-t$~6vWC2lY2(2p~C-C53iZHonutgSeBTMjnPx`1W_ z%gEC1IyyMrogeyGh<0v^p+&i!6$T99Z|^E$${1}3bC>|<>ig5)C2suM*5??zvJxWR zgo0MoOSp7Fhqn62^MLaVZkgH8w6|9v@5_2zcV{BzG`qms;umn!b}1N_J0cqv&Yz9g z3}b(Mg^@GPK%RUT9#*qti(|jTx$ny{dD>50ur`irh3WFH`;%}@Sq!>XsnbnMZewZp zBs8}gz`sA4&fgWhfN9TnvgsMc@K#>}&#%+wSKGZ|>Vp~BHGCt_KAME{oJwI>$Wb&K zFo($<%mm9LDPUgqfk;{mfgh5#bkrz&%z=S)d#4>ZmNbHqwh!x*B~BXzXR+|RAuk@& z28$ru$UnW);tzc^VCCg3#QYP)ikcp;tm;)~Trj|TFvr3Rd( zz43+TG`=e+iDX8qaamS|<5zqneU_Cng&XtGBdjmalYEM4a{bwL1%yfkhTYF)sWq|2 z)aKm~`F0l`xjTz{Paerli=1iYvR_!x+l~jV_rePa9J)$(;_;XnbmVtuh}P7`cQs;= zBrBlSW#6%Byd&Pv%OqRm%3=M*A{;n)J0|-3py2^K+UYBx0Zx6f#Jmu)y+-hkfCzq} z-wE10bP#s-_zFAEOW-lmAvk7wZ*sriZE*7Ki}uT;xki=-G%h%ghHoq}eQYs&{x$)N zkD6ib&n*}uu8;4|?y%ak%?%!|@6D6Wv|8O+{SZgL5kmE_PAoawu1)q&*#~KApEd2z{W1{fQz}0xE)e~gJzQEdq-Ec>52+sFNg2gujLF)c& zx_M{^>s}z*VYlM7e?>P+&9LG$Kb#S43 z4aSGP=ZlU?PqbVrgfov%;?`|1Fjr$6E*#MS5_iT>DXFEnsq`jIQ>cVnh;x#eXqwvqmv+1Gh<+;g z{=*1J2^mCxulM5TN>tYM5)=EK{-=FX;m>_?ti6rwfA5piyeb8bBdbZtsT)Mc&4DeM zV@bT;=CgT|2aw-w^tzrJI;h7V{&)J{x6wyT|G(S#uLxCp8{PkIwlyFGxkC052RR6(DQ$yN1OZ``=9Xu ze_{_Q{0lqg-`M{=!~BW8srWCf>A$i6xsU&e^%(mvtl7V@|0xrHVt0=F7uNjW*#8{s zKd~`_e__Y|8~dLl*yoRae)S*N|B?+SM`>xp|Ei=VY4qRK|B0giCx7%iKE3C0A%EvR exZhFjVq@vw@4x?ca_lAj`%Sjz_q+bzb^jl$)9@w$ diff --git a/checkpoints/sgail-ppo-options-setobs2-Feb18_16-25-08.pt b/checkpoints/sgail-ppo-options-setobs2-Feb18_16-25-08.pt deleted file mode 100644 index 7013a8d2ae7ca338b33256a0d01dee6688a9a26f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16279 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 a3jeL3 diff --git a/checkpoints/wgail-options-setobs2-Feb16_01-06-27.pt b/checkpoints/wgail-options-setobs2-Feb16_01-06-27.pt deleted file mode 100644 index ac6db8cae0326c0633524da85267560f1e868fb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14763 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 s{&mZjz$@aP#IyT{>&R!dX&~-iCnU|$ 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 diff --git a/config/networks.json5 b/config/networks.json5 deleted file mode 100644 index ebce18f..0000000 --- a/config/networks.json5 +++ /dev/null @@ -1,42 +0,0 @@ -{ - ego_encoder: { - input_dim: 5, // number of state vars - hidden_n: 0, - hidden_dim: 5, - output_dim: 5 - }, - deepsets: { - input_dim: 6, // number of relative state vars for others - phi: { - hidden_n: 2, - hidden_dim: 20, - }, - latent_dim: 20, - rho: { - hidden_n: 2, - hidden_dim: 10, - }, - output_dim: 10 - }, - path_encoder: { - input_dim: 40, // 2 * path length for (x,y) coordinates - hidden_n: 0, - hidden_dim: 20, - output_dim: 10, - }, - head: { - input_dim: 0, // computed in policy constructor - hidden_n: 3, - hidden_dim: 50, - output_dim: 1, // number of outputs e.g. number of actions, or just one - final_activation: 'sigmoid', - }, - optim: { - optimizer: 'adam', - lr: 1e-3, - weight_decay: 0.1, - }, - train_epochs: 200, - train_batch_size: 32, - loss: 'huber', -} \ No newline at end of file diff --git a/config/value_dice.json5 b/config/value_dice.json5 deleted file mode 100644 index 439eef0..0000000 --- a/config/value_dice.json5 +++ /dev/null @@ -1,85 +0,0 @@ -{ - policy_net: { - ego_encoder: { - input_dim: 5, // number of state vars - hidden_n: 0, - hidden_dim: 5, - output_dim: 5 - }, - deepsets: { - input_dim: 6, // number of relative state vars for others - phi: { - hidden_n: 2, - hidden_dim: 20, - }, - latent_dim: 20, - rho: { - hidden_n: 2, - hidden_dim: 10, - }, - output_dim: 10 - }, - path_encoder: { - input_dim: 40, // 2 * path length for (x,y) coordinates - hidden_n: 0, - hidden_dim: 20, - output_dim: 10, - }, - head: { - input_dim: 0, // computed in policy constructor - hidden_n: 3, - hidden_dim: 50, - output_dim: 1, // number of outputs e.g. number of actions, or just one - final_activation: 'sigmoid', - }, - }, - value_net: { - ego_encoder: { - input_dim: 5, // number of state vars - hidden_n: 0, - hidden_dim: 5, - output_dim: 5 - }, - deepsets: { - input_dim: 6, // number of relative state vars for others - phi: { - hidden_n: 2, - hidden_dim: 20, - }, - latent_dim: 20, - rho: { - hidden_n: 2, - hidden_dim: 10, - }, - output_dim: 10 - }, - path_encoder: { - input_dim: 40, // 2 * path length for (x,y) coordinates - hidden_n: 0, - hidden_dim: 20, - output_dim: 10, - }, - action_dim: 1, // number of actions - head: { - input_dim: 0, // computed in policy constructor - hidden_n: 3, - hidden_dim: 50, - output_dim: 1, // number of outputs e.g. number of actions, or just one - final_activation: 'id', - }, - }, - policy_optim: { - optimizer: 'adam', - lr: 1e-3, - weight_decay: 0.1, - }, - value_optim: { - optimizer: 'adam', - lr: 1e-3, - weight_decay: 0.1, - }, - train_epochs: 200, - train_batch_size: 32, - discount: 0.95, - clip_grad_norm: 1., -} \ No newline at end of file diff --git a/experiments/experiment.py b/experiments/experiment.py deleted file mode 100644 index bcddb06..0000000 --- a/experiments/experiment.py +++ /dev/null @@ -1,203 +0,0 @@ -import json5 -from functools import partial -import os -opj = os.path.join - -# set up ray tune -import ray -from ray import tune -from ray.tune import Analysis, ExperimentAnalysis -from ray.tune.schedulers import ASHAScheduler -from hyperopt import hp -from ray.tune.suggest.hyperopt import HyperOptSearch - -# get graphs -import intersim -from intersim.graphs import ConeVisibilityGraph - - -from src.main import basestr, main - -def parse_args(): - """ - Parse arguments to main - Returns: - kwargs: dictionary of arguments: - train (bool): whether to run train loop - test (bool): whether to run test loop - method (str): the method to try for imitation - loc (int): the location index of the roundabout - config (str): config path - seed (int): RNG seed - """ - import argparse - parser = argparse.ArgumentParser(description='Save Expert Trajectories') - parser.add_argument('--loc', default=0, type=int, - help='location (default 0)') - parser.add_argument("--train", help="train model", - action="store_true") - parser.add_argument("--ray", help="use ray tune to run multiple experiments", - action="store_true") - parser.add_argument("--test", help="test model", - action="store_true") - parser.add_argument("--method", help="modeling method", - choices=['bc', 'gail', 'advil', 'vd'], default='bc') - parser.add_argument("--config", help="config file path", - default=None, type=str) - parser.add_argument('--seed', default=0, type=int, - help='seed') - parser.add_argument('--nframes', default=500, type=int, - help='frames for test animation') - parser.add_argument('--nsamples', default=200, type=int, - help='number of ray samples') - parser.add_argument('--graph', action='store_true', - help='whether to mask the relative states based on a ConeVisibilityGraph') - parser.add_argument('-d', default='./expert_data', type=str, - help='data directory') - parser.add_argument('-o', default=None, type=str, - help='output directory') - args = parser.parse_args() - kwargs = { - 'train':args.train, - 'test':args.test, - 'method':args.method, - 'loc':args.loc, - 'config_path':args.config, - 'seed':args.seed, - 'ray':args.ray, - 'nframes':args.nframes, - 'nsamples':args.nsamples, - 'datadir':os.path.abspath(args.d), - 'graph':None, - 'outdir': opj('output',args.method,'loc%02i'%(args.loc)), - 'train_tracks':[0,1,2], - 'cv_tracks':[3], - 'test_tracks':[4], - } - if args.o: - kwargs['outdir'] = args.o - if args.graph: - kwargs['graph'] = ConeVisibilityGraph(r=20, half_angle=120) - return kwargs - -def get_full_config(ray_config:dict, method:str)->dict: - """ - Get full model configuration from ray config and method string - Args: - ray_config (dict): ray config - method (str): method to get full configuration for - """ - if method == 'bc': - from src.bc import bc_config - config = bc_config(ray_config) - elif method == 'vd': - from src.value_dice import vd_config - config = vd_config(ray_config) - else: - raise NotImplementedError - return config - -def get_ray_config(method:str)->dict: - """ - Get configuration for ray based on method. - Args: - method (str): method to get configuration for - Returns: - ray_config (dict): configuration for ray - """ - if method == 'bc': - ray_config = { - "lr": tune.loguniform(1e-5, 1e-3), - "weight_decay": tune.choice([0, 0.1]), - "loss": tune.choice(['huber', 'mse']), - "train_batch_size": tune.choice([16,32,64]), - "deepsets_phi_hidden_n": tune.randint(1,5), - "deepsets_phi_hidden_dim": tune.lograndint(8,65), - "deepsets_latent_dim": tune.lograndint(8,129), - "deepsets_rho_hidden_n": tune.randint(0,3), - "deepsets_rho_hidden_dim": tune.lograndint(8,129), - "deepsets_output_dim": tune.lograndint(4,129), - "head_hidden_n": tune.randint(1,6), - "head_hidden_dim": tune.lograndint(16,257), - "head_final_activation": tune.choice(['sigmoid', None]), - } - elif method == 'vd': - ray_config = { - "policy_lr": tune.loguniform(1e-5, 1e-3), - "value_lr": tune.loguniform(1e-5, 1e-3), - "policy_weight_decay": tune.choice([0, 0.1]), - "value_weight_decay": tune.choice([0, 0.1]), - "train_batch_size": tune.choice([16,32,64]), - "deepsets_phi_hidden_n": tune.randint(1,5), - "deepsets_phi_hidden_dim": tune.lograndint(8,65), - "deepsets_latent_dim": tune.lograndint(8,129), - "deepsets_rho_hidden_n": tune.randint(0,3), - "deepsets_rho_hidden_dim": tune.lograndint(8,129), - "deepsets_output_dim": tune.lograndint(4,129), - "head_hidden_n": tune.randint(1,6), - "head_hidden_dim": tune.lograndint(16,257), - "head_final_activation": tune.choice(['sigmoid', None]), - "clip_grad_norm": tune.choice([.5, 1., 5., 10.]), - "discount": tune.choice([.95, .99]) - } - else: - raise NotImplementedError - return ray_config - -if __name__ == '__main__': - kwargs = parse_args() - - # make prefix of output files - - if kwargs['config_path']: - # load config - with open(kwargs['config_path'], 'r') as cfg: - config = json5.load(cfg) - if not os.path.isdir(kwargs['outdir']): - os.makedirs(kwargs['outdir']) - filestr = opj(kwargs['outdir'], basestr(**kwargs)) - if kwargs['ray']: - filestr = kwargs['config_path'].replace('_config.json','') - main(config, filestr=filestr, **kwargs) - - elif kwargs['ray'] and kwargs['train']: - - ray.shutdown() - ray.init(log_to_driver=False) - - def ray_train(config, datadir=None): - full_config = get_full_config(config, kwargs['method']) - main(full_config, filestr='exp', **kwargs) - - ray_config = get_ray_config(kwargs['method']) - search = HyperOptSearch(ray_config, max_concurrent=8, metric='cv_loss',mode="min",) - custom_scheduler = ASHAScheduler(metric='cv_loss', mode="min", grace_period=15) - - analysis = tune.run( - ray_train, - #config=ray_config, - search_alg=search, - scheduler=custom_scheduler, - local_dir=kwargs['outdir'], - #resources_per_trial={"cpu": 2}, - time_budget_s=120*60, - num_samples=kwargs['nsamples'], - ) - elif kwargs['ray'] and kwargs['test']: - analysis = Analysis(kwargs['outdir'], default_metric="cv_loss", default_mode="min") - config = analysis.get_best_config() - filepath = analysis.get_best_logdir() - filestr = opj(filepath, 'exp') - config_path = filestr+'_config.json' - with open(config_path, 'r') as cfg: - config = json5.load(cfg) - print("Best ray experiment:", filepath) - main(config, filestr=filestr, **kwargs) - else: - raise Exception('No valid config found') - - - - - - diff --git a/experiments/experiments.sh b/experiments/experiments.sh deleted file mode 100755 index 9efc552..0000000 --- a/experiments/experiments.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -python experiments/experiment.py --ray --train -d ./expert_data/base -python experiments/experiment.py --ray --test -d ./expert_data/base --nframes 1000 -python experiments/experiment.py --ray --train -d ./expert_data/reg -python experiments/experiment.py --ray --test -d ./expert_data/reg --nframes 1000 -python experiments/experiment.py --ray --train -d ./expert_data/reg_graph --graph -python experiments/experiment.py --ray --test -d ./expert_data/reg_graph --graph --nframes 1000 - diff --git a/experiments/train_vd.sh b/experiments/train_vd.sh deleted file mode 100755 index 13bdc14..0000000 --- a/experiments/train_vd.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -# python experiments/experiment.py --method vd --train --ray -d expert_data/reg -o output/vd/loc00/reg --nsamples 400 -# python experiments/experiment.py --test --ray --method vd -d expert_data/normal -o output/vd/loc00/normal --nframes 1000 -python experiments/experiment.py --train --method vd --config config/value_dice.json5 \ No newline at end of file diff --git a/src/bc/__init__.py b/src/bc/__init__.py deleted file mode 100644 index 52cdb6d..0000000 --- a/src/bc/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from src.bc.bc import BehaviorCloningPolicy, train, bc_config diff --git a/src/bc/bc.py b/src/bc/bc.py deleted file mode 100644 index ee3b1d7..0000000 --- a/src/bc/bc.py +++ /dev/null @@ -1,191 +0,0 @@ -import torch -import torch.nn as nn -from torch.utils.data import DataLoader -import pickle -from torch.utils.tensorboard import SummaryWriter - -from src.policies import IntersimStateNet, IntersimPolicy, generate_transforms -from src.util.nn_training import optimizer_factory -from tqdm import tqdm -import json5 -from ray import tune - -def bc_config(ray_config): - config = { - 'ego_encoder': {'input_dim': 5, 'hidden_n': 0, 'hidden_dim':0, 'output_dim': 0}, - 'deepsets': { - 'input_dim': 6, - 'phi': { - 'hidden_n': ray_config['deepsets_phi_hidden_n'], - 'hidden_dim': ray_config['deepsets_phi_hidden_dim'] - }, - 'latent_dim': ray_config['deepsets_latent_dim'], - 'rho': { - 'hidden_n': ray_config['deepsets_rho_hidden_n'], - 'hidden_dim': ray_config['deepsets_rho_hidden_dim'] - }, - 'output_dim': ray_config['deepsets_output_dim'] - }, - 'path_encoder': {'input_dim': 40, 'hidden_n': 0, 'hidden_dim': 0, 'output_dim': 0}, - 'head': { - 'input_dim': 0, # computed in constructor - 'hidden_n': ray_config['head_hidden_n'], - 'hidden_dim': ray_config['head_hidden_dim'], - 'output_dim': 1, # number of outputs e.g. number of actions, or just one - 'final_activation': ray_config['head_final_activation'], - }, - 'optim': { - 'optimizer':'adam', - 'lr':ray_config['lr'], - 'weight_decay':ray_config['weight_decay'] - }, - 'train_epochs': 40, - 'train_batch_size': ray_config['train_batch_size'], - 'loss': ray_config['loss'], - - } - return config - -class BehaviorCloningPolicy(IntersimPolicy): - """ - Class for (continuous) behavior cloning policy - """ - - def __init__(self, config: dict, transforms: dict): - """ - Initialize BehaviorCloningPolicy - Args: - config (dict): configuration file to initialize IntersimDeepSetsNet with - transforms (dict): dictionary of transforms to apply to different fields - """ - super(BehaviorCloningPolicy, self).__init__(config, transforms) - self._policy = IntersimStateNet(config) - - @classmethod - def load_model(cls, filestr: str, config: dict = None): - """ - Load a model from a file prefix - Args: - config (dict): configuration dict to set up model - filestr (str): string prefix to load model from - Returns - model (BehaviorCloningPolicy): loaded model - """ - if not config: - with open(filestr+'_config.json', 'r') as cfg: - config = json5.load(cfg) - transforms = pickle.load(open(filestr+'_transforms.pkl', 'rb')) - model = cls(config, transforms=transforms) - model._policy.load_state_dict(torch.load(filestr+'_model.pt')) - return model - - def eval(self): - self._policy.eval() - - def parameters(self): - return self._policy.parameters() - - def save_model(self, filestr, save_config=True, save_transforms=True): - """ - Save transforms and state_dict to a location specificed by filestr - Args: - filestr (str): string prefix to save model to - save_config (bool): whether to save the config file (as a json) - save_transforms (bool): whether to save transforms (as a pickle) - """ - if save_config: - with open(filestr+'_config.json', 'w') as cfg: - json5.dump(self._config, cfg) - if save_transforms: - pickle.dump(self._transforms, open(filestr+'_transforms.pkl', 'wb')) - torch.save(self._policy.state_dict(), filestr+'_model.pt') - -def train(config, policy, train_dataset, cv_dataset, filestr, **kwargs): - - using_ray = kwargs.get('ray', False) - if using_ray: - print('using ray') - - # hyperparams - loss_type = config['loss'] - train_epochs = config['train_epochs'] - train_batch_size = config['train_batch_size'] - - cv_every = 1 - print_epoch_every = 1000 - print_cv_every = 5 - checkpoint_every = 100 - cv_batch_size = 256 # doesn't matter - - # training and testing dataloaders - training_loader = DataLoader(train_dataset, batch_size=train_batch_size, shuffle=True) - cv_loader = DataLoader(cv_dataset, batch_size=cv_batch_size, shuffle=True) - - # change policy dtype - policy.policy = policy.policy.type(train_dataset[0]['state']['ego_state'].dtype) - - # generate loss function, optimizer - cv_loss_fn = nn.MSELoss(reduction='sum') - if loss_type == 'huber': - loss_fn = nn.HuberLoss(reduction='sum') - elif loss_type == 'mse': - loss_fn = nn.MSELoss(reduction='sum') - else: - raise NotImplementedError - optimizer = optimizer_factory(config['optim'], policy.parameters()) - - # generate tensorboard writer - if not using_ray: - writer = SummaryWriter(filestr) - - for i in tqdm(range(train_epochs)): - - # save model checkpoints - if i % checkpoint_every == 0: - policy.save_model(filestr + '_epoch%04i'%(i) ) - - # train - epoch_loss = 0 - for (batch_idx, batch) in enumerate(training_loader): - - # sample mini-batch and run through policy - pred_action = policy(batch['state']) - loss = loss_fn(pred_action, batch['action']) - - # compute loss and step optimizer - optimizer.zero_grad() - loss.backward() - optimizer.step() - - epoch_loss += loss.item() / len(train_dataset) - - # if i % print_epoch_every == 0: - # print('Epoch: {}, Training Loss: {}'.format(i, epoch_loss)) - - # measure cv loss - - if i % cv_every == 0: - with torch.no_grad(): - cv_loss = 0. - for (batch_idx, batch) in enumerate(cv_loader): - pred_action = policy(batch['state']) - loss = cv_loss_fn(pred_action, batch['action']) - cv_loss += loss.item() / len(cv_dataset) - - - # Write epoch loss - if using_ray: - if i % cv_every == 0: - tune.report(training_loss=epoch_loss, cv_loss=cv_loss, training_iteration=i+1) - else: - tune.report(training_loss=epoch_loss, training_iteration=i+1) - else: - writer.add_scalar('training loss',epoch_loss, i) - if i % cv_every == 0: - writer.add_scalar('cv loss', cv_loss, i) - - # if i % print_cv_every == 0: - # print('Epoch: {}, CV Loss: {}'.format(i, cv_loss)) - - - policy.save_model(filestr) diff --git a/src/data/data_utils.py b/src/data/data_utils.py deleted file mode 100644 index 0bcf9d4..0000000 --- a/src/data/data_utils.py +++ /dev/null @@ -1,96 +0,0 @@ -import torch -from torch.utils.data import Dataset -import numpy as np -from src.data.expert_data import load_expert_data -import os -opj = os.path.join - -class InteractionDatasetMultiAgent(Dataset): - """ - Class to handle getting full multi-agent observations and actions - """ - pass - -class InteractionDatasetSingleAgent(Dataset): - """Class to load states and actions for individual agents.""" - - def __init__(self, output_dir='expert_data', loc:int = 0, tracks:list = [0], dtype=torch.float32): - """ - Args: - output_dir (string): Directory with all the images. - loc (int): location index - tracks (list[int]): track indices - """ - self.output_dir = output_dir - self.loc = loc - self.tracks = tracks - self.dtype = dtype - self.keys = ['ego_state', 'relative_state', 'path', 'action', 'next_ego_state', 'next_relative_state', 'next_path'] - self._load_dataset() - - def _load_dataset(self): - """ - Load the full datasets ahead of time - """ - self.raw_data = {key:[] for key in self.keys} - max_nv = 0 - for track in self.tracks: - try: - data = load_expert_data(path=self.output_dir, loc=self.loc, track=track) - print('Loaded location {} track {}'.format(self.loc,track)) - except: - print('Failed to load location {} track {}'.format(self.loc,track)) - continue - max_nv = max(max_nv, data['relative_state'].shape[1]) - for key in self.keys: - self.raw_data[key].append(data[key]) - - # pad second dimension of relative state - for i in range(len(self.raw_data['relative_state'])): - nv1, nv2, d = self.raw_data['relative_state'][i].shape - pad = torch.zeros(nv1, max_nv-nv2, d, dtype=self.dtype) * np.nan - self.raw_data['relative_state'][i] = torch.cat((self.raw_data['relative_state'][i], pad), dim=1) - self.raw_data['next_relative_state'][i] = torch.cat((self.raw_data['next_relative_state'][i], pad), dim=1) - - # cat lists - for key in self.keys: - self.raw_data[key] = torch.cat(self.raw_data[key]).type(self.dtype) - - # mandate equal length - lengths = [len(self.raw_data[key]) for key in self.keys] - assert min(lengths) == max(lengths), 'dataset lengths unequal' - - def __len__(self): - return len(self.raw_data['ego_state']) - - def __getitem__(self, idx): - """ - Sample from the dataset - Args: - idx: index or indices of B samples - Returns: - sample (dict): sample dictionary with the following entries: - state (dict): state dictionary with the following entries: - ego_state (torch.tensor): (B, 5) raw state - relative_state (torch.tensor): (B, max_nv, d) relative state (padded with nans) - path (torch.tensor): (B, P, 2) tensor of P future path x and y positions - action (torch.tensor): (B, 1) actions taken from each state - next_stat (dict): next state dictionary with the following entries: - ego_state (torch.tensor): (B, 5) raw next state - relative_state (torch.tensor): (B, max_nv, d) next relative state (padded with nans) - path (torch.tensor): (B, P, 2) tensor of P future next path x and y positions - """ - #sample = {key:self.raw_data[key][idx] for key in self.keys} - sample = { - 'state':{ - 'ego_state':self.raw_data['ego_state'][idx], - 'relative_state':self.raw_data['relative_state'][idx], - 'path':self.raw_data['path'][idx] - }, - 'action':self.raw_data['action'][idx], - 'next_state':{ - 'ego_state':self.raw_data['next_ego_state'][idx], - 'relative_state':self.raw_data['next_relative_state'][idx], - 'path':self.raw_data['next_path'][idx]}, - } - return sample \ No newline at end of file diff --git a/src/data/expert_data.py b/src/data/expert_data.py deleted file mode 100644 index 4b4b5ba..0000000 --- a/src/data/expert_data.py +++ /dev/null @@ -1,210 +0,0 @@ -import torch - -import pickle -import gym -import numpy as np - -import intersim -from intersim.utils import get_map_path, get_svt, SVT_to_stateactions -from intersim import collisions -from intersim.graphs import ConeVisibilityGraph -import os -opj = os.path.join - -def generate_expert_data(path: str='expert_data', loc: int = 0, track:int = 0, - mask_relstate: bool = False, regularize_actions: bool = False, - **kwargs): - """ - Function to save (joint) states and observations from simulated frame - Args: - path (str): directory to save data - loc (int): location index - track (int): track index - mask_relstate (bool): whether to mask the relative states from the cone visibility graph - regularize_actions (bool): whether to regularize the action selection - kwargs: arguments for environment instantiation - """ - - action_reg = 0.002 if regularize_actions else 0 - - if not os.path.isdir(path): - os.makedirs(path) - filestr = opj(path,intersim.LOCATIONS[loc]+'_track%03i'%(track)) - - svt, svt_path = get_svt(loc=loc, track=track) #base='InteractionSimulator' - osm = get_map_path(loc=loc) - print('SVT path: {}'.format(svt_path)) - print('Map path: {}'.format(osm)) - states, actions = SVT_to_stateactions(svt) - - # animate from environment - if mask_relstate: - cvg = ConeVisibilityGraph(r=20, half_angle=120) - env = gym.make('intersim:intersim-v0', svt=svt, map_path=osm, - min_acc=-np.inf, max_acc=np.inf, graph=cvg, mask_relstate=True, **kwargs) - else: - env = gym.make('intersim:intersim-v0', svt=svt, map_path=osm, **kwargs, - min_acc=-np.inf, max_acc=np.inf) - - env.reset() - done = False - obs, actions_taken, max_devs = [], [], [] - i = 0 - while not done and i < len(actions): - # check state deviation - env_state = env.projected_state - nni = ~torch.isnan(env_state[:,0]) - norms = torch.norm(env_state[nni,:2]-states[i,nni,:2], dim=1) - if len(norms)>0: - max_devs.append(norms.max()) - - # propagate environment - ob, r, done, info = env.step(env.target_state(svt.simstate[i+1], mu=action_reg)) - obs.append(ob) - actions_taken.append(info['action_taken']) - i += 1 - - print("Maximum environment deviation from track: %f m" %(max(max_devs))) - - # check for collisions - x = torch.stack([ob['state'] for ob in obs]) - cols = collisions.check_collisions_trajectory(x, svt.lengths, svt.widths) - assert ~torch.any(cols), 'Error: Collisions found at indices {}'.format(cols.nonzero(as_tuple=True)) - - # shift actions - actions_taken.pop(0) - obs.pop(-1) - actions = torch.stack(actions_taken) - - # save observations and actions - pickle.dump(obs,open(filestr+'_raw_observations.pkl', 'wb')) - torch.save(actions, filestr+'_raw_actions.pt') - process_expert_observations(obs, actions, filestr) - -def process_expert_observations(obs, actions, filestr, remove_outliers=True, dtype=torch.float32): - """ - Process the expert observations and save them as torch tensors - Args: - obs (list[dict]): lost of observations - actions (torch.Tensor): (T, nv, a) tensor of actions - filestr (str): base filename with which to save out observation tensors - remove_outliers (bool): whether to remove datapoints with acceleration above or below 5 m/s/s - dtype (torch.Type): type to convert data to - """ - keys = ['ego_state', 'relative_state', 'path', 'action', 'next_ego_state', 'next_relative_state', 'next_path'] - data = {key:[] for key in keys} - assert len(obs) == len(actions), 'non-matching action and observation lengths' - T = len(obs) - max_nv = 0 - for t in range(T-1): - nni = ~torch.isnan(obs[t]['state'][:,0]) & ~torch.isnan(obs[t+1]['state'][:,0]) - max_nv = max(max_nv,nni.count_nonzero()) - - # state - data['ego_state'].append(obs[t]['state'][nni]) - data['relative_state'].append(obs[t]['relative_state'].index_select(0, - nni.nonzero()[:,0]).index_select(1, nni.nonzero()[:,0])) - data['path'].append(torch.stack((obs[t]['paths'][0][nni], obs[t]['paths'][1][nni]), dim=-1)) - - # action - data['action'].append(actions[t][nni]) - - # next state - data['next_ego_state'].append(obs[t+1]['state'][nni]) - data['next_relative_state'].append(obs[t+1]['relative_state'].index_select(0, - nni.nonzero()[:,0]).index_select(1, nni.nonzero()[:,0])) - data['next_path'].append(torch.stack((obs[t+1]['paths'][0][nni], obs[t+1]['paths'][1][nni]), dim=-1)) - - - - # pad second dimension of relative state - for i in range(len(data['relative_state'])): - nv1, nv2, d = data['relative_state'][i].shape - pad = torch.zeros(nv1, max_nv-nv2, d, dtype=dtype) * np.nan - data['relative_state'][i] = torch.cat((data['relative_state'][i], pad), dim=1) - data['next_relative_state'][i] = torch.cat((data['next_relative_state'][i], pad), dim=1) - - # cat lists - for key in keys: - data[key] = torch.cat(data[key]).type(dtype) - - if remove_outliers: - non_outlier_indices = torch.nonzero(torch.abs(data['action'][:,0]) < 5) - for key in keys: - data[key] = data[key][non_outlier_indices[:,0]] - - # mandate equal length - lengths = [len(data[key]) for key in keys] - assert min(lengths) == max(lengths), 'dataset lengths unequal' - - # save out data - for key in keys: - torch.save(data[key], filestr+'_'+key+'.pt') - -def load_expert_data(path='expert_data', loc: int = 0, track:int = 0): - """ - Load expert data from processed files. - Args: - path (str): directory to save data - loc (int): location index - track (int): track index - Returns: - data (dict[torch.Tensor]): dict of data - """ - # load observations and actions - filestr = opj(path, intersim.LOCATIONS[loc]+'_track%03i'%(track)) - data = {} - keys = ['ego_state', 'relative_state', 'path', 'action', 'next_ego_state', 'next_relative_state', 'next_path'] - for key in keys: - data[key] = torch.load(filestr+'_'+key+'.pt') - return data - -def load_expert_data_raw(path='expert_data', loc: int = 0, track:int = 0): - """ - Load expert data from raw file. - Args: - path (str): directory to save data - loc (int): location index - track (int): track index - Returns: - obs (list[Observations]): list of observations - actions (list[torch.tensor]): list of corresponding actions taken in observations - """ - # load observations and actions - filestr = opj(path, intersim.LOCATIONS[loc]+'_track%03i'%(track)) - obs = pickle.load(open(filestr+'_raw_observations.pkl', 'rb')) - actions = torch.load(filestr+'_raw_actions.pt') - actions = list(torch.unbind(actions)) - return obs, actions - -if __name__ == '__main__': - import argparse - parser = argparse.ArgumentParser(description='Save Expert Trajectories') - parser.add_argument('--loc', default=0, type=int, - help='location (default 0)') - parser.add_argument('--track', default=0, type=int, - help='track number (default 0)') - parser.add_argument('--all-tracks', action='store_true', - help='whether to process all tracks at location') - parser.add_argument('--graph', action='store_true', - help='whether to mask the relative states based on a ConeVisibilityGraph') - parser.add_argument('--reg', action='store_true', - help='whether to regularize actions in the action targeter') - parser.add_argument('-o', default='./expert_data', type=str, - help='output folder') - args = parser.parse_args() - - kwargs = { - 'loc':args.loc, - 'track': args.track, - 'path':args.o, - 'mask_relstate':args.graph, - 'regularize_actions': args.reg - } - - if args.all_tracks: - for i in range(intersim.MAX_TRACKS): - kwargs['track'] = i - generate_expert_data(**kwargs) - else: - generate_expert_data(**kwargs) \ No newline at end of file diff --git a/src/discriminator/__init__.py b/src/discriminator/__init__.py deleted file mode 100644 index 4ad66b2..0000000 --- a/src/discriminator/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from src.discriminator.discriminator import * \ No newline at end of file diff --git a/src/discriminator/discriminator.py b/src/discriminator/discriminator.py deleted file mode 100644 index 1c9664c..0000000 --- a/src/discriminator/discriminator.py +++ /dev/null @@ -1,101 +0,0 @@ -import torch - -# imitation.rewards.discrim_nets.DiscrimNetGAIL is composed of self.discriminator (nn.Module), -# which gets called with inputs (state, action) when needed. - -class CnnDiscriminator(torch.nn.Module): - """ConvNet similar to stable_baselines3.common.policies.ActorCriticCnnPolicy.""" - - def __init__(self, env): - super().__init__() - - obs_channels, _, _ = env.observation_space.shape - (action_size,) = env.action_space.shape - in_channels = obs_channels + action_size - - self.cnn = torch.nn.Sequential( - torch.nn.Conv2d(in_channels, 32, kernel_size=(8, 8), stride=(4, 4)), # 5+1 -> 32 - torch.nn.ReLU(), - torch.nn.Conv2d(32, 64, kernel_size=(4, 4), stride=(2, 2)), # 32 -> 64 - torch.nn.ReLU(), - torch.nn.Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1)), # 64 -> 64 - torch.nn.ReLU(), - torch.nn.Flatten(start_dim=1, end_dim=-1), - torch.nn.LazyLinear(512), # 28224 -> 512 - torch.nn.ReLU(), - torch.nn.LazyLinear(1), # 512 -> 1 - ) - - @staticmethod - def _concatenate(state, action): - b, _, h, w = state.shape - _, a = action.shape - act = action.unsqueeze(-1).unsqueeze(-1).expand((b, a, h, w)) - sa = torch.cat((state, act), -3) - return sa - - def forward(self, state, action): - sa = self._concatenate(state, action) - assert sa.ndim == 4 - return self.cnn(sa).squeeze(1) - -class CnnDiscriminatorFlatAction(torch.nn.Module): - """ConvNet similar to stable_baselines3.common.policies.ActorCriticCnnPolicy.""" - - def __init__(self, env): - super().__init__() - - obs_channels, _, _ = env.observation_space.shape - (action_size,) = env.action_space.shape - in_channels = obs_channels - - self.cnn = torch.nn.Sequential( - torch.nn.Conv2d(in_channels, 32, kernel_size=(8, 8), stride=(4, 4)), # in_channels -> 32 - torch.nn.ReLU(), - torch.nn.Conv2d(32, 64, kernel_size=(4, 4), stride=(2, 2)), # 32 -> 64 - torch.nn.ReLU(), - torch.nn.Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1)), # 64 -> 64 - torch.nn.ReLU(), - torch.nn.Flatten(start_dim=1, end_dim=-1), - torch.nn.LazyLinear(128), # 28224 -> 128 - ) - self.decoder = torch.nn.Sequential( - torch.nn.LazyLinear(64), #128 + 2 -> 64 - torch.nn.ReLU(), - torch.nn.LazyLinear(64), #64 -> 64 - torch.nn.ReLU(), - torch.nn.LazyLinear(1) #64 -> 1 - ) - - @staticmethod - def _concatenate(state, action): - b, s= state.shape - b, a = action.shape - sa = torch.cat((state, action), -1) - return sa - - def forward(self, state, action): - s = self.cnn(state.float()) - sa = self._concatenate(s, action) - assert sa.ndim == 2 - return self.decoder(sa).squeeze(1) - -class MlpDiscriminator(torch.nn.Module): - """MLP similar to stable_baselines3.common.policies.ActorCriticPolicy.""" - - def __init__(self, env=None): - super().__init__() - self.flatten = torch.nn.Flatten(start_dim=1, end_dim=-1) - self.mlp = torch.nn.Sequential( - torch.nn.LazyLinear(64), # 42 -> 64 - torch.nn.Tanh(), - torch.nn.LazyLinear(64), # 64 -> 64 - torch.nn.Tanh(), - torch.nn.LazyLinear(1), # 64 -> 1 - ) - - def forward(self, state, action): - flat = self.flatten(state) - sa = torch.cat((action, flat), -1) - assert sa.ndim == 2 - return self.mlp(sa).squeeze(1) diff --git a/src/discriminator/test_discriminator.py b/src/discriminator/test_discriminator.py deleted file mode 100644 index 1de614c..0000000 --- a/src/discriminator/test_discriminator.py +++ /dev/null @@ -1,45 +0,0 @@ -from intersim.envs.intersimple import NRasterized -from discriminator import CnnDiscriminator -import torch - -def test_image_concatenation(): - env = NRasterized() - disc = CnnDiscriminator(env) - s = torch.tensor(env.reset()).unsqueeze(0) - a = torch.tensor([[0.5]]) - sa = disc._concatenate(s, a) - - assert s.shape == (1, 5, 200, 200) - assert a.shape == (1, 1) - assert sa.shape == (1, 6, 200, 200) - assert torch.allclose(sa[:, :5], 1.0 * s) - assert (sa[:, 5] == a.unsqueeze(-1)).all() - -def test_image_concatenation3(): - env = NRasterized() - disc = CnnDiscriminator(env) - - s1 = env.reset() - a1 = 0.15 - s2, _, _, _ = env.step(0.9) - a2 = 0.25 - s3, _, _, _ = env.step(-0.9) - a3 = 0.35 - - s = torch.stack([ - torch.tensor(s1), - torch.tensor(s2), - torch.tensor(s3) - ], axis=0) - a = torch.tensor([ - [a1], - [a2], - [a3], - ]) - sa = disc._concatenate(s, a) - - assert s.shape == (3, 5, 200, 200) - assert a.shape == (3, 1) - assert sa.shape == (3, 6, 200, 200) - assert torch.allclose(sa[:, :5], 1.0 * s) - assert (sa[:, 5] == a.unsqueeze(-1)).all() diff --git a/src/main.py b/src/main.py deleted file mode 100644 index edf255c..0000000 --- a/src/main.py +++ /dev/null @@ -1,118 +0,0 @@ -import os -import torch -import gym -import intersim -import numpy as np -from tqdm import tqdm -from torch.utils.tensorboard import SummaryWriter - -from src import InteractionDatasetSingleAgent, metrics -from intersim.utils import get_map_path, get_svt -from src.policies.policy import generate_transforms - -def basestr(**kwargs): - """ - Return base prefix for all files relating to a certain experiment - Args: - kwargs (dict): keyword arguments sent to main training loop - Returns: - basestr (str): prefix - """ - return 'base' - -def main(config, method='bc', train=False, test=False, loc=0, datadir='./expert_data', filestr='', **kwargs): - """ - Main loop for training and testing different imitation models - Args: - config (dict): configuration dictionary for model - train (bool): whether to run train loop - test (bool): whether to run test loop - method (str): the method to try for imitation - loc (int): the location index of the roundabout - datadir (str): path to expert data - kwargs (dict): remaining kwargs for training loop - """ - # get/set seed - seed = kwargs.get('seed',0) - torch.manual_seed(seed) - - # method-based training - if method=='bc': - from src import bc - policy_class = bc.BehaviorCloningPolicy - train_fn = bc.train - elif method=='vd': - from src import value_dice - policy_class = value_dice.ValueDicePolicy - train_fn = value_dice.train - else: - raise NotImplementedError("Method {} not implemented".format(method)) - - # default train / cv / test split datasets - if train: - - # make policy, train and test datasets, and send to - train_dataset = InteractionDatasetSingleAgent(output_dir=datadir, loc=loc, tracks=kwargs['train_tracks']) - # generate transform from train_dataset - transforms = generate_transforms(train_dataset) - policy = policy_class(config, transforms) - cv_dataset = InteractionDatasetSingleAgent(output_dir=datadir, loc=loc, tracks=kwargs['cv_tracks']) - train_fn(config, policy, train_dataset, cv_dataset, filestr, **kwargs) - - if test: - - # load policy - policy = policy_class.load_model(filestr, config) - policy.eval() - - # simulate policy - simulate_policy(policy, loc=loc, track=kwargs['test_tracks'][0], filestr=filestr, nframes=kwargs['nframes'], graph=kwargs['graph']) - - # run test metrics - test_dataset = InteractionDatasetSingleAgent(output_dir=datadir, loc=loc, tracks=kwargs['test_tracks']) - writer = SummaryWriter(filestr) - info = metrics(filestr, test_dataset, policy) - for k, m in info.items(): - writer.add_scalar('test/{}'.format(k), m, 0) - - -def simulate_policy(policy, loc=0, track=0, filestr='', nframes=float('inf'), graph=None): - """ - Simulate a trained policy - Args: - policy: the policy to simulate, which should return action directly - loc (int): location index to test policy - track (int): track to test policy - filestr (str): path prefix to save simulation to - """ - # animate from environment - basepath = os.path.abspath('./InteractionSimulator') - svt, svt_path = get_svt(base=basepath, loc=loc, track=track) - osm = get_map_path(base=basepath, loc=loc) - if graph: - env = gym.make('intersim:intersim-v0', svt=svt, map_path=osm, - min_acc=-np.inf, max_acc=np.inf, graph=graph, mask_relstate=True) - else: - env = gym.make('intersim:intersim-v0', svt=svt, map_path=osm, - min_acc=-np.inf, max_acc=np.inf) - # env = gym.make('intersim:intersim-v0', loc=loc, track=track, - # min_acc=-np.inf, max_acc=np.inf) - - ob, _ = env.reset() - env.render() - done = False - i = 0 - with tqdm(total=min(nframes, env._svt.Tind)) as pbar: - while not done and i < nframes: - i += 1 - - # get action - action = policy(ob) - - # propagate environment - ob, r, done, info = env.step(action) - env.render() - - pbar.update() - - env.close(filestr=filestr+'_sim') diff --git a/src/models/__init__.py b/src/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/nets/__init__py b/src/nets/__init__py deleted file mode 100644 index e69de29..0000000 diff --git a/src/nets/deepsets.py b/src/nets/deepsets.py deleted file mode 100644 index 3b58d16..0000000 --- a/src/nets/deepsets.py +++ /dev/null @@ -1,117 +0,0 @@ -import torch -from torch import nn - -from src.nets.util import parse_functional - -class DeepSetsModule(nn.Module): - def __init__(self, input_dim, phi_hidden_n, phi_hidden_dim, latent_dim, rho_hidden_n, rho_hidden_dim, output_dim): - """ - Args: - input_dim (int): input size of one instance of the set; input size of phi - phi_hidden_n (int): number of hidden layers in phi - phi_hidden_dim (int): size of hidden layers in phi - latent_dim (int): output size of phi network, where sum is taken over instances; input size of rho - rho_hidden_n (int): number of hidden layers in rho - rho_hidden_dim (int): size of hidden layers in rho - output_dim (int): output size of rho - """ - super(DeepSetsModule, self).__init__() - self.input_dim = input_dim - self.latent_dim = latent_dim - self.phi = Phi(self.input_dim, phi_hidden_n, phi_hidden_dim, self.latent_dim) - self.rho = Phi(self.latent_dim, rho_hidden_n, rho_hidden_dim, output_dim) - self.output_dim = self.rho.output_dim - self.pooling = torch.sum - - @staticmethod - def from_config(config): - """ - Args: - config (dict): dictionary with network parameters in the form - { - "input_dim": 5, - "phi": { - "hidden_n": 1, - "hidden_dim": 10, - }, - "latent_dim": 8, - "rho": { - "hidden_n": 1, - "hidden_dim": 10, - }, - "output_dim" : 1, - } - Returns: - m (nn.Module): deep sets module - """ - input_dim = config["input_dim"] - phi = config["phi"] - latent_dim = config["latent_dim"] - rho = config["rho"] - output_dim = config["output_dim"] - m = DeepSetsModule(input_dim, phi["hidden_n"], phi["hidden_dim"], latent_dim, rho["hidden_n"], rho["hidden_dim"], output_dim) - return m - - def forward(self, x): - """ - Args: - x (torch.tensor): ([B, ]max_nv, d) - Returns: - y (torch.tensor): ([B, ]output_dim) - """ - # mask for selecting only those batches and vehicles where all relative states are not nan - # shape (B, max_nv) - notnan_mask = torch.all(~torch.isnan(x), dim=-1) - # create zero tensor of shape (B, max_nv, latent_dim) to store phi evaluations in - latent = torch.zeros([*x.shape[:-1], self.latent_dim], dtype=x.dtype) - # evaluate phi for all not NaN entries - # x[batch_dynamic_mask] has shape (notnan_mask.sum(), input_dim) - latent[notnan_mask] = self.phi(x[notnan_mask]) - - # sum over relative state dimension - latent = self.pooling(latent, dim=-2) - - # apply rho network - y = self.rho(latent) - return y - - -class Phi(nn.Module): - def __init__(self, input_dim, hidden_n, hidden_dim, output_dim, final_activation=None): - """ - Fully connected feedforward network with same size for all hidden layers and ReLU activation - - Args: - input_dim (int): input dimension - hidden_n (int): number of hidden layers - hidden_dim (int): hidden layer dimension - output_dim (int): output dimension - """ - super(Phi, self).__init__() - self.input_dim = input_dim - self.output_dim = output_dim - if hidden_n > 0: - self.layers = nn.ModuleList([nn.Linear(self.input_dim, hidden_dim)]) - for _ in range(hidden_n - 1): - self.layers.append(nn.Linear(hidden_dim, hidden_dim)) - self.layers.append(nn.Linear(hidden_dim, self.output_dim)) - else: - self.layers = nn.ModuleList([nn.Identity()]) - self.output_dim = self.input_dim - self.activation = nn.functional.relu - self.final_activation = final_activation if final_activation else lambda x: x - - def forward(self, x): - for layer in self.layers[:-1]: - x = self.activation(layer(x)) - x = self.final_activation(self.layers[-1](x)) - return x - - @staticmethod - def from_config(config): - args = (config["input_dim"], config["hidden_n"], config["hidden_dim"], config["output_dim"]) - if "final_activation" in config: - kwargs = {"final_activation": parse_functional(config["final_activation"])} - else: - kwargs = {} - return Phi(*args, **kwargs) diff --git a/src/nets/util.py b/src/nets/util.py deleted file mode 100644 index 6634224..0000000 --- a/src/nets/util.py +++ /dev/null @@ -1,14 +0,0 @@ -import torch -from torch.nn import functional, Identity - -def parse_functional(functional_config): - if isinstance(functional_config, str): - if functional_config == 'relu': - return functional.relu - elif functional_config == 'sigmoid': - return torch.sigmoid - elif functional_config == 'softmax': - return functional.softmax - elif functional_config == 'id': - return Identity() - return None \ No newline at end of file diff --git a/src/policies/__init__.py b/src/policies/__init__.py deleted file mode 100644 index 0679815..0000000 --- a/src/policies/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from src.policies.policy import IntersimPolicy, IntersimStateNet, IntersimStateActionNet, generate_transforms -from src.policies.options import OptionsCnnPolicy \ No newline at end of file diff --git a/src/policies/options.py b/src/policies/options.py deleted file mode 100644 index 2b55c12..0000000 --- a/src/policies/options.py +++ /dev/null @@ -1,65 +0,0 @@ -from stable_baselines3.common.policies import ActorCriticPolicy, ActorCriticCnnPolicy -from torch.distributions import Categorical - -class OptionsCnnPolicy(ActorCriticPolicy): - """ - Class for high-level options policy (generator) - """ - def __init__(self, observation_space, *args, eps=0, **kwargs): - super().__init__(observation_space, *args, **kwargs) - self.cnn_policy = ActorCriticCnnPolicy(observation_space['obs'], *args, **kwargs) - self.eps = eps - - def _prior_distribution(self, s): - """ - Return prior distribution over high-level options (before masking) - Args: - s (torch.tensor): observation - Returns: - values (torch.tensor): values from critic - dist (torch.distributions): prior distribution over actions - """ - latent_pi, latent_vf, latent_sde = self.cnn_policy._get_latent(s) - distribution = self.cnn_policy._get_action_dist_from_latent(latent_pi, latent_sde) - values = self.cnn_policy.value_net(latent_vf) - return values, distribution.distribution - - def forward(self, obs): - """ - Will mask invalid states before making action selections - Args: - obs: dict with keys: - obs (torch.tensor): (*,o) true observations - mask (torch.tensor): (*,m) mask over valid actions - Returns: - ch (torch.tensor): (*,a) sampled actions - values (torch.tensor): (*,) predicted value at observation - log_probs (torch.tensor): (*,) log probabilities of selected actions - """ - s, m = obs['obs'], obs['mask'] - values, prior = self._prior_distribution(s) - posterior = Categorical((prior.probs + self.eps) * m) - ch = posterior.sample() - return ch, values, posterior.log_prob(ch) - - def _predict(self, obs, deterministic=False): - action, _, _ = self.forward(obs) - return action - - def evaluate_actions(self, obs, ch): - """ - Evaluate particular actions - Args: - obs: dict with keys: - obs (torch.tensor): (*,o) true observations - mask (torch.tensor): (*,m) masks over valid actions - ch (torch.tensor): (*,a) selected actions - Returns: - values (torch.tensor): (*,) predicted value at observation - log_probs (torch.tensor): (*,) log probabilities of selected actions - ent (torch.tensor): (*,) entropy of each distribution over actions - """ - s, m = obs['obs'], obs['mask'] - values, prior = self._prior_distribution(s) - posterior = Categorical((prior.probs + self.eps) * m) - return values, posterior.log_prob(ch), posterior.entropy() # additional values used by PPO.train diff --git a/src/policies/policy.py b/src/policies/policy.py deleted file mode 100644 index 274d34b..0000000 --- a/src/policies/policy.py +++ /dev/null @@ -1,164 +0,0 @@ - -import torch -from torch import nn - -from src.nets.deepsets import DeepSetsModule, Phi -from src.util.transform import MinMaxScaler - -class IntersimStateNet(nn.Module): - def __init__(self, config): - """ - Args: - config (dict): dictionary for configuring the deep sets policy - """ - super(IntersimStateNet, self).__init__() - ego_config = config['ego_encoder'] - deepsets_config = config['deepsets'] - pathnet_config = config['path_encoder'] - - self.ego_net = Phi.from_config(ego_config) - self.deepsets_net = DeepSetsModule.from_config(deepsets_config) - self.path_net = Phi.from_config(pathnet_config) - - cat_dim = self.ego_net.output_dim + self.deepsets_net.output_dim + self.path_net.output_dim - # head has number of concatenated features as input - head_config = config['head'] - head_config["input_dim"] = cat_dim - self.head = Phi.from_config(head_config) - - def forward(self, sample): - """ - Args: - sample (dict): sample dictionary with the following entries: - state (torch.tensor): (B, 5) raw state - relative_state (torch.tensor): (B, max_nv, d) relative state (padded with nans) - path (torch.tensor): (B, P, 2) tensor of P future path x and y positions - action (torch.tensor): (B, 1) actions taken from each state - Returns: - x (torch.tensor): (head_output_dim,) output of common head network - """ - ego = self.ego_net(sample["ego_state"]) - relative = self.deepsets_net(sample["relative_state"]) - path = self.path_net(sample["path"].reshape((sample["path"].shape[0], -1))) - x = torch.cat([ego, relative, path], dim=-1) - x = self.head(x) - return x - - -class IntersimStateActionNet(nn.Module): - def __init__(self, config): - """ - Args: - config (dict): dictionary for configuring the deep sets policy - """ - super(IntersimStateActionNet, self).__init__() - ego_config = config['ego_encoder'] - deepsets_config = config['deepsets'] - pathnet_config = config['path_encoder'] - - self.ego_net = Phi.from_config(ego_config) - self.deepsets_net = DeepSetsModule.from_config(deepsets_config) - self.path_net = Phi.from_config(pathnet_config) - self.action_dim = config["action_dim"] - - cat_dim = self.ego_net.output_dim + self.deepsets_net.output_dim + self.path_net.output_dim + self.action_dim - # head has number of concatenated features as input - head_config = config['head'] - head_config["input_dim"] = cat_dim - self.head = Phi.from_config(head_config) - - def forward(self, sample): - """ - Args: - sample (dict): sample dictionary with the following entries: - state (torch.tensor): (B, 5) raw state - relative_state (torch.tensor): (B, max_nv, d) relative state (padded with nans) - path_x (torch.tensor): (B, P) tensor of P future path x positions - path_y (torch.tensor): (B, P) tensor of P future path y positions - action (torch.tensor): (B, 1) actions taken from each state - Returns: - x (torch.tensor): (head_output_dim,) output of common head network - """ - ego = self.ego_net(sample["ego_state"]) - relative = self.deepsets_net(sample["relative_state"]) - action = sample["action"] - path = self.path_net(sample["path"].reshape((sample["path"].shape[0], -1))) - x = torch.cat([ego, relative, path, action], dim=-1) - x = self.head(x) - return x - - -class IntersimPolicy(): - """ - Base class for intersim policies - """ - def __init__(self, config, transforms): - super(IntersimPolicy, self).__init__() - self._config = config - self._transforms = transforms - - @property - def transforms(self): - return self._transforms - - @transforms.setter - def transforms(self, transforms): - self._transforms=transforms - - @property - def policy(self): - return self._policy - - @policy.setter - def policy(self, policy): - self._policy = policy - - def transform_observation(self, ob): - # run observation through transforms - transformed_ob = {} - for key in ['ego_state', 'relative_state', 'path', 'action']: - if key in self._transforms.keys() and key in ob.keys(): - transformed_ob[key] = self._transforms[key].transform(ob[key]) - return transformed_ob - - def __call__(self, ob): - - if 'ego_state' in ob.keys(): - # extract state from dataloader samples - pass - else: - # extract state from observation (using simulator) - ob['ego_state'] = ob['state'] - ob['path'] = torch.stack(ob['paths'],dim=-1) - - ob = self.transform_observation(ob) - - # run transformed state through model - action = self._policy(ob) - assert action.ndim == 2, 'action has incorrect shape' - - # untransform action - if 'action' in self._transforms.keys(): - action = self._transforms['action'].inverse_transform(action) - return action - - -def generate_transforms(dataset): - """ - Generate transform dictionary from dataset - Args: - dataset (Dataset): dataset of demo observations and actions - """ - transforms = { - 'action': MinMaxScaler(), - 'ego_state': MinMaxScaler(), - 'relative_state': MinMaxScaler(reduce_dim=2), - 'path': MinMaxScaler(reduce_dim=2), - } - for key in transforms.keys(): - if key == 'action': - transforms[key].fit(dataset[:][key]) - else: - transforms[key].fit(dataset[:]['state'][key]) - - return transforms diff --git a/src/util/nn_training.py b/src/util/nn_training.py deleted file mode 100644 index eea6eea..0000000 --- a/src/util/nn_training.py +++ /dev/null @@ -1,11 +0,0 @@ -import torch - -def optimizer_factory(config, parameters): - optimizer_type = config['optimizer'] - learning_rate = config['lr'] - weight_decay = config['weight_decay'] - if optimizer_type == 'adam': - optimizer = torch.optim.Adam(parameters, lr=learning_rate, weight_decay=weight_decay) - else: - raise NotImplementedError - return optimizer diff --git a/src/util/transform.py b/src/util/transform.py deleted file mode 100644 index 0b244e9..0000000 --- a/src/util/transform.py +++ /dev/null @@ -1,140 +0,0 @@ -import torch -from torch import nn -import numpy as np -from sklearn import preprocessing - -class Transform(nn.Module): - """ - Base class to normalize observations and actions for network. - """ - - def __init__(self): - super(Transform, self).__init__() - # self.fit(X) - - def fit(self, X): - """ - Fit transformer to X - Args: - X (torch.tensor): (B, N) tensor of B data points with N features - """ - raise NotImplementedError('Please implement fit()') - - def transform(self, X): - """ - Transform X. fit() has to be called first - Args: - X (torch.tensor): (B, N) tensor where N has to be the same as during fit() - """ - raise NotImplementedError('Please implement transform()') - - def inverse_transform(self, X): - """ - Inverse transformation - Args: - X (torch.tensor): (B, N) tensor - """ - raise NotImplementedError('Please implement inverse_transform()') - - def forward(self, X): - return self.transform(X) - -class MinMaxScaler(Transform): - """ - Scale tensor so each feature is in [0, 1] - """ - def __init__(self, reduce_dim:int=None): - """ - Initialize SciKitTransform - Args: - reduce_dim (int): dimension to start calculating featues from - e.g. with reduce_dim=2, (A, B, C, D, E) will be reshaped to (A*B, C*D*E) - """ - self.reduce_dim = reduce_dim - super(MinMaxScaler, self).__init__() - - def fit(self, X): - nd = X.ndim - if self.reduce_dim: - self.nfeatures = int(torch.tensor(X.shape[self.reduce_dim:]).prod()) - else: - assert nd==2, 'Invalid ndim' - self.nfeatures = X.shape[1] - - X = X.reshape((-1,self.nfeatures)) - nans = torch.isnan(X) - X[nans] = float('inf') - self.min = X.min(0,keepdims=True)[0] - - X[nans] = -float('inf') - self.span = X.max(0,keepdims=True)[0] - self.min - - X[nans] = np.nan - - def transform(self, X): - - assert hasattr(self, 'min') and hasattr(self, 'span'), 'Model not yet fit' - shape = X.shape - X = X.reshape((-1,self.nfeatures)) - t = (X - self.min) / self.span - return t.reshape(shape) - - def inverse_transform(self, X): - - assert hasattr(self, 'min') and hasattr(self, 'span'), 'Model not yet fit' - shape = X.shape - X = X.reshape((-1,self.nfeatures)) - it = X * self.span + self.min - return it.reshape(shape) - - -class SciKitTransform(Transform): - """ - Wrappers around scikit-learn transforms - """ - def __init__(self, tf, reduce_dim:int=None): - """ - Initialize SciKitTransform - Args: - tf: transform - reduce_dim (int): dimension to start calculating featues from - e.g. with reduce_dim=2, (A, B, C, D, E) will be reshaped to (A*B, C*D*E) - """ - self.tf = tf - self.reduce_dim = reduce_dim - super(SciKitTransform, self).__init__() - - def fit(self, X): - nd = X.ndim - if self.reduce_dim: - self.nfeatures = int(torch.tensor(X.shape[self.reduce_dim:]).prod()) - else: - assert nd==2, 'Invalid ndim' - self.nfeatures = X.shape[1] - - self.tf.fit(X.reshape((-1,self.nfeatures))) - - def transform(self, X): - shape = X.shape - t = torch.tensor(self.tf.transform(X.reshape((-1,self.nfeatures))), dtype=torch.float) - return t.reshape(shape) - - def inverse_transform(self, X): - shape = X.shape - it = torch.tensor(self.tf.inverse_transform(X.reshape((-1,self.nfeatures))), dtype=torch.float) - return it.reshape(shape) - -class SciKitStandardScaler(SciKitTransform): - """ - Wrapper around scikit-learn's StandardScaler for standardizing each feature individually. - """ - def __init__(self, **kwargs): - super(SciKitStandardScaler, self).__init__(preprocessing.StandardScaler(), **kwargs) - -class SciKitMinMaxScaler(SciKitTransform): - """ - Wrapper around scikit-learn's MinMaxScaler for scaling features to [0, 1] individually. - """ - def __init__(self, **kwargs): - super(SciKitMinMaxScaler, self).__init__(preprocessing.MinMaxScaler(), **kwargs) - diff --git a/src/value_dice/__init__.py b/src/value_dice/__init__.py deleted file mode 100644 index bb17233..0000000 --- a/src/value_dice/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from src.value_dice.value_dice import ValueDicePolicy, train, vd_config diff --git a/src/value_dice/value_dice.py b/src/value_dice/value_dice.py deleted file mode 100644 index d9e29d6..0000000 --- a/src/value_dice/value_dice.py +++ /dev/null @@ -1,300 +0,0 @@ -import numpy as np - -import torch -import torch.nn as nn -from torch.utils.data import DataLoader -from torch.nn.utils import clip_grad_norm_ -import pickle -import itertools -from torch.utils.tensorboard import SummaryWriter - -from src.policies import IntersimStateNet, IntersimStateActionNet, IntersimPolicy, generate_transforms -from src.util.transform import MinMaxScaler -from src.util.nn_training import optimizer_factory -from tqdm import tqdm -import json5 -from ray import tune - -def vd_config(ray_config): - config = { - 'policy_net': { - 'ego_encoder': {'input_dim': 5, 'hidden_n': 0, 'hidden_dim':0, 'output_dim': 0}, - 'deepsets': { - 'input_dim': 6, - 'phi': { - 'hidden_n': ray_config['deepsets_phi_hidden_n'], - 'hidden_dim': ray_config['deepsets_phi_hidden_dim'] - }, - 'latent_dim': ray_config['deepsets_latent_dim'], - 'rho': { - 'hidden_n': ray_config['deepsets_rho_hidden_n'], - 'hidden_dim': ray_config['deepsets_rho_hidden_dim'] - }, - 'output_dim': ray_config['deepsets_output_dim'] - }, - 'path_encoder': {'input_dim': 40, 'hidden_n': 0, 'hidden_dim': 0, 'output_dim': 0}, - 'head': { - 'input_dim': 0, # computed in constructor - 'hidden_n': ray_config['head_hidden_n'], - 'hidden_dim': ray_config['head_hidden_dim'], - 'output_dim': 1, # number of outputs e.g. number of actions, or just one - 'final_activation': ray_config['head_final_activation'], - }, - }, - 'value_net': { - 'ego_encoder': {'input_dim': 5, 'hidden_n': 0, 'hidden_dim':0, 'output_dim': 0}, - 'deepsets': { - 'input_dim': 6, - 'phi': { - 'hidden_n': ray_config['deepsets_phi_hidden_n'], - 'hidden_dim': ray_config['deepsets_phi_hidden_dim'] - }, - 'latent_dim': ray_config['deepsets_latent_dim'], - 'rho': { - 'hidden_n': ray_config['deepsets_rho_hidden_n'], - 'hidden_dim': ray_config['deepsets_rho_hidden_dim'] - }, - 'output_dim': ray_config['deepsets_output_dim'] - }, - 'path_encoder': {'input_dim': 40, 'hidden_n': 0, 'hidden_dim': 0, 'output_dim': 0}, - 'action_dim': 1, - 'head': { - 'input_dim': 0, # computed in constructor - 'hidden_n': ray_config['head_hidden_n'], - 'hidden_dim': ray_config['head_hidden_dim'], - 'output_dim': 1, # number of outputs e.g. number of actions, or just one - 'final_activation': ray_config['head_final_activation'], - }, - }, - 'policy_optim': { - 'optimizer':'adam', - 'lr':ray_config['policy_lr'], - 'weight_decay':ray_config['policy_weight_decay'] - }, - 'value_optim': { - 'optimizer':'adam', - 'lr':ray_config['value_lr'], - 'weight_decay':ray_config['value_weight_decay'] - }, - 'train_epochs': 40, - 'train_batch_size': ray_config['train_batch_size'], - 'discount': ray_config['discount'], - 'clip_grad_norm': ray_config['clip_grad_norm'], - } - return config - -class ValueDicePolicy(IntersimPolicy): - """ - Class for value dice policy - """ - - def __init__(self, config: dict, transforms: dict): - """ - Initialize ValueDicePolicy - Args: - config (dict): configuration file to initialize IntersimDeepSetsNet with - transforms (dict): dictionary of transforms to apply to different fields - """ - super(ValueDicePolicy, self).__init__(config, transforms) - self._policy = IntersimStateNet(config['policy_net']) - self._value = IntersimStateActionNet(config['value_net']) - - @property - def value(self): - return self._value - - @value.setter - def value(self, value): - self._value = value - - @classmethod - def load_model(cls, filestr: str, config: dict = None): - """ - Load a model from a file prefix - Args: - config (dict): configuration dict to set up model - filestr (str): string prefix to load model from - Returns - model (BehaviorCloningPolicy): loaded model - """ - if not config: - with open(filestr+'_config.json', 'r') as cfg: - config = json5.load(cfg) - transforms = pickle.load(open(filestr+'_transforms.pkl', 'rb')) - model = cls(config, transforms=transforms) - model._policy.load_state_dict(torch.load(filestr+'_policy.pt')) - model._value.load_state_dict(torch.load(filestr+'_value.pt')) - return model - - def parameters(self): - return itertools.chain(self._policy.parameters(), self._value.parameters()) - - def policy_parameters(self): - return self.policy.parameters() - - def value_parameters(self): - return self.value.parameters() - - def eval(self): - self.policy.eval() - self.value.eval() - - def save_model(self, filestr, save_config=True, save_transforms=True): - """ - Save transforms and state_dict to a location specificed by filestr - Args: - filestr (str): string prefix to save model to - save_config (bool): whether to save the config file (as a json) - save_transforms (bool): whether to save transforms (as a pickle) - """ - if save_config: - with open(filestr+'_config.json', 'w') as cfg: - json5.dump(self._config, cfg) - if save_transforms: - pickle.dump(self._transforms, open(filestr+'_transforms.pkl', 'wb')) - torch.save(self._policy.state_dict(), filestr+'_policy.pt') - torch.save(self._value.state_dict(), filestr+'_value.pt') - - - -def train(config, policy, train_dataset, cv_dataset, filestr, **kwargs): - - using_ray = kwargs.get('ray', False) - if using_ray: - print('using ray') - - # hyperparams - train_epochs = config['train_epochs'] - train_batch_size = config['train_batch_size'] - discount = config['discount'] - clip_grad_norm = config['clip_grad_norm'] - - cv_every = 1 - print_epoch_every = 1000 - print_cv_every = 5 - checkpoint_every = 100 - cv_batch_size = 256 # doesn't matter - - # training and testing dataloaders - training_loader = DataLoader(train_dataset, batch_size=train_batch_size, shuffle=True) - cv_loader = DataLoader(cv_dataset, batch_size=cv_batch_size, shuffle=True) - - # change policy dtype - dtype = train_dataset[0]['state']['ego_state'].dtype - policy.policy = policy.policy.type(dtype) - policy.value = policy.value.type(dtype) - - # define loss function - def f_value_dice_loss(batch): - # get s, a, s', s_0 from batch - state = batch['state'] - action = batch['action'] - next_state = batch['next_state'] - initial_state = state - - # append action to state batches - # use expert action for s - state['action'] = action - # run s' and s_0 through policy - initial_state['action'] = policy(initial_state) - next_state['action'] = policy(next_state) - - # transform state and action before inputting to value network - # (for the policy network this is done in policy.__call__() ) - state = policy.transform_observation(state) - initial_state = policy.transform_observation(initial_state) - next_state = policy.transform_observation(next_state) - - # evaluate value network - value = policy.value(state) - value_init = policy.value(initial_state) - value_next = policy.value(next_state) - - # linear loss - linear_loss = (1 - discount) * torch.mean(value_init) - - # nonlinear loss - value_diff = value - discount * value_next - nonlinear_loss = torch.logsumexp(value_diff, dim=0) - np.log(len(value_diff)) - - loss = nonlinear_loss - linear_loss - return loss - - - policy_optimizer = optimizer_factory(config['policy_optim'], policy.policy_parameters()) - value_optimizer = optimizer_factory(config['value_optim'], policy.value_parameters()) - - # generate tensorboard writer - if not using_ray: - writer = SummaryWriter(filestr) - - for i in tqdm(range(train_epochs)): - - # save model checkpoints - if i % checkpoint_every == 0: - policy.save_model(filestr + '_epoch%04i'%(i) ) - - # train - epoch_loss = 0 - for (batch_idx, batch) in enumerate(training_loader): - - loss = f_value_dice_loss(batch) - - # In original implementation policy is regularized with orthogonal regularization, - # value with L2 regularization on gradients - policy_loss = -loss - value_loss = loss - - # # compute loss and step optimizer - # policy_optimizer.zero_grad() - # value_optimizer.zero_grad() - # policy_loss.backward(retain_graph=True) - # value_loss.backward() - - # clip_grad_norm_(policy.policy.parameters(), clip_grad_norm) - # clip_grad_norm_(policy.value.parameters(), clip_grad_norm) - - # policy_optimizer.step() - # value_optimizer.step() - - if batch_idx % 2 == 0: - policy_optimizer.zero_grad() - policy_loss.backward() - clip_grad_norm_(policy.policy.parameters(), clip_grad_norm) - policy_optimizer.step() - else: - value_optimizer.zero_grad() - value_loss.backward() - clip_grad_norm_(policy.value.parameters(), clip_grad_norm) - value_optimizer.step() - - epoch_loss += loss.item() / len(train_dataset) - - if i % print_epoch_every == 0: - print('Epoch: {}, Training Loss: {}'.format(i, epoch_loss)) - - # measure cv loss - if i % cv_every == 0: - with torch.no_grad(): - cv_loss = 0. - for (batch_idx, batch) in enumerate(cv_loader): - loss = f_value_dice_loss(batch) - cv_loss += loss.item() / len(cv_dataset) - - - # Write epoch loss - if using_ray: - if i % cv_every == 0: - tune.report(training_loss=epoch_loss, cv_loss=cv_loss, training_iteration=i+1) - else: - tune.report(training_loss=epoch_loss, training_iteration=i+1) - else: - writer.add_scalar('training loss',epoch_loss, i) - if i % cv_every == 0: - writer.add_scalar('cv loss', cv_loss, i) - - if i % print_cv_every == 0: - print('Epoch: {}, CV Loss: {}'.format(i, cv_loss)) - - - policy.save_model(filestr)