From 16058501b534b2a11719953139540a578fa6e998 Mon Sep 17 00:00:00 2001 From: nighood Date: Wed, 20 Dec 2023 21:28:42 +0800 Subject: [PATCH 1/7] env(rjy): add smac env --- zoo/smac/README.md | 54 ++ zoo/smac/__init__.py | 0 zoo/smac/envs/__init__.py | 7 + zoo/smac/envs/maps/README.md | 15 + .../envs/maps/SMAC_Maps/10m_vs_11m.SC2Map | Bin 0 -> 14925 bytes zoo/smac/envs/maps/SMAC_Maps/1c3s5z.SC2Map | Bin 0 -> 16965 bytes zoo/smac/envs/maps/SMAC_Maps/25m.SC2Map | Bin 0 -> 14923 bytes .../envs/maps/SMAC_Maps/27m_vs_30m.SC2Map | Bin 0 -> 14929 bytes .../envs/maps/SMAC_Maps/2c_vs_64zg.SC2Map | Bin 0 -> 16477 bytes zoo/smac/envs/maps/SMAC_Maps/2m_vs_1z.SC2Map | Bin 0 -> 15539 bytes zoo/smac/envs/maps/SMAC_Maps/2m_vs_3m.SC2Map | Bin 0 -> 14916 bytes zoo/smac/envs/maps/SMAC_Maps/2s3z.SC2Map | Bin 0 -> 15692 bytes zoo/smac/envs/maps/SMAC_Maps/2s_vs_1sc.SC2Map | Bin 0 -> 14202 bytes zoo/smac/envs/maps/SMAC_Maps/3m.SC2Map | Bin 0 -> 14920 bytes zoo/smac/envs/maps/SMAC_Maps/3m_vs_4m.SC2Map | Bin 0 -> 14922 bytes zoo/smac/envs/maps/SMAC_Maps/3s5z.SC2Map | Bin 0 -> 15697 bytes .../envs/maps/SMAC_Maps/3s5z_vs_3s6z.SC2Map | Bin 0 -> 15704 bytes zoo/smac/envs/maps/SMAC_Maps/3s_vs_3z.SC2Map | Bin 0 -> 13995 bytes zoo/smac/envs/maps/SMAC_Maps/3s_vs_4z.SC2Map | Bin 0 -> 14000 bytes zoo/smac/envs/maps/SMAC_Maps/3s_vs_5z.SC2Map | Bin 0 -> 13998 bytes zoo/smac/envs/maps/SMAC_Maps/4m_vs_5m.SC2Map | Bin 0 -> 14919 bytes zoo/smac/envs/maps/SMAC_Maps/5m_vs_5m.SC2Map | Bin 0 -> 14913 bytes zoo/smac/envs/maps/SMAC_Maps/5m_vs_6m.SC2Map | Bin 0 -> 14930 bytes zoo/smac/envs/maps/SMAC_Maps/6h_vs_8z.SC2Map | Bin 0 -> 14342 bytes zoo/smac/envs/maps/SMAC_Maps/6m_vs_7m.SC2Map | Bin 0 -> 14922 bytes zoo/smac/envs/maps/SMAC_Maps/8m.SC2Map | Bin 0 -> 14922 bytes zoo/smac/envs/maps/SMAC_Maps/8m_vs_9m.SC2Map | Bin 0 -> 14927 bytes zoo/smac/envs/maps/SMAC_Maps/MMM.SC2Map | Bin 0 -> 17411 bytes zoo/smac/envs/maps/SMAC_Maps/MMM2.SC2Map | Bin 0 -> 17419 bytes zoo/smac/envs/maps/SMAC_Maps/__init__.py | 0 .../envs/maps/SMAC_Maps/bane_vs_bane.SC2Map | Bin 0 -> 16782 bytes zoo/smac/envs/maps/SMAC_Maps/corridor.SC2Map | Bin 0 -> 18055 bytes .../envs/maps/SMAC_Maps/infestor_viper.SC2Map | Bin 0 -> 17080 bytes .../maps/SMAC_Maps/so_many_baneling.SC2Map | Bin 0 -> 18133 bytes .../envs/maps/SMAC_Maps_two_player/3m.SC2Map | Bin 0 -> 14835 bytes .../maps/SMAC_Maps_two_player/3s5z.SC2Map | Bin 0 -> 15596 bytes .../maps/SMAC_Maps_two_player/__init__.py | 0 zoo/smac/envs/maps/__init__.py | 0 zoo/smac/envs/smac_env_ace.py | 753 +++++++++++++++++ zoo/smac/envs/smac_env_lz.py | 772 ++++++++++++++++++ zoo/smac/envs/smac_map.py | 350 ++++++++ zoo/smac/envs/test_smac_env.py | 41 + zoo/smac/utils/eval.py | 69 ++ 43 files changed, 2061 insertions(+) create mode 100644 zoo/smac/README.md create mode 100644 zoo/smac/__init__.py create mode 100644 zoo/smac/envs/__init__.py create mode 100644 zoo/smac/envs/maps/README.md create mode 100644 zoo/smac/envs/maps/SMAC_Maps/10m_vs_11m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/1c3s5z.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/25m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/27m_vs_30m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/2c_vs_64zg.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/2m_vs_1z.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/2m_vs_3m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/2s3z.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/2s_vs_1sc.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/3m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/3m_vs_4m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/3s5z.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/3s5z_vs_3s6z.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/3s_vs_3z.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/3s_vs_4z.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/3s_vs_5z.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/4m_vs_5m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/5m_vs_5m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/5m_vs_6m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/6h_vs_8z.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/6m_vs_7m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/8m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/8m_vs_9m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/MMM.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/MMM2.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/__init__.py create mode 100644 zoo/smac/envs/maps/SMAC_Maps/bane_vs_bane.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/corridor.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/infestor_viper.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps/so_many_baneling.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps_two_player/3m.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps_two_player/3s5z.SC2Map create mode 100644 zoo/smac/envs/maps/SMAC_Maps_two_player/__init__.py create mode 100644 zoo/smac/envs/maps/__init__.py create mode 100644 zoo/smac/envs/smac_env_ace.py create mode 100644 zoo/smac/envs/smac_env_lz.py create mode 100644 zoo/smac/envs/smac_map.py create mode 100644 zoo/smac/envs/test_smac_env.py create mode 100644 zoo/smac/utils/eval.py diff --git a/zoo/smac/README.md b/zoo/smac/README.md new file mode 100644 index 000000000..ddc458caa --- /dev/null +++ b/zoo/smac/README.md @@ -0,0 +1,54 @@ +## PYSC2 Env +DI-engine use modified pysc2 env (for more maps and agent vs agent training), and you need to install [DI-star](https://github.com/opendilab/DI-star#installation) first, then you can import related package like this: +```python +import ctools.pysc2 +from ctools.pysc2.maps import lib +``` + +## SMAC Benchmark + +==setting: SC2 version=4.6.2.69232, difficulty=7, 2M env step== + + +| 3s5z | pymarl | |DI-engine | | cfg | +| :----: | :------: | :--: | :------: | :------: | :----------------------------------------------------------: | +| | win rate | time | win rate | time | | +| qmix | 1 | 9.5h | **1** | **3.2h** | dizoo/smac/config/smac_3s5z_qmix_config.py | +| collaq | 1 | 28h | 0.9 | **8.5h** | dizoo/smac/config/smac_3s5z_collaq_config.py | +| coma | 0 | 2.7h | **0.9** | **2.9h** | dizoo/smac/config/smac_3s5z_coma_config.py | +| qtran | 0.1 | 11.5h | **0.9** | **4h** | dizoo/smac/config/smac_3s5z_qtran_config.py | +| ippo | 0.15 | 10.5h | **0.8** | **6.8h** | | +| mappo | 0.936 | 10.5h | **1** | **7.4h** | dizoo/smac/config/smac_3s5z_mappo_config.py | + + +| 5m vs. 6m | pymarl | |DI-engine | | cfg | +| :-------: | :------: | :--: | :------: | :------: | :----------------------------------------------------------: | +| | win rate | time | win rate | time | | +| qmix | **0.76** | 7.5h | 0.6 | **6.5h** | dizoo/smac/config/smac_5m6m_qmix_config.py | +| collaq | 0.8 | 24h | 0.7 | **9.5h** | dizoo/smac/config/smac_5m6m_collaq_config.py | +| coma | 0 | 2.5h | 0 | - | | +| qtran | 0.7 | 7h | 0.55 | **5.5h** | dizoo/smac/config/smac_5m6m_qtran_config.py | +| ippo | 0 | 9.2h | **0.75** | **6.9h** | | +| mappo | 0 | 9.4h | **0.75** | **7.2h** | dizoo/smac/config/smac_5m6m_mappo_config.py | + +| MMM | pymarl | |DI-engine | | cfg | +| :----: | :------: | :--: | :------: | :------: | :----------------------------------------------------------: | +| | win rate | time | win rate | time | | +| qmix | 1 | 9.5h | **1** | **3.5h** | dizoo/smac/config/smac_MMM_qmix_config.py | +| collaq | 1 | 38h | **1** | **6.7h** | dizoo/smac/config/smac_MMM_collaq_config.py | +| coma | 0.1 | 3h | **0.9** | **2.6h** | dizoo/smac/config/smac_MMM_coma_config.py | +| qtran | 1 | 8.5h | **1** | **5.5h** | dizoo/smac/config/smac_MMM_qtran_config.py | +| ippo | 0.33 | 7.2h | **1** | **4.7h** | | +| mappo | 1 | 7.2h | **1** | **3.7h** | dizoo/smac/config/smac_MMM_mappo_config.py | + +| MMM2 | pymarl | |DI-engine | | cfg | +| :----: | :------: | :--: | :------: | :------: | :----------------------------------------------------------: | +| | win rate | time | win rate | time | | +| qmix | 0.7 | 10h | 0.4 | **5.5h** | dizoo/smac/config/smac_MMM2_qmix_config.py | +| collaq | 0.9 | 24h | 0.6 | **13h** | dizoo/smac/config/smac_MMM2_collaq_config.py | +| coma | 0 | 3h | **0.2** | 3.5h | dizoo/smac/config/smac_MMM2_coma_config.py | +| qtran | 0 | 8.5h | 0 | - | | +| ippo | 0 | 8.3h | **0.875** | **6h** | | +| mappo | 0 | 8.3h | **1** | **9h** | dizoo/smac/config/smac_MMM2_mappo_config.py | + +comment: The time in the table is the time to run 2M env step. The IPPO and MAPPO were experimented with DI-engine and the epymarl open source library. The epymarl library commit id is ee85dd0. diff --git a/zoo/smac/__init__.py b/zoo/smac/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/zoo/smac/envs/__init__.py b/zoo/smac/envs/__init__.py new file mode 100644 index 000000000..bf48acec0 --- /dev/null +++ b/zoo/smac/envs/__init__.py @@ -0,0 +1,7 @@ +import warnings + +try: + from .smac_env_ace import SMACACEEnv +except ImportError: + warnings.warn("not found pysc2 env, please install it") + SMACEnv = None diff --git a/zoo/smac/envs/maps/README.md b/zoo/smac/envs/maps/README.md new file mode 100644 index 000000000..3cf1a28dc --- /dev/null +++ b/zoo/smac/envs/maps/README.md @@ -0,0 +1,15 @@ +# Notes on Two Player Maps + +Before starting, you need to do the following things: + +1. copy the maps in `maps/SMAC_Maps_two_player/*.SC2Map` to the directory `StarCraft II/Maps/SMAC_Maps_two_player/`. +2. copy the maps in `maps/SMAC_Maps/*.SC2Map` to the directory `StarCraft II/Maps/SMAC_Maps/`. + +A convenient bash script is: + +```bash +# In linux +cp -r SMAC_Maps_two_player/ ~/StarCraftII/Maps/ +cp -r SMAC_Maps/ ~/StarCraftII/Maps/ +``` + diff --git a/zoo/smac/envs/maps/SMAC_Maps/10m_vs_11m.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/10m_vs_11m.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..1dc2286dfd39380feafa6f8a1819248c9f2c9e3b GIT binary patch literal 14925 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/1c3s5z.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/1c3s5z.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..07dfe38062b880307a95cd7722c17fa7ea740a24 GIT binary patch literal 16965 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/25m.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/25m.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..fcfdeb09dfc47c0b6376447608b3681a2ef8964a GIT binary patch literal 14923 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/27m_vs_30m.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/27m_vs_30m.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..861c7f7069125d9d22e098056f7b430e83917acc GIT binary patch literal 14929 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/2c_vs_64zg.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/2c_vs_64zg.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..b740b6c3d5fdc71d94f6e9b992206dbbfc5f495d GIT binary patch literal 16477 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

_!HGw$4 z41!Y5#-hP%dFVD~OLOBef`PAxvqLX_msL zE$T>MeS2Q&TkPMVr`jUtL@4xhsPTyJ#^O|t7$JW)HCG@Oy*4e{uvz}FuO%(rQ#^59D8*O2{Eh0*iFNEKReF`W5? z1si5EKhBeu8=YDBQ#P-zZi0ry&W>#*2 z*N?DI@!8oY5vHl@LJ1li21iDPG4f>Wu=p;SqX~_ zltIc(9q*Y9zLvtv{#>FSk`du@dTT1A}GGx)_08F|tV{nw#R~#q?;}o)f5AWexaslG=qv z&yv~TspHpdL$kPTTupG@Lm)(ICI~R@XS5rD+AptA0EnJ`3tY=K*V z%~_l|<3%%aDwF%^=|Nae#9_dz^L;V%@RH8?nkLR!q*^jL3{SwR*#K@PJEoyNbgZsia}!Wn3!cnp`STsVr#@`#-vJmeJPr*lp|%)SplIEQCsaU1L$qBNX3oO43lZbun< zaM(_ITK+MhMO!^a=~jE^TThnO9T#y9l@~#yGO`->Ac^aNHL6&Wpf0dfnvkH)ef1&| zjVEYPzYiVG_6Lpq!PucvzVT4NG`;-H>_Urs=lH8b% zHhhVcoe2n+Cu#vr*+8bKX`5#x5|Y%B{X*6s$+!fZlTP3dSVOGhP}xMMQiV8Yd>wU- zU*B4_A>}s64cnzs(c7|V`pZ_hOHjD&^AU6BahMl3{0D13t)==lgGkJ*i81v>YSe6H zu0>2Q!eCHIg^51A@MH2$79v5mI+Sjv$G!#GQ^*YkM7J28t*BW=`z0TVE>mmKrk2?f zk#Ux5-lzp|<;#W2Ly}7O#DV_+4SB@Rim2yC1Xfx}#=VcE&|M=P!4Qv-O0V?m3$(ix zs1sKkA?O?u0|y$S8IoUq3~wR1Y}B!(IQors53=G@Ej##rTExmd1#o#JDuEN0#2UJu zoIr{Q=uy7|d>3h{`{kQWJLAHfU5oa3bSU)!-fIjPR^`JO>Iy>Px#r6yovKHe-Jfe* zjoLfX73TeP+yQTUprX}1hy!R Zqa&pt%v$)jaAe$MH|5b7EYw8R{x6J^pV9yT literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/2m_vs_1z.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/2m_vs_1z.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..f4c05c40b1e7be6ae542c9fcae1bf319d28cf7c3 GIT binary patch literal 15539 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�P^>K= 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 aZ-8MSgB*Qfb+5{0w#PqCPsy}CbN>e;?7PnZ literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/2m_vs_3m.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/2m_vs_3m.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..f0f7ab199b079c6f0dd151c23fb1db096db260f4 GIT binary patch literal 14916 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/2s3z.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/2s3z.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..59846ccf27a67450c03bea41c1fe5efbff4f0ad2 GIT binary patch literal 15692 zcmeIZWpG`+(k{5o%*+fiGcz+YZZmVt%*@OTv15)QW{8>DF|%W4rg6@B&)jcLP0jqj zbyf99T1#rFB`vjDEiHK^W!z~103gQ?0Du7?0IwVXz$*^`AoTf;;uHVV{mt{&)w2CN zB={!;fdBhh3H0CLfBc|-BK-e(F9ZM>ejvc0L7ktyBnZXjP30IBt}f-cO7>jduCK%J zCZlcshxR|AA%d?~yH_O(-TZQPIk9#l?21mIjYjz!w#Lw6tZ)16J01t&3_=42W9m03 z_G-=rP>-A&Cl^F%lOAwbrSTXdCPa77GG(SBkic8!QxJe)DO``PE9)t~L5vchk%Z8F zhc4!mZA6LA*HZP07c1%To;mm70Z->=zaH{|dsXb5S5uI0_|IPtZ3{xLVIiVYcW)Qn z@3T0>k<>R^L$I$$@B&X_8WF42liM%2H{IsD)*Y>2@XSe7I9>e_lL@k*%0ETfde*J0 zbi5#3U0LO$5

MT}MmUi6MEbKNUap2XX0{+NC5H|yav<2m z2w%5z7*?*XQAEHAxoIS3ggy*=$GQ8xIS)c^+IQo6vKs%b{Vv`z*;cbul)gzt)o3(i z*;mRYqjr8IT93*^E-oL%IE?=ki5c8yr-p!2l;x_`N+k24wED~)5`>n6+D&b)d0<(d zF1L9~_j!N^ksM4Cm1e5xxa4kk($ zaX2rZjd>C*_X)%fVVbG}HWkZN$2TjyB7|!ubQhYBoE4b?#6}^TQ(b0%WErGrdb|8i zibCc6;MulwjZo87pI>1|5K@u_>kK!{hRB;m6!g>J+viSnzu=W|4@6(k-=#&nfZ(Cb zrAV`RT%KD5Z;l6 z+Ab5$2StBc@FI5(_O1zer`;ROCr2-=qks(s5HG)jzw%Z)yA>7u$dVd3A348}u&wgE z%`5uTys|=X1GV%cRJYt5@kYT*=X-wFO!N*utlm5vY#|vD&G)!j8@hR64yq3=ykao0 zQSc~TmER0s!_h@BT7AILov|zKGyH@qy!-Wi<#M59ktlyw8)V?=2!|dBb6DznfTuGA z!lH3f2ci9$xOT`8Ur_H-<$ouC{=is4#_h@$YF~)j0p(Va*Y8w5&k-1eZk{g&kJMXZ zPqx9w+$~D{3CY!SwOM8 z#?m9mx-+Syg)0aH+!Xsh0XiMOXvJl!nh+^U>+>U!85uq$#D8F|7>5*D|HGuVfU`{v z6+qW@PP@~WQLNbl;s{M8-|Us37+y%Di;O@@mQHw3*Iby3YdSw|#XR@TEGPEpYPj3X zm%L6`5Z>uZ3&o)uGZH(;Xqx-CdpGvRH=GHP5smajU(iR`U6N$Q2T*9sSM0RLd;u18>Rj9YpBR={FRBb*J0|FkPNRRq#=McWU~m;s7{1^ah=t z+Ulk{X-nN5@xq}oko%LL^IdYiF`*i6ww!6cE9q7<>76yNXDCYU!y>0 z09(S)R>hN(*W)%Weu1-;&-)&lgnwl|oz$(m1rS(=ZVCW{pf(RN#vbX}O43T1*iuW; zO4L5hP)$f227ocq!(+e?ZwVszq%yHGi81whAVQ0h;NoEKjeSVK31!d`2W5ib0YiS$ zkT+F8t4G0<#KP!T5_4{52IfOl8SMc8JJskmn$Ty8km)n}{S%i-cBg?epA5t%C?W+h z!4F(e`h}NSgdkx1qb3AXF-pyQpg~LuRk%?|fLfO{e@_o#=?6Z&<}4 zZjA;$lU7-|Y7&Lzn<1VtQJ!3q(1E^S?T=b|ZuDT_D9ZLFLniFIl53Tbb}2Sg$N-7U z7m>ne9i*E)aj-FbZQ2Q_u@=#1{FM|v*kE9$#PY_J#9pOMtJtuo$-KrTq+Up9Ql)I7 zR;|P#76=0A!PBn?3Fs>*kS1-ZC~>oL#IO?DmV5AJT$MFb=B8q>yDh^sEJ6G8rHtgA{*;#hbNS&W$9@q$EO{=lRHPj8d`Su8(^qqCPozHK$r=VWv`>rSyXLPgUEtK^?Y}GK_{O) ztul{fo{2F?zKM%RW_kkI6~rSkG6&+gA#fs*N2WW*QS0Q?tc?}?V6uRY(#8sI)+lZ> zkHkdZ&3gv!P$t0v{I_CaS+JK3(X9^Pu?cyevbN`Qe;cj2YQM?^?~9Zm=(J?-Jt;an zrc=-x`wY^R2`QZ4HR{4o$b6XlJyG4ULC7p+k;<>SKUrXloSr-4 z_4H1WY~z(}hhCg5DLa`5+~*>1V;-UbU#CK7VK~RARH+9oqH%*-{@a~K2%Rm&m_=xO zK&HG=T2)`SfUB*u0SjF#U0IUm$j_~lyXw&lDPbY=)+FDq2U>(j@IUnseFnG9<fAC_t-kD0e%26N~oTxfB}%NHG5em>?s^QV4h$r*&a1{K}p1_z8fdcN%F<7Cf3?M!6R&_XQ)ZC7k(AY-TdTsdrQ^ zsljzqY-!8D*K1P}Eyz+-ZsP3?FT(Z3e37y>Pakfn2A%X# zaTM7IbTM7Pn{y4W!pR*niUcnSk=V!{c(-R3%{Fb+DAc zR=QfPg_EE{nnAfESr#S^b3L32B~!R7z@H&MijbI&v$T(vJR!S_z#NfelM);(W~^z= z{UCO4aZ{*iyewE1$As(!ymwNlYWP%{Mbm<|P`PLGfmwHjr<+yPvd z|A2CZYVpq%y-&9aMj*K2)za-*Cug8g%g*b?jj8VMx-oQH#4g?=FS}21UN4Hb;r)gw zTWIa<ve7@Widitl4I-vLPR%y%uct=Tf=4gB7T%q>5jJh;@w zewac!fXH=dAcvr6pmfe_5oP_!Le@`eZTlH}%HQ506L~IO8+(2ecB8vDNu&DXLaVW8 zvp(Kx!w5K4m7RJz1~lkfN3hJE1Tz!G02f9E-~RAm{j*98=aO^u{lS3$PxY+Rge5%a-8Er|Lk6Yb_tgF*)@-`#9_J+@>OD-^ARIdOQeV=J5s`O4x?n zI(T;N$vn=PNfbEtS*Lfmcek#UfwQ!^U!JUWR+pi%ePvf-bYo$0VbwP~M`2@6LPo4G zP%2q0RWd9%P2HuA`864cp`@f=d$tBO2}R?#xAUYCxLBfOqF}PDSh_{-9ZaWli`h4W6EvdNQ_Ki@ZaaoVjNv$R-+_R}IcOd(K)FG-eO3>Hm!+s_0#MPi0 zu_!jW9ZvZnYa?~xOy4_MP{K| zR|)Q?(>R!4?G;#Dy|2Wl2Mw1_*`}H8i|@42G(B18)gCVK*Qp-Kp6GbLMcuUOk9GWX zxEB^2J9KMgaA>BA-(5+kmBh%+QNN{!UAXPY8p`tJ|G=PL5voG?x*}AIAlDSQ+uL*W zr}Y?&Zv$9@I3q-DKgv;SH1?J0EBROKukc?1Ul)c-1!J=+idfWBq`w-q9pmXg#n!w_ zK=u5A#wGwQHUWM`j)@EULmlCa`04#C_CLJ^Y70wtOAPfecIEJ+@ z0s&}S2oM?s6~c)l1!LNU4`7|_3E~J~%d?`h0x78vpr8+6!>pUr23T?FKqL&}XwCK| zVW#~s!?GKzSxGZ!)}BqHu=|(yyJ;14wpBWSZG3B)`wU>!n!ug*!$g|*)6;Yqs@aI6 zI5UvK^G#+^*+SC*hC$TL8E6HXLBwG^8i8zdmfEHceg`CkxvYTADkU_Os0!g)0Hw?6 ztdaxKJwB4JxO*I7_W-*v7y7JjLYeR}6+(z^S4=qAsvdBOb-^;IOqHPA%SIG1K*C{= z3@G#f&w@ib7iq17r0MLQkaaw0yEAZ4-Zht%H5g}i5Qt^stz%MutYKk?m&ATJYRiL; zAyG=CrDH)oLSWn>_q8Vogv}8Icc+k`<-za?1Uj3`-aRN~mU-N(0Wp-r*^#G$u7GeJ zV*z0NDn_J+u>fe7Ki#Ehx%=7u+kVrFik25tKc3L`-a%o#^5)(Z@%g6+UP?6hCf2|X z0`b{gkTRg00S6xBUKls)Q|N}>C(HVoarfO2XOp(wDX0D%D+C`9#SEdx#oyDIxO*0W z{nmKe?36kZpAzR^J19D-akKxY=Dl+RuqwUoo{15{1*ES)#LU0Zb55GFReL z@X38@zagLa{)vT8ynTY=Qze%FgzG1AKQZu$vrk}r8ub1e^~^pI`-!GctbgM8AAEB0 zseK~=h~WWD34`*jmjV7zyP1Jz4%xTg+c%|HvHmd_epc~sH+>J1(;XW2m#&xjvjRY0 z!TUE0c%p)T(*F|#w1Cw8?r->4K9axrK#4!{7g00{-u}D9Rs@Z3!QTH_;GLq~|7(Fl z007AU$@iZg{wMtG=>N_7#ROOY|JgVp00^Y>E@{X5#rsLka=Fwx|KHvF*-|}1024g8 z5Ua2`5S<6NgsvBUWRVFJLA{bq424J5AI;}#Bc47VrM}DRqD_@l+RvsMZe&m-iJW^4 zM+5oy++gBa?zRo(h~NuAirec&uhlq_8&;5WgTh{mmi{aB-zu`0ZP1mGhc+Q--#~Rd ziTXAkIAVizLgzIhc(YT2bZuNxOSQj~$7)&@k}?E|Am5(S-=k$zp|g2xtWS1iwxBv# zWUcNWAVIFuuLNWjt*d1XUO9N>G^vfcfO$fs^E^{@B7|wc#&Ix^Pqw~=oPyH`3BL;>TcUdjL z-B)+}VdJRs*q)rB?X7yv+MKvLwTH@Y6$LuqsahYPRtfUuqg@UD+;#b0C;#kM%08J` zLyUZN+M1evJxZu}bZi}8#oCO=ir-v1i0iu^nF~SUyxl7-xk>m+CfkM>8OxjSRs5x- z-R;`4j_qNhw)m3X|Kx#D4)t+){48<#5|-XHr}gJqKka}8{M8pa0l9e@M{#9qoe>vH ziqfW}jVKimEQQnqWPOob`Rd7x3bihwZ)zGeofxSydbQ@&vY}-suw^Hi@=FA$Ppn}6 zDlQZG6H!qP6kRtuhCbjo^!3;W1=xcKx;24LqDq#)9A8<4m`455z}-29Ik8ptMOu}7 z&tC%q#Y4s!!PjGute`lYkUlP4_22Y`E z+`Et?mRsCBxx%0CuNs>8*mA9ZpA{I8q!hmX$P@&${@AnVqZnzc~nfHdRZ)jr3B zN#ZK?<5`7->q#aSeULqAsb}N_|H>@Lt(ZZF!gg>aeDPZnkztQqW@H9x z{PC>v98({G3=#SOqw~dQA=}XZ9jsB8wSr7HN9^b2`+aH|S~oF5C=#R#u-$`MR~e#i zND8Qc4fm684!SIvYm_=VE6;+-b7>?No#wX$2m#f3Z_Z0}?KWf6$si)&9*ei9ypRN15N-K;`eF6U0DlPlJR_RPWh`jPCH0LoU zG8a1PGGr%)cJhBH8NNyV%d!^XJJizyT7napfiv0yItzlYAc}=Uku>8;l)~C=Ut)ai$@H1(WiKPekM|u;~t+D&umZS+Ddh;EhKzFp1`NJ4s<{Fxj>!ZIPB| z5Dnmg6$-0|QsJHASX^N%&7(GblBo^%z;|ulx0@KR)RtUTzt{UTfFJF!l(Se!)Io=|R2OW^I?Ok6G56gw8_wCEQ3EG!@Ot|=; zJI<5AAp6s?Ar^o@4zC;;IE4&ao?@d9bCGV?I%0BBg23I(D)c+TgE0KU$STb93e&GW z%$$5`9hXvf7h1!RF|6#o6EW>Ml5OT9`Gxt6G_(+njil1lC92M37%{FRUeU!mUv`&k zIrALxiN z=mu$E*fNDOSSE`Z7GuI)pY;7_?0mSd<@}i0WBtZH{f#ereR7=Y0#Wuswd-tx&SL~` zxeqON{I^T#NSy+i8<_0MzL_IP%H<(wvW`KRa>9d6CF2FY-^%3#;2=}57MoHS$TmvY zl^Vpa(;zQ&WZRQwrw-QBcPdl1(0dD69tTMkq+f(apiRPlvodq?OvN$D{!z(nxOC&_ zwP$h$N_j@W5G`@(&t4i0(4t5t;YwZEGUrTC4jpGC3%YQWNvVJ)FpIE$DfJJe#5oxhn%awp%i^y>bw5~B(2Agpwk$>>~#)JDCKGi zk{a8n)L1ge((v{LE0$l}f2J>kpD5$#*&uwiW@N0nuw9Psnx#seg{xvOmz~>KG8hligi?dsk3PKUc?U79K2+A zGc*zB#QKGfMD{&J3y>Pd0rH3HyTD`uCT`RTPivFL=NEQ#soJjgIlKOv9Za01{SyCW zaPa%L(N@_;5!IKnOXHe2fswzM8gB)O?ZGjl1~InvJ37{=TP+yui9 z4s84EKbQNfud+r!pi;n&GE+xDKQ(@6u_HPnGCqVT-shf%C9yyEj$1hyb~bi{?Bt`S zi2C7^=>N~GFFn_!^e>yf(}?2zxa=4d3r0ZCAg3TjNdqy)Cbf))LH;gHk~Cs2u$u8^ssKreC8}tY4ZcN>qfwD%4dsg{FiyXJ=KY z=vk>2V5wEUBc(3Exp9DA&zy-i0;mBGpF5m-NpxQ=b%_^Rfa~?IDT1`ngws!sC$#Jw zcDRt={bt{wXo(ah3(mTv;aZCDS4mUt)V+q*ttj>ez_eUXhuxIgyZs1;U^2+%h3k08 z#Z0Dd#!dNH{pQch%OeWerNkjFAS{fignABxl)6qKBCUiHvBjc5ba_1NZ}C)EHYs zFbq^l`fbLwSjzEjk^?W(pe#YxI;Mnzw#7H@DN?=IQDCUlXKbH5bswcgKjxUKAtPr= zi#E5(p7B^^;D1i6OL;OlKL`vW6)&E(_t|~mnUO5wP7(Ec_w4;P)j7`Tn6mmxA&&a6 zo54?Jqa^#>MVt#72hk$8?O?Rouv#8Zz3SED4C6HnwA&Ta6#cpZ!+YO&_M(DIZW%3( z6aVt$oAj#;81fzAuz!1d4PM!1(?h~XnLtq$xpvo~2;&N~DuPy8d`(D08D1c@I@CMj z7j9*g5gl}0M~mK=hL(@H$G2;jHhH#U{4kV-6|KWRtVHgaN)nZS%C!cIb46O{XVOsx z4;8wgaf~pD#~ekUOafb)F)qIs&vW$IRKthc#`B7>4(;81x80Wjj8guFL+~29#3vP1 zy(=0pM;MeyGC41q7WtMbpPf04N1F`U+)rGRmZ8Dx>MdYweLriBoz0T*3lO>*eR;a` z+CMpB4qPL)sC7zn~c=;_Dkgl`ExWSgzJ5k`>du*50f) zOhPj1K3#J?-3j?+wuuL7lg**@L6O$&wKDD_i$QbT=PnpoZjQ@BuH226|F+qE-*XwS zEubqV#1@{yKt`@0!u-qJ&ES{$72ep zI?=Qq1(WKd{J8}@)bRZ9IGl9tSLyj3y$ zCJ@v^^X?!;H)zQKJvjt<%Or8bI5WnRf6n*{G&KS*6H#>sSyd6ftv||s0F)JVIDb?~WmUGxmx`5!4;WCI z8(+P*Jr_brfu|g(Dykc;*Yr!M5I)D7k_LpI0!(3;2^e+q(ssgYB3G=Gm- z|EDr&2vVY7HCFU_KD%%M&G@_>wL|>}D=p?0TxW(yza9B=BODG10O&#g8=nQO>yFvu zaiXtd{Sk!Lp<>@eQd8)$z$2!QBA+PA7Ks}iBsTeyuwU^0GV8^3?ZI~dPw~4!gD^9_ zBfR5bP1Kpq>t)l7{n22&cJ%k{S7?8beqrV}mh6z$&E z)hlCsLa1%lXQpiWMSsTpP5P*@-tugRfg{ItFD?&GZUUZO3KDPxMHL<02;zisf#nrL z#csNwmS!$PZDN~(ptv$!ORFyped5tGBbXV9RZ(NcZI%Ph78TN#`g!RCuM>yYm3*{S z&Q7d6zn{IT>R;ZAPhw5X_0+50>m?1CdoGNX$25>|K|+`>Rlc$`7-&&KoSTx9Osg%G zKi4Nh&ne(^v#*}u*ymlQY5yj4wNcMreDd|=AewSe2=`~`!aDJ6dlLeG=0&ye!iuZY zk$7d#i)V}$XEuCj@G-z~tgS=qBgfMMDL_vu5wXLqa;hLAPB&~K6^oh2&%@Fb$9I0Z z^wiVGqE7~QM1n?nLnNNogASmm6_HIN&s>i{BzL<@J^ z=FUvAfN;!KfdqMZ>Exy#GKo4g(B&v;fMlQUhcEfX;7|N>B^?tGx%^8`J)!=N5#m#M zBu^63I?9#gHgK!o7EE*@kTm>=*y3^(0(i+>8k00A;_MtEdl7U)2_a0LOQ}hb)awtJ?p}taWvPO--(%SIZ zen|2Pc^TgZHp`&=YWs{3?)q+1-yFS)Y)n%qWNTN8qYFGP9_=^fk0}j(+F;8+=U(u! z1g#rXcFZcX!h_G{cBe*ER@tXgs?DcBM60>$?)SU+>*LDrQJT%ziUw~63X}tEB;+;a z`#T-qgV6Yu22wUaDsvj)q(J$#vO3=EQFXYHsY_xGbM=LWFpMgYLa5)aQ$R{4=i@sx zw!z$F>FMzb$kHBzWXQ0aMj&Bb!YLH7KqS0O3#7WFEuGIJ$pwT+gaRj*AqEK%>8|P> zb=G)MESZJyS#9mE*=6UnhG?(Ip39RS!MV*#C!v4HBSED-BGZsT$Wh_j(xqgT%leEZ z)`^wme*s#2vk>6FkGu>cUbXPX+a{|06%W_I7#V+0d1YeBm-tIkBCKN$M^dOhoGST| zS=S)#*JjD>mCP&kk2uX8$s_k4sDcLjuESI7Yu^W7dg933JGFh6?|8v9ccT{|%-z#M zu(9orF$71{V8${}2PQC)cY|5Zj7EvgC--wsC5J!Hrct&@0_Qe~gRn&pcsoFL`VPbr z5LX3bOZxKun1U&oE*~yAOzR@h%?kM5XKz`Ic!b72fD>tq{t6vlIhOf_P-UUB-s>RS z=U}PoV!!a+3ZIJF>{kULm&xni)-54+Sb&XA(HjBvkkq8pI;t(3orVk%*6y(l^T$K~ z3phNM(Q;*upWUB7Etj>`Y5q_o3vlN=NG@BX__sgZ4-zAC>}rSODK99iewYUtgGxQ$ zmz5^rXCwxO45MVdbHs||$eQrxY=!a^tA)#Yl?RyWT$zITzj(o?`Z64mz4|h#^qq*YuuIvd-wQ`}96dmGfn@ZtKY(88~cHf_-sw(zvFic2A*1d$ z`AYR-NMr=9K(fnh7oo;ARjFoU=c-+-=9HT-2roL4i{>b#h3j%o(^REl@y#J|pUWwu4Ni)xf+AlW(5;I2 zkWaCI?g$TaSsvm7XZY2X6gf_8XH85KIcy?y7h`t#_W>Y`SwVF>CqYas3A=^pd33MP ziI^f_5{485oM~Gj66}lB@QYS!qF}3&*1X2!$%bU-=_=naG^*0l4{^lcdmo;+9Z4ta zSd@xg!sgHnkr>p&NEZkr^wkDJ_vKcz5Z)5~DgTFu8QT`hr52T{)B6q6Oa^=%V@>RK zmZv;1B=y)*NhNW}M^scyXKAbQkfXg)wu=jIfziq*tX0Q>h7d3>gu zDfG(p3nAwgC6Mx0Y$-1ni%8FU$RLSGBgtDu*FA!)ni>ZkDJWxW^fX}{&{j@9u3&D$BBtBvwPGBJ`Wl2Tqz|0zWIrZA+GPDodkj~aJ!iA{MS03A$ z^F`-PK;jR2J|_hBtdg;DMU|kB84UOq7cU$v&5k65C|GAN;<7mtQ+0KK+he;a*e0I_ zM==h^eUH@0q;EH`I76n{+j=N#eqiVjb{WMg2&NaF!_t5=V33pespa+5_;TwvsPewb zkdY$NRkaz1GVP-RWF+Ah;XPxCZkIM-X+ou)o;C~*foGo{EF#vC_pnFV-exUsR+3N8 zm*2scY0hjl%`IBgMHuyLT+r9ISkzGRYzM1>o#nD7zas&Q9^hZMIZAeo0{Dt*S~1##u?D^LSR<8zL;ym)-@sDZv()1*~+ zphtx;7a!1X`l%~Je4?`p_GIpj(;q{E#QNOq^VSn5J3buR88#`#)kb+hV6R7eFWe-! zW{~334393C;Q0)cCR>G*Kqjz8D|{-SweZRC`SR8dhJ{IBxY>suwO3E|l8L_^`~FI(r^bd~X~ z=zgCp0p44M1~~MIkya$;dXs5Arx>$%cn=vCIRsnOIM2Oy?B4gX2`rEx$ z87t#l5c$tgoL(FT690Y6(vy$ol27Zlf1N9Gi+2UD;(Tf_G}~D?^lnvW{o=%e!~4iE@I z`XlW_#6loq0L2}3KM44 z?2+r=2U;BpVT^4igI_HQNGXAZWqLU#Y!(|5E<=3rf0>nPZBcVvgEYQ$MnL=ubR~4&F1en^Z(_zhY9=|W%=f&$UI8$ z%IplJ#MN;Bp0c}rqHT&V%!X>h;wn1>Jg{?NLYoW%g;%gmgPG}?qkvqN=1a` zfUyV^Jp5+Snb+6*a1~`oUHzWBPy-*l?TYq(gFxEb4C#sNr*H7Cmp|eHqD@*tyc=PS z6iOi?S&|}~)39AnKyMJ!ZW|^Xd04+K2Si)My|{6H|J99!0+I`FLL3(dOT0p|`n{Pv zW#d90sk_5g8-l&+#dwWA&<$aF@s$Zbr1YH&TOzlwwW-?M!Ci&pzRNPAYQ@ZE$)Dm> zIVC`z@KQ_9xrRE!WS`8TacSy;Ns&+1N&TB8qr=4^zac{52&)J@ zr|>gH1q?c1cyRD# zF%yD#t!nRj`;mA+_tnysIG|~aF}<9i*D2>4XOrV7!o8L2)SuqWBLq-J46l6lz~8r> z1R`TaRb-gj)J-?n23~eG?BO0o^+F%DkPs4->o~8ASTyE>hc9Jriw&FQYv9oOCfo}upX6}J%PwC16i_SKQ&I2zcM&WE_WSMgI>^UVU2zMrS zu4>31v<2M#-P0)G*D0?wC1Mmq62GG95vWfr!p$bvU5&`%r0^WfPQh z8Zpdo++ZiT<7Xa#A3XGBy?8Cd@70YOV9s<==Kh%XZ+>#IEa6!CI?yM2H9TfcrTIuN zvT}yOi6=GvoGC+wkWD#FE8%imdc0`Y95L<&8*G=qEEC)Ls^F)>wj7KKJ!wI8atBUa zf?$wBspZfPeQFeZo_*lr33q47Yf2wtgrg56SXO-AO1zOGkm;}kD&U19*e@WhiMJsd zWej@!(uEkN^x)U|#|~UJO{6ecPT~TY^T|ATYf<&Xm_a-{c6y~!W2qppy>2pxI)-y$ z2@w57cseEVG|T#zJ6Th(1RDZ2(s^g+tsvlio;c|K06tjP9^m$w&VBXDm|T}t)MGU_cI3}I>Tb%vEAC@Y@$G(BZh3@J6_U^$Mn=}C;A zpCHF4{9t8B3_3>6Ujn7Fb$%oY&SR*c|6KmnqJn4D2sH>Bnu-Q8G zs|+gIk^r2Hu%y?GLy}?J%pS|=(23HdjdLX6nI2lc3~e5MQEz-PQjMG z&hb18r8?-Tl1#x^y!(&nJUGmPE2er{&r1xkcbo^0VP~!$oT&e%ZEL|53I8sKiGXN7 z1+$Zg7!AT0RA$8ZE@p|Jo3)Crg%rQ@JoIST0{bJr8OKoqJNS=?ZF;)Ju~wdi~ej zqH2(}Eo*pe!ebN_AP0IbY%Tc$_r5+KMK*eZRtUrY!;k|hE31;robAwq+VA-E^LYtBkF4G^c|hfxj3}#5X=v@{fp+h z1{8#nK&7wLw1^P^PWoRWOa3A?mcfw`j%fAC+EK02^#QYS6PJE+w?7tNjP-&vC*j1r z8RN!_N8S$IAW%q;Z+G-mYGf`+iv}(cDud2XLW4(WxD?P$eY&wucslkZYY*-*pa;0X z8_-vOwS#-e^oY4+@9rmTj185LMU9Z+Y*&SZJp{Ueo7nVN4s8{U#^bxkptlfF{t_!F zI_B8*x$PF|`7x9@x3Jagrw6{v7sM;)!w$hzx1dp((a19@0@e`8dG;J)@&sO^F!EN> zP-xtLgx|B*S-tCm32wYlVx5%IZrp6!9_%y{0`W?h6T4ty tdJRJ!1!JA9w=Gcz+&%*<@ZUf=uf+kN|LtM>oa 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/3m.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/3m.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..b35ec1008349e64afb63e23caeaa8c73f6028a03 GIT binary patch literal 14920 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/3s5z.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/3s5z.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..e5a4313a216031f463383957fce249dba8a94fe4 GIT binary patch literal 15697 zcmeIZWpG_R)-HI=%*+fiGcz+Y9y7-jGcz+YL(FW)?3kG$cFc~MnLSST+jGC^nwt54 z>#FLJw6~Hg;V>zdg9 z9g_YN0>J|@bLblZrL*w21f!v33gSdz(%9&4O?S)DaNPc_L;>@GglZ<6#ftX zBbiWH4XAtejiWQ7v`H^GtkOg@5fh@DN2xMXAxOY2^C<{GumrAG*M;>I-ym8E&`3h) zwnG>FS>#Mx*M5xy-Iu8D1Ng`tWiPFYbq{NpIF!DQ-Li)0gJT(yz&&3mt76q;*dr>N zN*0;C$2O`&=VPgQ#fz1AaL=6c@PMcDqhAks->ouc-m^K-C+x?-L;Ir8YiO{j)ZN=f z&-)w>aRl|v)-der5xl^Ym`3Z4vGRao6M3lZ+Mb&65 zc*RG`CcSoHG)j-kL@qWD#WZLYO;*S22)(!OQNLgz#df+YcGy`%wS$S$ zO&rF{XJeiS%Y6c|Lzt?nfKA16)%o2DuMpvy3Ei3IBYRb55V29n=2Vy24_O8&iry}- zi=sgJPtaWZxkiZTn)g8H5rmXv{yM`Avmx?kAqD*m`1ZLY-2l8Y?!M>?`n$AfHxN98 zxddr0mkS*!VyjPsrG{b};OG`Df+=;i<(!Rt>?|0MYHjxiHj^|sfhRKZI3L-4YZ?gl zhwYt&r#uOo#bmQX-STP%E-r~SgiR=kLv{k>~K-Wj(B^Qo~5>quZjKE%tfpl`g@POgRdO_@@I=cDHr61J5d zx4DIfEvu{aHc-n=A-ZMeh&KwJI#qeyvr#+vuzCw{umxm9G*z*4HgpTZ98@1#ctv1f zW8jgxD!&-Mg`taJw0VQ0J7JgKr~3+(d-d!4$mKxEB2oURHb}?Q5f0fG=CIUt2Tx-N zfJNh^4n#YgytYplUsUf_<$ouC{=is8#_i4$>R6220p(Va*Y8q3&lVVhZdoV-kI?(g zo@9fMxm%d<1Drvi#dr@2wg@g7#&dc@p64a*1x3;a-Q43XP{)P!E8@}FupV*fR6fPZ zZ=~`4-Q3#jpYzU1S7OvNXc|x|V_*T+@XaE9Uv{X4x@ES0g=U zKIC=6g7A)4S}68Cm=W07Ml;;M+3Jrdnp1A9%}#?;t`4j=!J)tUG1yfSIyHs{D_#yHnFg6??$hffwk^ z^i~hmNqfrfs3#7Mf!twUc9rCMV|+E-Tp80scjB#P;yY{nEmuYLP~ja>>5(hu#@w&k zgb)j*;Twl8HFJ+Plq(ZHy_;2$e%1~z0o<>+sR(qx!CB)S&?b8OVwlh%I6?BF0#0IR z;z$pi41$CNPS~OK!WaZYLkvyQrweLQMMWEa$^g03;X9EAc0#1uj(!pi_htQoc8Lr& zWw*=-02VN?R}F^5aeXpI6xNc`zs`ly-JVpqsxfzPuzX%x?{-$IkYP?nS8Gkid4>kyxA+fSCEwNW&(| zpj9hzfCYj;y8krrAOU>^1=6f7wXz9*ODnt+ZD5)WrLJrA!k)n1jl_1;7kW&ghj4_9 z`=9ZUn~?jj@tB4zc43(>5;6w-!i74PIT;E}`$@V+-R zHU)yrox&pnc4<>SV$8wk0GZT2ZMmwbZmcDBT>W=_sl_Fwr) znHiW!iOs&6*qd5?wcsap`DRYfMJgzO0Lv#VEoSu1=x>bipXis^1)s7~#@=kq-z8xq zWWY}i&ia`Vg@lj+y?1Da1Nl4&8#cGwODs%k3>#JsMN6j{1n+(Upq3XOf5@KGc_^YsLry$s-z+{ zDLbV&Iw9MtPD8&WPp2?7q1Mp4`=m0(o?%a{{$aPR-g_!51bI=pb#Z;A)NH zI{QdWRAt^fc!x3t4&c8P6U&6XWQc0B2ak!*^^mnapa0uv&9$#k&lrSEA|FQsHI3run>)%QQIGcff^$fL$jB^P$VDO7e}RS(&5z62!R+ zJi*IRH=@h%$4auZ{xPj!$M$&!>CS)@&g&j?<|kx6$f-(DcW4kYOJ1V#t?o|}*dnLr z4u3tpQzYAXW!s?_XG_dV;sN)*$lX|gXu#Jg7g`+2HY!o-MGJ4-pqBrBrx8qN3o&jH z66c>GZ)1y02t%YmzE$5|UHUat)@J5UGCypxPxyCyfu zP3+6+Ds3N~i|K6jZ%{+m7QE9w0uKE4`$9JwX-*bAngOGni`D!5(Y9jFJV!P&8R3*W zD(94-x@or572xZ&DTx+j2`V@7_J(o*Tc4U`yrXCssdoMu%~wyt^`$(K(%&B5+)@oX zX=CJS8)kzs^#-e23<^)s~ou3Q}R|kH$^)*@g60~-xFj-F+*Y` zlT91uX?0S6k5JV-$q1oBOU2mCZ>$nr?eX5epkQ`;b9{81Su}}?20iuGbtgpZo(a!g zg~R3s8>cpgM*Vimmp^)7k9P5UEc(+%;K$fTaOlx={xxmhdQf;3Q#_5IDa(>CnGUn{ z6+APUj9qSp`^jPs1@mFz&A*eJ(2K<9xE^bcjL5Sx(65w8a+FJE=z|u=dBj7NfPL5A zQUY7)YONMdf(mIC<&I=Um^jqsU^;|M;VvJ4mi#DOVkXw|Yn0>(*#VN@PjV}=z2_L^X6JGaPwwRB32i+>zt3K7 zFrywaPQKi|3?Llw?z6D*p*i%ib2R@Ukl!Y9i}_Ok5iDa9{mvNxISe!C!?T_DcLJs| zBL)f~i(90D%G3g@8FYa5aS;)2Tkae~Q+Pn}KNu}{08%{jT?=h%whVa#-*+N&%a12_ zE_JacQ%HLdxlRq_U=$6Mt_3Zk%)?A%{lvERA2Fx=9i1`}=hC$?=Qp7@x_eVJs!bPK zjfI=_aaJ2f!0F1Yl+$sb!OwLB%d9CdGf@n1VPx>_4|mqXHDWmD?4zm&1OCIZ_Y+Tf zkT+1PVN0Hm@+-Vo8^3dO zkbM)7(#PRvn&jyhqPqkwQ&7PaDX-&YK3fat1`ji4(u)9KfdQ$`YTZ%`osOjzKbT=G zRz$G;Og8}njr~C&h?A9+0L&7z)TC%%#>TU7akfRwhlaEu>LX3Wr|$3D;-iAVq<4xe z(PIjg*&-!S@Ih=yDIg$L3qWe~C1?k=^y=~I(X}#gk~a6vm9@_7HZ=ZP(VY<0SWr|@`Q6Sz*w}-R z5i1mwN)}6%3=2+Ece!)nw+zH^V&cG_twBwE;l%Cj0%^Pm_w) zr#3m6hW1%Z=!2V7XS~D)WgL&Il)^F`cI%=<8fQi?pwaP|DaHE4>dlIRBJ*s1TpRpR z6_LICdN1#`!(pb+M;_XeihtU_6KXWB=utYV)kKDQG`HsrX6=*OM^;1%`gnhQT}?f4 zF{nl?jEU-iQ+~+YNLf77_ev6!uv1SH9CO9=(>|D1zxmPLN z&L8&o!h+)mu8j=#EmU#4t7){77&+PMxAd@!x1E{8nLhj<7}Tpml?dNfg=!Jxnge$G zdXEm37rJpHGb zns*7P-a}|?0?;B8;5X#x*uX>Ta3{o1?_aV1=`AYP@xW^QKtH0^B7mqY0=l4A#RmTC zrGjMN5j7V9MA@s@jIsj{?En2-wB>@{85_8)e8~fA@YGlJKcBzHic}QEA5$0iqu=B8 z&aZFQJ{PooaMw{>2skRvXAhja26-uRZrMYkhiX7q*ERi|g;k_g(P1vdK+{RM0{;Nx zQCz=VL6}~@+(MufBtVcWYqWsTG}9;IlRHeSo4oc?wk51|>OOn=LBJ5XZmWCy5oNtG zUA*(f(4K1KDJaC4b2)SeAu?_Iu>cBd@N2H}gWKL4KTcla9Zu3iUi=l#I2<4p2A(*Y zwJsb1Xj=df8Uhu;m-nlA4Ro$e+MjJ=YlZs^VAU4So!Vp~&HL$T+7H)k z#8R9YNa6V;v8ZgJX#hhZ>gEl!0?Z&{F&>RTHo8h|Q--Pl@uAMEU~@|G4aKTLxE4U^ zGCHfI0Ce|{q$}=T2iQHpF3g2KtE*53d~~@GqU#kC4z{X0TtZ!t3@TFvDEEpH1q_gI z1SA~_-QOesfX-Q3Yd>)&t2cNZ58Cbw+=KVG^XhLHCpQp?72>U9Qa`K_Vf&YaemH8& z{mx-gN~GmuK|MlX>;d<+2MC1C5d?Rakf7!M$O!~GoAcg1C}pO3?5hDWl>OO}hk~wv za4us$VB#uTq=qpcXqPwBt!TOX+5OwTGfRq=7gSA8XnXIVu%5Z|?~3^R(*!TY8hn$# z!S)02*_@Hmp_~Bw?&O{rH|x{rhCL@M`WdnJJrHM8wmr$GejKX=9}q|EJ}>a|5s{x$c>b7QzLjtwKaEywP)3Cx~uWRFg7S z;8XC)eOkZ4pQ!r8;wRodLGfu4%YVY<6FHw4{KVNOFg^*rzoeeoCt^O){E78X9RGt) zEk3Pp1OPESfGK`RzU|WA4{A3fz|21DwyI-OiWTc0!tk?-f4iA`knEn2(7)ySm_I83 z{LFvQ!x?lYb|H?=5HyOM*iD>OKd~X2ovo4p91d`?fzc{ z3Vjlu|0myndibC4v!nkv>lYJXKKy6nga9CrPP?R?>lg1QH7jLO>->LD?`O;P2>wj) z;6kjz=0J2F++w;u_|YXMPz3b~HZc?)SwA%ItBpANJe2xwtBZD3QfXhCYPiuMkwkLt z-#8k`zvhP$&T_VGC`Scf08-qZFM4gp3EZ%PoEsEhwP@+TLI15Hli3Dc8F_dUg7ytm z$AjqS#sf!8pianwCIoL*a-gn_b4rPJ6?u%NWdSKepa}BqDg8ZKdL=rW`^NfIXGSZk zy+!8QpM4}Km_13?13^|^`}_L`SNnCBshHnSxa2*5y5ASt8y+X7(fUxJVclWq|FG9V zaV__9_l7_+02tUEU>r&UX#Mp|BU(%d!!#~)G>I6_dWp^ny>FxP&>m0yE-}LghZ%QS zEy3N^cKcytsdCw#oS?s2^_jIha&>7Bm)$A~biGrxJwUAyVO!niDr7RY0&5QudMcMRMe;r_#&Sx`n>0Y0z|Gq{!&inpew)l%Bwro@B@`6QDk^ zg88X9Pv%WVM%q(!-{=^6gWu5CWAEo<4AD{RGr(6N5{@ZYumFCkpAHDSN9&eJZ5-nxRO zQ8wo>0@|APEPhgqHC|k3TzR<9h9nhP zMaR)AKa<~QLmw^tDpX^_xc4}; z0}C48ZTxO;RHsZ@tm+Lne^feza{g2P>S6KDC59d+W8|CfhK&`ET@6YuI4}M;Nwwr8 z%dc3GiHWgP*=_U0d}jml%4HctSq%!Jr1QJR)M#;=!##?cm-7T^zaG~$mA?aNCaTmv z$An4ZD&^x@g@o%#CI)?oJ#o2r^aTIPEbJQsU0~8+Bf3JamL1BIw~{Qg2`ifGzOjKmjnm_)p=j`OH|{JVj5JLtQQKid&VuQDOO#}4?lT@|pX(Bvn7_1P93kR4ud)m?L$>n2XZU#M`5 z-({+={_ts$CN9YDN|_M{{hT*XuaCJ0&?z#`Cz|z2-~HcsBm)v@ZnqN^wuX{y3saY9 zd4|vc?pPtPdMM>y$qq&3w$eOmGbb6^a1VUf=0A56;*{D`Y}rIS`XG(|MAC4G`{>eO z%8|b4_MGP41tyN++=8n{JKf8dp@es$rbAA&%Hl!$CvSVz=f}Zv;pu(+xbCJA)JVqK?h{i@zY3gECCo+s^mr>8CBAqY0 zE47@t4){e%%n$SM3kkZY&27Fcb-w1u-7%uLj*BIPXk;pG`Nf0Dg88S0hROKlJW9@6 zqP@Y#W5C}x(r1VAMZQ}6Rm)?gDj(#YqLLqh$xzmCeX8H5MTtyBiHOwkhHLSlJ`(Tk z!CTr}a+jySrBaSNu?4RchuX zVdvrntF2u-fHs+@fD;|6&(@M&`YmzXFR*|#X7*UW@rVA#2faQiR&|jmYrooME?(y` zoVU!I7CY|yrF4W&zRV3wR>jZRBS^}XVQ8|>A(%44{Y@p~MZRCkWdz_L)36qsQW(fK zO4t<|#IG|TFLY$vQ)Z|3)-!i1)3(rii<$2GiRGkUghruFLVvL`bMj2bGRYpQWHem5 za`b&=aso{gKLnE2V@S|xj9m6Pg~XR| zwFXL!Z&YY38)RyD`G6J4Fa3F@FNL2h<>=iYe6?m|thumViRzxCN|}SJWG|DQ-;GS< zPa=Njq)8=NR3(tjTBiAhrt)=;MU~v{OiY848z^IAQP^^#dBhdtp!!m0(NI;$4%HI0 zYfAM>H{p?sNTR)}Vt$Dx$}Y7;dp<6xXDwWz`H4G)~Ih z@b>Eo?cikhhNQef)*!t)lSP|m6=C$nIFn(fni`5|EK$6#GCjL^-EB0#1>V(iUPHOs z%N9Z65TMSy)+@u+hJR@(LCjUuy{_0GjQ^J4Mb=a$+01<*9SJm&O@+RvHhvVeKA54?wU!}~2Z)3wtDx6!fV zhTvyfJEVf&rEycPdf?~jWRIb>KdCs%E%-K9>jt*G9z!I#sYWwSuVMnIsF|Bfmd6PTz4<@qR*f9Et_QzjugJkfOMO7-I|qE`(w~xpdWIKcyJ6 zgo3hc^-vT%ANN+-Wu>hcvv|J*P(3C`Kg34yg|T^HjEeP3b9u3fFj%>|>ZZ`N(B|Bn z3Kcyo)gmmlN)=MdGMp<1==JQGXd{3c@bG!Ush33e(NdRqp#`{H4@?uJhQyzKYCQS5 zl<#mMzx&R;LD3Q^O6H$+OT)Dm;;)gW*r|ICuUk><4T5R8oQ}9Eb@ccW48x?8%L~`> zkc*j2-%ObDvHC8Ymz9MVuuF+UTtHYDQ3>@P1S)l(LPS^_v6rzu-VWFHe1p<5p-kOZ zG!rpw_JtT%n3dtQ(&E2`G?d{5QmR9| z!Uu3GB8}*v>pENY#x=CO&E3CWJGaZT72$`XEUs!D9I_I*WhhBh9F}Pf73GMu($A)$ z3LYqQL*p1>5|2BGKA8lxwqRUV6)kZ5w5f&k!W&WJR|ZwLq02G29GugvZbH6I5k~^*TqY~*!q6X8as<6eE<-$7Ik^L z^V&Z(YUI(OMLqLl_9fOHXk*QWzOXdFLTX2P@8P_B@c?UuCEobADIlA6W(`0$a3>s7II~-y!^KKw0M2M%v9#GA$F_K_RTO1_t)~I=^ZW{L=q26_kmc8Pj=b8+z&)-h zT^#L$D)d1VscA)F&nuPg&V_Glcoe!tb{}A5-gmxpOGX9-wzQ!S*wZD{Rgkn~rW0+7 zVK)Jw?wWV|$-05d2Ixt_$Xg}}8^#&Y9{lshSD-23co~SQI~c##9P$i&yq0ZT_sbF` za9;YxsDsiVVrkVnuAcJdtxHeq5L4u|iv=~Ax%0eWOChUo_w7c3G7$zCF9&6_D!<0F zU&xcJj_D6$>+Oc1^?$CZ9{ld)rS@L5?gIAZHj_(@qn>nwq^M^N`oo&?n zuASIn!@`fz0#oKucbnq}4^cZ#mrwh;j(mEpgoqo8v0(}h($K>FMafH;q|oGzNGv)E%|uu&TAr;n`uT$8Q?a^Sr;*j?FjF zU~v`|RoAxSc3cRyZ*Z9psW%@JdF^36E{>ZZz0MN-0fYvollj#u}6h0gY5O6mNNr=*4u*a`K8+*qBig@>#jmW!K zJoEzDAx6B-tK5D}Y&Zcg(&J=g(weMG46h1(yIiAi(w66o?sz_^g3c*yStd6DGnzM_fLNF%3iw47`MW?ik$j^nvPwompaeLLlHP6JD>ik)G}a zLB_8?)q*yZCJH3*r$rhMZ}$Ua^4v#8GJv@e>U18fNruhI;c@z#Nl6Hzp&R4N=Bf%~ z7OpNFxybpGs6K5={#=EY)3|dtrsr=y?T&9tG0lu8_Vz?NiNsx1O>(vdLfC;NeVrPH zuHeV@6Z`0(0X|&8w-HO&F?(-e{Q4o-CbHmvZrsLW zk%HP3@_(0&PxXQ97qQHr+x1r-2tICPjxhOCg{rJ(LM9eF;sh@ZoupX_#BsO#jZ-(r(BJB9{0rsrlaktY%#3t1?zxnp}&g}>~Nt@D2SaAnB2b{*UCpEvV zP~d9u0+nnK<>Rm8Q0a8E7uluZ(U5j4VOKzbhFj`;Ztv{uaon?C%drlQn5f&biREeU zoq$zTLLwr|lAxUl60h`{sbpq@8I-eBR_e!DtzWXHrkQ$Y{h<5x{(}?Cmr@uKM}B&& z12c^5!vLDnTSTQl+4@4LhkbKm7#4e@2d(E&! zb-LD8zW@Yv16XRfedY2TO6k0G9_`Rfb7WxR*YYAs&eP;qAg~~?--Z~N?k@*WiQvix zyU+qK!3LQ7mnaPz*^iV0D<`4(Z%jhY&M z%L;KycQ;WsEP%3sZ2DqrPxjiM^5`ghPjNN7LGBA5W0CkcG7|5`vkOgqe`$*!`EWV+Pl8J_jD=|8LVHv zYlkX>#)vzqtL+!4vA0qwzZ}lM#E`oZ7mp+%3xPKCdJeN0Nq?c2vjy;|vYA%eBNy zyw!zlU3MGXVHg=4<_f4OY(Z|WE~rqFt;|$QKd3S0L}$HLa6I{}l)19Owr8D*kGDq> zkbZIO7Me0cJf3IzSDVT|o5E6efgMx*_-)WoKIb_et+DyS93RI>F-+{p;a4Slz1WkN7 zec!>AZV(xnsr{4t%BS(tP~Nwt_u7zav*S%(Pov@=+=%hWJf=~fC}texep-~7i~>@! z3*k9pB?%QLhQ_#L>t*~zqmhwYD3HtWuPQWn5<=>jR>rcB&)l?tWd0qEjZ@|;cv&&3D zFxAKn(i{IgE?@__fkG;m7j<)}r!Y}nTHLK|X}I(O0>2i9_qp{{tIOLLF(G$pu73D) zwMO=U*rCF#{-iZ>cSzs-ReuyuVNe&!8uaKzQSwdfepl+mHCzCro;Wa{VL$ ze>Z(U7+R}6A|Jie!MaCZE_k?pDzNZvr%he5g)O-53{j#|lP)t+snv;iVeEbYZpf(n zPQ6mS7!nylE0F9m+l8xfO;@Pd*tuvIsX6Av55bF$=AbzUY2iAb(==CVSbVonSS*u; z^+2v?0;m63OS5_Oqd|lIL!N55yvqkrOIyyF#JH>tHDu(cT*YC4G3mV^YT+y{`ptO2 zgH+lfzy#r{o;l=tb6FPb3}^Vwg%mkfZ0EO_CUWRx$S%g*$gh1sD6@j@6{}c=<1~}8ULIl_stC1J2wgka8N38{o$CC}ouG2NX5olDUll>sUBZ@-bdhM(g9v8`BlNWfLbsJRvtZt0{b|34hgsWJ%H>v-%G3J|(+mcD9b--G z4wk1}F(mbv5=kX-$VXIEOeblpvf!h=61IyAFM+X&C#*Gx!3HovcXb+y-(pTamg7j- zoi_imROF=PEItXZ|4Cb6fzA*hhky#inp=+4wAY1MLL! zd7T>(@I?V6Bl9;LdAG2S_4W*)Zyl!L+h@A-l_Q+A#b-KoI7p(jE>1qoovUC}b?I7K zal89xx|zbHOurCvZectrq1q+&sj_e)Tkf2$bYE$cxR$rS9Sd{7nZinr#x;jP!nA3k zj8X#=uQ%)FbXB340tj&;AW0Uf=A6>U<>KV7qn0(W`vT$GTlH+#iHxu{SrDRt2+|Q> z5G!TKgV(X|Vk1p@!T3^Vot^HBth{ia0)bLDp11$qY`qrt4r+CLm94RQAF2GH#^S?_ zZ`YQ5C8XUW3pKx1!Y;>|Ig@_jIESe~y9+c7fptuDI|_Gh`4|L-NCx7M2@Q5l(*cX` zD=4`$&qY<2ic5%bwkd>;g#oM~H&SA)ABc$*+UL+%bxe~ZKn{-dHvqMxJFQSSS^^z- zhF}TPV%|F1cEx93#C*~VK|=6i7YUCTh?7{zN|{m-Ixuqvo{oLCISd^mHl%a4jBvr~ z3l+z9=6q4PlaTmB9?$Usy=!D_T#?1-;|7C1MMaDI%X6dg!3x${OSo)K#8lm#;9s#_ z6>O7EgCZG6VyhxFGUz+Z%g>N$_O>2MTOJrXg`LN+@`LDw=dm>43>f4jerS0X z4ynAaF{CGpbXRW1qRe=!02xWRMR?CxqB^7vSej93XJ!n;g5lX`h6;&w>%n2+=CH~qAiAwJR74SO>G#_5M4L1KMw_IdS*lN}!p?F^d~<7%VKKcLUO zqYrKhTr*JdX_iNqOYnRaN|UYJQ6OZ9M{rY3Ja;5spCEW*@2xdxZ+P1qC9^M0nB@V$>HO_O-9lQ6vcE?4~HP+L+ zTvC}EvG6u<*Ie?&OR`*GnWaS1FYU#m8bIGT5+rQ2gvBkTJSAIS{6q4m69CEj&vwm@6 z!C^~X2WYm?!rjZgEy@|$uS;Md91YR&9HjYE3_<0K!o!4rJw(!@rd9K?LkI0KwL|DF#2>{3Y;{udUsP#cFHTq{D zJLkkBd@|K&=8u4q!k+=cEYTom<2p+@L%pf$IT0G284S5!qO+`YpHWc5u=IL}I)yfu zc*;$fRkKE~f9-2^Dugn&n+$!k$S0))7L@8`o3L4ISS8X8bL+}alsDwF3vU=d*a-H5 z4>G0=r^-`R%LDhc2g1Tlxm>M1H41@AYVX!?8srB^E zVufR*(P|L8F=s)n+_PnGZ$`9f`|CM~YA;(@N2`R^Jp6aVMshHy(u}=CmxD2DB&^ZQf)(@c0sJ{`Y@=ME=o;`SZF#yO|V!+9LGW z(>D8~zagJxGyf>7Axd(RA}G! z|B4XV__Qf7_?X00m)vslNd`OQ3f^m||GR(eB`f27SHEfilGMSCL1s?m>I70RJ6qzO-lK5H+3K*7sXXG9pw)zObD4^? zedC>Uhc#$R{Rg2;Ijz{oA4mM2&#DBxQwlSr zxW$3gfA&5syaF@b==0fI+rj%^zQWs4$>Zb2Xj$}FWF+sDc2@Z>nFWD- zIkIX9^Pcx5k6Xt{h)@*nc+>?W=h+I~@=H#zq9=L6YX0MnKq|U?0J8YiLJ>h5+jHGn z<=yi8_=ANq>HLcDLi7tA8cA%?Gc?TEMa>%uT8*W`W3SR)hDMM(q%4Ljl$9oIfsn@Z zr#^#Cg`DqXF7+1^U=rkx!YIYfUc8S26Mxo)W!A^gzM4+?U*~fTspAQwbw-51vOC(b zgM>0TO7dd2Y`M&9jO<8id?&uT4?*C@Hs4T^FLFk7s=S{J&UJZsG`bT$g-*+-2)cz` z#vRGa$!|!D1y#=qUh^(53iqvIa1{>;GKi9=_KPvmRR8Zkl(91Pdr<#kN$+&F&ua)* zIKnCf4;~Qe88hkeN{2td@ujb9l>YdVUkPppimhzrx)J|`MfS^_UoVqf@)UlyFrPsO z3=a;zGpG=y}Td#@XyJhH!7?GJV*WafATMh~b&X z9`Nh7i$G+&u#yZ@o4Wbt+Q8GUhCR%^uwLk+77{{&avkS&35&*D@ZhD?b*W*qj4iiQ zu$u`3rEWPi(-ilaseI#hJZ6rKJm76G&CD%8?I}%JV9CiQ!D;ZN*eHyxlq^H;D|>b^ z3c{Uugf6ojG_;vCtO|clou*5(VJp%QKMVQ&tx{DE6tQ4NT*@-yTS-_4q zVsEn;N+X8(jVtUVciij)@PmiGv=6U!@h|h9wM3UkCa`uZG9W zu_O=aMOMx*DB+~0pEG&b5VASDc{NOKOOF@rnj_lHV1w;)z%rqOuM&Pbbj#kTz=IZ4 zCui`)IS>XZgjx>mz`I7l``H^Vj&OI5yr$$KS~zN7f@RhFt=J1G9GMQ=zZ_mToc#jQ zns^(cQO2OxH%*9PS`U7me|+D0(?klB$MIgiYpw-!}Dlo`aMbEi)#C58$D+w&%4 zxN{^2mH^RDgr`dqPqVatrHeHgOR&LzBaL@%!3vVjL7d<8aWH3lCMWgBP=dH8M@=k>HEhlQT2K&^Gg{?1$0NL!af>N5cVnLCBF1>DRHY$(0<(SXQjtN#XPrsNkoIZMrTZX-52`aU_v89w~<5uFSk;bAdDd~dGvFP_Wf^E*c?HI_q)iX)XJSB#5! z7G+w7?A?4#R%Cm|E89yk;kdV_&L#S0>GhWOhOjjFIwQ*Al;ux+njSJLhLjp|upGx( z^d!d5PmmLnzOXVR2A!klF9A|nI!y_J3m7WsKUM}>Rq(7DA$>Kx!64Y}B=HCpb#>C> zH`}HMN}-}G3Bbt+i~C$TBpJ5NzG4|2I8vIlbB_8y(?iRbqAkEL=}j!o5inpPvp+-A zDcI82Ih<#rR0lp)kSQ38_Z*5YfWs`hV5+C~zC;sy#k%ttcID{7iTZ8Yw&h=u@b7Y% z2#EGmFguEf(IAXNWrR=cVix~kUH!lo!TqOQhH+tKNok44)K#{6LW zbJ0@QfPzpQp!AKJ7BL*aNk1U6>?cxV859xjfL5QR9oZ&b?>`qidFd;6+qCpztQV*` z1t;dk7&}ok`gY(7fkJwGyQ8O4BXdbwICzOr5qN$Q5;RJ~rGReg-Gg<))43;EyMK=X zJ;(*#fW9`+0q!o-E9RWF`zL;5e7Kk_a+DNjyD~WRA;1;f#HQDBc&l(M4&N;ry_JY^ zKrFxTm}A%bwnwD5X*gkiajVZ)4}6y|kXO!|9fGNDQKKTgk!MT^a!v3A{#O z^sT(1z_|Yizjv>zde<2f+<39rN+FV|)P>1jc&-gphpgQ9M;$5M;*8%pTNYTOiEjN{ zu=8?}_a#$`A63bK5`Gj^hH$ucw zOBdARUD7>;8(z))4ZCOZn>+zNL6Z<#sSq7hm^+PCZ-Re+f)_rNqvU>u-1hey3iK?m w&bHfi^j{8nT4l+do~I#5C!}5b7!e$#1k-+QZyf?pWZQWuM+Qq_7>Akv7e3kC&Hw-a literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/3s5z_vs_3s6z.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/3s5z_vs_3s6z.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..3927ca4f45afacbba09c1abf46aa5576fb8b5345 GIT binary patch literal 15704 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 B;+Fsb literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/3s_vs_3z.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/3s_vs_3z.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..4de7cf80e75f7a2e11878f767a74199cf8630a4f GIT binary patch literal 13995 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/3s_vs_4z.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/3s_vs_4z.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..8db2dfc6aa08e310ad99f4f7f0b0b7b84811ffc2 GIT binary patch literal 14000 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/4m_vs_5m.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/4m_vs_5m.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..ef36a1f80c1dfff00249e5e4d9fe3e218adcedb8 GIT binary patch literal 14919 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/5m_vs_5m.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/5m_vs_5m.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..e2e2c771916b71471539e86c7fa9aec52e86cf52 GIT binary patch literal 14913 zcmeIZbC4&`(l`1Yn>)6-WA7L{wr$(CZQHhO+qP}&?Ci|Ev*-NI6HlCY;mll&l=qEC2xD{{aAi0KfouOaQ@ss9ky zSsJ)=VV-R)RXe|IEZt66406(yGAHOCYB|4YL;NHVBx@$7Tki3N$9U-e^ZXz)0EMw@ zFOh@$8;*PjlnECtx|5WGY<7Y*I)jOFU>fEYLqvP$;)t=UKsF(`XE`E1p3;A<>JH4W zhS0EXnnfEGD~8>_7JZWhViG9rrx6P1&Z?afWdGC% z6GUOsk*9j1PhVBVxm-@$X-o(pqX1yRB8}Ghn-^S*Uc}%PzZzcWH+-$C!?qz`an?Fy z$4?9SSc%QeO-G-u?%#@N9N4atFTnf7DXfF^tw~g4gscY@6yx7874DCawB%{xLfS)5 zLb@|lA#}|Lw(}WIRpvqc-@zBrrohs<=#)T|Evj4Wl`X<(Lsu^gb>R5XE3gRdJzfTw6Tg&em@;~nyPOCcdmL~Y??rs5PC}TCOXw6N@(%Ag zy`!yB;O$X{PC2;bI4L<0$WKccx zVh*;r;2OcpG0J^%zIj?(`WncEit7R{CC0b#)9M~>VnDFR<7w=OizqY^OC!&L-*6$E zNU(X{djAaQQ&!1NKM4oC^P|}FJNBFamZ@S<*As*+5GEnA^FE!A8E71i0Qr@ zT3_B$TSqKr8Dq7vDj$B%NAcRA@I%9uGy2&lrcfk#PRgPePWdXIt|dO+j7*dj4CuY- zB<86?Eri)~YGeQWYZ-2`mKybKwnSB#N_*DD>h;4=<-!Jw7M=DPN6Hg>&bXAJ!d`|F zqKdw^z%C(FnFeDQuZBL}oT)&APZ!`R*bC~Ksj*AuG6sJyO}>S>{eHZ41(F;(H%oQJ zs1E_$fUBngIM4#_Ei#CivK57G%@1L^7aE&XKGVL<`_hlp{f%sibZ<1F-hv%8SaaG7*+`BlhmtL zV}3~2y5P=sR z!@IZ@%hBfp`8_gR0s(l7V0ty2m@aX&BV_>%gm^Cd-y^?7B&5Y?re!834E1$&S094? z{J=z+fEgkY^mm>d!-3}jyZn%51=G{_lNJu%e)D9%k6cyozQm$pWf1)7VTW$WyhDmj z0^u-xkYfYL=|mS@bLioW=|L7wTU^As5LxQDyI$5GQ^?k;;%rg1bShYXntubGOD-?p zFbGHYO8uESRgzE`+ljJd?t@%(t@omBE67ZlDjr-Z>r|nqR)hf&I7H|`DUkPD9pNGS zC&&bj8ub*!M2p~Wob^Oa=m6a`;nnRK;lpx^R-sWhgGJ?AaLvG=_;QIj)f(XwbRamQ z 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/5m_vs_6m.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/5m_vs_6m.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..f2ae42c2da5c1d11683d63f458f1a554e2da66fc GIT binary patch literal 14930 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/6h_vs_8z.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/6h_vs_8z.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..df01eb64749ef42cd68e51fb20e53303a476ffe0 GIT binary patch literal 14342 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/MMM.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/MMM.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..ed26fe446731b821aae6853e310ecce782a89864 GIT binary patch literal 17411 zcmeIZ1$QMq(gt?T%*-A$Gcz-fnVFfHnVFdx$IQ$yW@dZL_L$l6ySrcVWlv6iKu&b- z)77_CDwU+}E>*Q8tDuNI2LJ#-M7{w412pjh08N4bfWY@P(r^6l^bgNJ$&~xwbdl@d z6ae~fssQ|-|NkL@|DnA9b6o%c7zOX?%IFA^K9U3(t;)EVD%e=bb`kHpx!>A?;!Z-@ z`M*m505-~lz|E2$P#eE^kHwt}!=TqS3#?SjJ}^~Bmt%Z7?;F%jyf!%3Xr7f1o}q+d zbb#Hn?;M=qC5`$(p%td02^iqrJW3TA3V{Od883hU{3S4bS}x2NxVq5_fTkb#Zu>OR z-$gDpwVd|ZP<^juzCZ?@pg|>C)&i~&9gUznVNF|edYnzT&^2#~;FI zG+MYNl8?T|Iy>8P<;h$R9%L?GHQYd%eY`ppsni)9JI2+E_ToSD|JWfd{@hC=@H>G^ z5J{%rZ2b~bH; zD=@~J8-|k&JdeeS>&QHW3uEIvV8{H|U#hWyV$rOv(3}wwID~b8=Y6$K9;|%y5bUvJ z*MK)?w@u`tDQ+})Pu>k)gT}<9AwWG0zI1gOEkkMOCU&ZM7wGQxMp%yW?@d#mns(cB zq<$u~eZVzhy5sIA9%8_#K2;`B+1OLRMF;T*oSE-&ahx{Yk9b!>5K6FiIFiTKsR6K= zr2$k9a$Mkqw(#Te=y5z(5@aSEyS(&pC{G&PI8y_nN$i$I1SuG z#gIi$ohY0*(cR90uEHxuyB&y(z>*SkGAXK6B^E&>`sHxmp34ku5T%NUBm*9Vm~H0Z zw-tSBYZ?cCZ2xT4N|@*;BgCwA`_O*d3lO{WMa#TW1|<;xT3>4*P#O+}h0 z=@Aey3}ybYg~;3`C^9vk1OxXb9kIED8v&O3Q?QMYX`!pe!aiWxJfPr0@#T$$zKm!J zw}xSI_+5%(3wx2ZgOr61Ng+t}ql5mX6f>ZZ7u9H4d)5?hPoixZn3I@85kHG6{og9mjt2V zR-Dmzgy7YMV>o{m%&HVWOXb)t8OiC78W~^YkJtCnrDL^;E&DUsc6sHqlnc^;%*o~| zdUjF!(%*?8O7T5%W$RoHu7`C<;@iKEh+PZ(vnHLTQ-6aK_bsX7FdR<76(&(cFd6ko z7kf*7aKlpR0ofguVGx04In?K zadP@7`O|jX?y9T%koo9+b;;&iGcsPGt1k`<-3fo*#mzV|9LRl0VBM-c>rfDqE}$~a zJ4YN`Sv?HNA(($8$@mATV4K`PnVY;#N1(3xw|wxymj9KGr-)-hwmYa9_q+2OhI7CK z%(cp_J?fWV$Z~M#HMxDLRkM4ncExK>e|eiIz7ZrhV?OB1a32nx8b>uC`fZ7-Z-@jf zeDs%q&GtPh74MHggpnk9?tECub|{*^8E*UJg!xI$364Mcoi zEqJaDj~_KPR^+aSwbXw+exDiI5$^=VFi3b>nj{%2U43ST?ckZJNkW%Q=Wh@T_jEF9#WX`NnlJ*IXts;#kNJbM#Z=961q#!nt zbv@bkN|dwgcgq@98Bo)mEQqOD78y;L)v;0q2=nw~1D;ty&@k*Okv)p1y(Y4siiY8@ z&}C3{Gf~YG#OfKomPq`rNTok>9asIl1)zNryBmeOyB7=gZ#Yjp98aJ)*Zn+Bb6$6H z7YSa6`0?%|D86=6NqqTpdGuhbV9dQ8n-r;(WU1|jAViPx4uR9)6N^#vr@%4Jo-)EJ zQ@Ux`*B^UcfjZ^1Z$8h<+$bM|tv2uW1U)&VYyNq~1~Jkn3+Q{Xl^tY^#?mV-a=AuB zu(6CS)3!EwSjw~6Hc(x95=RfI6C*PlF*DS@YAe}}L9OE4Bj7!V4ES+(z-9U`C5+b@wi;<>UO^$dqpUE2_?|8gs)x{yM2njcDB@>hDMEI zyWT_Y1vn!2xWvEgwya6WZA02N1o@nrDTpUw%LP>GI3{==GZgIy{8Q^*4_idUGOf;8 z3iltR9yZWGD)gc-AsQX%4aL2;hQnQ%bDZdJ;p#-Ki-}CDc70wJC7ZF=>(H&!$Xmv( zTgln7FJFfuo3`^-`q)8K8(SgHV~(g7w!PgcuT{pgK099ZMADGfgGmUd zL~K~BDcTyX2@hlSzO9$EoFwgx{N$vup}zj=U1&f6m;^I0V>E){&VzF#@NdAbAf!dn z%*^eSm6LD4JlX4!yBhvKc9KToUd2pbzaG^X00Kr~8f=I;-nW~mo;y2wgvQvS5A{_iyASPZOA&>!f_?pZ& ztkf(R4$}`gK8T!NV$nU10nU^GWZ|UMO^OGRwSl+$Y5hKpY^^529!*EDicQoK1@w1n zW#xuZB!*AAX!>+nQgM72>XM}&a>%w1 zyIfI_Nn8!;X^6>I;aA-CWNqjm{S2|y?OCzIN~<=JF%P3f)f;f_;E=>h=>+vUu|F6< za74#1Lr-Fme<6UHH6&JdK<}vq_oH={eBRgXYTQgoF7iUvi4kCU&IA|V0Nf85QgMZHG|8q(iyXaF^O5c}_zF87BMy&s> z#N{9(ynp~Apzi@iuV7^iZJn0xN4t=MJ70*}m<*GXhEz=W=SKG^@%1I{de5+$NS)&MlT**<+E@5lXep1K%QD;sjv=1rWuq1-}Fzb(eKeqHLiOTu(>_ zuZls~aGIz--|a&J8#ivY4}u~R_kM%&MiNgptk<$r2`n!osx_Q#LT8gHjoY?|&jiMR zG3Qp;)_@utrtIAAr>EfK((F_y?Wv03Z1}Cu!{-v zp71+(a8BFK-dOyh9hlXl9|b7w;G_knj>U75TrYT2hO=;#{nK>y4ciS4L?8Cuy0NOR zON8fsNhc7)#qdPbPEmuo`BfsRgtK_Z6~ErWEV`EFtcw-|t&`znZ4T@Nvzh1*j|8j` zy;79i*)&*<9FST9f@L}09OWt0yO3r5`%d!bg+<8MEjy3eG8EJ1JK9EMQ+fZfLmKdU zcuCs!3@keeuTaY{nlO!!35puCj$J}WT786lpIPFIW5>zjevm;WgHhS5leP0}=w4vc z%2dRb zMw+*d+d3BghcXuZcMy9w!wx0K$p&0#oGB28pa<*SlJ!9aWh)#=3t6)RUZx-L!az9= zgoRD*@dW-yFyqpuvmWD2%Hu9Gr}!J^ZAcJ(+=yuUnoy=)M6~L)J>;zth+|tz+mK@U ziJh)yqt8zh$AR4qVWB^l65QyM?g^U;M5=3+XjR|?2e3oA8McWvpi%`3KviOzyhNeq zK@|%GM`D6J8-=(yc(Nn5i_?WljX&k(5>+}B$RulKUB=;-^!Kk~Cy(Hh%qlHAD1ScF zyzVzGI;Y0BT4I!<>7mZ{MX*a{K)18VMcN8Ayn|Fu?CWzmF#dURoMqjClpyM6fx&2^ z*GX~$ACo!9m#2bymXRLNPMQbNNgq9~*xtVt;m&EZ)@r$b*x<3X0a}-$mgC7F=e4C} z$2A7WBQ^M%i_C)_a3%hL=bC3uyU`oVXvr%&7UM;}lb9lAbPHcw8c_kdr`xgY!OD1j zkdcMJ=)q2nJr^ChtM!&lGw6u4TE_6o#&2fFEqW&l?LCw#$17X;`oY_$QI?Zm>v%#F%{w`gyqTb^@mRtP$j~J32NY*abpH z)4*0}a!Safz<$1JjkHE>g_A;;4mC{a(qBl6jL^` zcjLr6&>Wv2x8?Aed7r`$4CwuJ8lZN9o>7}d*-97H%bC}E=z{aBuUv<0<>$n!r`WJ{ z=Ap}A`r+O@MG%A#AvQwf3q#?@NYiz~PLDOEdfo7ydz?A~Ym{WQ9{{1`5A5RB-N&p; z`&$eY(MORuX0b&O+jwb(jxC<>lH=}wUK^>r@ZYbu5D1$5d+6mrf2haD%yf5%STiH* zlj`Qeedu5KfXx`@afZfE5;CPJGCk9sth9<9-_C6`0E4in-GqIYoMJLL9bcaVussth zkbuekG>Ccp`t=)=--t!?gY;<51i>Ti-CWQVA`V;VSiMj;15F719oB}K(1v%Qo6@My zxm!Po{+Il-%I5}mWFbXlVRTrkEd1q1eVx`Gic;@H5(^3orR~RQ(|qyeSYL||KQ~KJEMhksLvZy&tshU> zwC)Lf&PX+q4fXNg4To`qg_nWHb3hco}qH`3QP^albX zOjb|;FpB-AAVQ&>n9Rb)G9Y3$GOFH3q~vKdA6whTM``Ea&_^Q|b486QRAh<#<^(3v zmn|;N2Z&5WMhbu$90(1S3krki3dR*G21E1eaH)b(A#q&6T#y?9nr{t?WsNYAPrysH(8B7c}(1 zr^g5dCYQ$eNsIxbrnS;0vq z{;f?;=9b*X_nmT0{eVZaql$QaQHvs7P(Bx>i~3O5<$unhzXyuV4f$|-o{o5X(3G
A|$(9?o`33v4Ald6Wt%mytPzx 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/infestor_viper.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/infestor_viper.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..88a8b2cb6278f4d28a7e8753cfef72bd53a9d21c GIT binary patch literal 17080 zcmeIZb#Ns;vp06k%*(Sp`MxSpWdgDg*$40KfnmJOF@(008iP0LZ@a-_t)l|0EEu|DyJs z|3v|y|3wXe|NZ?h3Hq0c{;%r-06-cYGcdR5Pq9b|9L#FotvtLuP`*I_q0Zn3&{mR3 zjLQFW2>^hs8X^j^rYZOM9`Zxh1wR4X@La$32?Uo!Wx21Y-p!0(XKF^3NxhsM?=YXi zN;@&IN9KjLw)46es?U|o7sx=v1RnYHt{Veeb4eV7z`UG3m$fCFHae|tmCb_wPD8t2 zBZedghaK}Y%AAim{mEz5;WoXzwbswxP4Y?Z8aC@_E3jYi&fzT_HQ@W7B~MHGKA$(C z+W;t$HDDjLU48rOHR61s&AUHU?y=r|9<2D#p*1{{7#nEpF0%TpJ2LxP{&_3v7cu=zM@hnwW^T|8#P}c7o-vWb#Is`pa}^?RiY$GyHAP^t-_I zyI8LS8QelzuNQcRYL8cwg^U1T_#;l-m*(#&o_s=raCSbXWs0y;LjgfZ6#?^c8^@hnmUF@N zJ4f<0MgM>+NNz8l;!sQbtq3khv!(O&!gxyQ!1(3NHQxF`DrUqvgn&6m=_I*JE^cA| z1cZ3&cd`MuoyC}~*ylfoJc#RT>N0uxNR=O8L$O}Y3`;p)?%HqoE4wu)^~k1U!LdQ$ zZ$s>l*XxouEKM3w%Q`-Nd-GJI5h|v<(E%*1>+4=;TaRmEDV=wk>o`XU1gK&)e`&8+ zfn@KKD?bMwVAVNLPQh*jF=etzbF_K|(L| zLBT~bW}+vKMEi`Y>KM#|lFb_jV@~Rz1A;kEcLOZshe-)tE~?vH8bbMN+h-p3n~Jwn zZg>w^abT)>J8HNl&!{*6EUUl#jMe&{04p+Z9X~=V1X+537m&PN9Taz-=w7KJOBNGLESX1!)t6VhjCG=5_|MW zRWIf@AY#g;T61(PPc)juJC0ufJVvMS>(*RQ8F7j~QL1s8Ueya(aPcMM=r|>#!*DT+ z;go{#9(o#C_~A(FC?$ii)Uwea545m)fv!ak74MOiXl8>|VVx-}z%;23kwK;j2;`Vk zP$S%ke&HBKbiOON%*oUXpRHRST$kA{Vj!V4WZQ6MNkBR7{PvgOW2<&=RM?{NH2ja; z>=M$*z{CeSr>aLKW1Tvk33T;kJC2QKR;w*#*1m1exK&k+H(hmU3>Y@zFN20-Pi6?M zFh&zqYe57griNqU+yH@zL<2ftp)Glx3Act_JD{#*u`0-^O5vw!9bglNY7fvWx#zP> z`cvQ{G``X7J(AZi#44yQA5395b*CF#PN7HckBxWqpFw>W9y!Q|Cm{Bz8hf@-28%Vn zfrhClfn>u%*P((gly4a>GY^?zWR;S4Y*QUAxsqo?i`GMq{7PUsC+00qt4_z=_Ia1q zsUfj55_b6+^cAY|ru~V>gT^jrRJ^_(rJw=TLGhu3!M`PCWdliXGie6SewlPx&#s5` z8^^V|Qu3*Yxz)0z>FI9J4e9_U8NxcwJQDhlC*IRMGO>%m!=>AhGDJkY{qbsH4vhzX zr`%e($fF&jCy|APBvahv76 z$KWz+K}*;=r5nqY{}HPNj%o&co$7_aK_uYxUl$qxN= zcwb{T`mCx{YWyr>t3!KmC?cuo;92u}NzzAFwz6WHXc=rE{V~#HSz&xq>qbhR%}6J? zDqCh|IXJW94D88CHrLc(Ypt@y_%ySLTe2wuh&!xW!CkZS+e{2E@bC@RMzUTm>G^)F zzWT?X71yEKN`HX0RzO-yUcgRZ>g1>X+Hc;SZlbt&0qz=e5stG~NfAaliEg6E-nUc9 zy+yQryAN|Q{=OU?*%7CC8Cjy8qxkqu(yZDL%63s?O|QjE#h$5=HLMg3L-ai38$&ov z7}9qyO^bNn*kbcJ;d0FvOR-y;}l*PKFq~xlR;^$F^ zzg*vzfR2k@?Rq|*Pq>1YAR;|m=<3~o*PGZ^Pe;pTU9>oC+heebI7j#{mH3zamdzkq zOVEyK+>8!w)F=^{l)@Ty3{j-_BL!xje5CqT2JLU8*LA9Bil1FdpKhYUXU!E z!mw^!F^I>f8jti2ar7cnB}50+`d*E8Bw4M-)nSS!P!>#zH&9TfUA&D3v99E0Mlm`B zEK}t?4l{s=*SP&2#BPf$Yw&y+u4KD!=qxT^x-D6w&!=wTjkl&T>idFy=Vn>iPs%uDc7&I-P}**iyPcuC`4P-un8C;|p}_n*az z4EaF*_l$pm0Q^NTz1ptKe{uDq6aWoB@ZI-mqP|6>v@@{nfQDHzgRJ-lk zpMd!X42vDRJiSJx&8f6|{_@+PfqQV%kHWUW*u1P#doO@_RKw^L3(+!@Lgn2Hqlo#l z>>I?Z6HIDI?MHovG$%X$CMR+W+M0<^jK0!7Kx8XEvN4y1LEanV-oc>APds?X_a~u5 zPLMkPf;0~Z_e5QA5tVAvA|cY$!L6#XE7mX-k~MFYjGLj)?oZa&2J$m0hi)#Ul5kPS zcsna9L`F6KN3Apx_p0Uw2DPXr01z+=vmhhPvEJPTjijkvl_ZUL&A+M2aq*)75C&RU zG}zHye#G8n24)5khCUB?NZ}vYSeQ=fUt%x^o`xIbaorhX4R>59;7H>9fO5N>6MHlD#VI6XC$W4~dRSiq`P^A?+d?nHT`g|Aj>a z>^A_P-5&SMMG0U7vKGMJW32*ze+2L}Od15S`d%!%eoI~qFv1H6AOd3*~cDR}S&tB=YsIcrKqhkb5zjSyd5;I4NctJK&4{X5!w9|j>?gyc50s&Hwx>dYLC zmHBd;DxSC3k3p3fHiE0KT_wz0V(}N8?>Dn z0T#bw?|Jw=Y;6eLOr4x9?d^Dp80i>@2u$#FX^3{Me*) ziz*eZs5F=iq^lc<6ld?^60CAwOj`u+y@bt@1%d|78S3= z`T7|FwLiFtm;=PqN>k7`2BhL^Y@{YX{!zN7w*4OtL?7{e^?O#_s>T@}1^C8f0|YD2 zxwS_~xG{hl9=A2O%gYmY_hJ7<rqsk3ioHp*)|?&& zZwVjU7qH00s=gErup*wnT%n|LmwgsxB#E11V#MtgC=tm6eDk&NfErRkFDe6~W<6xx;1J%agkFp0T%E6&Z8P@JkEcRsmvb7D9L zA!O}yo3z^8W7uszP6Ky3N+_oyS zw|!b%g1-U$nFaKP_5%;{w|~|NC5e<+LDC%8@&x0two1yVGi;JWj0aqqSB%7a7>b?c z2ri_8k?PJG~uY-#%0LuRAC?7mpUqkQtI>R60AQrPCy(!UAqOg$->ibo$}U1S2DyPI|Au8g(pkjWsKZn&?C7wlXmDdbb7N>1fd~W&F$AD z_0h7@^qMliHS2RimAr#pXSf!{wB=3BYf4_bqDs)4WJ~zcB)02}>lRS_RaNB&e)#)i zu%a2MF?#oF5t4`2&ceq<&dAt&kADf)Zds}APuk1qutOmVs36o%9)`z30o$=4fwU_8 zF)46MzgC)BQ6OWU-Ex>F@)~IcZc!9_Qp^0!{7Ep6MzmqX%@xtgy=`NlVnjYhJ!1nk?$AmV;N?Ar?CXh0aFvJh}VPeIJnS-ab z(NEj;(tgGl>=e}6u3rL2nUK+-W*fv2*s#8h7~RL&mW^RYQsaHr&mh@4qS&kuw>!a7*SRYC`KhnvPyL9OVdY&8pSaPbCLQIwX88Ux z5o%Xo+Fm%D{wRq74OUo_4?IET^5$dcTf8sS^p%blaK>65_w!0Wgtxnq$MWZG_|ID^ zwZC=#4thP2r~-G>zj2?YH9+732Jne+Gr^lOEjVx5I2>D>tbkXt-I7;6bI0vw^qPjK z#t!V8Lp8nt;4GCxVYK7YW5iobs4KR%vD`dW--m9%HEg zBq39pB-1zB$w(>N@#)w`1271C+K)SQ$|)w1)A98>0y{9F0tuMjPk~s(tzW${`3_q) zJxGsajT1c5-pvM1BI2-xjMfTuG0+6l-(hW-3vGA>xGRl#pS$;g7<|b;tA1{9N90pP zhYXq)wsQu$9lhz}i&jqPUvaUAnyWz$L z21b5BV1!8u3IIm2ISL{a%JGQ|Y%D_}W@F>ZeMCy0dW+GuZG4nA4h{n}axpj5=zK+% zh;L3{A_LjN!d!sJctnH%sNsRoV5y)mh@N0TySt)wO$@6He zq6-J5z^Hng=}|>knedgbFD6aa51Nn+SpawH0LC<#JwT`4WF1J`mWEysKVs_x_`eG@ zjS+b#LxTri_4-+Zp}o1V=@E4dRhU9o;71F>#XhIVsyf>f#hCo5rOzEjv_K#a^=^G#4ApIUS$$rE28(H5N`o_gK(7wHFyx%bWM)WtD zzOnUsS|YKAcd}NIlet{7%1f4ud^VY;MShv-4EM+k=Lz1;`&LGvVeZ z8@e-$X?oo>e@@$USeFiNiP%mgag!(Z9o1;B==NQmf3u6K4yEMq`=mA>StYAabXgqi zUy3Yt6+fA}y6HXM5W zeJkKdSB<1w7Tc1?<()p6Iwnp;8M`EmNhhkA@PYlPcwg*_{PLLSoarvDcrh@-S zHJKgb#>C#_=5ljpC1A8|#)eI9qG8Zg)#~nuMt`dNp*N3iN{`+Z3v6c&3tqtvrLIV%1qQJlvwK68)KNsc1`_3ph z@W4tsiBJDS3wB*lGh+f46tB6U^~C$mDLnANYC0MJix%vh z1@YMY_$Vic4Bhbm-Pv(~uYXM8wgGp^v*p)=rGTmRqp^P;TAZ4vO2Tp|RZYf1bQt9w z;grX9z?hxKeISrM_1%S~Hd8K}R42u?>xm(6r++z;K(x-Me0d z0x;wu1{l!*qHZuXMnj5hG$uoiY&2#=NNN38&}$2Wbtn51&;_tz0G6EuK=U56ek_~u zLI2#u4K!u9g^@VWP2FzRod2!6@V^gI+cnmURn`lQ`54j*fF;KZE@8C&*?-EzlV0yi zV0#rb9{}D=AsGPXu&@sSbAZ)bO`^$2Ag(y%%}^SL9=4J4W9bGagsVsbo^J&MD>Rg% zB#c%DE(Do^;!cwRuSQa+T^KVl-~&T75b9G(i^@_YGcHLQTip^yW+-#ePW016Qve+M z$0TK`Cw$X*kmFWUJm@0eim@|4QB5J@XC_!DG5yzz0w@TD`l!b!}Jf zEVz8!08CV%+4L_SliO<=K{|Q|xOC2|JCB0UOg#ZXW^q0G+}t$cmQX074vg9@7U%VA zC?_uuZ^8+TR`97zHgBO0zC7EU*=~7@1M<-qL;S`El*12T=yXmeUm&ol%tzmSi{lvY za^h^W%QM$Ypzmt2IM478Dsz5btf20EuGH}|<6U&atamlMl$d-q&0Rjz4?YBMn$-q= z9!A)E@v2&38ACtre4C#CII3tQCQbi`59IED`#{q7!7ll%5$4eOF9pkj*Cj;g@wvYx z{~4%gTk1JUn)zf)Tc!Wka3wynA+I2>qRiGo(C8;VJw^yHxip3{F$Rpf_DbjCrWDvn zLc-vojb3$J{^b4rB2gGNhA^=(h%_^X_DCjf@OChNt!~*c=DFY5vaenK&9lnO4+?jw&$SZLIA}Y`)Kb54yA8|MtadmGtI+RiB5- zYZdX+=U{BrjA?sc1=wF^KcmFWJ_Z?U(U-gH_wetqUH>_T*iuSsLH*1Gr}y{i@_e<^ z%Bd`$v2kocS0M0GgG|)Nsb~j)$(w8(Ddo zNRwbdDSWKEj0yzulEG0vbU{_rf*-sLNV+6Q#9;(XK~JZT;~dx`s{3Lo%<1)W!;&V_YbRkPOjr z|2&K-4u;GaPKf3Xo5`}~bgTdc?_o6ZH(2~cL)dwOjb2KKkfC@-0}b47mPq1b7450b zwo<+Whq!;)76@?sO)$~Lhy4v54{=xNVp5fDSr=-Ry@%g0*UWL@>t|Z`O>+8-nW6-l zU?Yi7dfglcGp#DpItIKjU!5P!Of~w|Ybd>2nd@usPkumcZf?=H7iD13lkS_<-aZ*@ z!Y@Oz!HRvMZ-7tVA93r`&;-s6LBCT*fLK>QFW}}Wv)=x45qchXzW_wGO(A6_b`{ti z%^W00OH7X`fCUbX#hOuHh#;`>YqFr@e~m1A$p3Rqj??J5Gg{bl@>+4XHcD~ zfV9$=XaxrKzyKXb@K43V5M|t1H98d)ohLVt9s-rQ>)p%4POf8W4-~`-@=7`J!2s<^@63F1%l=L7y+JM+EP$ zcUc7Vz_qHg!4(+&OC9mo5F*s0o~WXseMwP2z6Qc4gv=PnwDz0PO*;O-%kiG_61A%) z?LS}EN*|OT11#7qm!P==s=Xd)iUW8@Q_SvAB1M>n);-v54CjZyJi-=7FyeYwY*Qs; z0?8d$$?@X-Xv=Y&Y1cYT0?C-yvIE#n&bFjM+5Pf0YvN(b7NB<8^Om0++gP-~iC((j z?6v4lcj#YxBsV@oY4B~2{qfTJ(* zEtniX^F7Uh9li>9t_fv0o+aG$);F^`0Snu?45SWE@@FC!NNcT_kodo^&Pbfrm* zq%1oeX7;gD0gSMwC@`Kim;YK0UGr{I`KiLXjvH;FzKxF{@9XLVh#7LzO#U{XyOUf4 z1K(EMQ+)4F#P60(X>HgYupxTW&-xMu@zJu47iGBANw(MGodj@U3{Dq=p+mMJ+oI%2 zBo}TTUU3)FEiXBtc39w}vvE3`g*5*&Orb=TMpO`Yt0ey;s|iUrmfghhN}ywTtqmPCyv2H+7vSb{6Bt3G=0LxS1;Mq$4jKEVvF1%`iZ&3 zOiN=UvB!7K`&aC$A30!CXtwHHRh~!n8_`tg&58s<1kD+5ecpqA+oU<|!L`%Yo35d7 z=m6)KwEP*)kft2E^X;hTWbN zRj`Jnw-phO=>m{;wXd1zNRrP2cc=d z8`3~))VA?#tXR|RXT@n5Y1yaCq3cePG2$7y&2W$m%5TAM1`f;@4BonNsXA1XlZpRA z3l#rz{*%jBBfUk};|MAnrx8URC_8?!qJ%K$mCxUpEJ4KEw=hA5)FuJ%)Gho)PAl&G ztsK*!g|2^$G`>HI73?|hCFTb9QsU8SUFdEA9~MoSYKUiX>LsvmIp`*0V-NV|)sb~8^EEnRT+AsnTBkylSsq&-RC$9-$ocdt3q<)FveuA%B}<&S^B2Wz4I%YlogIC06Zu(9~Ii z?v~x)+A;G3X%=*PyFumitL%kVl%RQHgjU&)tatG^qe3iBsw8!8EL%vH2kZmU4B?wb zrI{6wn*F*`_N#~bM|{Qa#q*qg86l#!d>F`uHL`8h$p;3vduaJ95ZbmdryfJyGnDY+h|+t22Gh?E=|VQ-6dYx}!M{)I1n2!ulOjK2MG3{^88XR$g9k_Z{B{_mkvno~Yd=5ucB$|6$G)%LY(9VY@Gg%s{DTX1o zPXI9lTQ|bm73YD(T}kOkolz;d8(`Sg*;HkwWsfY$mnSGz$?y8R@0e^n9P-W;aW#k6 z5;6VU?OCXk;=IZxc7)D>rhE`8(KRbg|uDsh`FMt7K zu#tI0t%#RN#wvMUu9i$86MFC7D|CB0@gDRs!Qi<6AO*jcW0KPl%;+PMH}96HmfAuQ ze2}XB_?a5mOtj-j)uBP2*#E;=rB*DlEsoUIAf!_8NZY;WFczLpSF%ueAuUB{Lj8@93onuwy;-^fd@5XEvb%K&jl_ zmn)&z>-rcDyxRo7mJz>9_*c4{Ep|m+H5X9|R_n8|Sm#nVG?$3dTN0Z{O<7_xRZ`}# zDpI0&KQvg9YFqxXH`ms5?n$;Ijj=!04%dh1Pxf##)(LmUJ1XZYv0tLTTpN7j&{j^g zi)duMtV3T0*Khb5yQkMOEZTmcz^fBIU=Fj1Bg&VUM7jKTL_k+2@t;-N(f8ioUf@D3 zEJBvBE8xPOMZOr|a3H|8859~iCr3mBrViAWIdkEj?Ihl}WLJW;+<*XV$Wy!%1k5sv zLUW-K1u|+A(=#dQ#2eLY$Wo{AbAaM9ll+D-IbH>W~-GpV?IA5Ew zn^mMqK!B+nQx{eVMvy8TCh%{$zE@7qI_nb-FR;O7cW{Bb)BIji}*@@(W?g~jt4!J!ywRmbiC(S4C?o3C`LJRo~!({<{ zs5I+=$HTe+d5Q*Xv*tY7O2MaXnwaU;#?8a10IUZ6LSY{oT*@|Vr}EX~-a9iGTlA<^ zA=+OaTKV9`5r@)|8>Ygt%=-4@>dz8qrdX& z2pyv8Ds1GA+_#G4?pU}NrysOkJp}~ruV4^OG5e?8ZIP;$=QTbNzO^#U1vJ(N7%Ok; z8sgfw$6aiDPay~r>R|=!-8FPe;kg5JJiX-uL(TVHu3Vl=`6qR z_Urn%V9lbX?^Bntk3^Nmk1~31I0dsJ`XQZel@d^Sr4o+~ol^o7xLh^JU~)@5o$$!2 z+G_Gzzhsjt^0?!*%6kq*njFi3R2t{>UcC?|q6$Sr4EuK;9GDRP-Ga@9)$ic17HwKe zTA1^)4UcNX1X`?F(f|iqHxQ`U4w@` zf8OmSLm!rtO00R&oA9)tdJTKQJ z0j?W7LVL`QGiwm}!Aw%Bb-a$13s?A#uFspB3gev9)ddwxRq0Fhx?e}Do9oiOoYxsR+ER;O+#g?tXAgK2YSURniF?I;- zM}DC|wUqYg<%xK0pavllo2WBM9Yj)~Suv9m9c@Y-n4|ykOA*Rj+>8l72)Mx}R+mYL zQRSQuzH`3j6*V1YT0l(%<#cwUrpyqJ0CojfKxByLJmbLoxZ?#WkaZh< zIH>>$^k?hc#(%e?@A@*K_e7;uorR&MGRIk1_-*n*di3^mSiZ)ziO zyBQ*gs2eTFT|Z35cn&!a-MjDN6Cen_I&hx4(HeeoW@SF@(dX_^ldUW$a<=ha(POY* ziGCe~=J;ZJWhb|^3{Apg3^=U8dq7Y(^9$Oxs#przc;D+^wRuTSgznF3l~NGjdRKwA~#Z(q+_a^n5faRkYCEP8#|< zV9H5fGw#^dN|32)r;goWAFFGR$2@T3vBm#5N)7(Jps`rKBuDJW0InC&6;+AxThjlD zDFM-6VRz3fC#hQbg@AjATP1S19`?Wu$i#v(j`VU+~*3wVb zOt`BEQO1q?`gT1WhniZHei9rFpj_01!jN?qwF8A%!D_oEu`tXsP9ExGQCufiM^0S& z$lsE{t-_FuuOLAJ&cXnipJ-ahm&rgQz@V_Xd~3bLMjT0<16D(I-3YyT@IMAmTOu_9N&x15d2T;ad3DS$Xb8ye_0dS14W z<6DkPLMQ{riHY?sN?NWxS{tE*3pk(F@?cdw2ckPBFk&g;K zU1SXiO=_5Rn~T#vacUK|j0R)S-L-G^3;CHSxVnLVOGs2pww~xIYmamZ3zO$BH3C!+ z2DK!5Hd5!L7EV!KheRaa#1TRgG*+>M>MaKet7(ZgfaeF^C^GD@f@e_|3W7@hUO9U? z9DNr9Ri#<)zdY|8xe!kY+^T^1ct!{IU|UopY}oLATGmj`cjqv#SEKV26v5H z7bJs1ad7CJ;Qp5BuJ}O+3IOV9l&-y)B^fz+SN4tcQvtp^#Fg4$Ci%L~YYa-b(2j z>wb-aL1eu`fy7=(r+g0Yqw8ocoRRK)ZYF!cAxKF~#wnP7orqHM)XM<6c}}M&;uLfK z+n~U*;k1>e2fYFG$$lX0!0EOqFLtM2KKb_-IOlv3sGTwcxl&Nz_``H3VA#@?5kEsG zYT0=jbOk2fyTh6V--e*20HoqhupxWNSusPKrmV8S@x>)cH716dE8 ziiyzk(c8r5U)A{(Pyee&k&%=!|3CLAIC1dPTS>i;g+OgD;Maw`vH?q(bSXT!D21ZD(w=I52jX_?8Fped9p z5t3J6+}MC`6)%L@&xa;8XVfn}>l@xo4_q?ALypXg4Opkd2&UQufIK_^fPy9?MUT_N zwJkgzTOIMK&3cU`zVF7|K{`Qw$KApMDCL0C(l=p9x&^(h_GSTnTTt~b|7iBc5k}Jd z`#wb&P=cg3RxZ?o8-HX~@kUBvyT|u^S2=#^0RdEBRT4a07Y9^3l{k`U<@RJ33n}fO z(l^$hjQ;m@o4V9kSswr+b#nfIS5;iF2OJJha~6uez@5IUuALnA+kjFSfF9`V8t}Q@ zCJ@LSU$$HhoE3O&9;12bYob?-km{kqc%tw~lkUjVM*$0cZ4LSS%l3xiuBG0uZM&74 zr&xM~l`D1jFYKA0+3&41Tg`C7_@OjM(@}H`T*j>k2Sq9-y{+R4aT1D1km*#&Atq82 zyt6wgdxg1Z&`+(7S`7P2XXROBE@4dB4sM3abf8{}=%ux#5&_iSP zhfD=hPT!GG+ParD)mU`NxuVhstm$-%#QPVYoD}1&3SzZTAZks(o)>=G@JdnRo&Q_^g!p$VC9IqJNyCW-y&||fLcLpNx$Dc7isa~T!K2`n+zX9;)1-)2^}WC+Y#XWY1EPnysmpy2E?t-p#IzYyHb-O1qm2RU z$mr~7<#ORBsOY^#mw__aOT7n=IQONnS5K%u)NTEU>XPi|*rHUWfUqwXGSi{}PGo>6 z%U+viQ0Pq5x)7`GrD2WF{LY}IFCeq znKX;?bJ&?u`>~dYof_lJ<^)s!NddCmU<=TDH?LZVC&t@OLTRIsIqI;l^Ob}4-2Rhp zKriqU*nOkfC8qlkVH)8&lW9BZsLA*0KG-*ixobnax}nd<4QQZjZPF|P%bb_{QUcfFMZ+0ASkovAkg;XZN=aRImTW7xfh1T z;(+8F-4m}bSVg(JlNWNZe5d62T`j=TZk`Yx7W$qdvX^O|K?C7utH2POE+N9Y*g{_- z_0JhlPo7Vl=DRwmIrXCk!{+xe(Sf|Qlp8VceXhT1ZQ;ONS|sfF26CKlUWq6ZkD5J2 zNGXf2$rqjP2ge)o^hUNnd8n>=H0}qszN7xR*KtbAgXIo!;^#XBwPC87owRiSXT0&b z`zDZ8v4mRsTyj?(Ga)+XC}yZ}yja%_Cwr@fDd$ z1MG8sd6Wvhf!FpJ@5gyss)_XZO2^+42F_x_IHXA*z@*DfUG^ZS9g$DBijF(Hp`n(X z_fa;DeaXImQGUO_AX603#e~*!)^P8Jbf8U5ME6lWj@C>h7KZ&%Z&hdI5cep@Cqy&Y zG74ebQ7ry_@L1r5pK|CM7q!NAn zbpxL6gq=dINNcNGs@r)-`5hX~iE?x=GrE7UQ&W-=56cGX-_}CBvsEz{HyG{+EjS>< zOgjsj=inso82XKPX|ZBweVk!q7Yt%eYxFFc_KiE%gyp_*_7qlr@v+iQ;s>FFaS`j& zkB}?P-VF2Jnz{{qSJA5zx8o9R9b!m&5fTh?QY9U1^u8Za6n^fp0zA{O$ldr?4J+td zbu1atd9nQBk%X-|vfIL|k!>u1?u`kGJq6)2>A<%8V+Q*6QaF^xgq6GZ%ha`P58XjQV)6Yc?*JO3lD{w8^_U@ZXt1)Ih@omUYt+qv9sXSnXuah z-&~*4v=UghN+hPK#IFfF+>mpYJkL&)JnRMZzN$RP4}-IMzjC)-+APkC9-30TAIWT_MoaWWZZxCh|Q-48Pgd1uw6z zIQKmU+a47@f0-s!y5dnY$(pe%h^b_Og1tB9SkQt16MA<8lK-+^YQStWfD&qdJf(qz5>Rr7*-G;kSDLN)b1Qc8n)9qyj^mYR)Eo zZ<-L@MymbtT$sapgqXcUr}c+8gU8Ag=JS!sqT&aM>j^(CidwE&%|nEeFcOid&hn94 zNgNd)d_hKi&9s(9Bf|oOrJGQL8(=n^N4F^?D%sBbR_WPclrt)!7rz21Mhbs{pcZw2 zv6sKr>BaN7)BgLy@u?Nm5aaQrK3ACFJ#iedOXyz2dgPFWeqjt)5g1>b4G$Qh5iKLk+Al1osk`d$kNM@TxVEl~>- zQ52wYJet=;n;11Zx1n*otw*Z=bDyp@{~f|l$S~>KYUl0wt7ipwjA;OgQOoWC?DyV` z-JIL#*=ITZw{T4pE3&{kWbEqeX@(QdQ-^}rxj$GoRGk4ai-RT=%8GBc`#JOv_pY*k z6ewVILd!aV+}Ncq<7L#RSR0y~sRWEMO!5~f0cOs2kb$djj?gup7_{IZLXUZ%rZ{KK z_+RW9&-@Id=BA%NmZR`Og1tpNMv2T#yFm$4!9yq-ei1i$=St9CyRZT3><*bd=vlPi zD-?BZW()|mCQjZTrA<>Gt&bJz=XiuFXnS}_xdtb=Bc<|uT3qid?xo8f3!#4ry#SHl z4Pgs5z=A%GIH;_YD3IH$$)r7gPCpWOxul=%U+Jq6F=m6 z3YuLO9@KHPL02%k@;Q(E%vWG(z()=snK`9%R8u)yU&&QN50KAfvBWaaAp4WO1;2-d zx7FkpWB&T1;eCs5Nn3NP1Ji-!>|W+CRkWI5mgud#H-dhxK>_w-!;az_3fFw zznby5oOk;!9=&LxebD#(t;v=(+{+WCD|9H9Ak|7k5s%d1C?Iors1kCA!^SabgWkPs zEx}oFW8e!OGlg(nfZ>RsW0qjFq%K`xW7MlqXr*yh+F9(2DwqL3R*NdzPGlDs*l>N% zdNT!!Ga&X%r4rGj!E(noOK{L#HTsHT>Cm1aNKQMxYI==Fb=Z^ScdMi#NiqriFx4Nr zbAnDQ33?dQpi-WlWzmEpzq2)Bo+~z!Rq3efRbzbX9{FFJqKB~qU+>Z?HPKt^eb%k2`p3^!kxR zoNNd`n>7DYplhJ@k}U^98^?Y4+*CUXM??%3?SJ82@MqQVj93>G=8kc>l0RRZ-#P}( zs950GPmwY+4rzSsmE|syVx~f=+sl7i4hO?Idyw^A=xBDQyaim5sdIPQ1xjUZQG$E+ zFn;GlMX3?}V^G~>!Zi0m=Eh%>3R&Jo^n$g?U$$AU%-^7-PGtSNR$M{i)ym^ z{coa@(6AWbQf+eyUhoCTaji4fX9hp^GsJd^Ml9TYf=W9&pmOaJ#!}wDeqy!wm`6n) z*GN7~AptYd7MZfQAY2*Aogyvwl5KKHyt66-CkS=QjTbVml2&UT2|S?u+WK}Bsc+hv zXdo8R!N~GQy}6&K7+hhs2#&Sm?QjC3FxN1T8sNmnep35{X9#^~A(}H(oNMbPi%%^T z4$z;|2r@2^BGdi-Jv}qTwtJR6kbAdHU?)VlBPkCrgK5J1Tdym*WvpMNjn0wvoILNSB;$lsBtzQ9vU701w~iBw8%$wS7+B9aBrROVZt+jz0X zo)I6 zAE(2xwm?Yk1h7K8oH>@uG3|-YJ)F)02OmoKWgRIbAVV@mUB+nGyehz!3b-BD%Y5?D ztqbmcg0=*Q)c66{wc|JXM>vS~)x=Q2;TuqO94ph0h_7UV{|Y}0Toj3h(piNw{N6Ja zDH9W?rD z@Tx%^+DI6n;{l=k^)`lZD*$48bgGp&_0= literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/so_many_baneling.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/so_many_baneling.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..6a184e355eb0f724a53877c12ca055dc22182d67 GIT binary patch literal 18133 zcmeFYWpp0BvM%_VnK5Q&wqs^ywqs^yW~Ml1W=hOVF*C%>%*@OT_s#zHJ#)^UwPw~` z^LJV*K}prER;%l2sY`N-N;p#h0AOAm0009(015>GfI?9K02l#Cf%M;xzjgi|PW=DG z`+Wbz0PufeCeVN9{~h`MJ0|_#d_e%9j{_Ddu>9kXQ7w+96r~@sL2E|_F6!>U8GG1y z7C1`G|2zW#&_;5`?E07?42ERzd9j(+_kSZdY5mh4c#AdD`r-Z6 zU3poFUudcgqchF{f*?}$6v6{|l7Zu_9q3*?2Q)$^FtS%oDhKCh<&~MxC9__!{;xa^ z;YygyDu^G7(&5^4cUSW^BH!We!IM)+-0BdjtmitZvg(m@a~8)oj|Z$ozVut~9jTYm zafN71J(G!{d#OFuZe@8sscej?j=|gKMd}EOd~{aE-@r6r>#2(p~OyaQ0;pr(j}#{esH~q#A1qBKqqqJJ z7S$I06uR3eRCS0rg1MFRfTR7Cl@51x1Km_r=(_J-te@{{wx!lA&tq~Dc2!| z;gFAD5|)n5Q33f#smy^jFn`2-AUp%;tA&)TUQm;@Kn|}>k37un8p59=1nJb56l+nS zkSf6mgYOQIBPGid_t|X6Z>VN6o@%}p4u}P^Uo^-j=FjChM}d)S+>ttd&;(ZWKL(1( zr9E-O3g0eU)_tyk|8(+4`&ABZbm_ltrc<5XLUvjnP4>n0 z{wjjO^}91`(|Cs#sH?x;t^#D;`5Ie&BAIdF58(+t{7?PjMlXRgm5ll10n`>(*N(D~ zQ}+?Hj;;YPvLqe6i`Mf@p2!q);&>hUh_ff7@sIK|g{ru@#zzgQWQmaNs!`}2gA8ky zF)E`q?}Qva`l|d&1+e*^1D(@3(Ji_FkxF+Yf?44rxgbMC-<1y$w4Xobp=K?s6E;<# zv10}3O3pRkeuI3=JT~WSW22jlhn7L)0&|6Vpt>X2)zV;TSm>Le+TxrTj9AKENcONQJtqA{UYsHFdLl+f4QrZ*Sz2PsCGi@OI*`WWr>e0LqH$TsM8 zuANDDJ_=nI6oC3gMqY}3LSb~&#K^#aYRlNf0A$8S5Pp{x^q5Pf(>U3}8y%28T2-5oN^!ebTHcqksYc z`gPGZ2ZTTrS1ned9n=)U&YKUYfEP@Tms99tf)Bfte1jT2jN7-iC25fD{xMntz7nV{ z**6zYQGx*d!8Z-C#1rh}@9?t~NLj1c7ywlJWqe21-b*5WI#L$sw~b_czLwoRdAln( z4sz}6@?7#vHDB^U3df0rBhOH%mJu0qSZ^vxHcOz77C)Nd-K+Mq;zY@S6@xulSl)t5 zNfK@L_Gd84E}Di6X~2(c{XPBN3H}U=RHrbm2=mJ_C4*l+t|qlwq^YmuVOH4)G6NOb z%@Ei{2Lkmcu00J!Llxq2L|FzEP3ZLCPe!N4i(@30`lss@VXX=!V7R*O}wLt)NPaeu1gL|{*xK*;pueh=bE9d=kw|#7zRYB!undKJhd7_ewxHR z8zWZLhoRhh^guPz-PA+oJNm$RsDS`M^LXMd?7y**XoFm9lH`JaRKVwSqQT$Z-R`~1 z?QrJPzUl5Ge_i=i#Z~51VO_3Ew)Ax~?~0VZmUtYeTyAdoS-U*X>c{XMux<6V)kEV- zR5J856JwM0YAkcCiprAXG7}2JV=_%@H1rE{bn+8ps&!4f`*ko>(&NJlvLMX(i842l z=qxHW$w8#SB09diJ)jfMo|fsy(l109#HC_lKhix7zRHXJz)1fS!v*o>2lDV#`xt7t ztdX7-;uH)q+bgqKcbgzSUMUm|hHz~&q7M_S#nvvN`;wH!@cJT^lwA&e?1mO73R#lQ2qjik(gqh(Dsc{RwDG0H11}Vt_!%PKUN6D zj(W{&yx5<>)4XAuw6LzPOZ5_O6O4&nndj?_4yEnb7by;Dz#v)@#UGzLtLe8enT%vY zzD*D2h*Xr)RQ*|>&&r3iE}po4E2SR?c)^A1AO#=={DE;cfHpSB$mXo4VQ}Q&vhp>abUrxI_Ow!TavyF}?8SN?XY3}^r?=smZr_LcbcB>(Oh+Tb5guXlO6ylg9^eVb$KTc|m8 z4r7_2*qg|nK3@?p?SXJcZLGgqNbtR@KB%$nwD1m2w`N*0V%p+sZLY-MgwU)e?FKloCAXlgPAF>}JdkY2G-b-kFP!Zb~Z{}sfptywh8ceOH0UztVyc|&>s0a5hJIy||u znwDYK-Jad+heNiMDF$$?H>AqR_c0-dQp$_)BK zg*=C4*ZH}Mm-k2Eno0znl7L6ltFCP2`t}Jo_SVDy@k&(mo4S9F4Dq0IBR7Spm~!Kk zpWt0i3jO2Hetq+qT4bJ(OLKyj- zzC<6|JpPGW+a~R@wm$0Y48AX%Y4_t|cqco}HCs@x5b`fKAQvfa4BzMqwm{yQ<@+Qu z2`kLYuHtZ_qxHUvDv<2{P_ZW8<`J}QxjRAFqj zdDuqjdrjP7pl=@0a_Zw#Fwcd10%7b7ktye6L;7TZWPLp`OBEA4<X6m;1jw;sf}L}(l$yhXO0`&3KGQk*bW!7^ybhgLe5xw?1>ZFb zpwbzM@5L69ktqtAJGVaaTKtDza54zxDy%LD83uzJ7pme7ZGzDip9< zTquscIRQ#kKFWrH;|9(h9%jV28v(!q15%mUw51w08ABy@IK^0?fM5YEA5YS^?qx#% z)5jkWEXNMj8cHqQqqSfgK?F^kEt-W}ML!{+(E0M7>rSpAe15f&i6}QIlIusw^++bH z6aJoXrB<-^zBH`1FYYmqt-Fv+ZK#0R>%F?+dcbk9)7mjoLIx%inM-BmPU-4jM31Oz z^AyR67$y?eSmFiK91yW%zhFHM<=NqQ`+T}hJ;M-sl`55R(~y-)t&z5Ca0T`LQGV%9 zl^kf@L%juU!w=7fWesT>li4o-%Q09JW*z94~VMR@1aT3eDMsi$~D(MP)^ot0apReEkh zF|qh2ewdYI@YeGYebU_K74PY6OfEWz=uxhw-;8dCBkL|9SLYRDe1}PC^ThdNVsoDC zEL`6#BmBCMsC)($%@x{}u}?5X%>Ns(W4*h)yRsi?q1{q6989A{tVuf*|NnpWInu}nqZUyz<@ak2?{TjQwn zlBzJTN#z0qY)p3gs@;kpa@Zy9JwDy0I?P5Q5-OWjLZl8`+1wrkyBSP5cH#@NnD0v! zhoH?>TKX?4(96%v^k+9WtTg=&`-rV^)rR$y$T(ebLxT~Yw%_}=BsQmTx`zv4-!{Aa z(m9ICe$#tfQHXFLHxK&Qp53;#ELIB{!`&KWhs8uf1u#y zh*B!_8d!43(||r=L9Wi1U0it3oN=A#U=0*+5guf=!FDY{T?9|UwQ04a`LDFXj4X7p zp2i}v1-d$h2$gb}#qG#(O!R7gcGiDHzk*eTj91#ZTouoo8h>V3m!FEIxuG~EyP|}B zul*j||5P|)k|gPjB9&^JKU!Fo;@)||bIQ=->k{3(s`6!^VftRi7nv{Pv8Zy)*WIzi znqM3;SxSNCwlv6!wfQvs`#IlX2p%oE#?O9O40UYd(BTpXeq43mkU`2Q4PiDS^v9xU z2<&Bm_~gBJW|wTnQ(9?drc@$!bhVyB23gWv<*RwI3eO}m6mpS!g|t!`e4!DFyjy2x z`5XEbj}#iL8UEDSUicqT`C7Wh?swvLETEo zoUou0LR(bOco2d4L=NcSG5;`8C4_dUB=I1At*vbM#J-iZ#hlX3v}`Fm?og7=X2i2Y}EiyA$NAVK4=#DXSu`>+zax<$(a8Iz?m=s3C<1kdYQw_3ugO#i33}kMQJGgk}od+=}LWuthxekbp`|F8pI@2RRvxIoz+5S zj!4gmhIk@t9?`x?ZBW&hKDd{j2H+vUQv;>5aZrVEH8rO8q$t|sWx1gvu7>9YO$&}h ziXB>Y2OmRylI$t5raGKEaT0P@M6%Q-_1PnO~?s4VaU@LmU53NC& zT!6XyW$jcu*CRcO*|B$Qrg|cV^FpZ-fYHQ)q`wA?`3fGIadUWs27Sl~{cU*0y6Y}G za_BbVmkgu^Ci2a5j1#jkXo8ZiTXh85_ zca_yIcOrP1J=llGfVS%<&3RIs#k?zO{^@M42n zr1v=y)Jow$3$ija!t@!?iz!mJFD^f09BG`m_~mGv;CxV!+CNqSc`z6}rNd#{eVTxVX^(=#H|cacGHh{Tp>v|4KapXlobu2N zLM^{y#URmj)Bhj2%Ani>o&Hw=s?_VwVx0kRRH`Q)81%QNzlrNKaM%xVPze8bdLZlm zD=-KJa^9?gWs8SoidV(@l0>_)3X`*>l26;_nu1T;L~ziX@qz=7ZMwiZZja=!=sve9 zz@%9sIBX|zV30tZV9%leMPN|%qWsn(Fs*m>2WA3RK1gWb8(G?eLX5irS%N}-px=C)Bs)Pl*)((XheU%&VDeGkc%zCO;0IXY6QYZ)NNm#xBIL{3z(DpISZ0IYJLtCznk2J2P(Mv_*{UHErnBan6OH*rp<@quLJ54W ze)`u|X&T-HY|cXWHLQGO$+nb(`nBqMSuSw+g-mI%>R04tb!l4{X=m3YyLq7P;b4vaRTSHrEH8JBHS zw5qMq8G~@FCQ&!TjG{{Pj>|?idzS2)=?=>IlxBzFa@(moux5*o)N0NfCmQ|X-`BDM z*a6+eEf3$lC%voZpL3}G&*!|;;KATYs6{B~6MM=|fh2c#_Yb9=cO$RK~f zUZf1eUsX8r69hm6-!CXmMSAs$^aE7wo40vl)_aBgjdugsf9Pu_HxPqMkdeP)%gnF< zCTMV>uDDNsb>s?CXeriNJLh+?e)2 zDjfl4L5jd+p*laTcOE3^dJvdryn86h1&Y!B=XI|>Cj>r5$qz>pZpjhvcoFA#;P2kN z;K2Cw7M}(8Pq_)PpMAEnC!xgs{O7uPHyd%%4p-H|hzb9C>gvFxMZvLGpzr4Ozi>VD zwATOl-rn$j>pwOqI5a3YVokLF75SDQ=;Lk|oHkbAG<&$k{{<4Oj-(vOV#Dw$Bi*Wy z1ZFh`kUW1=DJ&Yce*>0aa#p6~z+rgaF+nChK2{5t-IqbNQ<}Tts)=;0FjZZPT5R(M zt;)s6Y+TlHbjEMxZTBmKxXkwdH-NC5Jt)p3ANmG>dM?Xh6zVKH?2HF{!r5xzy$b|X z@72nKdq6pSEoMjE;??&Xam<-TAZ(l3DamDN-}OM3RihcSERi;S!r!0kXYuJM;`~|* z?=J93K2SQe|HN53M1Q5ZcKxxa=`Z)}+XMC1X$bLb32iF6>k$b&+3y(NRg`n7Ndc0s}VT?Y}$ z*C;uly0G|>_cZ%C`2g{0;68P?FAn^-UlSL9T);xttT`vl%HZ7YfdEne7a-gwjJM5)t{MUHch<9NrO)V3e}cEq z4mu4$4=6OIU=0BDxaV0v4*~qRXPg7M|BxRoeA1U9E_IyjU-WIAEbcE|pP?2+xVS-* z$Om~tD1d(AvgCkghf(&3|50%*-;u9jcIx8E)Eg98`*z*AIe*pZzod3Gb#(m14uk~) zxUSZB%}EvglEF^p*9Uc;mc!IV-}R58z0xtCb;8ppp@~7v7mu>-*S>3b2j<*uW&Z8M zTW<&?)1sI`2J|h{2`iHTB-b~sJ@`YeLC=Y6kS(xor~o7YA;6FJsfI?ucwC1-fKFyQ zcLRtB)j&je-wxXOUi53cGO{f2i#K*D zfgIg#AVyrAIQd598&pkRQyr=LqCeI9dnDZ{O@&tC=gxL?$hDwNbzmV9f`=$P)42r& z%q~nM-?~X!6L;Qxn`q-@2nB0<-UZo#8t{9FkGp24i+cY!0wTixKZxLmgVpTn*sXBr z;meWo{R#P|yM9TWn_wfGXt1*DH!|%r?jPpE+WQ-{KdGQi-_xv`qwO%7ZZ*2ksZC++ z`fPuYZoB;wTkBkO^e)|H=bsbmqqpUtX~uUa-Cxo>t(B`aB6Oy2{MQ%8s>z@6d)8I!SA}CPu3nU>C5}vT)b%Pe*RocrrfB+G}NYuIGuihIb1|kA7 zIMa(eFNq+yVyxHq^)r@lT-kf?7k>X!F#`ab3}4gup8iVpFaswRfZn`&1zUK+y#J^d z&;%j~0D%1e_5MHii?Kl-aAF3upa7v1Ae;O4fIIp@E{q(S8}{pO=PuPE1Tevach>;Y z1C@>};xvNrS=dRZ6axi&uKk0UQSEjUjmi8n22Bx&;Rn6_8Y^QHa6r@+h8v3JOc&TO zp5OE7$w|^d56j9+cu2o7VN8W$zTs%V4?+{LMB;e!R zZLId2vce{2f@ZO+P;gw$v18u18;_ljc9fLjgGDgJ&L;kFzZDQ@2n;2j6VJ?d5Bd4O zZ0UQf65xLH5`Iu7E0}S7LVVb}?a#OMf$acXUiy|Ch}MP`?pH@kBaD%A+1ULPOho&O zlm;YlQbY;R%ydw-840_-40Sq4Q0NzsZ&nm<>1Cbkpo*bP&mzfJz!qQWI1Bmfx7w?C zq)A<{C~$9Wqh~o?i@&D1wfK2FotBP|I?#MLk`ZBy7jjMVf)z?XwOlmBPOTF^s+Fa| zsul_Nkz-I zAgJyP)|iTV=Jkh#;K|DVOA5OA;w9Aavz@Jct$p;O%S~R6&*bRaF|mrItg_T>mb7B{ zR}JjWV#6mzuvbhYqHYo_D+mzGwg6`kb?0N~kR#omHwxe&N|qCM629?36ExK}0wdKe zLk}A<;6_bUGF2FQSCA+xW0Hj+k44Y>ioGY<2LX@&(-Ki!lcYO%7fyCGxvtXVYZ7_% znI7nkWSh=rLlo|{giVQ;kHSszY(%4>!LJ_8##D5j{T_rqESx3x{O^#2ZEup#$45-T0IoK8cD?bE1dJ)L$I zRoyz_zB4_Kq}Qd&8cK-y;wZxesR3JNVm%81KSIm`mH&pkm0lrY6nfwG767ZTn`jra zkg6?f7c&BT$rZe+v#e*#@oV*sf+xxZOvp2{!(7sb3ALZ0B0cgl0}Pv!XH!rso^Spe zBBTNG_VEg8x07#rx;;u&l^(pVaD1v_+RXf~JNg@huThC3k(W77kVX4 zWchYA>+-n{DOD7kA{u!Tvte~_sno5)^$ihjA)Cj;s;XAGgB{_7YCHIN=2_ zB4p;u*d3(&WyGRHgLiXlf62HW&MW$j(Wb6a!|#If(bF+79l=`NJQq_o2xujS09$Yv z-Czd4u-r+yyy4I3Sh_Txg?iY_cIKX3dPi1wYO0wTHLW+<03iYgd>hUsP*06nbsfG0 z{7hyrZ71$Fe5z-vR7D#wV<1*zlyNA-Z$ngl$I_c>7Y3@U*Uwzc?!~h?cnV0!Filo0 zZWbmVzz#x;rR8S;8#p=$vmD(3+?yN0z8UCh7syE&Sj@9z)e9?86%H=|9WrVwjuQZ% z2&Fi-1rA3j<+FWjJNjEBuDb((um(jHsLdi6c&g;olL&J`9oNRd`9LS)Q5NQCBJm;! zCi+W6%Auc}TQo*o-hoiunGKz&_Yj0lhd(OCLlU5_(9;X4DuLj`2LbqOiI`($6>z2? zWEyfXvoyYD`Q;95d9uH=Y_{J|a~Hrq-1{`0qS0Yg<4@J4r3Z{d*~g=+S%*D$ufJ2;V(6Z46kB&dXJrmT^n z?tZjlyFmS-*qo+LOhE(@)mcPWT8-+A&wJ>w7R1XePq-db&GBzP0~z2fkV^T`azB`t zHwrbp$UG?D`1_6VcWG39WRlw8zb}o#?>d7Xdu|elv4UCxYMY?g5@26LLFvBkqt`y7 zxZ!BM{9BNrRPukCV?>RmrhBvgYfZJvAJRCW|4-;`WzJAZUr{wS>Cy~PY+l3GeuWA7 zBc|WKd0%8-QdRK?&Uag6KxS~xO?%aKrjsZUZ!W_zZkMUH^3%6bis+~6Y!SOlykNgO ze=gzXZI*1qir00qPMLa-Uv|Er6b7V&RI$UZ47(cbDMt1d44^%h6e0(Do=>`2Nwtw2 zpZe%=yrR$>#gldWmQ&EdjvO~uNw3CGwc}UBxZEWU@aEPp$hoBI&!8gYUL#o_b&htPgy;BHtJJ7Z5Hxyo*c1d88N} zm12LiHl@X$P31tHE_$QI+uF?6ajkqehc%Z}*xGdB$&d)CJDsrW--Ke!esLhub$FyC z2Wv$h(Z+m*wCIT?nQ)G@Zf3ELg_Lt=@7}9Fb1f?m;)D@T!cBE65`=%Hic;l47g7azWiZ~R-`mosnYv}Y zv;p565A!&PFEOGP9L7eASY~AwaLLg%OqmL0F`hp6iRf_92}IdPDGFKJa*@inx7I5i ziW?IQGacRbVTVv340>s)XBJEN=|2Ho`8y4hMl@^i@T4G9nzw`KXyP}8g?i=`8HaJC z$&@dW%`VvNa|DG*<7p=zzARbeK=?i^7r#aoa$UlK8@Bbd_P3Lc#iF^7?rw|3`{quB z<|!*nu(Px7+=rW!)(JH4X@!RZ7B9nw0~b>-4V5}`)c#NLKTZW+6~>yk;^f|wvq_P9mH95QYN}0#fvxs7%)f!unXbvg(hkjxzN41V{iYV| z0x|MVK}rq8+ejf=@z^*_%XW40roU|K5;AtNcVd(`v^8baGBvcZchOgt<@>J`0<5-7 zyPDL|t)*}9!CP&Tu!g3RZ+4yoA^!z61HaKF?4#wH(Ras=RP+#zBf_%y;HN z!c4=z%J3lR9oho>nim-Ib}IuqeE2%3TRg(=XXIv;`4l=;+sS{CNQy*edYDHc0S*?S zkz#Sad$$AWkJdiGK@eGV;natlt*9iu(ENQo81!IW_ho3&qJnixn6+s%VIPs zIft+i-zsP`_}ymNS0mhpGs6-^?V=pAm#!VvT8p~tUHj*NujG%q;&1$Dq@HxfajD-RUZ^OM?aOkD} zT%u(zpXr_lO@0^MWfyh_KY`ug{BZ3eV`yNY7+`b)2E`^>>ZdH%J*SXC9jqo$OR=?} zkVTzzLTLiJ@0X`4V5mYhuYj+=#bKCtuhJK?jf$1j7C^8KG-p;OKzfoR#)Nl$Z)7L0)I z0S*E3f;u9M5eT?Y@`I$J70-j@0?a~kisF?c5%4^mJ0;hp<^s%ugF-;%h%Eg88#y&& zL;naRD|JIjfwB--iJHo$;H2Q@%#1Q6JuBrrER}KvQt~348$0OD^tnhqfC}&koSN23 zp!;g5iNDeUTyOd(@l!(M&VVg$NcorQ9^6z|aSwkZIO=<_s-ZFU6{Ml3SzjuWKEfpI zDKnNZhiZ7gb4CT_EQl^@Xb)<8{k(V+fGYIANgFZ{d8CAgQ8Bn>{T2uE?qxJYs$5C+ZJ<_kqyNndq2W zirW1bHQ@ALM0zYBdk0lrSfxqW%^n@DsALUgFe5+9EGr+!`V`)|nB*0y;Li?5lDxK5 z>O>eFDy-9=2?G&f_wH_)T-dtN(g}2X2m8^9^Y??fQA4u|`F>VE7{37YHIT^ln5gfS zS}!2U^r+?i-#ahZ&=NSN%mt52*hQJ` zB*7KbVy)#SurSdBXnzvWcq*O5q-!_f=3@Q0%|+OnfvO+9fnS#3Mx*B&e=Hv{h1f^C zi6}>dL7|A5G3cgv3@S*=Pmq<=wjFDCm|dT-o&RV^x2OaEReQ+24`)V1cw_EV@r_ds zg+n*ix*XgI>AR5jzJTurZ5oVSYUW#fZWmE@VZLN}wn02LIkIsfY_zrE#pTtsS;&DO z1vJ)P#YKhgQPTHgCp#a%>QbRkRH?(-)F=Onlf6&(Y?o+%KM;R%Ol;*}r9cBLa6FFg zv>RPvhU8{p&zebw#&g|wZSar&xA*Z;gUB0HQ!OmaTFiADn8qqvBl=c-i<3IuxnHoA zp+`R%bR@KYqiyRPx}I~NSl;>%a%g@WV0JF9+gjC}bL+w;y~%mGOE2_nZy!mNfZ(d4UT8JEi(1i|&_)4kEop!yuMAQv(Max&QjenWUrn57W_l zu;a9Un~v6OKt9zp)OF&4(N=cVbKHT)@sj`r*R^HraXFAXv5x$aUF5Ag2}`m9s%;Sp z#Nvv$?vyJk8*0MoAnNeuK0ANYO?!mRGT!LA4xf#5r}y+zcFmlvH#rQ&8;Yp zoE|)7oWJ(q@#5u9Cy0gll|U>zAiHM0iLc7{lvnCmUg!N;Wu>)Fxz%;6I9kf zlejdzuUYBMo~}yt3)!7(DqrvOPj6ebI-XVa7mDxO_4E~DaP&DK+p67FF5y}Cef)R? zb}|&Zdwlih%;tiHlZ4D1`m(W!K}(9J9?)nCoN$n*Wx_@5zM!?%uB>9%>0iaDSz6hi zS*`MSl`DMPKY8(ZJAAQrJ$FIlM?@qXHOZ9F3$eAzq+wAo5y@gh`-nh8ApG!*` z`(A8kw!zKf{PDycE^A|>O;?BKkz~+Q-ArwbCx{_*3gm6a3rn0ztZAc594MLQZ@|== z6Sc!{z>G4+SYgtofexY@Rb?$8j4Y&UF6dWK^Bpn_>t1Mhcg9iBnM&MuEM2%@`r2z~ z`-&hO)|?s{p>GomC}LmPh4Jh{) zD!8;0fpjpezOXs-1*4Q`@<02WDY0&#M0l4&`pFz{Ol>J+$E{7UspCGzB)L)-@)drW zr5k6a@!bFYl<j7Im?+aU-aaeKD69BD8gZB@k1u?8dBGrfd;%MPh&+Fl@CsCPW zLn5$9H&$NeKdEuuL2XZhx5t%DYR>qIC&Jt+bx zM6v7X9x6ZRX!BoB0jx+`oVy1UV^=ol0w$wKV%H+lT{;nj;S0d3fiE2z5rkDYUVDd3 z9Oc{mHN^*=9OX!vehSy^S?hWR6g3vqp|s#~0FBefjS@Q0PL&*}8VHiLVr5?IT0Ej4 z(YKxgrBIVj(ilvGF(MH`-tq0u;Hx*bk9%Z7Kf$X461v}G`->` zU$api`{G%^V&sZ9F|vgE%%4PVz&1sGa1kAKc#KR21PQJed=v5j408p`-YS`)wwnL3MH zgk{OvTcetVIH3DWPX!(+L=7fbj8(*Z{}zmZ(tl1U>9WOKmj#Ws$&GvDGbq37dsVPN zqgK#fg|#MtPO#hO>S;*n=OVZPG4&Jh9H9LhZeIkXjsc5j;sf&{sLw~3}E2zo%@rde27V(p_=_d5U*yN@JP0cy8y zl9kB+ZNE3gnPxa|pJmsym`P-#5miU9NbOB7yc_vTQ(iaZMDK1BA%Lk0dvu=3IQvNq5_Z)i@9xj~(lBWE`-x94A}yB*&~3_!vwx zY%*JwDISwifc4Y6j&^7gL3equuC`oE#^<*W0kwKEN8Ig7WI;vF!O|Uk0ei~O`2UT8 zvQo0<|8t^W4{ABz!jb=X`$UmCezIMPX{0Rf?NYmJa+F8e>4=Zk*gsowlMeSg5Sf`!w@~s`Jru!*5huA41s1E}z z@6iObI#TN$=`10_15FVkW>&_zF_rZF3wrL;@&oF-MW68~K zwotvTG;X3`v2gXaZVIeM=vxkN$u)!MMo%7nltvQ}aAC-1KJdR5p?e94BkIs^RT^~@ zURTZ%dw|$0;}hy($%JfRy9G4X^91}bgHSi_3!(KQkIySuzd0xwV#2$bWN(>eUFy#H zbgzCuo(MGGt+gSe?d4>>z37}E#(xpPNCHBP#N)6FPDnxbQX(SrsFKmr?FtSt&c40O zL95sw88=jlu|Ih8$*YH}3FvFJCt1#*#l8w0r*mrDJ-j|QKfKz^a%AgiD1%|Ub?&3j zKwx$jzXUi0>M-}{&${h&B|dt9c_+sj^=;39Xbi_zgW?6-zEnQ;WXn=Hm=2hW-tBeX z@wCmF6Md&lMUgE_7ml=SN$ykK4`p*T5HACJ(#HXS)>dYnIHNnqOyGj?ZonKJm z(uw&8!Z@oBCSI+i&pivM5&c$#m>ZO>jir;rpSem=1I;eruKr+r`9GCve3R$o{MJij zSWLi$Z5%`2^Df}Lj#A|Dg?`|*{K3+qrW1K`gcQ*}0{K-13g}!NrP@{$IhF}-xjSHD zY%M`R`<<|O`<7MJy<*WTQBZKoy`yXKp>C9~TjX%@f#>9pt7R4U zes4)JRh+-SejS0-G07WdMLBNHkr`*8Y*>#O9>DEW!fwJ>QHbesO8AE;ueRwYOD0DX ziq8PL{ySQ%koTJBtQ>7|UtKjbDsL~H{HM;`Z*M`f4$$_pC;NJxskbw2m`M#!Mn61) zMCOa)kh0Yg&swWmwPuq7%2m@53u8+N;(d?t;@$Pgs_6QZirP{~gc@M%SRmk!RgLSgrdOU~ zcz)#Ksqm|#21;c#kBk1em1#CjUPvP;>aeUVBJh0%g&Jdzle%86F3TklI;~dpG^77( zAY@-!1A)O|hXtqrkzTedcqhMp7{exP8bg7zFeJwGEEPXw-t5e;dI9vjIFk98VGRy7 zEAgy%<({bYzyzIh4}Z^rbtV~2m=MO3+g4ZdFYOQ;wnsdM3*0Pr;7_WK^yQ?e?X{9+c(mrk9%W^S5@L=uQLn`h{TPkjTPmKqp7&(g97vv- zL3pR`weDbn>|!7i{(%m~gH-!Sj(^x7exA%nnaanIH;>zNr{O)x*T|gz&Qs6TA`B2z z18fCX#@7CfzMi+kOg`o0{r;5K{E)Y^!iYos;yHef*jgI*6wP^c4Am8~$>~xy^g>5u zNoSrXYg3C|qES+^C~OsE8I%u8A)_%^7@f$BA_(I+_Vok2te3Q0#Z9`xiG5~M&ku8t zplhNLjU||9eOLz>Twv`1X`-#2ymtNPl05)4Ic}F~BSsDUe9#Y$@72jXQ)1T1iq|%a z$QIjB1t%6&s}TYk+WqR-&)V(la$h{0FjEzt<84ruM9qdV9o7U`bsl$i)$hGywg24o z&&t&2Nwv(9*6wVdTNf^WjP(mVq+hUW#JI~l4gT9QH0P6nC88T|CGJO(W=TsZimsBr<@X6X-|{YYE`cl@H2m>ruaqe~M(uL}!e&c_}X zRF7Rt%Q9>HUZg$BkMbukGfH7cQ>v-cs{%l?B>i8Bc4lzCBy*o}tt(>&_^c zQ%7~&Ims{8n%oo(ki`S7N`HkU-H1~il55Tv;u-8a_m_@gQd^12sji*azywN}Guq9& z?Z_RI7qiR57^ObOmY0G-N?mx98hNX=*t}RZdj>a#-_nOd%Xabd~_%vN!0x0ROv9FLnSrjA@^kS=a(DLHsia;)*79*+iUTh z=-CCkzS`d<$YJ5epMkFNNA-HIL{ME)*|*af9SN9E<2(84^`Ip2HxuPoR>2iVfQlR1XROp)8;YZ6p%!Loat3D@ zSh2)uHzBPdrmaui@MBnb)F=WC44~}B5?bWCyA9bPKJ8Oucs)wJ#L6#bl;FLi>U7-S zMOmt7axUT+R8$-fg%VO|H}FYchI4-vtRvF8G(qD?TuYJD9}#y8R}#mdHnkn_CXMfcH!WX~rpdQa z9hGLtd+{ZfNFZ#|ybB-52?CF!Woc6{Tffg|omhNgb7#OiaB~^gHkahHpMxIRp8xuk zYQcW&Pz3%PyNMUK@^RH1DFEE2#r}T<4g&H0?nn=VXW)*{V8ROHorI6hVjt|$XO(HG zyL>lt+zhQ|bDs*70)?~tT?!H4$X*xBK9peX!<8w1N+Zo#y#foFabZ0QQ5jk$%zZ|s z_%Vup7A6GE2;j3uE5?zcKa>Vhjdc2(owb$Ur?I?zLGGGUMN*}-uI!uPk* z3#B9Ksy(vz5ZG{m+v1y*rJ7V|1Zh=ynqI+A45<9Up0Ec|BuGJ#k0lv4mn`x`owhxW zPH!JP&13tD&i9O(PiytgOsWwW0dIu@EwucKeZ$ash;3#$LmBP4v-SWANyJSSb22M_ zfs4+73KmtD3sGQghez}=n68IYr-*2&LMO$9@kv`k(133l;gJX=E5*KWm`~mxQcVJ^ z?-5&di^=*D1JJ&vh(;DDrXFN^5`7?OyICS2(~CG_K)d{vZ5mn#DNO>q_4h0+I8mm_<8W^gW`w)CP6!s)F8Ab9wdd*$x%h3*i;3#14v^*= l2M9{X@(-}3{+C4FEYj96bPyO!0~YeKmCbE}RAmb=kQikg({KO) literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps_two_player/3m.SC2Map b/zoo/smac/envs/maps/SMAC_Maps_two_player/3m.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..3fb426d93a7d00dae662da2fee566e7883781fd8 GIT binary patch literal 14835 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 Mpfl|<(O$Iw4F>Op^d+vRHyZ60k&z}AJJ#U`# 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

EswrsH@WguVO__SE=kYYSBUR*^#Q~b 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 RCZ8bgUyka$-lBT*e*tfIrTG8= literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps_two_player/__init__.py b/zoo/smac/envs/maps/SMAC_Maps_two_player/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/zoo/smac/envs/maps/__init__.py b/zoo/smac/envs/maps/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/zoo/smac/envs/smac_env_ace.py b/zoo/smac/envs/smac_env_ace.py new file mode 100644 index 000000000..3676a0c3a --- /dev/null +++ b/zoo/smac/envs/smac_env_ace.py @@ -0,0 +1,753 @@ +from collections import namedtuple +from operator import attrgetter +import numpy as np +import random +import logging +from easydict import EasyDict +import pysc2.env.sc2_env as sc2_env +from pysc2.env.sc2_env import SC2Env, Agent, MAX_STEP_COUNT, get_default, crop_and_deduplicate_names +from pysc2.lib import protocol +from s2clientprotocol import common_pb2 as sc_common, sc2api_pb2 as sc_pb, raw_pb2 as r_pb, debug_pb2 as d_pb +from ding.envs import BaseEnv +from ding.envs.common.env_element import EnvElement, EnvElementInfo +from ding.utils import ENV_REGISTRY, deep_merge_dicts + +from .smac_map import get_map_params + +races = { + "R": sc_common.Random, + "P": sc_common.Protoss, + "T": sc_common.Terran, + "Z": sc_common.Zerg, +} + +ally_types = { + 'marines': { + 0: 'marine', + }, + 'stalkers_and_zealots': { + 0: 'stalker', + 1: 'zealot', + }, + 'colossi_stalkers_zealots': { + 0: 'colossus', + 1: 'stalker', + 2: 'zealot', + }, + 'MMM': { + 0: 'marauder', + 1: 'marine', + 2: 'medivac', + }, + 'zealots': { + 0: 'zealot', + }, + 'hydralisks': { + 0: 'hydralisk', + }, + 'stalkers': { + 0: 'stalker', + }, + 'colossus': { + 0: 'colossus', + }, + 'bane': { + 0: 'baneling', + 1: 'zergling', + }, +} + +enemey_types = { + 73: 'zealot', + 74: 'stalker', + 4: 'colossus', + 9: 'baneling', + 105: 'zergling', + 51: 'marauder', + 48: 'marine', + 54: 'medivac', + 107: 'hydralisk', +} + +switcher = { + 'marine': 15, + 'marauder': 25, + 'medivac': 200, # max energy + 'stalker': 35, + 'zealot': 22, + 'colossus': 24, + 'hydralisk': 10, + 'zergling': 11, + 'baneling': 1 +} + +actions = { + "move": 16, # target: PointOrUnit + "attack": 23, # target: PointOrUnit + "stop": 4, # target: None + "heal": 386, # Unit + "parasitic_bomb": 2542, # target: Unit + 'fungal_growth': 74, # target: PointOrUnit +} + +FORCE_RESTART_INTERVAL = 50000 + + +@ENV_REGISTRY.register('smac_ace') +class SMACACEEnv(SC2Env, BaseEnv): + """ + This environment provides the interface for both single agent and multiple agents (two players) in + SC2 environment. + """ + + SMACTimestep = namedtuple('SMACTimestep', ['obs', 'reward', 'done', 'info', 'episode_steps']) + SMACEnvInfo = namedtuple('SMACEnvInfo', ['agent_num', 'obs_space', 'act_space', 'rew_space', 'episode_limit']) + SMACActionInfo = namedtuple('SMACActionInfo', ['shape', 'value']) + SMACRewardInfo = namedtuple('SMACRewardInfo', ['shape', 'value']) + config = dict( + difficulty=7, + save_replay_episodes=None, + game_steps_per_episode=None, + reward_death_value=10, + reward_win=200, + reward_scale=20, # if None, reward_scale will be self.reward_max + reward_type='original', + ) + + def __repr__(self): + return "DI-engine SMAC Env" + + def __init__( + self, + cfg, + ): + cfg = deep_merge_dicts(EasyDict(self.config), cfg) + self.cfg = cfg + # Client parameters + # necessary for compatibility with pysc2 + from absl import flags + flags.FLAGS(['smac']) + self.agent_interface_format = sc2_env.parse_agent_interface_format(use_raw_units=True) + self.save_replay_episodes = cfg.save_replay_episodes + assert (self.save_replay_episodes is None) or isinstance( + self.save_replay_episodes, int + ) # Denote the number of replays to save + self.game_steps_per_episode = cfg.game_steps_per_episode + + # Map parameters + map_name = cfg.map_name + assert map_name is not None + map_params = get_map_params(map_name) + self._map_name = map_name + self.map_type = map_params["map_type"] + self.agent_race = map_params["a_race"] + self.bot_race = map_params["b_race"] + self.difficulty = cfg.difficulty + self.players = [sc2_env.Agent(races[self.agent_race]), sc2_env.Bot(races[self.bot_race], self.difficulty)] + self.n_agents = map_params["n_agents"] + self.n_enemies = map_params["n_enemies"] + self.n_entities = self.n_agents + self.n_enemies + self._episode_limit = map_params["limit"] + + # Reset parameters + self._seed = None + self._launch_env_flag = True + self._abnormal_env_flag = False + + # Counter parameters + self._total_steps = 0 + self._next_reset_steps = FORCE_RESTART_INTERVAL + self._won_count = 0 + self._episode_count = 0 + self._timeouts = 0 + self._force_restarts = 0 + + # Reward parameters + self.reward_pos_scale = 1.0 + self.reward_neg_scale = 0.0 + self.reward_death_value = cfg.reward_death_value + self.reward_win = cfg.reward_win + self.reward_defeat = 0 + self.reward_scale = cfg.reward_scale + self.reward_max = 1020 # TODO: change after the env is lannched + self.reward_type=cfg.reward_type + + # Action parameters + self.n_actions_no_attack = 6 + self.move_amount = 2 + + def _create_join(self): + # copy and overwrite original implementation + map_inst = random.choice(self._maps) + self._map_name = map_inst.name + + self._step_mul = max(1, self._default_step_mul or map_inst.step_mul) + self._score_index = get_default(self._default_score_index, + map_inst.score_index) + self._score_multiplier = get_default(self._default_score_multiplier, + map_inst.score_multiplier) + self._episode_length = get_default(self._default_episode_length, + map_inst.game_steps_per_episode) + if self._episode_length <= 0 or self._episode_length > MAX_STEP_COUNT: + self._episode_length = MAX_STEP_COUNT + + # Create the game. Set the first instance as the host. + create = sc_pb.RequestCreateGame( + disable_fog=self._disable_fog, + realtime=self._realtime) + + if self._battle_net_map: + create.battlenet_map_name = map_inst.battle_net + else: + create.local_map.map_path = map_inst.path + map_data = map_inst.data(self._run_config) + if self._num_agents == 1: + create.local_map.map_data = map_data + else: + # Save the maps so they can access it. Don't do it in parallel since SC2 + # doesn't respect tmpdir on windows, which leads to a race condition: + # https://github.com/Blizzard/s2client-proto/issues/102 + for c in self._controllers: + c.save_map(map_inst.path, map_data) + if self._random_seed is not None: + create.random_seed = self._random_seed + for p in self._players: + if isinstance(p, Agent): + create.player_setup.add(type=sc_pb.Participant) + else: + create.player_setup.add( + type=sc_pb.Computer, race=random.choice(p.race), + difficulty=p.difficulty, ai_build=random.choice(p.build)) + if self._num_agents > 1: + self._controllers[1].create_game(create) + else: + self._controllers[0].create_game(create) + + # Create the join requests. + agent_players = [p for p in self._players if isinstance(p, Agent)] + self.sanitized_names = crop_and_deduplicate_names(p.name for p in agent_players) + join_reqs = [] + for p, name, interface in zip(agent_players, self.sanitized_names, + self._interface_options): + join = sc_pb.RequestJoinGame(options=interface) + join.race = random.choice(p.race) + join.player_name = name + if self._ports: + join.shared_port = 0 # unused + join.server_ports.game_port = self._ports[0] + join.server_ports.base_port = self._ports[1] + for i in range(self._num_agents - 1): + join.client_ports.add(game_port=self._ports[i * 2 + 2], + base_port=self._ports[i * 2 + 3]) + join_reqs.append(join) + + # Join the game. This must be run in parallel because Join is a blocking + # call to the game that waits until all clients have joined. + self._parallel.run((c.join_game, join) + for c, join in zip(self._controllers, join_reqs)) + + self._game_info = self._parallel.run(c.game_info for c in self._controllers) + for g, interface in zip(self._game_info, self._interface_options): + if g.options.render != interface.render: + logging.warning( + "Actual interface options don't match requested options:\n" + "Requested:\n%s\n\nActual:\n%s", interface, g.options) + + self._features = None + + + def _launch(self): + self.old_unit_tags = set() + print("*****LAUNCH FUNCTION CALLED*****") + SC2Env.__init__( + self, + map_name=self.map_name, + battle_net_map=False, + players=self.players, + agent_interface_format=self.agent_interface_format, + discount=None, + discount_zero_after_timeout=False, + visualize=False, + step_mul=8, + realtime=False, + save_replay_episodes=self.save_replay_episodes, + replay_dir=None if self.save_replay_episodes is None else ".", + replay_prefix=None, + game_steps_per_episode=self.game_steps_per_episode, + score_index=None, + score_multiplier=None, + random_seed=self._seed, + disable_fog=False, + ensure_available_actions=True, + version=None + ) + self._parallel.run((c.step, 2) for c in self._controllers) + self._init_map() + + def _episode_restart(self): + """Restart the environment by killing all units on the map. + There is a trigger in the SC2Map file, which restarts the + episode when there are no units left. + """ + try: + # save current units' tag + self._update_obs() + self.old_unit_tags = set(unit.tag for unit in self._obs.observation.raw_data.units) + # kill current units + run_commands = [ + ( + self._controllers[0].debug, + d_pb.DebugCommand( + kill_unit=d_pb.DebugKillUnit( + tag=[unit.tag for unit in self._obs.observation.raw_data.units] + ) + ) + ) + ] + # Kill all units on the map. + self._parallel.run(run_commands) + # Forward 2 step to make sure all units revive. + self._parallel.run((c.step, 2) for c in self._controllers) + except (protocol.ProtocolError, protocol.ConnectionError) as e: + print("Error happen in _restart. Error: ", e) + self._env_restart() + + def _env_restart(self): + self.close() + self._launch() + self._force_restarts += 1 + + def reset(self): + if self._launch_env_flag: + # Launch StarCraft II + print("*************LAUNCH TOTAL GAME********************") + self._launch() + elif self._abnormal_env_flag or (self._total_steps >= self._next_reset_steps) or ( + self.save_replay_episodes is not None): + # Avoid hitting the real episode limit of SC2 env + print("We are full restarting the environment! save_replay_episodes: ", self.save_replay_episodes) + self._env_restart() + self._next_reset_steps += FORCE_RESTART_INTERVAL + else: + self._episode_restart() + + init_flag = False + for i in range(5): + for j in range(10): + self._update_obs() + init_flag = self._init_units() + if init_flag: + break + else: + self._episode_restart() + if init_flag: + break + else: + self._env_restart() + if not init_flag: + raise RuntimeError("reset 5 times error") + + self._episode_steps = 0 + self._final_eval_fake_reward = 0. + + self._launch_env_flag = False + self._abnormal_env_flag = False + + self._init_units_attr() + self._init_rewards() + self._init_states() + return self.get_obs() + + def _init_map(self): + game_info = self._game_info[0] + map_info = game_info.start_raw + map_play_area_min = map_info.playable_area.p0 + map_play_area_max = map_info.playable_area.p1 + self.max_distance_x = map_play_area_max.x - map_play_area_min.x + self.max_distance_y = map_play_area_max.y - map_play_area_min.y + self.map_x = map_info.map_size.x + self.map_y = map_info.map_size.y + if map_info.pathing_grid.bits_per_pixel == 1: + vals = np.array(list(map_info.pathing_grid.data)).reshape(self.map_x, int(self.map_y / 8)) + self.pathing_grid = np.transpose( + np.array([[(b >> i) & 1 for b in row for i in range(7, -1, -1)] for row in vals], dtype=np.bool) + ) + else: + self.pathing_grid = np.invert( + np.flip( + np.transpose( + np.array(list(map_info.pathing_grid.data), dtype=np.bool).reshape(self.map_x, self.map_y)), + axis=1 + ) + ) + self.terrain_height = np.flip( + np.transpose(np.array(list(map_info.terrain_height.data)).reshape(self.map_x, self.map_y)), 1 + ) / 255 + + def _init_units(self): + # Sometimes not all units have yet been created by SC2 ToDO: check if use list not dict is a bug + self.agents = [ + unit for unit in self._obs.observation.raw_data.units + if (unit.owner == 1) and (unit.tag not in self.old_unit_tags) + ] + self.agents = sorted( + self.agents, + key=attrgetter("unit_type", "pos.x", "pos.y"), + reverse=False, + ) + self.enemies = [ + unit for unit in self._obs.observation.raw_data.units + if (unit.owner == 2) and (unit.tag not in self.old_unit_tags) + ] + + all_agents_created = (len(self.agents) == self.n_agents) + all_enemies_created = (len(self.enemies) == self.n_enemies) + all_agents_health = all(u.health > 0 for u in self.agents) + all_enemies_health = all(u.health > 0 for u in self.enemies) + + if all_agents_created and all_enemies_created and all_agents_health and all_enemies_health: # all good + return True + else: + if not all_agents_created: + print('not all agents created: {} vs {}'.format(len(self.agents), self.n_agents)) + if not all_agents_created: + print('not all enemies created: {} vs {}'.format(len(self.enemies), self.n_enemies)) + if not all_agents_health: + print('not all agents health') + if not all_enemies_health: + print('not all enemies health') + return False + + def _init_units_attr(self): + # type + self.min_unit_type = min([u.unit_type for u in self.agents]) + self.types = [ally_types[self.map_type][u.unit_type - self.min_unit_type] for u in self.agents] + \ + [enemey_types[u.unit_type] for u in self.enemies] + self.is_medivac = np.array([(t == 'medivac') for t in self.types], dtype=np.bool) + # type id + type_to_id = {t: i for i, t in enumerate(sorted(list(set(self.types))))} + self.unit_type_bits = len(type_to_id) + self.type_id = np.array([type_to_id[t] for t in self.types], dtype=np.int64) + # cooldown + self.cooldown_max = np.array([switcher[t] for t in self.types], dtype=np.float32) + # shoot_range + self.shoot_range = np.array([6 for t in self.types], dtype=np.float32) + + def _init_rewards(self): + self.reward_injury = np.zeros(self.n_agents + self.n_enemies, dtype=np.float32) + self.reward_dead = np.zeros(self.n_agents + self.n_enemies, dtype=np.float32) + self.reward_end = 0 + if self.reward_type=='original': + self.reward_max = (self.n_enemies * self.reward_death_value + self.reward_win) + sum( + [(u.health_max + u.shield_max) for u in self.enemies]) + elif self.reward_type=='unit_norm': + self.reward_max = max([(u.health_max + u.shield_max) for u in self.enemies]) + self.reward_scale = self.reward_max if self.reward_scale is None else self.reward_scale + + def _init_states(self): + self.state_len = 1 + self.unit_type_bits + 2 + 1 + 2 + 1 + 7 + 9 + 9 # ally or enemy, unit_type, pos.x and y, health, sheld(abs value and whether shield is zero), cooldown, last action(stop,move,attack), path, height + self.relation_len = 2 + 2 + 2 # distance, cos(theta) and sin(theta), whether can attack + self.action_len = self.n_actions_no_attack + self.n_entities # (dead, stop, move) + help ally(currentlly only for medivac) + attack enemy + # init satetes + self.states = np.zeros((self.n_entities, self.state_len), dtype=np.float32) + row_ind = np.arange(self.n_entities) + self.states[:, 0] = (row_ind >= self.n_agents) # ally or enemy + self.states[row_ind, 1 + self.type_id] = 1 # unit_type + self.alive_mask = np.ones(self.n_entities, dtype=np.bool) + # init relations + self.relations = np.zeros((self.n_entities, self.n_entities, self.relation_len), dtype=np.float32) + # init actions + self.action_mask = np.zeros((self.n_agents, self.action_len), dtype=np.bool) + self.dead_action = np.array([[1] + [0] * (self.action_len - 1)], dtype=np.bool) + self.last_actions = np.ones(self.n_agents, dtype=np.int64) + row_inds = np.arange(self.n_agents) + # update states with current units + self._update_states() + + def step(self, actions): + processed_actions = self._process_actions(actions) + try: + self._submit_actions(processed_actions) + except (protocol.ProtocolError, protocol.ConnectionError, ValueError) as e: + print("Error happen in step! Error: ", e) + self._abnormal_env_flag = True + return self.SMACTimestep(obs=None, reward=None, done=True, info={'abnormal': True}, + episode_steps=self._episode_steps) + self.last_actions = np.minimum(np.array(actions, dtype=np.int64), 6) # dead, stop, N, S, E, W, attack + self._total_steps += 1 + self._episode_steps += 1 + # Update states + self._update_obs() + game_end_code = self._update_units() + self._update_states() + # Get return + reward = self.get_reward() + self._final_eval_fake_reward += sum(reward) + done, info = self.get_info(game_end_code) + obs = self.get_obs() + return self.SMACTimestep( + obs=obs, reward=reward.copy(), done=done, info=info, episode_steps=self._episode_steps + ) + + def _process_actions(self, my_actions): + """Construct the action for agent a_id. + The input action here is *absolute* and is not mirrored! + We use skip_mirror=True in get_avail_agent_actions to avoid error. + """ + processed_actions = [] + for i, (unit, action) in enumerate(zip(self.agents, my_actions)): + assert self.action_mask[i][action] == 1 + tag = unit.tag + x = unit.pos.x + y = unit.pos.y + ma = self.move_amount + offset = [[0, ma], [0, -ma], [ma, 0], [-ma, 0]] + + if action == 0: + # no-op (valid only when dead) + assert unit.health == 0, "No-op only available for dead agents." + return None + elif action == 1: + # stop + cmd = r_pb.ActionRawUnitCommand(ability_id=actions["stop"], unit_tags=[tag], queue_command=False) + elif action in [2, 3, 4, 5]: + # move + o = offset[action - 2] + cmd = r_pb.ActionRawUnitCommand( + ability_id=actions["move"], + target_world_space_pos=sc_common.Point2D(x=x + o[0], y=y + o[1]), + unit_tags=[tag], + queue_command=False + ) + else: + # attack or heal + if self.map_type == "MMM" and self.is_medivac[i]: + target_unit = self.agents[action - self.n_actions_no_attack] + action_name = "heal" + else: + target_unit = self.enemies[action - self.n_actions_no_attack - self.n_agents] + action_name = "attack" + cmd = r_pb.ActionRawUnitCommand( + ability_id=actions[action_name], target_unit_tag=target_unit.tag, unit_tags=[tag], + queue_command=False + ) + processed_actions.append(sc_pb.Action(action_raw=r_pb.ActionRaw(unit_command=cmd))) + + return processed_actions + + def _submit_actions(self, actions): + # actions is a sequence + # Send action request + req_actions = sc_pb.RequestAction(actions=actions) + self._controllers[0].actions(req_actions) + self._controllers[0].step(self._step_mul) + + def _update_obs(self): + # Transform in the thread so it runs while waiting for other observations. + self._obs = self._controllers[0].observe() + + def _update_units(self): + """Update units after an environment step. + This function assumes that self._obs is up-to-date. + """ + n_ally_alive = 0 + n_enemy_alive = 0 + units = {unit.tag: unit for unit in self._obs.observation.raw_data.units} + for a_id, a_unit in enumerate(self.agents): + prev_health, prev_shield = a_unit.health, a_unit.shield + if a_unit.tag in units: + self.agents[a_id] = units[a_unit.tag] + else: + a_unit.health, a_unit.shield = 0, 0 + curr_health, curr_shield = self.agents[a_id].health, self.agents[a_id].shield + self.reward_injury[a_id] = self.reward_neg_scale * (prev_health + prev_shield - curr_health - curr_shield) + self.reward_dead[ + a_id] = self.reward_neg_scale * self.reward_death_value if prev_health > 0 and curr_health == 0 else 0 + if a_unit.health > 0 and not self.is_medivac[ + a_id]: # only count entities capable of attacking, 54 is medivac. + n_ally_alive += 1 + + for e_id, e_unit in enumerate(self.enemies): + prev_health, prev_shield = e_unit.health, e_unit.shield + if e_unit.tag in units: + self.enemies[e_id] = units[e_unit.tag] + else: + e_unit.health, e_unit.shield = 0, 0 + curr_health, curr_shield = self.enemies[e_id].health, self.enemies[e_id].shield + self.reward_injury[e_id + self.n_agents] = self.reward_pos_scale * ( + prev_health + prev_shield - curr_health - curr_shield) + self.reward_dead[ + e_id + self.n_agents] = self.reward_pos_scale * self.reward_death_value if prev_health > 0 and curr_health == 0 else 0 + if e_unit.health > 0 and not self.is_medivac[ + e_id + self.n_agents]: # only count entities capable of attacking, 54 is medivac. + n_enemy_alive += 1 + + self.reward_end = 0 + if n_ally_alive == 0 and n_enemy_alive > 0: + self.reward_end = self.reward_defeat + return -1 # lost + elif n_ally_alive > 0 and n_enemy_alive == 0: + self.reward_end = self.reward_win + return 1 # won + elif n_ally_alive == 0 and n_enemy_alive == 0: + return 0 # draw + else: + return None # not end + + def _update_states(self): + # update unit states + self.states[:, 1 + self.unit_type_bits + 6: 1 + self.unit_type_bits + 13] = 0 + self.states[np.arange(self.n_agents), 1 + self.unit_type_bits + 6 + self.last_actions] = 1 + for i, u in enumerate(self.agents + self.enemies): + self.states[i, 1 + self.unit_type_bits] = u.pos.x + self.states[i, 1 + self.unit_type_bits + 1] = u.pos.y + self.states[i, 1 + self.unit_type_bits + 2] = u.health / 100.0 + self.states[i, 1 + self.unit_type_bits + 3] = u.shield / 100.0 + self.states[i, 1 + self.unit_type_bits + 4] = (u.shield > 0) + self.states[i, 1 + self.unit_type_bits + 5] = u.weapon_cooldown / 50 if not self.is_medivac[ + i] else u.energy / 150 + self.alive_mask[i] = (u.health > 0) + # update surrounding terrain + pos = self.states[:, 1 + self.unit_type_bits:1 + self.unit_type_bits + 2] + ma = self.move_amount + border = np.array([[0, 0], [self.map_x, self.map_y]]).astype(np.int64) + offset = np.array([ + [0, 2 * ma], + [0, -2 * ma], + [2 * ma, 0], + [-2 * ma, 0], + [ma, ma], + [-ma, -ma], + [ma, -ma], + [-ma, ma], + [0, 0], + [0, ma / 2], # move north + [0, -ma / 2], # move south + [ma / 2, 0], # move east + [-ma / 2, 0], # move west + ]) + surround = (pos[:, None, :] + offset[None, :, :]).astype(np.int64) + surround_clip = np.clip(surround, border[0], border[1]-1) + in_path = self.pathing_grid[surround_clip[:, :, 0], surround_clip[:, :, 1]] + in_border = (surround >= border[0]).all(axis=-1) & (surround < border[1]).all(axis=-1) + surround_path = in_path & in_border + surround_height = self.terrain_height[surround_clip[:, :, 0], surround_clip[:, :, 1]] + self.states[:, -18:] = np.concatenate([surround_path[:, :9], surround_height[:, :9]], axis=1) + # update relations + disp = pos[:, None, :] - pos[None, :, :] + dist = np.sqrt(np.sum(disp * disp, axis=2)) + self.relations[:, :, 0] = np.minimum((dist - self.shoot_range[None, :]) / 6, + 3) # minus enemy's shoot range, clip to < 3 + self.relations[:, :, 1] = np.minimum((dist - self.shoot_range[:, None]) / 6, + 3) # minus ego's shoot range, clip to < 3 + self.relations[:, :, 2] = disp[:, :, 0] / (dist + 1e-8) # cos(theta) + self.relations[:, :, 3] = disp[:, :, 1] / (dist + 1e-8) # sin(theta) + self.relations[:, :, 4] = (dist <= self.shoot_range[None, :]) # whetehr can be shooted + self.relations[:, :, 5] = (dist <= self.shoot_range[:, None]) # whetehr can shoot + self.states[:, 1 + self.unit_type_bits] = self.states[:, 1 + self.unit_type_bits] / self.map_x + self.states[:, 1 + self.unit_type_bits + 1] = self.states[:, 1 + self.unit_type_bits + 1] / self.map_y + # update actions + self.action_mask[:, 0] = 0 # dead action + self.action_mask[:, 1] = 1 # stop action + self.action_mask[:, 2:6] = surround_path[:self.n_agents, 9:] # move action + medivac_mask = self.is_medivac[:self.n_agents] + alive_mask = self.alive_mask[:self.n_agents] + shoot_mask = self.relations[: self.n_agents, :, 5].astype(np.bool) & self.alive_mask + self.action_mask[~medivac_mask, 6 + self.n_agents:6 + self.n_entities] = shoot_mask[~medivac_mask, + self.n_agents:self.n_entities] # attack action + self.action_mask[medivac_mask, 6:6 + self.n_agents] = shoot_mask[medivac_mask, + :self.n_agents] & ~medivac_mask # heal action + self.action_mask[~alive_mask, :] = self.dead_action # dead action + + def get_reward(self): + reward = (self.reward_injury + self.reward_dead)[None, :].sum(axis=1) + self.reward_end + reward *= self.reward_scale / self.reward_max + return reward + + def get_obs(self): + """Returns all agent observations in a list. + NOTE: Agents should have access only to their local observations + during decentralised execution. + """ + obs = { + 'states': self.states.copy(), + 'relations': self.relations.copy(), + 'action_mask': self.action_mask.copy(), + 'alive_mask': self.alive_mask.copy(), + } + return obs + + # def get_avail_agent_actions(self, agent_id): + # return self.action_mask[agent_id] + + def get_info(self, game_end_code): + """This function is called only once at each step, no matter whether you take opponent as agent. + We already return dicts for each term, as in Multi-agent scenario. + """ + info = { + "battle_won": False, + "battle_lost": False, + "draw": False, + 'final_eval_reward': 0., + 'final_eval_fake_reward': 0. + } + done = False + + if game_end_code is not None: + done = True + if game_end_code == 1: + self._won_count += 1 + info["battle_won"] = True + info['final_eval_reward'] = 1. + elif game_end_code == -1: + info["battle_lost"] = True + else: + info["draw"] = True + elif self._episode_steps >= self._episode_limit: + done = True + self._timeouts += 1 + + if done: + self._episode_count += 1 + dead_allies = sum(~self.alive_mask[:self.n_agents]) + dead_enemies = sum(~self.alive_mask[self.n_agents:self.n_entities]) + info['final_eval_fake_reward'] = self._final_eval_fake_reward + info['dead_allies'] = dead_allies + info['dead_enemies'] = dead_enemies + info['episode_info'] = { + 'final_eval_fake_reward': info['final_eval_fake_reward'], + 'dead_allies': dead_allies, + 'dead_enemies': dead_enemies + } + return done, info + + def info(self): + agent_num = self.n_agents + enemy_num = self.n_enemies + obs_space = {} # TODO: Now, obs_space is only accessible after self.reset(). + obs = self.reset() + for k, v in obs.items(): + obs_space[k] = v.shape + self.close() + obs_space = EnvElementInfo(obs_space, None) + return self.SMACEnvInfo( + agent_num=agent_num, + obs_space=obs_space, + act_space=self.SMACActionInfo((self.n_agents,), {'min': 0, 'max': 1}), + rew_space=self.SMACRewardInfo((1,), {'min': 0, 'max': self.reward_max}), + episode_limit=self._episode_limit, + ) + + def seed(self, seed, dynamic_seed=False): + self._seed = seed + if self.cfg.get('subprocess_numpy_seed', False): + np.random.seed(self._seed) + + def close(self): + SC2Env.close(self) + + +SMACTimestep = SMACACEEnv.SMACTimestep +SMACEnvInfo = SMACACEEnv.SMACEnvInfo +SMACActionInfo = SMACACEEnv.SMACActionInfo +SMACRewardInfo = SMACACEEnv.SMACRewardInfo \ No newline at end of file diff --git a/zoo/smac/envs/smac_env_lz.py b/zoo/smac/envs/smac_env_lz.py new file mode 100644 index 000000000..883c8bae0 --- /dev/null +++ b/zoo/smac/envs/smac_env_lz.py @@ -0,0 +1,772 @@ +from collections import namedtuple +from operator import attrgetter +import numpy as np +import random +import logging +from easydict import EasyDict +import pysc2.env.sc2_env as sc2_env +from pysc2.env.sc2_env import SC2Env, Agent, MAX_STEP_COUNT, get_default, crop_and_deduplicate_names +from pysc2.lib import protocol +from s2clientprotocol import common_pb2 as sc_common, sc2api_pb2 as sc_pb, raw_pb2 as r_pb, debug_pb2 as d_pb +from ding.envs import BaseEnv +from ding.envs.common.env_element import EnvElement, EnvElementInfo +from ding.utils import ENV_REGISTRY, deep_merge_dicts + +from .smac_map import get_map_params + +races = { + "R": sc_common.Random, + "P": sc_common.Protoss, + "T": sc_common.Terran, + "Z": sc_common.Zerg, +} + +ally_types = { + 'marines': { + 0: 'marine', + }, + 'stalkers_and_zealots': { + 0: 'stalker', + 1: 'zealot', + }, + 'colossi_stalkers_zealots': { + 0: 'colossus', + 1: 'stalker', + 2: 'zealot', + }, + 'MMM': { + 0: 'marauder', + 1: 'marine', + 2: 'medivac', + }, + 'zealots': { + 0: 'zealot', + }, + 'hydralisks': { + 0: 'hydralisk', + }, + 'stalkers': { + 0: 'stalker', + }, + 'colossus': { + 0: 'colossus', + }, + 'bane': { + 0: 'baneling', + 1: 'zergling', + }, +} + +enemey_types = { + 73: 'zealot', + 74: 'stalker', + 4: 'colossus', + 9: 'baneling', + 105: 'zergling', + 51: 'marauder', + 48: 'marine', + 54: 'medivac', + 107: 'hydralisk', +} + +switcher = { + 'marine': 15, + 'marauder': 25, + 'medivac': 200, # max energy + 'stalker': 35, + 'zealot': 22, + 'colossus': 24, + 'hydralisk': 10, + 'zergling': 11, + 'baneling': 1 +} + +actions = { + "move": 16, # target: PointOrUnit + "attack": 23, # target: PointOrUnit + "stop": 4, # target: None + "heal": 386, # Unit + "parasitic_bomb": 2542, # target: Unit + 'fungal_growth': 74, # target: PointOrUnit +} + +FORCE_RESTART_INTERVAL = 50000 + + +@ENV_REGISTRY.register('smac_lz') +class SMACLZEnv(SC2Env, BaseEnv): + """ + This environment provides the interface for both single agent and multiple agents (two players) in + SC2 environment. + """ + + SMACTimestep = namedtuple('SMACTimestep', ['obs', 'reward', 'done', 'info', 'episode_steps']) + SMACEnvInfo = namedtuple('SMACEnvInfo', ['agent_num', 'obs_space', 'act_space', 'rew_space', 'episode_limit']) + SMACActionInfo = namedtuple('SMACActionInfo', ['shape', 'value']) + SMACRewardInfo = namedtuple('SMACRewardInfo', ['shape', 'value']) + config = dict( + difficulty=7, + save_replay_episodes=None, + game_steps_per_episode=None, + reward_death_value=10, + reward_win=200, + reward_scale=20, # if None, reward_scale will be self.reward_max + reward_type='original', + ) + + def __repr__(self): + return "DI-engine SMAC Env" + + def __init__( + self, + cfg, + ): + cfg = deep_merge_dicts(EasyDict(self.config), cfg) + self.cfg = cfg + # Client parameters + # necessary for compatibility with pysc2 + from absl import flags + flags.FLAGS(['smac']) + self.agent_interface_format = sc2_env.parse_agent_interface_format(use_raw_units=True) + self.save_replay_episodes = cfg.save_replay_episodes + assert (self.save_replay_episodes is None) or isinstance( + self.save_replay_episodes, int + ) # Denote the number of replays to save + self.game_steps_per_episode = cfg.game_steps_per_episode + + # Map parameters + map_name = cfg.map_name + assert map_name is not None + map_params = get_map_params(map_name) + self._map_name = map_name + self.map_type = map_params["map_type"] + self.agent_race = map_params["a_race"] + self.bot_race = map_params["b_race"] + self.difficulty = cfg.difficulty + self.players = [sc2_env.Agent(races[self.agent_race]), sc2_env.Bot(races[self.bot_race], self.difficulty)] + self.n_agents = map_params["n_agents"] + self.n_enemies = map_params["n_enemies"] + self.n_entities = self.n_agents + self.n_enemies + self._episode_limit = map_params["limit"] + + # Reset parameters + self._seed = None + self._launch_env_flag = True + self._abnormal_env_flag = False + + # Counter parameters + self._total_steps = 0 + self._next_reset_steps = FORCE_RESTART_INTERVAL + self._won_count = 0 + self._episode_count = 0 + self._timeouts = 0 + self._force_restarts = 0 + + # Reward parameters + self.reward_pos_scale = 1.0 + self.reward_neg_scale = 0.0 + self.reward_death_value = cfg.reward_death_value + self.reward_win = cfg.reward_win + self.reward_defeat = 0 + self.reward_scale = cfg.reward_scale + self.reward_max = 1020 # TODO: change after the env is lannched + self.reward_type=cfg.reward_type + + # Action parameters + self.n_actions_no_attack = 6 + self.move_amount = 2 + + def _create_join(self): + # copy and overwrite original implementation + map_inst = random.choice(self._maps) + self._map_name = map_inst.name + + self._step_mul = max(1, self._default_step_mul or map_inst.step_mul) + self._score_index = get_default(self._default_score_index, + map_inst.score_index) + self._score_multiplier = get_default(self._default_score_multiplier, + map_inst.score_multiplier) + self._episode_length = get_default(self._default_episode_length, + map_inst.game_steps_per_episode) + if self._episode_length <= 0 or self._episode_length > MAX_STEP_COUNT: + self._episode_length = MAX_STEP_COUNT + + # Create the game. Set the first instance as the host. + create = sc_pb.RequestCreateGame( + disable_fog=self._disable_fog, + realtime=self._realtime) + + if self._battle_net_map: + create.battlenet_map_name = map_inst.battle_net + else: + create.local_map.map_path = map_inst.path + map_data = map_inst.data(self._run_config) + if self._num_agents == 1: + create.local_map.map_data = map_data + else: + # Save the maps so they can access it. Don't do it in parallel since SC2 + # doesn't respect tmpdir on windows, which leads to a race condition: + # https://github.com/Blizzard/s2client-proto/issues/102 + for c in self._controllers: + c.save_map(map_inst.path, map_data) + if self._random_seed is not None: + create.random_seed = self._random_seed + for p in self._players: + if isinstance(p, Agent): + create.player_setup.add(type=sc_pb.Participant) + else: + create.player_setup.add( + type=sc_pb.Computer, race=random.choice(p.race), + difficulty=p.difficulty, ai_build=random.choice(p.build)) + if self._num_agents > 1: + self._controllers[1].create_game(create) + else: + self._controllers[0].create_game(create) + + # Create the join requests. + agent_players = [p for p in self._players if isinstance(p, Agent)] + self.sanitized_names = crop_and_deduplicate_names(p.name for p in agent_players) + join_reqs = [] + for p, name, interface in zip(agent_players, self.sanitized_names, + self._interface_options): + join = sc_pb.RequestJoinGame(options=interface) + join.race = random.choice(p.race) + join.player_name = name + if self._ports: + join.shared_port = 0 # unused + join.server_ports.game_port = self._ports[0] + join.server_ports.base_port = self._ports[1] + for i in range(self._num_agents - 1): + join.client_ports.add(game_port=self._ports[i * 2 + 2], + base_port=self._ports[i * 2 + 3]) + join_reqs.append(join) + + # Join the game. This must be run in parallel because Join is a blocking + # call to the game that waits until all clients have joined. + self._parallel.run((c.join_game, join) + for c, join in zip(self._controllers, join_reqs)) + + self._game_info = self._parallel.run(c.game_info for c in self._controllers) + for g, interface in zip(self._game_info, self._interface_options): + if g.options.render != interface.render: + logging.warning( + "Actual interface options don't match requested options:\n" + "Requested:\n%s\n\nActual:\n%s", interface, g.options) + + self._features = None + + + def _launch(self): + self.old_unit_tags = set() + print("*****LAUNCH FUNCTION CALLED*****") + SC2Env.__init__( + self, + map_name=self.map_name, + battle_net_map=False, + players=self.players, + agent_interface_format=self.agent_interface_format, + discount=None, + discount_zero_after_timeout=False, + visualize=False, + step_mul=8, + realtime=False, + save_replay_episodes=self.save_replay_episodes, + replay_dir=None if self.save_replay_episodes is None else ".", + replay_prefix=None, + game_steps_per_episode=self.game_steps_per_episode, + score_index=None, + score_multiplier=None, + random_seed=self._seed, + disable_fog=False, + ensure_available_actions=True, + version=None + ) + self._parallel.run((c.step, 2) for c in self._controllers) + self._init_map() + + def _episode_restart(self): + """Restart the environment by killing all units on the map. + There is a trigger in the SC2Map file, which restarts the + episode when there are no units left. + """ + try: + # save current units' tag + self._update_obs() + self.old_unit_tags = set(unit.tag for unit in self._obs.observation.raw_data.units) + # kill current units + run_commands = [ + ( + self._controllers[0].debug, + d_pb.DebugCommand( + kill_unit=d_pb.DebugKillUnit( + tag=[unit.tag for unit in self._obs.observation.raw_data.units] + ) + ) + ) + ] + # Kill all units on the map. + self._parallel.run(run_commands) + # Forward 2 step to make sure all units revive. + self._parallel.run((c.step, 2) for c in self._controllers) + except (protocol.ProtocolError, protocol.ConnectionError) as e: + print("Error happen in _restart. Error: ", e) + self._env_restart() + + def _env_restart(self): + self.close() + self._launch() + self._force_restarts += 1 + + def reset(self): + if self._launch_env_flag: + # Launch StarCraft II + print("*************LAUNCH TOTAL GAME********************") + self._launch() + elif self._abnormal_env_flag or (self._total_steps >= self._next_reset_steps) or ( + self.save_replay_episodes is not None): + # Avoid hitting the real episode limit of SC2 env + print("We are full restarting the environment! save_replay_episodes: ", self.save_replay_episodes) + self._env_restart() + self._next_reset_steps += FORCE_RESTART_INTERVAL + else: + self._episode_restart() + + init_flag = False + for i in range(5): + for j in range(10): + self._update_obs() + init_flag = self._init_units() + if init_flag: + break + else: + self._episode_restart() + if init_flag: + break + else: + self._env_restart() + if not init_flag: + raise RuntimeError("reset 5 times error") + + self._episode_steps = 0 + self._final_eval_fake_reward = 0. + + self._launch_env_flag = False + self._abnormal_env_flag = False + + self._init_units_attr() + self._init_rewards() + self._init_states() + ori_obs = self.get_obs() + # process obs to marl_obs format + obs_marl = {} + # agent_state: + obs_marl['agent_state'] = ori_obs['states'][:self.n_agents] + # global_state: + obs_marl['global_state'] = ori_obs['states'].flatten() + # agent_specifig_global_state + obs_marl['agent_specifig_global_state'] = np.concatenate((obs_marl['agent_state'], np.repeat(obs_marl['global_state'].reshape(1, -1), self.n_agents, axis=0)), axis=1) + ori_obs['states'] = obs_marl + return ori_obs + + def _init_map(self): + game_info = self._game_info[0] + map_info = game_info.start_raw + map_play_area_min = map_info.playable_area.p0 + map_play_area_max = map_info.playable_area.p1 + self.max_distance_x = map_play_area_max.x - map_play_area_min.x + self.max_distance_y = map_play_area_max.y - map_play_area_min.y + self.map_x = map_info.map_size.x + self.map_y = map_info.map_size.y + if map_info.pathing_grid.bits_per_pixel == 1: + vals = np.array(list(map_info.pathing_grid.data)).reshape(self.map_x, int(self.map_y / 8)) + self.pathing_grid = np.transpose( + np.array([[(b >> i) & 1 for b in row for i in range(7, -1, -1)] for row in vals], dtype=np.bool) + ) + else: + self.pathing_grid = np.invert( + np.flip( + np.transpose( + np.array(list(map_info.pathing_grid.data), dtype=np.bool).reshape(self.map_x, self.map_y)), + axis=1 + ) + ) + self.terrain_height = np.flip( + np.transpose(np.array(list(map_info.terrain_height.data)).reshape(self.map_x, self.map_y)), 1 + ) / 255 + + def _init_units(self): + # Sometimes not all units have yet been created by SC2 ToDO: check if use list not dict is a bug + self.agents = [ + unit for unit in self._obs.observation.raw_data.units + if (unit.owner == 1) and (unit.tag not in self.old_unit_tags) + ] + self.agents = sorted( + self.agents, + key=attrgetter("unit_type", "pos.x", "pos.y"), + reverse=False, + ) + self.enemies = [ + unit for unit in self._obs.observation.raw_data.units + if (unit.owner == 2) and (unit.tag not in self.old_unit_tags) + ] + + all_agents_created = (len(self.agents) == self.n_agents) + all_enemies_created = (len(self.enemies) == self.n_enemies) + all_agents_health = all(u.health > 0 for u in self.agents) + all_enemies_health = all(u.health > 0 for u in self.enemies) + + if all_agents_created and all_enemies_created and all_agents_health and all_enemies_health: # all good + return True + else: + if not all_agents_created: + print('not all agents created: {} vs {}'.format(len(self.agents), self.n_agents)) + if not all_agents_created: + print('not all enemies created: {} vs {}'.format(len(self.enemies), self.n_enemies)) + if not all_agents_health: + print('not all agents health') + if not all_enemies_health: + print('not all enemies health') + return False + + def _init_units_attr(self): + # type + self.min_unit_type = min([u.unit_type for u in self.agents]) + self.types = [ally_types[self.map_type][u.unit_type - self.min_unit_type] for u in self.agents] + \ + [enemey_types[u.unit_type] for u in self.enemies] + self.is_medivac = np.array([(t == 'medivac') for t in self.types], dtype=np.bool) + # type id + type_to_id = {t: i for i, t in enumerate(sorted(list(set(self.types))))} + self.unit_type_bits = len(type_to_id) + self.type_id = np.array([type_to_id[t] for t in self.types], dtype=np.int64) + # cooldown + self.cooldown_max = np.array([switcher[t] for t in self.types], dtype=np.float32) + # shoot_range + self.shoot_range = np.array([6 for t in self.types], dtype=np.float32) + + def _init_rewards(self): + self.reward_injury = np.zeros(self.n_agents + self.n_enemies, dtype=np.float32) + self.reward_dead = np.zeros(self.n_agents + self.n_enemies, dtype=np.float32) + self.reward_end = 0 + if self.reward_type=='original': + self.reward_max = (self.n_enemies * self.reward_death_value + self.reward_win) + sum( + [(u.health_max + u.shield_max) for u in self.enemies]) + elif self.reward_type=='unit_norm': + self.reward_max = max([(u.health_max + u.shield_max) for u in self.enemies]) + self.reward_scale = self.reward_max if self.reward_scale is None else self.reward_scale + + def _init_states(self): + self.state_len = 1 + self.unit_type_bits + 2 + 1 + 2 + 1 + 7 + 9 + 9 # ally or enemy, unit_type, pos.x and y, health, sheld(abs value and whether shield is zero), cooldown, last action(stop,move,attack), path, height + self.relation_len = 2 + 2 + 2 # distance, cos(theta) and sin(theta), whether can attack + self.action_len = self.n_actions_no_attack + self.n_entities # (dead, stop, move) + help ally(currentlly only for medivac) + attack enemy + # init satetes + self.states = np.zeros((self.n_entities, self.state_len), dtype=np.float32) + row_ind = np.arange(self.n_entities) + self.states[:, 0] = (row_ind >= self.n_agents) # ally or enemy + self.states[row_ind, 1 + self.type_id] = 1 # unit_type + self.alive_mask = np.ones(self.n_entities, dtype=np.bool) + # init relations + self.relations = np.zeros((self.n_entities, self.n_entities, self.relation_len), dtype=np.float32) + # init actions + self.action_mask = np.zeros((self.n_agents, self.action_len), dtype=np.bool) + self.dead_action = np.array([[1] + [0] * (self.action_len - 1)], dtype=np.bool) + self.last_actions = np.ones(self.n_agents, dtype=np.int64) + row_inds = np.arange(self.n_agents) + # update states with current units + self._update_states() + + def step(self, actions): + processed_actions = self._process_actions(actions) + try: + self._submit_actions(processed_actions) + except (protocol.ProtocolError, protocol.ConnectionError, ValueError) as e: + print("Error happen in step! Error: ", e) + self._abnormal_env_flag = True + return self.SMACTimestep(obs=None, reward=None, done=True, info={'abnormal': True}, + episode_steps=self._episode_steps) + self.last_actions = np.minimum(np.array(actions, dtype=np.int64), 6) # dead, stop, N, S, E, W, attack + self._total_steps += 1 + self._episode_steps += 1 + # Update states + self._update_obs() + game_end_code = self._update_units() + self._update_states() + # Get return + reward = self.get_reward() + self._final_eval_fake_reward += sum(reward) + done, info = self.get_info(game_end_code) + ori_obs = self.get_obs() + # process obs to marl_obs format + obs_marl = {} + # agent_state: + obs_marl['agent_state'] = ori_obs['states'][:self.n_agents] + # global_state: + obs_marl['global_state'] = ori_obs['states'].flatten() + # agent_specifig_global_state + obs_marl['agent_specifig_global_state'] = np.concatenate((obs_marl['agent_state'], np.repeat(obs_marl['global_state'].reshape(1, -1), self.n_agents, axis=0)), axis=1) + ori_obs['states'] = obs_marl + return self.SMACTimestep( + obs=obs_marl, reward=reward.copy(), done=done, info=info, episode_steps=self._episode_steps + ) + + def _process_actions(self, my_actions): + """Construct the action for agent a_id. + The input action here is *absolute* and is not mirrored! + We use skip_mirror=True in get_avail_agent_actions to avoid error. + """ + processed_actions = [] + for i, (unit, action) in enumerate(zip(self.agents, my_actions)): + assert self.action_mask[i][action] == 1 + tag = unit.tag + x = unit.pos.x + y = unit.pos.y + ma = self.move_amount + offset = [[0, ma], [0, -ma], [ma, 0], [-ma, 0]] + + if action == 0: + # no-op (valid only when dead) + assert unit.health == 0, "No-op only available for dead agents." + return None + elif action == 1: + # stop + cmd = r_pb.ActionRawUnitCommand(ability_id=actions["stop"], unit_tags=[tag], queue_command=False) + elif action in [2, 3, 4, 5]: + # move + o = offset[action - 2] + cmd = r_pb.ActionRawUnitCommand( + ability_id=actions["move"], + target_world_space_pos=sc_common.Point2D(x=x + o[0], y=y + o[1]), + unit_tags=[tag], + queue_command=False + ) + else: + # attack or heal + if self.map_type == "MMM" and self.is_medivac[i]: + target_unit = self.agents[action - self.n_actions_no_attack] + action_name = "heal" + else: + target_unit = self.enemies[action - self.n_actions_no_attack - self.n_agents] + action_name = "attack" + cmd = r_pb.ActionRawUnitCommand( + ability_id=actions[action_name], target_unit_tag=target_unit.tag, unit_tags=[tag], + queue_command=False + ) + processed_actions.append(sc_pb.Action(action_raw=r_pb.ActionRaw(unit_command=cmd))) + + return processed_actions + + def _submit_actions(self, actions): + # actions is a sequence + # Send action request + req_actions = sc_pb.RequestAction(actions=actions) + self._controllers[0].actions(req_actions) + self._controllers[0].step(self._step_mul) + + def _update_obs(self): + # Transform in the thread so it runs while waiting for other observations. + self._obs = self._controllers[0].observe() + + def _update_units(self): + """Update units after an environment step. + This function assumes that self._obs is up-to-date. + """ + n_ally_alive = 0 + n_enemy_alive = 0 + units = {unit.tag: unit for unit in self._obs.observation.raw_data.units} + for a_id, a_unit in enumerate(self.agents): + prev_health, prev_shield = a_unit.health, a_unit.shield + if a_unit.tag in units: + self.agents[a_id] = units[a_unit.tag] + else: + a_unit.health, a_unit.shield = 0, 0 + curr_health, curr_shield = self.agents[a_id].health, self.agents[a_id].shield + self.reward_injury[a_id] = self.reward_neg_scale * (prev_health + prev_shield - curr_health - curr_shield) + self.reward_dead[ + a_id] = self.reward_neg_scale * self.reward_death_value if prev_health > 0 and curr_health == 0 else 0 + if a_unit.health > 0 and not self.is_medivac[ + a_id]: # only count entities capable of attacking, 54 is medivac. + n_ally_alive += 1 + + for e_id, e_unit in enumerate(self.enemies): + prev_health, prev_shield = e_unit.health, e_unit.shield + if e_unit.tag in units: + self.enemies[e_id] = units[e_unit.tag] + else: + e_unit.health, e_unit.shield = 0, 0 + curr_health, curr_shield = self.enemies[e_id].health, self.enemies[e_id].shield + self.reward_injury[e_id + self.n_agents] = self.reward_pos_scale * ( + prev_health + prev_shield - curr_health - curr_shield) + self.reward_dead[ + e_id + self.n_agents] = self.reward_pos_scale * self.reward_death_value if prev_health > 0 and curr_health == 0 else 0 + if e_unit.health > 0 and not self.is_medivac[ + e_id + self.n_agents]: # only count entities capable of attacking, 54 is medivac. + n_enemy_alive += 1 + + self.reward_end = 0 + if n_ally_alive == 0 and n_enemy_alive > 0: + self.reward_end = self.reward_defeat + return -1 # lost + elif n_ally_alive > 0 and n_enemy_alive == 0: + self.reward_end = self.reward_win + return 1 # won + elif n_ally_alive == 0 and n_enemy_alive == 0: + return 0 # draw + else: + return None # not end + + def _update_states(self): + # update unit states + self.states[:, 1 + self.unit_type_bits + 6: 1 + self.unit_type_bits + 13] = 0 + self.states[np.arange(self.n_agents), 1 + self.unit_type_bits + 6 + self.last_actions] = 1 + for i, u in enumerate(self.agents + self.enemies): + self.states[i, 1 + self.unit_type_bits] = u.pos.x + self.states[i, 1 + self.unit_type_bits + 1] = u.pos.y + self.states[i, 1 + self.unit_type_bits + 2] = u.health / 100.0 + self.states[i, 1 + self.unit_type_bits + 3] = u.shield / 100.0 + self.states[i, 1 + self.unit_type_bits + 4] = (u.shield > 0) + self.states[i, 1 + self.unit_type_bits + 5] = u.weapon_cooldown / 50 if not self.is_medivac[ + i] else u.energy / 150 + self.alive_mask[i] = (u.health > 0) + # update surrounding terrain + pos = self.states[:, 1 + self.unit_type_bits:1 + self.unit_type_bits + 2] + ma = self.move_amount + border = np.array([[0, 0], [self.map_x, self.map_y]]).astype(np.int64) + offset = np.array([ + [0, 2 * ma], + [0, -2 * ma], + [2 * ma, 0], + [-2 * ma, 0], + [ma, ma], + [-ma, -ma], + [ma, -ma], + [-ma, ma], + [0, 0], + [0, ma / 2], # move north + [0, -ma / 2], # move south + [ma / 2, 0], # move east + [-ma / 2, 0], # move west + ]) + surround = (pos[:, None, :] + offset[None, :, :]).astype(np.int64) + surround_clip = np.clip(surround, border[0], border[1]-1) + in_path = self.pathing_grid[surround_clip[:, :, 0], surround_clip[:, :, 1]] + in_border = (surround >= border[0]).all(axis=-1) & (surround < border[1]).all(axis=-1) + surround_path = in_path & in_border + surround_height = self.terrain_height[surround_clip[:, :, 0], surround_clip[:, :, 1]] + self.states[:, -18:] = np.concatenate([surround_path[:, :9], surround_height[:, :9]], axis=1) + # update relations + disp = pos[:, None, :] - pos[None, :, :] + dist = np.sqrt(np.sum(disp * disp, axis=2)) + self.relations[:, :, 0] = np.minimum((dist - self.shoot_range[None, :]) / 6, + 3) # minus enemy's shoot range, clip to < 3 + self.relations[:, :, 1] = np.minimum((dist - self.shoot_range[:, None]) / 6, + 3) # minus ego's shoot range, clip to < 3 + self.relations[:, :, 2] = disp[:, :, 0] / (dist + 1e-8) # cos(theta) + self.relations[:, :, 3] = disp[:, :, 1] / (dist + 1e-8) # sin(theta) + self.relations[:, :, 4] = (dist <= self.shoot_range[None, :]) # whetehr can be shooted + self.relations[:, :, 5] = (dist <= self.shoot_range[:, None]) # whetehr can shoot + self.states[:, 1 + self.unit_type_bits] = self.states[:, 1 + self.unit_type_bits] / self.map_x + self.states[:, 1 + self.unit_type_bits + 1] = self.states[:, 1 + self.unit_type_bits + 1] / self.map_y + # update actions + self.action_mask[:, 0] = 0 # dead action + self.action_mask[:, 1] = 1 # stop action + self.action_mask[:, 2:6] = surround_path[:self.n_agents, 9:] # move action + medivac_mask = self.is_medivac[:self.n_agents] + alive_mask = self.alive_mask[:self.n_agents] + shoot_mask = self.relations[: self.n_agents, :, 5].astype(np.bool) & self.alive_mask + self.action_mask[~medivac_mask, 6 + self.n_agents:6 + self.n_entities] = shoot_mask[~medivac_mask, + self.n_agents:self.n_entities] # attack action + self.action_mask[medivac_mask, 6:6 + self.n_agents] = shoot_mask[medivac_mask, + :self.n_agents] & ~medivac_mask # heal action + self.action_mask[~alive_mask, :] = self.dead_action # dead action + + def get_reward(self): + reward = (self.reward_injury + self.reward_dead)[None, :].sum(axis=1) + self.reward_end + reward *= self.reward_scale / self.reward_max + return reward + + def get_obs(self): + """Returns all agent observations in a list. + NOTE: Agents should have access only to their local observations + during decentralised execution. + """ + obs = { + 'states': self.states.copy(), + 'relations': self.relations.copy(), + 'action_mask': self.action_mask.copy(), + 'alive_mask': self.alive_mask.copy(), + } + return obs + + # def get_avail_agent_actions(self, agent_id): + # return self.action_mask[agent_id] + + def get_info(self, game_end_code): + """This function is called only once at each step, no matter whether you take opponent as agent. + We already return dicts for each term, as in Multi-agent scenario. + """ + info = { + "battle_won": False, + "battle_lost": False, + "draw": False, + 'final_eval_reward': 0., + 'final_eval_fake_reward': 0. + } + done = False + + if game_end_code is not None: + done = True + if game_end_code == 1: + self._won_count += 1 + info["battle_won"] = True + info['final_eval_reward'] = 1. + elif game_end_code == -1: + info["battle_lost"] = True + else: + info["draw"] = True + elif self._episode_steps >= self._episode_limit: + done = True + self._timeouts += 1 + + if done: + self._episode_count += 1 + dead_allies = sum(~self.alive_mask[:self.n_agents]) + dead_enemies = sum(~self.alive_mask[self.n_agents:self.n_entities]) + info['final_eval_fake_reward'] = self._final_eval_fake_reward + info['dead_allies'] = dead_allies + info['dead_enemies'] = dead_enemies + info['episode_info'] = { + 'final_eval_fake_reward': info['final_eval_fake_reward'], + 'dead_allies': dead_allies, + 'dead_enemies': dead_enemies + } + return done, info + + def info(self): + agent_num = self.n_agents + enemy_num = self.n_enemies + obs_space = {} # TODO: Now, obs_space is only accessible after self.reset(). + obs = self.reset() + for k, v in obs.items(): + obs_space[k] = v.shape + self.close() + obs_space = EnvElementInfo(obs_space, None) + return self.SMACEnvInfo( + agent_num=agent_num, + obs_space=obs_space, + act_space=self.SMACActionInfo((self.n_agents,), {'min': 0, 'max': 1}), + rew_space=self.SMACRewardInfo((1,), {'min': 0, 'max': self.reward_max}), + episode_limit=self._episode_limit, + ) + + def seed(self, seed, dynamic_seed=False): + self._seed = seed + if self.cfg.get('subprocess_numpy_seed', False): + np.random.seed(self._seed) + + def close(self): + SC2Env.close(self) + + +SMACTimestep = SMACLZEnv.SMACTimestep +SMACEnvInfo = SMACLZEnv.SMACEnvInfo +SMACActionInfo = SMACLZEnv.SMACActionInfo +SMACRewardInfo = SMACLZEnv.SMACRewardInfo \ No newline at end of file diff --git a/zoo/smac/envs/smac_map.py b/zoo/smac/envs/smac_map.py new file mode 100644 index 000000000..fb911f344 --- /dev/null +++ b/zoo/smac/envs/smac_map.py @@ -0,0 +1,350 @@ +from pysc2.maps import lib +import os + + +class SMACMap(lib.Map): + directory = os.path.join(os.path.dirname(__file__), "maps/SMAC_Maps") + download = "https://github.com/oxwhirl/smac#smac-maps" + players = 2 + step_mul = 8 + game_steps_per_episode = 0 + + +# Copied from smac/env/starcraft2/maps/smac_maps.py +map_param_registry = { + "3m": { + "n_agents": 3, + "n_enemies": 3, + "limit": 60, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "8m": { + "n_agents": 8, + "n_enemies": 8, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "25m": { + "n_agents": 25, + "n_enemies": 25, + "limit": 150, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "5m_vs_6m": { + "n_agents": 5, + "n_enemies": 6, + "limit": 70, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + # self-defined + "2m_vs_3m": { + "n_agents": 2, + "n_enemies": 3, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "3m_vs_4m": { + "n_agents": 3, + "n_enemies": 4, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "4m_vs_5m": { + "n_agents": 4, + "n_enemies": 5, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "5m_vs_5m": { + "n_agents": 5, + "n_enemies": 5, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "5m_vs_7m": { + "n_agents": 5, + "n_enemies": 7, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "5m_vs_8m": { + "n_agents": 5, + "n_enemies": 8, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "6m_vs_7m": { + "n_agents": 6, + "n_enemies": 7, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "15m_vs_16m": { + "n_agents": 15, + "n_enemies": 16, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "11m_vs_12m": { + "n_agents": 11, + "n_enemies": 12, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "12m_vs_13m": { + "n_agents": 12, + "n_enemies": 13, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "13m_vs_14m": { + "n_agents": 13, + "n_enemies": 14, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "14m_vs_15m": { + "n_agents": 14, + "n_enemies": 15, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + # + "8m_vs_9m": { + "n_agents": 8, + "n_enemies": 9, + "limit": 120, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "10m_vs_11m": { + "n_agents": 10, + "n_enemies": 11, + "limit": 150, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "27m_vs_30m": { + "n_agents": 27, + "n_enemies": 30, + "limit": 180, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 0, + "map_type": "marines", + }, + "MMM": { + "n_agents": 10, + "n_enemies": 10, + "limit": 150, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 3, + "map_type": "MMM", + }, + "MMM2": { + "n_agents": 10, + "n_enemies": 12, + "limit": 180, + "a_race": "T", + "b_race": "T", + "unit_type_bits": 3, + "map_type": "MMM", + }, + "2s3z": { + "n_agents": 5, + "n_enemies": 5, + "limit": 120, + "a_race": "P", + "b_race": "P", + "unit_type_bits": 2, + "map_type": "stalkers_and_zealots", + }, + "3s5z": { + "n_agents": 8, + "n_enemies": 8, + "limit": 150, + "a_race": "P", + "b_race": "P", + "unit_type_bits": 2, + "map_type": "stalkers_and_zealots", + }, + "infestor_viper": { + "n_agents": 2, + "n_enemies": 9, + "limit": 150, + "a_race": "Z", + "b_race": "Z", + "unit_type_bits": 2, + "map_type": "infestor_viper" + }, + "3s5z_vs_3s6z": { + "n_agents": 8, + "n_enemies": 9, + "limit": 170, + "a_race": "P", + "b_race": "P", + "unit_type_bits": 2, + "map_type": "stalkers_and_zealots", + }, + "3s_vs_3z": { + "n_agents": 3, + "n_enemies": 3, + "limit": 150, + "a_race": "P", + "b_race": "P", + "unit_type_bits": 0, + "map_type": "stalkers", + }, + "3s_vs_4z": { + "n_agents": 3, + "n_enemies": 4, + "limit": 200, + "a_race": "P", + "b_race": "P", + "unit_type_bits": 0, + "map_type": "stalkers", + }, + "3s_vs_5z": { + "n_agents": 3, + "n_enemies": 5, + "limit": 250, + "a_race": "P", + "b_race": "P", + "unit_type_bits": 0, + "map_type": "stalkers", + }, + "1c3s5z": { + "n_agents": 9, + "n_enemies": 9, + "limit": 180, + "a_race": "P", + "b_race": "P", + "unit_type_bits": 3, + "map_type": "colossi_stalkers_zealots", + }, + "2m_vs_1z": { + "n_agents": 2, + "n_enemies": 1, + "limit": 150, + "a_race": "T", + "b_race": "P", + "unit_type_bits": 0, + "map_type": "marines", + }, + "corridor": { + "n_agents": 6, + "n_enemies": 24, + # "limit": 400, + "limit": 150, + "a_race": "P", + "b_race": "Z", + "unit_type_bits": 0, + "map_type": "zealots", + }, + "6h_vs_8z": { + "n_agents": 6, + "n_enemies": 8, + "limit": 150, + "a_race": "Z", + "b_race": "P", + "unit_type_bits": 0, + "map_type": "hydralisks", + }, + "2s_vs_1sc": { + "n_agents": 2, + "n_enemies": 1, + "limit": 300, + "a_race": "P", + "b_race": "Z", + "unit_type_bits": 0, + "map_type": "stalkers", + }, + "so_many_baneling": { + "n_agents": 7, + "n_enemies": 32, + "limit": 100, + "a_race": "P", + "b_race": "Z", + "unit_type_bits": 0, + "map_type": "zealots", + }, + "bane_vs_bane": { + "n_agents": 24, + "n_enemies": 24, + "limit": 200, + "a_race": "Z", + "b_race": "Z", + "unit_type_bits": 2, + "map_type": "bane", + }, + "2c_vs_64zg": { + "n_agents": 2, + "n_enemies": 64, + # "limit": 400, + "limit": 150, + "a_race": "P", + "b_race": "Z", + "unit_type_bits": 0, + "map_type": "colossus", + }, +} + +for name in map_param_registry.keys(): + globals()[name] = type(name, (SMACMap, ), dict(filename=name)) + + +def get_map_params(map_name): + return map_param_registry[map_name] diff --git a/zoo/smac/envs/test_smac_env.py b/zoo/smac/envs/test_smac_env.py new file mode 100644 index 000000000..759b61c1e --- /dev/null +++ b/zoo/smac/envs/test_smac_env.py @@ -0,0 +1,41 @@ +import pytest +import numpy as np +import gym +import sys +from easydict import EasyDict +from zoo.smac.envs.smac_env_lz import SMACLZEnv + +agent_num = 3 + +# @pytest.mark.envtest +# class TestAtariEnv: + +def test_samc(): + cfg = dict( + map_name='3s_vs_5z', + difficulty=7, + reward_type='original', + agent_num=agent_num, + ) + cfg = EasyDict(cfg) + samc_env = SMACLZEnv(cfg) + samc_env.seed(0) + obs = samc_env.reset() + # assert obs.shape == (cfg.frame_stack, 84, 84) + act_dim = samc_env.action_space.n + i = 0 + while True: + # Both ``env.random_action()``, and utilizing ``np.random`` as well as action space, + # can generate legal random action. + random_action = samc_env.random_action() + timestep = samc_env.step(random_action) + assert timestep.obs.shape == (cfg.frame_stack, 84, 84) + assert timestep.reward.shape == (1, ) + if timestep.done: + assert 'eval_episode_return' in timestep.info, timestep.info + break + print(samc_env.observation_space, samc_env.action_space, samc_env.reward_space) + print('eval_episode_return: {}'.format(timestep.info['eval_episode_return'])) + samc_env.close() + +test_samc() \ No newline at end of file diff --git a/zoo/smac/utils/eval.py b/zoo/smac/utils/eval.py new file mode 100644 index 000000000..d8a13c834 --- /dev/null +++ b/zoo/smac/utils/eval.py @@ -0,0 +1,69 @@ +from typing import Union, Optional, List, Any, Callable, Tuple +import pickle +import torch +from functools import partial + +from ding.config import compile_config, read_config +from ding.envs import get_vec_env_setting +from ding.policy import create_policy +from ding.utils import set_pkg_seed + + +def eval( + input_cfg: Union[str, Tuple[dict, dict]], + seed: int = 0, + env_setting: Optional[List[Any]] = None, + model: Optional[torch.nn.Module] = None, + state_dict: Optional[dict] = None, +) -> float: + r""" + Overview: + Pure evaluation entry. + Arguments: + - input_cfg (:obj:`Union[str, Tuple[dict, dict]]`): Config in dict type. \ + ``str`` type means config file path. \ + ``Tuple[dict, dict]`` type means [user_config, create_cfg]. + - seed (:obj:`int`): Random seed. + - env_setting (:obj:`Optional[List[Any]]`): A list with 3 elements: \ + ``BaseEnv`` subclass, collector env config, and evaluator env config. + - model (:obj:`Optional[torch.nn.Module]`): Instance of torch.nn.Module. + - state_dict (:obj:`Optional[dict]`): The state_dict of policy or model. + """ + if isinstance(input_cfg, str): + cfg, create_cfg = read_config(input_cfg) + else: + cfg, create_cfg = input_cfg + create_cfg.policy.type += '_command' + cfg = compile_config(cfg, auto=True, create_cfg=create_cfg) + + env_fn, _, evaluator_env_cfg = get_vec_env_setting(cfg.env) + env = env_fn(evaluator_env_cfg[0]) + env.seed(seed, dynamic_seed=False) + set_pkg_seed(seed, use_cuda=cfg.policy.cuda) + policy = create_policy(cfg.policy, model=model, enable_field=['eval']).eval_mode + if state_dict is None: + state_dict = torch.load(cfg.learner.load_path, map_location='cpu') + policy.load_state_dict(state_dict) + + obs = env.reset() + eval_reward = 0. + while True: + policy_output = policy.forward({0: obs}) + action = policy_output[0]['action'] + print(action) + timestep = env.step(action) + eval_reward += timestep.reward + obs = timestep.obs + if timestep.done: + print(timestep.info) + break + + env.save_replay(replay_dir='.', prefix=env._map_name) + print('Eval is over! The performance of your RL policy is {}'.format(eval_reward)) + + +if __name__ == "__main__": + path = '../exp/MMM/qmix/1/ckpt_BaseLearner_Wed_Jul_14_22_16_56_2021/iteration_9900.pth.tar' + cfg = '../config/smac_MMM_qmix_config.py' + state_dict = torch.load(path, map_location='cpu') + eval(cfg, seed=0, state_dict=state_dict) From 9f93bf7d3c37fb7273cffabd2bfb51f70f329f50 Mon Sep 17 00:00:00 2001 From: nighood Date: Thu, 21 Dec 2023 12:53:44 +0800 Subject: [PATCH 2/7] test(rjy): add test for smac env --- zoo/smac/envs/smac_env_ace.py | 753 --------------------------------- zoo/smac/envs/smac_env_lz.py | 2 +- zoo/smac/envs/test_smac_env.py | 11 +- 3 files changed, 5 insertions(+), 761 deletions(-) delete mode 100644 zoo/smac/envs/smac_env_ace.py diff --git a/zoo/smac/envs/smac_env_ace.py b/zoo/smac/envs/smac_env_ace.py deleted file mode 100644 index 3676a0c3a..000000000 --- a/zoo/smac/envs/smac_env_ace.py +++ /dev/null @@ -1,753 +0,0 @@ -from collections import namedtuple -from operator import attrgetter -import numpy as np -import random -import logging -from easydict import EasyDict -import pysc2.env.sc2_env as sc2_env -from pysc2.env.sc2_env import SC2Env, Agent, MAX_STEP_COUNT, get_default, crop_and_deduplicate_names -from pysc2.lib import protocol -from s2clientprotocol import common_pb2 as sc_common, sc2api_pb2 as sc_pb, raw_pb2 as r_pb, debug_pb2 as d_pb -from ding.envs import BaseEnv -from ding.envs.common.env_element import EnvElement, EnvElementInfo -from ding.utils import ENV_REGISTRY, deep_merge_dicts - -from .smac_map import get_map_params - -races = { - "R": sc_common.Random, - "P": sc_common.Protoss, - "T": sc_common.Terran, - "Z": sc_common.Zerg, -} - -ally_types = { - 'marines': { - 0: 'marine', - }, - 'stalkers_and_zealots': { - 0: 'stalker', - 1: 'zealot', - }, - 'colossi_stalkers_zealots': { - 0: 'colossus', - 1: 'stalker', - 2: 'zealot', - }, - 'MMM': { - 0: 'marauder', - 1: 'marine', - 2: 'medivac', - }, - 'zealots': { - 0: 'zealot', - }, - 'hydralisks': { - 0: 'hydralisk', - }, - 'stalkers': { - 0: 'stalker', - }, - 'colossus': { - 0: 'colossus', - }, - 'bane': { - 0: 'baneling', - 1: 'zergling', - }, -} - -enemey_types = { - 73: 'zealot', - 74: 'stalker', - 4: 'colossus', - 9: 'baneling', - 105: 'zergling', - 51: 'marauder', - 48: 'marine', - 54: 'medivac', - 107: 'hydralisk', -} - -switcher = { - 'marine': 15, - 'marauder': 25, - 'medivac': 200, # max energy - 'stalker': 35, - 'zealot': 22, - 'colossus': 24, - 'hydralisk': 10, - 'zergling': 11, - 'baneling': 1 -} - -actions = { - "move": 16, # target: PointOrUnit - "attack": 23, # target: PointOrUnit - "stop": 4, # target: None - "heal": 386, # Unit - "parasitic_bomb": 2542, # target: Unit - 'fungal_growth': 74, # target: PointOrUnit -} - -FORCE_RESTART_INTERVAL = 50000 - - -@ENV_REGISTRY.register('smac_ace') -class SMACACEEnv(SC2Env, BaseEnv): - """ - This environment provides the interface for both single agent and multiple agents (two players) in - SC2 environment. - """ - - SMACTimestep = namedtuple('SMACTimestep', ['obs', 'reward', 'done', 'info', 'episode_steps']) - SMACEnvInfo = namedtuple('SMACEnvInfo', ['agent_num', 'obs_space', 'act_space', 'rew_space', 'episode_limit']) - SMACActionInfo = namedtuple('SMACActionInfo', ['shape', 'value']) - SMACRewardInfo = namedtuple('SMACRewardInfo', ['shape', 'value']) - config = dict( - difficulty=7, - save_replay_episodes=None, - game_steps_per_episode=None, - reward_death_value=10, - reward_win=200, - reward_scale=20, # if None, reward_scale will be self.reward_max - reward_type='original', - ) - - def __repr__(self): - return "DI-engine SMAC Env" - - def __init__( - self, - cfg, - ): - cfg = deep_merge_dicts(EasyDict(self.config), cfg) - self.cfg = cfg - # Client parameters - # necessary for compatibility with pysc2 - from absl import flags - flags.FLAGS(['smac']) - self.agent_interface_format = sc2_env.parse_agent_interface_format(use_raw_units=True) - self.save_replay_episodes = cfg.save_replay_episodes - assert (self.save_replay_episodes is None) or isinstance( - self.save_replay_episodes, int - ) # Denote the number of replays to save - self.game_steps_per_episode = cfg.game_steps_per_episode - - # Map parameters - map_name = cfg.map_name - assert map_name is not None - map_params = get_map_params(map_name) - self._map_name = map_name - self.map_type = map_params["map_type"] - self.agent_race = map_params["a_race"] - self.bot_race = map_params["b_race"] - self.difficulty = cfg.difficulty - self.players = [sc2_env.Agent(races[self.agent_race]), sc2_env.Bot(races[self.bot_race], self.difficulty)] - self.n_agents = map_params["n_agents"] - self.n_enemies = map_params["n_enemies"] - self.n_entities = self.n_agents + self.n_enemies - self._episode_limit = map_params["limit"] - - # Reset parameters - self._seed = None - self._launch_env_flag = True - self._abnormal_env_flag = False - - # Counter parameters - self._total_steps = 0 - self._next_reset_steps = FORCE_RESTART_INTERVAL - self._won_count = 0 - self._episode_count = 0 - self._timeouts = 0 - self._force_restarts = 0 - - # Reward parameters - self.reward_pos_scale = 1.0 - self.reward_neg_scale = 0.0 - self.reward_death_value = cfg.reward_death_value - self.reward_win = cfg.reward_win - self.reward_defeat = 0 - self.reward_scale = cfg.reward_scale - self.reward_max = 1020 # TODO: change after the env is lannched - self.reward_type=cfg.reward_type - - # Action parameters - self.n_actions_no_attack = 6 - self.move_amount = 2 - - def _create_join(self): - # copy and overwrite original implementation - map_inst = random.choice(self._maps) - self._map_name = map_inst.name - - self._step_mul = max(1, self._default_step_mul or map_inst.step_mul) - self._score_index = get_default(self._default_score_index, - map_inst.score_index) - self._score_multiplier = get_default(self._default_score_multiplier, - map_inst.score_multiplier) - self._episode_length = get_default(self._default_episode_length, - map_inst.game_steps_per_episode) - if self._episode_length <= 0 or self._episode_length > MAX_STEP_COUNT: - self._episode_length = MAX_STEP_COUNT - - # Create the game. Set the first instance as the host. - create = sc_pb.RequestCreateGame( - disable_fog=self._disable_fog, - realtime=self._realtime) - - if self._battle_net_map: - create.battlenet_map_name = map_inst.battle_net - else: - create.local_map.map_path = map_inst.path - map_data = map_inst.data(self._run_config) - if self._num_agents == 1: - create.local_map.map_data = map_data - else: - # Save the maps so they can access it. Don't do it in parallel since SC2 - # doesn't respect tmpdir on windows, which leads to a race condition: - # https://github.com/Blizzard/s2client-proto/issues/102 - for c in self._controllers: - c.save_map(map_inst.path, map_data) - if self._random_seed is not None: - create.random_seed = self._random_seed - for p in self._players: - if isinstance(p, Agent): - create.player_setup.add(type=sc_pb.Participant) - else: - create.player_setup.add( - type=sc_pb.Computer, race=random.choice(p.race), - difficulty=p.difficulty, ai_build=random.choice(p.build)) - if self._num_agents > 1: - self._controllers[1].create_game(create) - else: - self._controllers[0].create_game(create) - - # Create the join requests. - agent_players = [p for p in self._players if isinstance(p, Agent)] - self.sanitized_names = crop_and_deduplicate_names(p.name for p in agent_players) - join_reqs = [] - for p, name, interface in zip(agent_players, self.sanitized_names, - self._interface_options): - join = sc_pb.RequestJoinGame(options=interface) - join.race = random.choice(p.race) - join.player_name = name - if self._ports: - join.shared_port = 0 # unused - join.server_ports.game_port = self._ports[0] - join.server_ports.base_port = self._ports[1] - for i in range(self._num_agents - 1): - join.client_ports.add(game_port=self._ports[i * 2 + 2], - base_port=self._ports[i * 2 + 3]) - join_reqs.append(join) - - # Join the game. This must be run in parallel because Join is a blocking - # call to the game that waits until all clients have joined. - self._parallel.run((c.join_game, join) - for c, join in zip(self._controllers, join_reqs)) - - self._game_info = self._parallel.run(c.game_info for c in self._controllers) - for g, interface in zip(self._game_info, self._interface_options): - if g.options.render != interface.render: - logging.warning( - "Actual interface options don't match requested options:\n" - "Requested:\n%s\n\nActual:\n%s", interface, g.options) - - self._features = None - - - def _launch(self): - self.old_unit_tags = set() - print("*****LAUNCH FUNCTION CALLED*****") - SC2Env.__init__( - self, - map_name=self.map_name, - battle_net_map=False, - players=self.players, - agent_interface_format=self.agent_interface_format, - discount=None, - discount_zero_after_timeout=False, - visualize=False, - step_mul=8, - realtime=False, - save_replay_episodes=self.save_replay_episodes, - replay_dir=None if self.save_replay_episodes is None else ".", - replay_prefix=None, - game_steps_per_episode=self.game_steps_per_episode, - score_index=None, - score_multiplier=None, - random_seed=self._seed, - disable_fog=False, - ensure_available_actions=True, - version=None - ) - self._parallel.run((c.step, 2) for c in self._controllers) - self._init_map() - - def _episode_restart(self): - """Restart the environment by killing all units on the map. - There is a trigger in the SC2Map file, which restarts the - episode when there are no units left. - """ - try: - # save current units' tag - self._update_obs() - self.old_unit_tags = set(unit.tag for unit in self._obs.observation.raw_data.units) - # kill current units - run_commands = [ - ( - self._controllers[0].debug, - d_pb.DebugCommand( - kill_unit=d_pb.DebugKillUnit( - tag=[unit.tag for unit in self._obs.observation.raw_data.units] - ) - ) - ) - ] - # Kill all units on the map. - self._parallel.run(run_commands) - # Forward 2 step to make sure all units revive. - self._parallel.run((c.step, 2) for c in self._controllers) - except (protocol.ProtocolError, protocol.ConnectionError) as e: - print("Error happen in _restart. Error: ", e) - self._env_restart() - - def _env_restart(self): - self.close() - self._launch() - self._force_restarts += 1 - - def reset(self): - if self._launch_env_flag: - # Launch StarCraft II - print("*************LAUNCH TOTAL GAME********************") - self._launch() - elif self._abnormal_env_flag or (self._total_steps >= self._next_reset_steps) or ( - self.save_replay_episodes is not None): - # Avoid hitting the real episode limit of SC2 env - print("We are full restarting the environment! save_replay_episodes: ", self.save_replay_episodes) - self._env_restart() - self._next_reset_steps += FORCE_RESTART_INTERVAL - else: - self._episode_restart() - - init_flag = False - for i in range(5): - for j in range(10): - self._update_obs() - init_flag = self._init_units() - if init_flag: - break - else: - self._episode_restart() - if init_flag: - break - else: - self._env_restart() - if not init_flag: - raise RuntimeError("reset 5 times error") - - self._episode_steps = 0 - self._final_eval_fake_reward = 0. - - self._launch_env_flag = False - self._abnormal_env_flag = False - - self._init_units_attr() - self._init_rewards() - self._init_states() - return self.get_obs() - - def _init_map(self): - game_info = self._game_info[0] - map_info = game_info.start_raw - map_play_area_min = map_info.playable_area.p0 - map_play_area_max = map_info.playable_area.p1 - self.max_distance_x = map_play_area_max.x - map_play_area_min.x - self.max_distance_y = map_play_area_max.y - map_play_area_min.y - self.map_x = map_info.map_size.x - self.map_y = map_info.map_size.y - if map_info.pathing_grid.bits_per_pixel == 1: - vals = np.array(list(map_info.pathing_grid.data)).reshape(self.map_x, int(self.map_y / 8)) - self.pathing_grid = np.transpose( - np.array([[(b >> i) & 1 for b in row for i in range(7, -1, -1)] for row in vals], dtype=np.bool) - ) - else: - self.pathing_grid = np.invert( - np.flip( - np.transpose( - np.array(list(map_info.pathing_grid.data), dtype=np.bool).reshape(self.map_x, self.map_y)), - axis=1 - ) - ) - self.terrain_height = np.flip( - np.transpose(np.array(list(map_info.terrain_height.data)).reshape(self.map_x, self.map_y)), 1 - ) / 255 - - def _init_units(self): - # Sometimes not all units have yet been created by SC2 ToDO: check if use list not dict is a bug - self.agents = [ - unit for unit in self._obs.observation.raw_data.units - if (unit.owner == 1) and (unit.tag not in self.old_unit_tags) - ] - self.agents = sorted( - self.agents, - key=attrgetter("unit_type", "pos.x", "pos.y"), - reverse=False, - ) - self.enemies = [ - unit for unit in self._obs.observation.raw_data.units - if (unit.owner == 2) and (unit.tag not in self.old_unit_tags) - ] - - all_agents_created = (len(self.agents) == self.n_agents) - all_enemies_created = (len(self.enemies) == self.n_enemies) - all_agents_health = all(u.health > 0 for u in self.agents) - all_enemies_health = all(u.health > 0 for u in self.enemies) - - if all_agents_created and all_enemies_created and all_agents_health and all_enemies_health: # all good - return True - else: - if not all_agents_created: - print('not all agents created: {} vs {}'.format(len(self.agents), self.n_agents)) - if not all_agents_created: - print('not all enemies created: {} vs {}'.format(len(self.enemies), self.n_enemies)) - if not all_agents_health: - print('not all agents health') - if not all_enemies_health: - print('not all enemies health') - return False - - def _init_units_attr(self): - # type - self.min_unit_type = min([u.unit_type for u in self.agents]) - self.types = [ally_types[self.map_type][u.unit_type - self.min_unit_type] for u in self.agents] + \ - [enemey_types[u.unit_type] for u in self.enemies] - self.is_medivac = np.array([(t == 'medivac') for t in self.types], dtype=np.bool) - # type id - type_to_id = {t: i for i, t in enumerate(sorted(list(set(self.types))))} - self.unit_type_bits = len(type_to_id) - self.type_id = np.array([type_to_id[t] for t in self.types], dtype=np.int64) - # cooldown - self.cooldown_max = np.array([switcher[t] for t in self.types], dtype=np.float32) - # shoot_range - self.shoot_range = np.array([6 for t in self.types], dtype=np.float32) - - def _init_rewards(self): - self.reward_injury = np.zeros(self.n_agents + self.n_enemies, dtype=np.float32) - self.reward_dead = np.zeros(self.n_agents + self.n_enemies, dtype=np.float32) - self.reward_end = 0 - if self.reward_type=='original': - self.reward_max = (self.n_enemies * self.reward_death_value + self.reward_win) + sum( - [(u.health_max + u.shield_max) for u in self.enemies]) - elif self.reward_type=='unit_norm': - self.reward_max = max([(u.health_max + u.shield_max) for u in self.enemies]) - self.reward_scale = self.reward_max if self.reward_scale is None else self.reward_scale - - def _init_states(self): - self.state_len = 1 + self.unit_type_bits + 2 + 1 + 2 + 1 + 7 + 9 + 9 # ally or enemy, unit_type, pos.x and y, health, sheld(abs value and whether shield is zero), cooldown, last action(stop,move,attack), path, height - self.relation_len = 2 + 2 + 2 # distance, cos(theta) and sin(theta), whether can attack - self.action_len = self.n_actions_no_attack + self.n_entities # (dead, stop, move) + help ally(currentlly only for medivac) + attack enemy - # init satetes - self.states = np.zeros((self.n_entities, self.state_len), dtype=np.float32) - row_ind = np.arange(self.n_entities) - self.states[:, 0] = (row_ind >= self.n_agents) # ally or enemy - self.states[row_ind, 1 + self.type_id] = 1 # unit_type - self.alive_mask = np.ones(self.n_entities, dtype=np.bool) - # init relations - self.relations = np.zeros((self.n_entities, self.n_entities, self.relation_len), dtype=np.float32) - # init actions - self.action_mask = np.zeros((self.n_agents, self.action_len), dtype=np.bool) - self.dead_action = np.array([[1] + [0] * (self.action_len - 1)], dtype=np.bool) - self.last_actions = np.ones(self.n_agents, dtype=np.int64) - row_inds = np.arange(self.n_agents) - # update states with current units - self._update_states() - - def step(self, actions): - processed_actions = self._process_actions(actions) - try: - self._submit_actions(processed_actions) - except (protocol.ProtocolError, protocol.ConnectionError, ValueError) as e: - print("Error happen in step! Error: ", e) - self._abnormal_env_flag = True - return self.SMACTimestep(obs=None, reward=None, done=True, info={'abnormal': True}, - episode_steps=self._episode_steps) - self.last_actions = np.minimum(np.array(actions, dtype=np.int64), 6) # dead, stop, N, S, E, W, attack - self._total_steps += 1 - self._episode_steps += 1 - # Update states - self._update_obs() - game_end_code = self._update_units() - self._update_states() - # Get return - reward = self.get_reward() - self._final_eval_fake_reward += sum(reward) - done, info = self.get_info(game_end_code) - obs = self.get_obs() - return self.SMACTimestep( - obs=obs, reward=reward.copy(), done=done, info=info, episode_steps=self._episode_steps - ) - - def _process_actions(self, my_actions): - """Construct the action for agent a_id. - The input action here is *absolute* and is not mirrored! - We use skip_mirror=True in get_avail_agent_actions to avoid error. - """ - processed_actions = [] - for i, (unit, action) in enumerate(zip(self.agents, my_actions)): - assert self.action_mask[i][action] == 1 - tag = unit.tag - x = unit.pos.x - y = unit.pos.y - ma = self.move_amount - offset = [[0, ma], [0, -ma], [ma, 0], [-ma, 0]] - - if action == 0: - # no-op (valid only when dead) - assert unit.health == 0, "No-op only available for dead agents." - return None - elif action == 1: - # stop - cmd = r_pb.ActionRawUnitCommand(ability_id=actions["stop"], unit_tags=[tag], queue_command=False) - elif action in [2, 3, 4, 5]: - # move - o = offset[action - 2] - cmd = r_pb.ActionRawUnitCommand( - ability_id=actions["move"], - target_world_space_pos=sc_common.Point2D(x=x + o[0], y=y + o[1]), - unit_tags=[tag], - queue_command=False - ) - else: - # attack or heal - if self.map_type == "MMM" and self.is_medivac[i]: - target_unit = self.agents[action - self.n_actions_no_attack] - action_name = "heal" - else: - target_unit = self.enemies[action - self.n_actions_no_attack - self.n_agents] - action_name = "attack" - cmd = r_pb.ActionRawUnitCommand( - ability_id=actions[action_name], target_unit_tag=target_unit.tag, unit_tags=[tag], - queue_command=False - ) - processed_actions.append(sc_pb.Action(action_raw=r_pb.ActionRaw(unit_command=cmd))) - - return processed_actions - - def _submit_actions(self, actions): - # actions is a sequence - # Send action request - req_actions = sc_pb.RequestAction(actions=actions) - self._controllers[0].actions(req_actions) - self._controllers[0].step(self._step_mul) - - def _update_obs(self): - # Transform in the thread so it runs while waiting for other observations. - self._obs = self._controllers[0].observe() - - def _update_units(self): - """Update units after an environment step. - This function assumes that self._obs is up-to-date. - """ - n_ally_alive = 0 - n_enemy_alive = 0 - units = {unit.tag: unit for unit in self._obs.observation.raw_data.units} - for a_id, a_unit in enumerate(self.agents): - prev_health, prev_shield = a_unit.health, a_unit.shield - if a_unit.tag in units: - self.agents[a_id] = units[a_unit.tag] - else: - a_unit.health, a_unit.shield = 0, 0 - curr_health, curr_shield = self.agents[a_id].health, self.agents[a_id].shield - self.reward_injury[a_id] = self.reward_neg_scale * (prev_health + prev_shield - curr_health - curr_shield) - self.reward_dead[ - a_id] = self.reward_neg_scale * self.reward_death_value if prev_health > 0 and curr_health == 0 else 0 - if a_unit.health > 0 and not self.is_medivac[ - a_id]: # only count entities capable of attacking, 54 is medivac. - n_ally_alive += 1 - - for e_id, e_unit in enumerate(self.enemies): - prev_health, prev_shield = e_unit.health, e_unit.shield - if e_unit.tag in units: - self.enemies[e_id] = units[e_unit.tag] - else: - e_unit.health, e_unit.shield = 0, 0 - curr_health, curr_shield = self.enemies[e_id].health, self.enemies[e_id].shield - self.reward_injury[e_id + self.n_agents] = self.reward_pos_scale * ( - prev_health + prev_shield - curr_health - curr_shield) - self.reward_dead[ - e_id + self.n_agents] = self.reward_pos_scale * self.reward_death_value if prev_health > 0 and curr_health == 0 else 0 - if e_unit.health > 0 and not self.is_medivac[ - e_id + self.n_agents]: # only count entities capable of attacking, 54 is medivac. - n_enemy_alive += 1 - - self.reward_end = 0 - if n_ally_alive == 0 and n_enemy_alive > 0: - self.reward_end = self.reward_defeat - return -1 # lost - elif n_ally_alive > 0 and n_enemy_alive == 0: - self.reward_end = self.reward_win - return 1 # won - elif n_ally_alive == 0 and n_enemy_alive == 0: - return 0 # draw - else: - return None # not end - - def _update_states(self): - # update unit states - self.states[:, 1 + self.unit_type_bits + 6: 1 + self.unit_type_bits + 13] = 0 - self.states[np.arange(self.n_agents), 1 + self.unit_type_bits + 6 + self.last_actions] = 1 - for i, u in enumerate(self.agents + self.enemies): - self.states[i, 1 + self.unit_type_bits] = u.pos.x - self.states[i, 1 + self.unit_type_bits + 1] = u.pos.y - self.states[i, 1 + self.unit_type_bits + 2] = u.health / 100.0 - self.states[i, 1 + self.unit_type_bits + 3] = u.shield / 100.0 - self.states[i, 1 + self.unit_type_bits + 4] = (u.shield > 0) - self.states[i, 1 + self.unit_type_bits + 5] = u.weapon_cooldown / 50 if not self.is_medivac[ - i] else u.energy / 150 - self.alive_mask[i] = (u.health > 0) - # update surrounding terrain - pos = self.states[:, 1 + self.unit_type_bits:1 + self.unit_type_bits + 2] - ma = self.move_amount - border = np.array([[0, 0], [self.map_x, self.map_y]]).astype(np.int64) - offset = np.array([ - [0, 2 * ma], - [0, -2 * ma], - [2 * ma, 0], - [-2 * ma, 0], - [ma, ma], - [-ma, -ma], - [ma, -ma], - [-ma, ma], - [0, 0], - [0, ma / 2], # move north - [0, -ma / 2], # move south - [ma / 2, 0], # move east - [-ma / 2, 0], # move west - ]) - surround = (pos[:, None, :] + offset[None, :, :]).astype(np.int64) - surround_clip = np.clip(surround, border[0], border[1]-1) - in_path = self.pathing_grid[surround_clip[:, :, 0], surround_clip[:, :, 1]] - in_border = (surround >= border[0]).all(axis=-1) & (surround < border[1]).all(axis=-1) - surround_path = in_path & in_border - surround_height = self.terrain_height[surround_clip[:, :, 0], surround_clip[:, :, 1]] - self.states[:, -18:] = np.concatenate([surround_path[:, :9], surround_height[:, :9]], axis=1) - # update relations - disp = pos[:, None, :] - pos[None, :, :] - dist = np.sqrt(np.sum(disp * disp, axis=2)) - self.relations[:, :, 0] = np.minimum((dist - self.shoot_range[None, :]) / 6, - 3) # minus enemy's shoot range, clip to < 3 - self.relations[:, :, 1] = np.minimum((dist - self.shoot_range[:, None]) / 6, - 3) # minus ego's shoot range, clip to < 3 - self.relations[:, :, 2] = disp[:, :, 0] / (dist + 1e-8) # cos(theta) - self.relations[:, :, 3] = disp[:, :, 1] / (dist + 1e-8) # sin(theta) - self.relations[:, :, 4] = (dist <= self.shoot_range[None, :]) # whetehr can be shooted - self.relations[:, :, 5] = (dist <= self.shoot_range[:, None]) # whetehr can shoot - self.states[:, 1 + self.unit_type_bits] = self.states[:, 1 + self.unit_type_bits] / self.map_x - self.states[:, 1 + self.unit_type_bits + 1] = self.states[:, 1 + self.unit_type_bits + 1] / self.map_y - # update actions - self.action_mask[:, 0] = 0 # dead action - self.action_mask[:, 1] = 1 # stop action - self.action_mask[:, 2:6] = surround_path[:self.n_agents, 9:] # move action - medivac_mask = self.is_medivac[:self.n_agents] - alive_mask = self.alive_mask[:self.n_agents] - shoot_mask = self.relations[: self.n_agents, :, 5].astype(np.bool) & self.alive_mask - self.action_mask[~medivac_mask, 6 + self.n_agents:6 + self.n_entities] = shoot_mask[~medivac_mask, - self.n_agents:self.n_entities] # attack action - self.action_mask[medivac_mask, 6:6 + self.n_agents] = shoot_mask[medivac_mask, - :self.n_agents] & ~medivac_mask # heal action - self.action_mask[~alive_mask, :] = self.dead_action # dead action - - def get_reward(self): - reward = (self.reward_injury + self.reward_dead)[None, :].sum(axis=1) + self.reward_end - reward *= self.reward_scale / self.reward_max - return reward - - def get_obs(self): - """Returns all agent observations in a list. - NOTE: Agents should have access only to their local observations - during decentralised execution. - """ - obs = { - 'states': self.states.copy(), - 'relations': self.relations.copy(), - 'action_mask': self.action_mask.copy(), - 'alive_mask': self.alive_mask.copy(), - } - return obs - - # def get_avail_agent_actions(self, agent_id): - # return self.action_mask[agent_id] - - def get_info(self, game_end_code): - """This function is called only once at each step, no matter whether you take opponent as agent. - We already return dicts for each term, as in Multi-agent scenario. - """ - info = { - "battle_won": False, - "battle_lost": False, - "draw": False, - 'final_eval_reward': 0., - 'final_eval_fake_reward': 0. - } - done = False - - if game_end_code is not None: - done = True - if game_end_code == 1: - self._won_count += 1 - info["battle_won"] = True - info['final_eval_reward'] = 1. - elif game_end_code == -1: - info["battle_lost"] = True - else: - info["draw"] = True - elif self._episode_steps >= self._episode_limit: - done = True - self._timeouts += 1 - - if done: - self._episode_count += 1 - dead_allies = sum(~self.alive_mask[:self.n_agents]) - dead_enemies = sum(~self.alive_mask[self.n_agents:self.n_entities]) - info['final_eval_fake_reward'] = self._final_eval_fake_reward - info['dead_allies'] = dead_allies - info['dead_enemies'] = dead_enemies - info['episode_info'] = { - 'final_eval_fake_reward': info['final_eval_fake_reward'], - 'dead_allies': dead_allies, - 'dead_enemies': dead_enemies - } - return done, info - - def info(self): - agent_num = self.n_agents - enemy_num = self.n_enemies - obs_space = {} # TODO: Now, obs_space is only accessible after self.reset(). - obs = self.reset() - for k, v in obs.items(): - obs_space[k] = v.shape - self.close() - obs_space = EnvElementInfo(obs_space, None) - return self.SMACEnvInfo( - agent_num=agent_num, - obs_space=obs_space, - act_space=self.SMACActionInfo((self.n_agents,), {'min': 0, 'max': 1}), - rew_space=self.SMACRewardInfo((1,), {'min': 0, 'max': self.reward_max}), - episode_limit=self._episode_limit, - ) - - def seed(self, seed, dynamic_seed=False): - self._seed = seed - if self.cfg.get('subprocess_numpy_seed', False): - np.random.seed(self._seed) - - def close(self): - SC2Env.close(self) - - -SMACTimestep = SMACACEEnv.SMACTimestep -SMACEnvInfo = SMACACEEnv.SMACEnvInfo -SMACActionInfo = SMACACEEnv.SMACActionInfo -SMACRewardInfo = SMACACEEnv.SMACRewardInfo \ No newline at end of file diff --git a/zoo/smac/envs/smac_env_lz.py b/zoo/smac/envs/smac_env_lz.py index 883c8bae0..9374d3aaa 100644 --- a/zoo/smac/envs/smac_env_lz.py +++ b/zoo/smac/envs/smac_env_lz.py @@ -505,7 +505,7 @@ def step(self, actions): obs_marl['agent_specifig_global_state'] = np.concatenate((obs_marl['agent_state'], np.repeat(obs_marl['global_state'].reshape(1, -1), self.n_agents, axis=0)), axis=1) ori_obs['states'] = obs_marl return self.SMACTimestep( - obs=obs_marl, reward=reward.copy(), done=done, info=info, episode_steps=self._episode_steps + obs=ori_obs, reward=reward.copy(), done=done, info=info, episode_steps=self._episode_steps ) def _process_actions(self, my_actions): diff --git a/zoo/smac/envs/test_smac_env.py b/zoo/smac/envs/test_smac_env.py index 759b61c1e..aff12ff58 100644 --- a/zoo/smac/envs/test_smac_env.py +++ b/zoo/smac/envs/test_smac_env.py @@ -21,15 +21,12 @@ def test_samc(): samc_env = SMACLZEnv(cfg) samc_env.seed(0) obs = samc_env.reset() - # assert obs.shape == (cfg.frame_stack, 84, 84) - act_dim = samc_env.action_space.n - i = 0 + assert isinstance(obs, dict) while True: - # Both ``env.random_action()``, and utilizing ``np.random`` as well as action space, - # can generate legal random action. - random_action = samc_env.random_action() + random_action = np.random.randint(0, 6, size=(agent_num, )) timestep = samc_env.step(random_action) - assert timestep.obs.shape == (cfg.frame_stack, 84, 84) + assert isinstance(obs, dict) + assert set(['agent_state', 'global_state', 'agent_specifig_global_state']).issubset(timestep[0]['states']) assert timestep.reward.shape == (1, ) if timestep.done: assert 'eval_episode_return' in timestep.info, timestep.info From c0dd08ef66715cabc9f0ca80742c5997c25cb006 Mon Sep 17 00:00:00 2001 From: nighood Date: Wed, 27 Dec 2023 21:05:52 +0800 Subject: [PATCH 3/7] polish(rjy): add installation notes --- zoo/smac/README.md | 62 +++++++--------------------------------------- 1 file changed, 9 insertions(+), 53 deletions(-) diff --git a/zoo/smac/README.md b/zoo/smac/README.md index ddc458caa..080e9578c 100644 --- a/zoo/smac/README.md +++ b/zoo/smac/README.md @@ -1,54 +1,10 @@ ## PYSC2 Env -DI-engine use modified pysc2 env (for more maps and agent vs agent training), and you need to install [DI-star](https://github.com/opendilab/DI-star#installation) first, then you can import related package like this: -```python -import ctools.pysc2 -from ctools.pysc2.maps import lib -``` - -## SMAC Benchmark - -==setting: SC2 version=4.6.2.69232, difficulty=7, 2M env step== - - -| 3s5z | pymarl | |DI-engine | | cfg | -| :----: | :------: | :--: | :------: | :------: | :----------------------------------------------------------: | -| | win rate | time | win rate | time | | -| qmix | 1 | 9.5h | **1** | **3.2h** | dizoo/smac/config/smac_3s5z_qmix_config.py | -| collaq | 1 | 28h | 0.9 | **8.5h** | dizoo/smac/config/smac_3s5z_collaq_config.py | -| coma | 0 | 2.7h | **0.9** | **2.9h** | dizoo/smac/config/smac_3s5z_coma_config.py | -| qtran | 0.1 | 11.5h | **0.9** | **4h** | dizoo/smac/config/smac_3s5z_qtran_config.py | -| ippo | 0.15 | 10.5h | **0.8** | **6.8h** | | -| mappo | 0.936 | 10.5h | **1** | **7.4h** | dizoo/smac/config/smac_3s5z_mappo_config.py | - - -| 5m vs. 6m | pymarl | |DI-engine | | cfg | -| :-------: | :------: | :--: | :------: | :------: | :----------------------------------------------------------: | -| | win rate | time | win rate | time | | -| qmix | **0.76** | 7.5h | 0.6 | **6.5h** | dizoo/smac/config/smac_5m6m_qmix_config.py | -| collaq | 0.8 | 24h | 0.7 | **9.5h** | dizoo/smac/config/smac_5m6m_collaq_config.py | -| coma | 0 | 2.5h | 0 | - | | -| qtran | 0.7 | 7h | 0.55 | **5.5h** | dizoo/smac/config/smac_5m6m_qtran_config.py | -| ippo | 0 | 9.2h | **0.75** | **6.9h** | | -| mappo | 0 | 9.4h | **0.75** | **7.2h** | dizoo/smac/config/smac_5m6m_mappo_config.py | - -| MMM | pymarl | |DI-engine | | cfg | -| :----: | :------: | :--: | :------: | :------: | :----------------------------------------------------------: | -| | win rate | time | win rate | time | | -| qmix | 1 | 9.5h | **1** | **3.5h** | dizoo/smac/config/smac_MMM_qmix_config.py | -| collaq | 1 | 38h | **1** | **6.7h** | dizoo/smac/config/smac_MMM_collaq_config.py | -| coma | 0.1 | 3h | **0.9** | **2.6h** | dizoo/smac/config/smac_MMM_coma_config.py | -| qtran | 1 | 8.5h | **1** | **5.5h** | dizoo/smac/config/smac_MMM_qtran_config.py | -| ippo | 0.33 | 7.2h | **1** | **4.7h** | | -| mappo | 1 | 7.2h | **1** | **3.7h** | dizoo/smac/config/smac_MMM_mappo_config.py | - -| MMM2 | pymarl | |DI-engine | | cfg | -| :----: | :------: | :--: | :------: | :------: | :----------------------------------------------------------: | -| | win rate | time | win rate | time | | -| qmix | 0.7 | 10h | 0.4 | **5.5h** | dizoo/smac/config/smac_MMM2_qmix_config.py | -| collaq | 0.9 | 24h | 0.6 | **13h** | dizoo/smac/config/smac_MMM2_collaq_config.py | -| coma | 0 | 3h | **0.2** | 3.5h | dizoo/smac/config/smac_MMM2_coma_config.py | -| qtran | 0 | 8.5h | 0 | - | | -| ippo | 0 | 8.3h | **0.875** | **6h** | | -| mappo | 0 | 8.3h | **1** | **9h** | dizoo/smac/config/smac_MMM2_mappo_config.py | - -comment: The time in the table is the time to run 2M env step. The IPPO and MAPPO were experimented with DI-engine and the epymarl open source library. The epymarl library commit id is ee85dd0. +LightZero use modified pysc2 env (for more maps and agent vs agent training), and you need to install , +```powershell +# install starcraft +conda create -n ace python=3.8 +wget https://blzdistsc2-a.akamaihd.net/Linux/SC2.4.10.zip +unzip SC2.4.10.zip +export SC2PATH="StarCraftII" +pip install pysc2 protobuf==3.19.5 +``` \ No newline at end of file From fe45b430e9b597212a1bd2e9357de7b42d9ec260 Mon Sep 17 00:00:00 2001 From: nighood Date: Wed, 12 Jun 2024 13:41:04 +0800 Subject: [PATCH 4/7] fix(rjy): modify samc env and readme --- zoo/smac/README.md | 66 +++++++++++++++--- ...ac_env_lz.py => smac_env_lightzero_env.py} | 13 ++-- zoo/smac/envs/test_smac_env.py | 4 +- zoo/smac/utils/eval.py | 69 ------------------- 4 files changed, 68 insertions(+), 84 deletions(-) rename zoo/smac/envs/{smac_env_lz.py => smac_env_lightzero_env.py} (98%) delete mode 100644 zoo/smac/utils/eval.py diff --git a/zoo/smac/README.md b/zoo/smac/README.md index 080e9578c..8e5378758 100644 --- a/zoo/smac/README.md +++ b/zoo/smac/README.md @@ -1,10 +1,58 @@ ## PYSC2 Env -LightZero use modified pysc2 env (for more maps and agent vs agent training), and you need to install , -```powershell -# install starcraft -conda create -n ace python=3.8 -wget https://blzdistsc2-a.akamaihd.net/Linux/SC2.4.10.zip -unzip SC2.4.10.zip -export SC2PATH="StarCraftII" -pip install pysc2 protobuf==3.19.5 -``` \ No newline at end of file +SMAC (StarCraft Multi-Agent Challenge) is an environment used for multi-agent reinforcement learning research based on the popular real-time strategy game StarCraft II. It provides a suite of tasks where agents need to cooperate to achieve specific objectives. This environment is widely used to benchmark the performance of multi-agent learning algorithms. LightZero use modified pysc2 env (for more maps and agent vs agent training). + +### Installation + +To install the modified PySC2 environment for more maps and agent vs. agent training, follow these steps: + +1. **Install StarCraft II:** + ```bash + # Create a conda environment + conda create -n ace python=3.8 + + # Activate the environment + conda activate ace + + # Download StarCraft II + wget https://blzdistsc2-a.akamaihd.net/Linux/SC2.4.10.zip + + # Unzip the downloaded file + unzip SC2.4.10.zip + + # Set the SC2 path + export SC2PATH="StarCraftII" + ``` + +2. **Install dependencies:** + ```bash + # Install PySC2 and Protobuf + pip install pysc2 protobuf==3.19.5 + ``` + +### Testing the Installation + +To ensure the environment is correctly installed and functional, you can run the tests provided in the LightZero repository: + +1. **Navigate to the LightZero directory:** + ```bash + cd LightZero/zoo/smac/envs + ``` + +2. **Run the tests using pytest:** + ```bash + pytest test_smac_env.py + +### Environment Requirements + +- **Operating System:** Linux (recommended) +- **Python Version:** >=3.8 +- **Dependencies:** + - StarCraft II (version 4.10) + - PySC2 + - Protobuf (version 3.19.5) + +Make sure your system meets these requirements before proceeding with the installation. + +### DI-engine Baselines + +For more information on DI-engine baselines for SMAC, refer to the following link: [DI-engine SMAC Baselines](https://github.com/opendilab/DI-engine/blob/main/dizoo/smac/README.md) diff --git a/zoo/smac/envs/smac_env_lz.py b/zoo/smac/envs/smac_env_lightzero_env.py similarity index 98% rename from zoo/smac/envs/smac_env_lz.py rename to zoo/smac/envs/smac_env_lightzero_env.py index 9374d3aaa..71095b2b4 100644 --- a/zoo/smac/envs/smac_env_lz.py +++ b/zoo/smac/envs/smac_env_lightzero_env.py @@ -10,6 +10,7 @@ from s2clientprotocol import common_pb2 as sc_common, sc2api_pb2 as sc_pb, raw_pb2 as r_pb, debug_pb2 as d_pb from ding.envs import BaseEnv from ding.envs.common.env_element import EnvElement, EnvElementInfo +from ding.envs import BaseEnvTimestep from ding.utils import ENV_REGISTRY, deep_merge_dicts from .smac_map import get_map_params @@ -366,7 +367,10 @@ def reset(self): # agent_specifig_global_state obs_marl['agent_specifig_global_state'] = np.concatenate((obs_marl['agent_state'], np.repeat(obs_marl['global_state'].reshape(1, -1), self.n_agents, axis=0)), axis=1) ori_obs['states'] = obs_marl - return ori_obs + + action_mask = None + obs = {'observation': ori_obs, 'action_mask': action_mask, 'to_play': -1} + return obs def _init_map(self): game_info = self._game_info[0] @@ -504,9 +508,10 @@ def step(self, actions): # agent_specifig_global_state obs_marl['agent_specifig_global_state'] = np.concatenate((obs_marl['agent_state'], np.repeat(obs_marl['global_state'].reshape(1, -1), self.n_agents, axis=0)), axis=1) ori_obs['states'] = obs_marl - return self.SMACTimestep( - obs=ori_obs, reward=reward.copy(), done=done, info=info, episode_steps=self._episode_steps - ) + + action_mask = None + obs = {'observation': ori_obs, 'action_mask': action_mask, 'to_play': -1} + return BaseEnvTimestep(obs, reward, done, info) def _process_actions(self, my_actions): """Construct the action for agent a_id. diff --git a/zoo/smac/envs/test_smac_env.py b/zoo/smac/envs/test_smac_env.py index aff12ff58..7948b45f2 100644 --- a/zoo/smac/envs/test_smac_env.py +++ b/zoo/smac/envs/test_smac_env.py @@ -3,7 +3,7 @@ import gym import sys from easydict import EasyDict -from zoo.smac.envs.smac_env_lz import SMACLZEnv +from LightZero.zoo.smac.envs.smac_env_lightzero_env import SMACLZEnv agent_num = 3 @@ -26,7 +26,7 @@ def test_samc(): random_action = np.random.randint(0, 6, size=(agent_num, )) timestep = samc_env.step(random_action) assert isinstance(obs, dict) - assert set(['agent_state', 'global_state', 'agent_specifig_global_state']).issubset(timestep[0]['states']) + assert set(['agent_state', 'global_state', 'agent_specifig_global_state']).issubset(timestep.obs['observation']) assert timestep.reward.shape == (1, ) if timestep.done: assert 'eval_episode_return' in timestep.info, timestep.info diff --git a/zoo/smac/utils/eval.py b/zoo/smac/utils/eval.py deleted file mode 100644 index d8a13c834..000000000 --- a/zoo/smac/utils/eval.py +++ /dev/null @@ -1,69 +0,0 @@ -from typing import Union, Optional, List, Any, Callable, Tuple -import pickle -import torch -from functools import partial - -from ding.config import compile_config, read_config -from ding.envs import get_vec_env_setting -from ding.policy import create_policy -from ding.utils import set_pkg_seed - - -def eval( - input_cfg: Union[str, Tuple[dict, dict]], - seed: int = 0, - env_setting: Optional[List[Any]] = None, - model: Optional[torch.nn.Module] = None, - state_dict: Optional[dict] = None, -) -> float: - r""" - Overview: - Pure evaluation entry. - Arguments: - - input_cfg (:obj:`Union[str, Tuple[dict, dict]]`): Config in dict type. \ - ``str`` type means config file path. \ - ``Tuple[dict, dict]`` type means [user_config, create_cfg]. - - seed (:obj:`int`): Random seed. - - env_setting (:obj:`Optional[List[Any]]`): A list with 3 elements: \ - ``BaseEnv`` subclass, collector env config, and evaluator env config. - - model (:obj:`Optional[torch.nn.Module]`): Instance of torch.nn.Module. - - state_dict (:obj:`Optional[dict]`): The state_dict of policy or model. - """ - if isinstance(input_cfg, str): - cfg, create_cfg = read_config(input_cfg) - else: - cfg, create_cfg = input_cfg - create_cfg.policy.type += '_command' - cfg = compile_config(cfg, auto=True, create_cfg=create_cfg) - - env_fn, _, evaluator_env_cfg = get_vec_env_setting(cfg.env) - env = env_fn(evaluator_env_cfg[0]) - env.seed(seed, dynamic_seed=False) - set_pkg_seed(seed, use_cuda=cfg.policy.cuda) - policy = create_policy(cfg.policy, model=model, enable_field=['eval']).eval_mode - if state_dict is None: - state_dict = torch.load(cfg.learner.load_path, map_location='cpu') - policy.load_state_dict(state_dict) - - obs = env.reset() - eval_reward = 0. - while True: - policy_output = policy.forward({0: obs}) - action = policy_output[0]['action'] - print(action) - timestep = env.step(action) - eval_reward += timestep.reward - obs = timestep.obs - if timestep.done: - print(timestep.info) - break - - env.save_replay(replay_dir='.', prefix=env._map_name) - print('Eval is over! The performance of your RL policy is {}'.format(eval_reward)) - - -if __name__ == "__main__": - path = '../exp/MMM/qmix/1/ckpt_BaseLearner_Wed_Jul_14_22_16_56_2021/iteration_9900.pth.tar' - cfg = '../config/smac_MMM_qmix_config.py' - state_dict = torch.load(path, map_location='cpu') - eval(cfg, seed=0, state_dict=state_dict) From c549ff925e4a3f9194e9136ae5d403a6a68ea4d0 Mon Sep 17 00:00:00 2001 From: nighood Date: Wed, 12 Jun 2024 14:02:06 +0800 Subject: [PATCH 5/7] polish(rjy): polish smac env --- zoo/smac/envs/smac_env_lightzero_env.py | 123 +++++++++++++++++++++--- zoo/smac/envs/test_smac_env.py | 52 +++++----- 2 files changed, 134 insertions(+), 41 deletions(-) diff --git a/zoo/smac/envs/smac_env_lightzero_env.py b/zoo/smac/envs/smac_env_lightzero_env.py index 71095b2b4..d196fa712 100644 --- a/zoo/smac/envs/smac_env_lightzero_env.py +++ b/zoo/smac/envs/smac_env_lightzero_env.py @@ -97,8 +97,11 @@ @ENV_REGISTRY.register('smac_lz') class SMACLZEnv(SC2Env, BaseEnv): """ - This environment provides the interface for both single agent and multiple agents (two players) in - SC2 environment. + Overview: + LightZero version of SMAC environment. This class includes methods for environment reset, step, and close. \ + It also includes methods for updating observations, units, states, and rewards. It also includes properties \ + for accessing the observation space, action space, and reward space of the environment. This environment \ + provides the interface for both single agent and multiple agents (two players) in SC2 environment. """ SMACTimestep = namedtuple('SMACTimestep', ['obs', 'reward', 'done', 'info', 'episode_steps']) @@ -122,6 +125,10 @@ def __init__( self, cfg, ): + """ + Overview: + Initialize the environment with a configuration dictionary. Sets up spaces for observations, actions, and rewards. + """ cfg = deep_merge_dicts(EasyDict(self.config), cfg) self.cfg = cfg # Client parameters @@ -178,6 +185,10 @@ def __init__( self.move_amount = 2 def _create_join(self): + """ + Overview: + Create the join requests for the agents. This function is called by the reset function. + """ # copy and overwrite original implementation map_inst = random.choice(self._maps) self._map_name = map_inst.name @@ -258,6 +269,10 @@ def _create_join(self): def _launch(self): + """ + Overview: + Launch the environment. This function is called by the reset function. + """ self.old_unit_tags = set() print("*****LAUNCH FUNCTION CALLED*****") SC2Env.__init__( @@ -286,9 +301,11 @@ def _launch(self): self._init_map() def _episode_restart(self): - """Restart the environment by killing all units on the map. - There is a trigger in the SC2Map file, which restarts the - episode when there are no units left. + """ + Overview: + Restart the environment by killing all units on the map. + There is a trigger in the SC2Map file, which restarts the + episode when there are no units left. """ try: # save current units' tag @@ -319,6 +336,11 @@ def _env_restart(self): self._force_restarts += 1 def reset(self): + """ + Overview: + Reset the environment. If it hasn't been initialized yet, this method also handles that. It also handles seeding \ + if necessary. Returns the first observation. + """ if self._launch_env_flag: # Launch StarCraft II print("*************LAUNCH TOTAL GAME********************") @@ -373,6 +395,10 @@ def reset(self): return obs def _init_map(self): + """ + Overview: + Initialize the map. This function is called by the launch function. + """ game_info = self._game_info[0] map_info = game_info.start_raw map_play_area_min = map_info.playable_area.p0 @@ -399,6 +425,11 @@ def _init_map(self): ) / 255 def _init_units(self): + """ + Overview: + Initialize the units. This function is called by the reset function. It checks if all units have been created \ + and if all units are healthy. If not, it returns False. Otherwise, it returns True. + """ # Sometimes not all units have yet been created by SC2 ToDO: check if use list not dict is a bug self.agents = [ unit for unit in self._obs.observation.raw_data.units @@ -433,6 +464,11 @@ def _init_units(self): return False def _init_units_attr(self): + """ + Overview: + Initialize the attributes of the units. This function is called by the reset function. It sets the unit types, \ + unit type ids, cooldowns, and shoot ranges. + """ # type self.min_unit_type = min([u.unit_type for u in self.agents]) self.types = [ally_types[self.map_type][u.unit_type - self.min_unit_type] for u in self.agents] + \ @@ -448,6 +484,11 @@ def _init_units_attr(self): self.shoot_range = np.array([6 for t in self.types], dtype=np.float32) def _init_rewards(self): + """ + Overview: + Initialize the rewards. This function is called by the reset function. It sets the rewards for injury, death, \ + and the end of the game. It also sets the maximum reward and the reward scale. + """ self.reward_injury = np.zeros(self.n_agents + self.n_enemies, dtype=np.float32) self.reward_dead = np.zeros(self.n_agents + self.n_enemies, dtype=np.float32) self.reward_end = 0 @@ -459,6 +500,11 @@ def _init_rewards(self): self.reward_scale = self.reward_max if self.reward_scale is None else self.reward_scale def _init_states(self): + """ + Overview: + Initialize the states. This function is called by the reset function. It sets the state length, the states, \ + the relations, and the actions. + """ self.state_len = 1 + self.unit_type_bits + 2 + 1 + 2 + 1 + 7 + 9 + 9 # ally or enemy, unit_type, pos.x and y, health, sheld(abs value and whether shield is zero), cooldown, last action(stop,move,attack), path, height self.relation_len = 2 + 2 + 2 # distance, cos(theta) and sin(theta), whether can attack self.action_len = self.n_actions_no_attack + self.n_entities # (dead, stop, move) + help ally(currentlly only for medivac) + attack enemy @@ -479,6 +525,12 @@ def _init_states(self): self._update_states() def step(self, actions): + """ + Overview: + Take a step in the environment. This function is called by the reset function. It sets the action mask, \ + processes the actions, submits the actions, updates the observations, updates the units, updates the states, \ + gets the reward, and gets the info. It then returns the timestep. + """ processed_actions = self._process_actions(actions) try: self._submit_actions(processed_actions) @@ -514,9 +566,11 @@ def step(self, actions): return BaseEnvTimestep(obs, reward, done, info) def _process_actions(self, my_actions): - """Construct the action for agent a_id. - The input action here is *absolute* and is not mirrored! - We use skip_mirror=True in get_avail_agent_actions to avoid error. + """ + Overview: + Process the actions. This function is called by the step function. It constructs the action for the agent \ + based on the input action. It then returns the processed actions. The input action here is *absolute* and \ + is not mirrored! We use skip_mirror=True in get_avail_agent_actions to avoid error. """ processed_actions = [] for i, (unit, action) in enumerate(zip(self.agents, my_actions)): @@ -560,6 +614,10 @@ def _process_actions(self, my_actions): return processed_actions def _submit_actions(self, actions): + """ + Overview: + Submit the actions. This function is called by the step function. It sends the actions to the SC2 environment. + """ # actions is a sequence # Send action request req_actions = sc_pb.RequestAction(actions=actions) @@ -567,12 +625,19 @@ def _submit_actions(self, actions): self._controllers[0].step(self._step_mul) def _update_obs(self): + """ + Overview: + Update the observations. This function is called by the step function. It gets the observations from the SC2 \ + environment and sets the observations to the environment observations. + """ # Transform in the thread so it runs while waiting for other observations. self._obs = self._controllers[0].observe() def _update_units(self): - """Update units after an environment step. - This function assumes that self._obs is up-to-date. + """ + Overview: + Update units after an environment step. \ + This function assumes that self._obs is up-to-date. """ n_ally_alive = 0 n_enemy_alive = 0 @@ -619,6 +684,11 @@ def _update_units(self): return None # not end def _update_states(self): + """ + Overview: + Update the states. This function is called by the step function. It updates the states, relations, and \ + actions. It also updates the surrounding terrain and the unit states. + """ # update unit states self.states[:, 1 + self.unit_type_bits + 6: 1 + self.unit_type_bits + 13] = 0 self.states[np.arange(self.n_agents), 1 + self.unit_type_bits + 6 + self.last_actions] = 1 @@ -684,14 +754,22 @@ def _update_states(self): self.action_mask[~alive_mask, :] = self.dead_action # dead action def get_reward(self): + """ + Overview: + Get the reward. This function is called by the step function. It calculates the reward based on the injury, \ + death, and the end of the game. It then returns the reward. + """ reward = (self.reward_injury + self.reward_dead)[None, :].sum(axis=1) + self.reward_end reward *= self.reward_scale / self.reward_max return reward def get_obs(self): - """Returns all agent observations in a list. - NOTE: Agents should have access only to their local observations - during decentralised execution. + """ + Overview: + Returns all agent observations in a list. This function is called by the step function. It returns the \ + observations for each agent. + NOTE: Agents should have access only to their local observations + during decentralised execution. """ obs = { 'states': self.states.copy(), @@ -705,8 +783,10 @@ def get_obs(self): # return self.action_mask[agent_id] def get_info(self, game_end_code): - """This function is called only once at each step, no matter whether you take opponent as agent. - We already return dicts for each term, as in Multi-agent scenario. + """ + Overview: + This function is called only once at each step, no matter whether you take opponent as agent. + We already return dicts for each term, as in Multi-agent scenario. """ info = { "battle_won": False, @@ -746,6 +826,11 @@ def get_info(self, game_end_code): return done, info def info(self): + """ + Overview: + Return the environment information. This function is called by the reset function. It returns the number of \ + agents, the number of enemies, the observation space, the action space, the reward space, and the episode limit. + """ agent_num = self.n_agents enemy_num = self.n_enemies obs_space = {} # TODO: Now, obs_space is only accessible after self.reset(). @@ -763,11 +848,19 @@ def info(self): ) def seed(self, seed, dynamic_seed=False): + """ + Overview: + Set the seed. This function is called by the reset function. It sets the seed for the environment. + """ self._seed = seed if self.cfg.get('subprocess_numpy_seed', False): np.random.seed(self._seed) def close(self): + """ + Overview: + Close the environment. + """ SC2Env.close(self) diff --git a/zoo/smac/envs/test_smac_env.py b/zoo/smac/envs/test_smac_env.py index 7948b45f2..ac8c55fb5 100644 --- a/zoo/smac/envs/test_smac_env.py +++ b/zoo/smac/envs/test_smac_env.py @@ -7,32 +7,32 @@ agent_num = 3 -# @pytest.mark.envtest -# class TestAtariEnv: +@pytest.mark.envtest +class TestSmacEnv: -def test_samc(): - cfg = dict( - map_name='3s_vs_5z', - difficulty=7, - reward_type='original', - agent_num=agent_num, - ) - cfg = EasyDict(cfg) - samc_env = SMACLZEnv(cfg) - samc_env.seed(0) - obs = samc_env.reset() - assert isinstance(obs, dict) - while True: - random_action = np.random.randint(0, 6, size=(agent_num, )) - timestep = samc_env.step(random_action) + def test_samc(): + cfg = dict( + map_name='3s_vs_5z', + difficulty=7, + reward_type='original', + agent_num=agent_num, + ) + cfg = EasyDict(cfg) + samc_env = SMACLZEnv(cfg) + samc_env.seed(0) + obs = samc_env.reset() assert isinstance(obs, dict) - assert set(['agent_state', 'global_state', 'agent_specifig_global_state']).issubset(timestep.obs['observation']) - assert timestep.reward.shape == (1, ) - if timestep.done: - assert 'eval_episode_return' in timestep.info, timestep.info - break - print(samc_env.observation_space, samc_env.action_space, samc_env.reward_space) - print('eval_episode_return: {}'.format(timestep.info['eval_episode_return'])) - samc_env.close() + while True: + random_action = np.random.randint(0, 6, size=(agent_num, )) + timestep = samc_env.step(random_action) + assert isinstance(obs, dict) + assert set(['agent_state', 'global_state', 'agent_specifig_global_state']).issubset(timestep.obs['observation']) + assert timestep.reward.shape == (1, ) + if timestep.done: + assert 'eval_episode_return' in timestep.info, timestep.info + break + print(samc_env.observation_space, samc_env.action_space, samc_env.reward_space) + print('eval_episode_return: {}'.format(timestep.info['eval_episode_return'])) + samc_env.close() -test_samc() \ No newline at end of file +# test_samc() \ No newline at end of file From 4eac16fa0c8bc69173bdf635e3804d2ceea5524d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=B2=E6=BA=90?= <2402552459@qq.com> Date: Wed, 12 Jun 2024 15:18:30 +0800 Subject: [PATCH 6/7] polish(pu): polish test_smac_env.py --- zoo/smac/envs/smac_env_lightzero_env.py | 43 +++++++++++++------------ zoo/smac/envs/test_smac_env.py | 35 ++++++++++---------- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/zoo/smac/envs/smac_env_lightzero_env.py b/zoo/smac/envs/smac_env_lightzero_env.py index d196fa712..9dec1247e 100644 --- a/zoo/smac/envs/smac_env_lightzero_env.py +++ b/zoo/smac/envs/smac_env_lightzero_env.py @@ -119,7 +119,7 @@ class SMACLZEnv(SC2Env, BaseEnv): ) def __repr__(self): - return "DI-engine SMAC Env" + return "LightZero SMAC Env" def __init__( self, @@ -177,8 +177,8 @@ def __init__( self.reward_win = cfg.reward_win self.reward_defeat = 0 self.reward_scale = cfg.reward_scale - self.reward_max = 1020 # TODO: change after the env is lannched - self.reward_type=cfg.reward_type + self.reward_max = 1020 # TODO: change after the env is lannched + self.reward_type = cfg.reward_type # Action parameters self.n_actions_no_attack = 6 @@ -267,7 +267,6 @@ def _create_join(self): self._features = None - def _launch(self): """ Overview: @@ -386,8 +385,10 @@ def reset(self): obs_marl['agent_state'] = ori_obs['states'][:self.n_agents] # global_state: obs_marl['global_state'] = ori_obs['states'].flatten() - # agent_specifig_global_state - obs_marl['agent_specifig_global_state'] = np.concatenate((obs_marl['agent_state'], np.repeat(obs_marl['global_state'].reshape(1, -1), self.n_agents, axis=0)), axis=1) + # agent_specific_global_state + obs_marl['agent_specific_global_state'] = np.concatenate( + (obs_marl['agent_state'], np.repeat(obs_marl['global_state'].reshape(1, -1), self.n_agents, axis=0)), + axis=1) ori_obs['states'] = obs_marl action_mask = None @@ -410,13 +411,13 @@ def _init_map(self): if map_info.pathing_grid.bits_per_pixel == 1: vals = np.array(list(map_info.pathing_grid.data)).reshape(self.map_x, int(self.map_y / 8)) self.pathing_grid = np.transpose( - np.array([[(b >> i) & 1 for b in row for i in range(7, -1, -1)] for row in vals], dtype=np.bool) + np.array([[(b >> i) & 1 for b in row for i in range(7, -1, -1)] for row in vals], dtype=np.bool_) ) else: self.pathing_grid = np.invert( np.flip( np.transpose( - np.array(list(map_info.pathing_grid.data), dtype=np.bool).reshape(self.map_x, self.map_y)), + np.array(list(map_info.pathing_grid.data), dtype=np.bool_).reshape(self.map_x, self.map_y)), axis=1 ) ) @@ -473,7 +474,7 @@ def _init_units_attr(self): self.min_unit_type = min([u.unit_type for u in self.agents]) self.types = [ally_types[self.map_type][u.unit_type - self.min_unit_type] for u in self.agents] + \ [enemey_types[u.unit_type] for u in self.enemies] - self.is_medivac = np.array([(t == 'medivac') for t in self.types], dtype=np.bool) + self.is_medivac = np.array([(t == 'medivac') for t in self.types], dtype=np.bool_) # type id type_to_id = {t: i for i, t in enumerate(sorted(list(set(self.types))))} self.unit_type_bits = len(type_to_id) @@ -492,10 +493,10 @@ def _init_rewards(self): self.reward_injury = np.zeros(self.n_agents + self.n_enemies, dtype=np.float32) self.reward_dead = np.zeros(self.n_agents + self.n_enemies, dtype=np.float32) self.reward_end = 0 - if self.reward_type=='original': + if self.reward_type == 'original': self.reward_max = (self.n_enemies * self.reward_death_value + self.reward_win) + sum( [(u.health_max + u.shield_max) for u in self.enemies]) - elif self.reward_type=='unit_norm': + elif self.reward_type == 'unit_norm': self.reward_max = max([(u.health_max + u.shield_max) for u in self.enemies]) self.reward_scale = self.reward_max if self.reward_scale is None else self.reward_scale @@ -513,12 +514,12 @@ def _init_states(self): row_ind = np.arange(self.n_entities) self.states[:, 0] = (row_ind >= self.n_agents) # ally or enemy self.states[row_ind, 1 + self.type_id] = 1 # unit_type - self.alive_mask = np.ones(self.n_entities, dtype=np.bool) + self.alive_mask = np.ones(self.n_entities, dtype=np.bool_) # init relations self.relations = np.zeros((self.n_entities, self.n_entities, self.relation_len), dtype=np.float32) # init actions - self.action_mask = np.zeros((self.n_agents, self.action_len), dtype=np.bool) - self.dead_action = np.array([[1] + [0] * (self.action_len - 1)], dtype=np.bool) + self.action_mask = np.zeros((self.n_agents, self.action_len), dtype=np.bool_) + self.dead_action = np.array([[1] + [0] * (self.action_len - 1)], dtype=np.bool_) self.last_actions = np.ones(self.n_agents, dtype=np.int64) row_inds = np.arange(self.n_agents) # update states with current units @@ -557,8 +558,10 @@ def step(self, actions): obs_marl['agent_state'] = ori_obs['states'][:self.n_agents] # global_state: obs_marl['global_state'] = ori_obs['states'].flatten() - # agent_specifig_global_state - obs_marl['agent_specifig_global_state'] = np.concatenate((obs_marl['agent_state'], np.repeat(obs_marl['global_state'].reshape(1, -1), self.n_agents, axis=0)), axis=1) + # agent_specific_global_state + obs_marl['agent_specific_global_state'] = np.concatenate( + (obs_marl['agent_state'], np.repeat(obs_marl['global_state'].reshape(1, -1), self.n_agents, axis=0)), + axis=1) ori_obs['states'] = obs_marl action_mask = None @@ -664,7 +667,7 @@ def _update_units(self): e_unit.health, e_unit.shield = 0, 0 curr_health, curr_shield = self.enemies[e_id].health, self.enemies[e_id].shield self.reward_injury[e_id + self.n_agents] = self.reward_pos_scale * ( - prev_health + prev_shield - curr_health - curr_shield) + prev_health + prev_shield - curr_health - curr_shield) self.reward_dead[ e_id + self.n_agents] = self.reward_pos_scale * self.reward_death_value if prev_health > 0 and curr_health == 0 else 0 if e_unit.health > 0 and not self.is_medivac[ @@ -721,7 +724,7 @@ def _update_states(self): [-ma / 2, 0], # move west ]) surround = (pos[:, None, :] + offset[None, :, :]).astype(np.int64) - surround_clip = np.clip(surround, border[0], border[1]-1) + surround_clip = np.clip(surround, border[0], border[1] - 1) in_path = self.pathing_grid[surround_clip[:, :, 0], surround_clip[:, :, 1]] in_border = (surround >= border[0]).all(axis=-1) & (surround < border[1]).all(axis=-1) surround_path = in_path & in_border @@ -746,7 +749,7 @@ def _update_states(self): self.action_mask[:, 2:6] = surround_path[:self.n_agents, 9:] # move action medivac_mask = self.is_medivac[:self.n_agents] alive_mask = self.alive_mask[:self.n_agents] - shoot_mask = self.relations[: self.n_agents, :, 5].astype(np.bool) & self.alive_mask + shoot_mask = self.relations[: self.n_agents, :, 5].astype(bool) & self.alive_mask self.action_mask[~medivac_mask, 6 + self.n_agents:6 + self.n_entities] = shoot_mask[~medivac_mask, self.n_agents:self.n_entities] # attack action self.action_mask[medivac_mask, 6:6 + self.n_agents] = shoot_mask[medivac_mask, @@ -867,4 +870,4 @@ def close(self): SMACTimestep = SMACLZEnv.SMACTimestep SMACEnvInfo = SMACLZEnv.SMACEnvInfo SMACActionInfo = SMACLZEnv.SMACActionInfo -SMACRewardInfo = SMACLZEnv.SMACRewardInfo \ No newline at end of file +SMACRewardInfo = SMACLZEnv.SMACRewardInfo diff --git a/zoo/smac/envs/test_smac_env.py b/zoo/smac/envs/test_smac_env.py index ac8c55fb5..39c87ab9e 100644 --- a/zoo/smac/envs/test_smac_env.py +++ b/zoo/smac/envs/test_smac_env.py @@ -1,38 +1,37 @@ import pytest import numpy as np -import gym -import sys from easydict import EasyDict -from LightZero.zoo.smac.envs.smac_env_lightzero_env import SMACLZEnv +from zoo.smac.envs.smac_env_lightzero_env import SMACLZEnv agent_num = 3 + @pytest.mark.envtest class TestSmacEnv: - def test_samc(): + def test_smac(self): cfg = dict( - map_name='3s_vs_5z', - difficulty=7, - reward_type='original', - agent_num=agent_num, + map_name='3s_vs_5z', + difficulty=7, + reward_type='original', + agent_num=agent_num, ) cfg = EasyDict(cfg) - samc_env = SMACLZEnv(cfg) - samc_env.seed(0) - obs = samc_env.reset() + smac_env = SMACLZEnv(cfg) + smac_env.seed(0) + obs = smac_env.reset() assert isinstance(obs, dict) while True: - random_action = np.random.randint(0, 6, size=(agent_num, )) - timestep = samc_env.step(random_action) + random_action = np.random.randint(0, 6, size=(agent_num,)) + timestep = smac_env.step(random_action) assert isinstance(obs, dict) - assert set(['agent_state', 'global_state', 'agent_specifig_global_state']).issubset(timestep.obs['observation']) - assert timestep.reward.shape == (1, ) + assert set(['agent_state', 'global_state', 'agent_specific_global_state']).issubset( + timestep.obs['observation']) + assert timestep.reward.shape == (1,) if timestep.done: assert 'eval_episode_return' in timestep.info, timestep.info break - print(samc_env.observation_space, samc_env.action_space, samc_env.reward_space) + print(smac_env.observation_space, smac_env.action_space, smac_env.reward_space) print('eval_episode_return: {}'.format(timestep.info['eval_episode_return'])) - samc_env.close() + smac_env.close() -# test_samc() \ No newline at end of file From 6817faff8c5bfc5895616df244758f124a002952 Mon Sep 17 00:00:00 2001 From: nighood Date: Wed, 12 Jun 2024 16:46:17 +0800 Subject: [PATCH 7/7] fix(rjy): fix smac env for lz --- zoo/smac/envs/smac_env_lightzero_env.py | 4 ++++ zoo/smac/envs/test_smac_env.py | 21 +++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/zoo/smac/envs/smac_env_lightzero_env.py b/zoo/smac/envs/smac_env_lightzero_env.py index d196fa712..f67a46fb2 100644 --- a/zoo/smac/envs/smac_env_lightzero_env.py +++ b/zoo/smac/envs/smac_env_lightzero_env.py @@ -523,6 +523,7 @@ def _init_states(self): row_inds = np.arange(self.n_agents) # update states with current units self._update_states() + self._eval_episode_return = 0 def step(self, actions): """ @@ -561,6 +562,9 @@ def step(self, actions): obs_marl['agent_specifig_global_state'] = np.concatenate((obs_marl['agent_state'], np.repeat(obs_marl['global_state'].reshape(1, -1), self.n_agents, axis=0)), axis=1) ori_obs['states'] = obs_marl + self._eval_episode_return += reward + if done: + info['eval_episode_return'] = self._eval_episode_return action_mask = None obs = {'observation': ori_obs, 'action_mask': action_mask, 'to_play': -1} return BaseEnvTimestep(obs, reward, done, info) diff --git a/zoo/smac/envs/test_smac_env.py b/zoo/smac/envs/test_smac_env.py index ac8c55fb5..9248c488c 100644 --- a/zoo/smac/envs/test_smac_env.py +++ b/zoo/smac/envs/test_smac_env.py @@ -3,14 +3,14 @@ import gym import sys from easydict import EasyDict -from LightZero.zoo.smac.envs.smac_env_lightzero_env import SMACLZEnv +from zoo.smac.envs.smac_env_lightzero_env import SMACLZEnv agent_num = 3 @pytest.mark.envtest class TestSmacEnv: - def test_samc(): + def test_samc(self): cfg = dict( map_name='3s_vs_5z', difficulty=7, @@ -23,15 +23,24 @@ def test_samc(): obs = samc_env.reset() assert isinstance(obs, dict) while True: - random_action = np.random.randint(0, 6, size=(agent_num, )) - timestep = samc_env.step(random_action) + # access random action according to samc_env.action_mask (shape: (agent_num, 14), bool) + random_actions = np.zeros(agent_num, dtype=int) + for agent in range(agent_num): + available_actions = np.where(samc_env.action_mask[agent])[0] + if available_actions.size > 0: + random_actions[agent] = np.random.choice(available_actions) + else: + # Handle case where no actions are available (all False) + random_actions[agent] = -1 # or any other placeholder value + # random_action = np.random.randint(1, 6, size=(agent_num, )) + + timestep = samc_env.step(random_actions) assert isinstance(obs, dict) - assert set(['agent_state', 'global_state', 'agent_specifig_global_state']).issubset(timestep.obs['observation']) + assert set(['agent_state', 'global_state', 'agent_specifig_global_state']).issubset(timestep.obs['observation']['states']) assert timestep.reward.shape == (1, ) if timestep.done: assert 'eval_episode_return' in timestep.info, timestep.info break - print(samc_env.observation_space, samc_env.action_space, samc_env.reward_space) print('eval_episode_return: {}'.format(timestep.info['eval_episode_return'])) samc_env.close()

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%0Dd+<=* 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 XcU7LEGe|Yq-By}E3+-NMr}uvV(-Atb literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/MMM2.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/MMM2.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..ab25a02bb391b1da5045a2ef73873c42305c429a GIT binary patch literal 17419 zcmeIZgO?@G@&|a^*0gQgw%yaVZQHhO+dXX?)AqEDY1`e~-}l~c_qXrt**{><=DDAW zx|I=8k(qTXGU8^+D*VKn1pojrA^-pg01VK{3jlNq0ssQv*GRwdzso;7{}fy9f71=F ze^UVHzo`Q7f4={R1pbHe{?By*03bR&VH>=i!hP3@A`go6N)tK@dW(X%<+imVIETjxNXebl!`4WB3QcHR|HhzTer_ zb8-Q@XWuzE!AlzTfkG=xM&mQUyLpuUWGDm*xMw^E0`Ql>^l7;;pX2C8D*&1Z@!a-k zqQ6BhG_{=e*id}0WWGQKouEM_TK)uFB03sDcfy*s=JYtDXaS)T{?w4$`+UWFL5n|t z(P*@AOC%qCjdgam<;s(}8r;uZzHGRLGW&RSC{n32IC6}u7wyG+<|o`HE&kk1!}mLZ zOAtw>-)R8%>)tgJGmdfpcm;(*aaVum#9m37gLDW;(4M~L6>|>d`SINBB?7Wh=k|BX z21j6wH#ZDB8+aa*6~~cz2nWW-dBBeO#$T$jfMU_Ct9Qr%q%}?C5UiKv&@vqn!>!Mqo*aS(y~osuGJJ68&;GZ_i~0Hi*)nh$I6Z1Q>1R z;I|chfBtCfAKM;p)=HS@C;yPo{7ZNuT~6%YFPd(steQ>{PKqbsU&@y!(9;k9@tTS> zQPLwIVi?LyxQWQzB`7jEo&*E;CLOV{gcAXlswCJ(z_id+V__e#Y#vZ>{`2LHg}#hv z5~qgY_wc(E#U|DwYX>O{9g;$j>PH9tODRS`Auo#2vi6KA?yf}RRv*vf-aEEf{M-7o zMPGRD(4MA#D9^dome2rpQ9Q)_wr37#lcx`!1k`Y`E0_xYM%`jn1v4-(I0|-cfi4L` z!>u@@@d*B_3&(K&DwtI%UY5#{TQZW-v5zbWUW0hzy> ztLWK9?MvqpLlonC!+lCeqJHT}dFE0rwDPY{n54;m<^~Huy8P&lf}=j4O;H~lYlJVhK6vfV+=xZj=M(47M& zV6IeV>`}h_LY9L=ugL8~t(x6qwJTn8`pery@r)q38S_D3hWoJT)HtdE(QivseM2Ou z`76n9d@T5$;41)xxrAd;Z($#;>upB&7HA(1_i9CKVK7hIQ z%_PLpX8E@;Ta+nMvm0UlPUU2Qdk;|Qd&*o6DTt)5)57EvITd{AMtZP2|9mrk+9x8$ z3to4Ns_3?P_Uqs1EQ?8-%Upsl#7JOVVW$JZ_a_uT!K(wrg_m#^sNao4{Q; z^(5A*m+0Edg8Mmgt_!Bcsm8-0&N7w<0!Bm^Q!;DTC`tPS$5xR>6C|Svq&H5=T2c_3 z$hwwndnw9UHrMh8vka)|P8P(}EQ^dL%<4$70)%<$u>setAZQqNmB=31(_Zt3pNfXz zuh3;sbu&@T6U6FizLrS5u1Lk>*^bM8-U84*iJkSrot^Uq`#0<-9*!qa?5lnrr&+H% zx$^|C1H5?m5oBMx$t1q~**to%RWRn>jtz=bO0v{;LlC0Jc!$6#@QKB!`BUH+XHOYn zl}X(+tgDY*uRxu0+Bcu)Wp3n;!B(4hd;Fdp(m(!r#Rf6bCktr1v6UTUjK#G*)~vJdJ=~ZsS_j9>oL>RzG^GkjzO*B+#}#Uhz}rnI?8JD@hcxJ zc90n>z?=Icr>Cdf#L~Jiw)t9)?D05U?CN%NkG&!ky#x|yS;ChuKf8U3zP2~jo`yz^ zV!Pf$?gcm^ce%vB>^7}Q$ZbQ~)&=>Tnkk5X!r@T@b&-(0m)e}iWS_>v2 zm=v*Lv8HHiv?e%+)%*5d(sGit)AGN68yo8Duik|Q1b|5}12aY=7;Zl}M*`0Qb_5|U zil(P;C#{@(1LnzI58c)9{_&GE689=*`ug=K#sCm73e#XijPbsmMD^sU9pz;81da1_ zrTBy~00;vuEGq2S4nJaF3Ij8P2t&U+Jftuo7AA&c=9d_ZKspUUU?~>7waVWl6>HT_{VIem_bs4W4xEg;^-mr9!I}T&fH-N-!XThY6i1g$iCZ z5$$NYSxfg-3Gm<7Tk;0HO_`m(K2{rOM_4#fe64nc}!@d-!x< z3>b56g>4O}v0=*g?Ou8c9uCcRh2pL{3I*^`&mS1rgZU$kL6SO|8g@)b#!sOW*a>zq zVcrvd2M^9E+nH;NW7>fkJ^E3A;x=|#VCq;rC&|@Dm` z>bgL9?w51|F- z8KPH;oI8^StC0gzi;ur7$D5-(iE0R{GK?lnBV>Z2#;jw9z>!uTVb5oV`25K6cX2<+prXO3?B&Uyvn%Lc zVAIM})9ybn8`_U|)cvjN5Gjlaf&P>Bq)E&jaoBKe5ce&p0|{+Ec)*t_HKq9ijKbo7&^?{SRTrrA=o%#+j7IU8Ya**3a6IAo{owQS~*UOuL9^)oXjmTO|<3HkY;_ z#qtw7UCl=CgikW7wCtc% zdZu~ZYg%+pjc>I?FGbZundysQm&$-{XOWAv6>4|~shrr;=W<{?esY{)-G-DP>SlpK zZ=%;pasnTdIm45uf_j#b9?(vj2hm9%J*wE+yA|QiX|vX9xqn#av9$qOlcJX6$sp&o zrDex42FE2e_?nH(gC1}t{($G2XHL7;8_Q_PD>@S6{c$HTNzCXL{%2`K1?Zk`+p-5U ze2^bmXqqTQbd{BhqRa-76cfnH{I-oh-EXK&l+KY~_oPw@=Y=9jF@R zWxH1EF>Y~l*S9Qk(k^82+EFw?mrqRg9MpC59%$?(*W{}Q>G`89C%?+iikcv7LX~f6 zaTRhz?7E5-SPx6ynXiMWv7zj`*AiSlL@14yoxh1O`xNx^V9)IYO!rwM$YW=8Y(lUL zgp8(vtCuihkYT;DOax3LDLS#th3>*iN}Z~^}{=# z73Wqd+;VLxzJWCO`Y?L(wEwB5kO#+LjbK~b&dYE}9(-bQ1n;^ac4O6bfa1#L746>S z4P?8b@-CNkt{k0}QF8X^T4Vh$e77NYYSHt(ubF&o6YvxXn%L99y=8D1jyyR&pel+< z8`-;Y;%#V-PmtSk_{_Xd;Rgn^{yGg%J3-H=4Wn$u^Xlcyt6em~`PEmh1Ge%r;?+|u z*gEsjWib74Z=NCu0*DYBA@YTx@FS$DI$@{Bno_-P_|9EU9f3cTWVIgvq2v#&;?|wV ztPA^FbY#&-kvL|tMG)I~X@!nWp74^R?tfkzsl4#tueT5gn*4j{7765c)gJbu*!L??5-j zQJ*uneh~dH`Dc~Sb?(SQipav~uvA(2i;wy`tzBfr-iajq2tE;=@Ylr6<5e$-J8zm> zC{Iectyaet`E+^SI8TF!?rZHycB6^#d)! zr)*mH1U_e^8p($G`0s|pxWPhA81=ycn4o}avRZePLuXb#1#HyiTvgS zCeoKJF3tytOhiTsfEw%z4V4QDgXjvz75)r{=ogSsD7Q*Ct1s)#vklHFi>tx|0X*E^ zA##0=jnT$La)6eaR)&R?F@Kxj)$7%(WufaRY3iFRZJF7lXJ}j5lMvNZP*hM=VPh|7 z=z&L%9tun@jjlwD4x^^E(zUoD1vZ+PICNmGTN__Ed4Io16pn>1Oe_o{&5W)!nvD}O z-!++N7?M1>h{B>$i*}SsMn)#qk}H6k5y6?E5Nf#P}t>v#-YCpip352aC(-Gc)Q<} zvj9nmJQHDdysk6Dn4#N4^Y^4(n{{dbmWb_G5+~*No`Wjw72TeTQ!2Zt%5Yj9zi)cW zp=FBN?{4$`y-ShB?$Rd{7q{)L1Nom?ONTR!-QjhrFVaii6?vC;9Gd)YS5NqsGfAJQ z7x0O#K}`qV=Wj(EnJQ6q%VL}IIK0!xQ%A%}$m5p;v6)15zkOjps@@m7qrTjKcg^&a zSG{yezj`hGnseOL(RiG}9}-bX6UU*w6ZK#iIh%SR!3%K)Kb;J)``t9;qGEY>NTWB^^UxPtQun9%aUFYl zunW!OZuUIT_IH|VH49+CZ7|yWH0OzIA68_lC@BVi0{NkQlhYMMnD0h|#fuCluk1aNmc2o&E2_($9J>Xw`PqQwnulu&N?`7nJJQ zz<*to6YoEz;J^hd>mok+7cJUxM#+v1T=;p-1+6RIe@5Ys3s%>~_-|UY_~JJ`oSAv1iHuzF6>Blimikfcc#4LX#Aub zWF|i1eK-Itj4{A~hZtZ;1BkxCP#+5|u~wf9J+xMz4JD=ZXF;nk4$+w$NJJCBf&o}` z;RDUP&-$}$Bn1Cci4$bPZUZB+uamyjqA{PUv+#d?NNxVGUaYcSsL#ieUH~jOUT_Fv z>`wos4_A7vJCW^G&}GSh5h+D&; zh&s{hH(8w4uAv;g-F*mtqql)iWwZGRb@CP1M`*Wp%ml^k>2WG9i>7~s0t9kD7 znSSUYWW%&R=<^`b&YM@o64MC!ar^t#^RF0@Mq<+BzhaBK|0}l0+ylGhvqG3dVU-la=-^lsK@HZ~Lf%={1{U_CH@{O2pG=F3B z8-M?UZ!5lo3pfA)EPx??M7HhP-w$FxBf!Ki>%O{kTY?$=KWXIeTl~AsJ_2R;hJ^kj z*U$KU1HeH3XN4Ioe*S;z|A+Xu0@eQ+Z2T7=;Xi!91Ydc}NUHfC|E;kNPBo0b|9>ld zkhl4NR44!d0R8`b|I@?&q2C?-|FM2C($9zeZkzxB2;6a>sB81;^Q?BYOk$IF?w`S5 z>4)-XfCZc75;U_%vC{=jvj^{Nj@=nfq6k;lya&6D<@^wsN7&>DL0s#OYp!NYB)Q`% zJ6gOSYdwlL>0X0LBpLT!wg|zO*%;11k_J^-tv=U8HpA-(n}ARzLwnS z4F7YtOh$7QL6p#Ac(90+{QS)nLmR&)Y*4Ufu0S0{FzzgUQe!Kd+C~=X33G?Q7*5it zd_+)Quc#W)Yb-bshwjZR_PZm3b{~WT*S4oYLEsntyU!Q1t*-9ot-lvmt-SAlkyxzEV)vyZ_>n)H=!dcFMH zY}bE}AT|{MV!kUZCC` zAM{?pjV6yZ#t1UTIKqK~2+b0m2q-|G;$X;*<%DSIw4SVJ$;1p)@EJiRe}lzKGJu`O zU+<%Y2pvvv&{xO#W{Dy`Qr4Q$H7Bc^CUCfF$A<33l1p=`^ljLt!Cj8~@zQxo+8wK__lHs;3q z`(r|=jg3wEj*={NdeS}9`r9Y{4fth9HdwJQv~}?5`$KL$8k(TFVd!_tND!;q=LMVs zCDvOnXQAf_w+ld2`xH`kQg@N<;mm$YjKuV~0$9-Sc$_Kqg$M#0zXp4nPyI;?6HgI= zE~2OS8LIcbHPKHf)$)?)_bjSYWso-dGR>giUKpUGNdBn=82nt?CD=SKZqVyK?gO+3 z*D>CezE34tcRG&NM_>GOCo7U;)q2Od{)P%n+^0PcV}nzK9Bqe-F)q_{X+Ruy>KFc! z(?yF4%?pBxZNz|7lOA72uL$nBPemm3;I)dA{uLPgO9S!OFe22WuINt#yRwo2JavRm z2$^w?X{|TIn@qgHm!n;!C2AK9+V5XhN@`XeB6 zA1q~+sX=MJwQfY;8W#Lf@aXG8UMSI4mA|4Y3)!LEK#MoXvHw=UpxQuEKAi@M<>*H6 z>W?@)-2sWz_#DLK^F`$)nhqQ>Jme8-_nY@pmY&}yNRt+GIk8r@Nc;8YV@fG6!z?Zs3- zq_W;fO&;kl^c3uT&tKuS>{>ZlZ{6%qlm%x~&L@*G*6IbnTlbG=mz$WO)c-HfE)DoU zvxeCmU|-%i-kP=efoEAS)Q>>|Db4?pq^pqlSH5xVy|1qixEK?YfF=A2xVU$bFBUig z2(V=eg^I?>5!r;H4Yg^;T)b;DiTf?Nq^@PR#(?50zQ><^qku_?+PbBMM?{CKblTE# zhL<1-znJL|zt7N6^X1bbNl>7yRraGpB7eup+xz{6J1>Sh^#QE&ZEq8tqymoF%}xl%*sFWt20|Xleu7Kb_P9#b>KXjL=x&Wc|!sW zSyscYUD=8y_QNxYauf<0b;Y*>*ySKqgtk@>wpuU4(|kW%OxvYmbSNE%TjB572`~h^ z8Yx62{36aX3PV8$Q~JHPA~zSOHI6a@R&yiaU+KUV^!^Go>GqIoR%ARMwxTVx!aSM; z4Ut+i;ygSR1o=3GGkSy#iGtgS0;TYGQRAwyEY#B!b@TbIWI>jT5QAX+l3YfO79=DG zTcxi4hRb=RNXf-4PD<_;vowbiZsiLZ2{<~sKJ1eizvzaFnSpo*8gkV{*4BjAdW0Cy zcGzCF&Mvc_I3m}1hssx@g{~$!EF~Cx2Xw-zKDZH|)I( z@xsVr04Z^_^ki*>$DD_2Fs6`_$;d$G3rc7IY5>w9AsJYEe}(*@ot17xb&|4h<#g)Q zA8SYB(ZXkDDg z@;)mZPZNeo7j*qVMfdn;_WMr~!^lz6H{svu3p>M~h89wmKfUASdDK_YgoD#yRD4Wz zsUj_n`6|~IlP4R8j7f&gfxEN;;~LEFpi^(M_N47g!!L**agBle-wL}ErR4?%U_+l0 z93fzqSrl4|6)Aq8G(+B~t6dJ+h{NuW?Smd#({TJyBe2LXK^X#$7>>67`g+b6y~uwwKgziBUdV;`Ju%N|QmA8J3WD zx1}GBXP+`C)OOFAyk&WkLt=_3-YIfck(Zl9F6gF^tZ1L#dsC0A>U-RB{O-nd*dnx0 z*fdfR$cI9+7IZYC1CXa^!ZK|spsf~s+MUK)8I9kp&EEX%BCH=*_{acY8z!Zg!C5}+lD2|bM}Mx3sXBtG@) zR+qb45+0#bR85(U+=2V{C%GFY&c(?GZFg@GzS}DpM04!kNl$x}ip5!-Z=_$n4092U z)js;lo0__~*6mR@+wM~+f`nRl5qnP^-BLupy0S=3OVu`Y3b7Z-+T(X`J3ZbwOB?9x zEBNpIWa#oAq`(O&vPXeO!~qk={*I`a5(aY~IDaNV&&O;LpMBL9QapVNH8s?YP5q>h zrlp#moM}>FT4YvGl$es9mLH##ZdIY8m0W06Xl&g-Y;+ixf1H&54Z(!!-#5a}Pg>ka zfI0yN6GD2FT)O6Qlv0dVLP}P)b|MU#k9GgkWwosst@x+}P%|MzJHkRrN#8s)LC#Fs zTwbgw2vV-1v@I|rusuJoNKVU4z64F7SdEaf0^`aCd^>j`+ytNiJblMk4dN(1>MCMy z)Bu;;p&8uNkofa&i>EZ#ZTHy_eduTX2!i=&*(OS|oEs!N>T!<)xzLBEOTo|}+kV&} z7f7TOZya247t<{-Iihr$7bFHi{t58!LO8OUiLj2q)crU2G@F zmiUXg&@i$wI`5_cx@~JO0G%rbYzuOaF&s(ptB(e_iG1Hr)*B0K+IH&_%S+MN6d@bx zJWmqok%LwP-Um8D5Z9QDL`Mj{#+I{igPgu>dafXdOa%PzVgo50Nk10agrLztfoZvz zxTOq>CkY42duW&Wua$7uOqf-S%U1Z^*twKQ;X`Sz6ZPxk7?b)mQ+>R@{zx?a!bVpwxzk5Wq^n|!+@X3& z`NT|1?$95U{k0zYFss*hmGqoRA?*_}n!z5$FqDPYxuEqTV_3=X;z=@| z(k`Zp;|%$0c!CjczH@c>Kac7H{J_JGy2weL6$AZlVXr zk4vgpLtjOPKK3RTu1Sq|X2JQi6%LW0V&-uO?2=%>x*v^?XTByiehpzOfycdOFf9k8 zYP}oKK&#ic^Q^B}(d^~KYZ_|WWy+!HOp-C;8oJJKkPOLh!fyl(&KC{cx^k)5*OHTo zd!Yu2|2^~I@>9=j)p0+B%EkVLtOk^uuvk?_5d6v)U__QE;^SAGC_`$UhI*OKN$!gG*6euq{bx-HvTfAjyAm%ezt}cIQ79S4Um=nXBnPm4PSVLb`z#=wSf-a1 z*lZZd$zxu(na>(RIJ`Z$ixH%qMHAbZr>fR&xW-V9^8To+rzz6jWbmW@KUNblX{Q(^ zC;5P+X&(#vEc08zR zEWvlnu5cX~g+Vk6+I>Bs@`W{aLMw{UJh4Kn?1xr6xSY|U=EpUX+BX)hB+G+#L8u1s z&12Hc3P>&f-D!KZ!vmv!;`ibOj$Vd{D6Jp*a^b(&HXCH;Pvt7|$pmM@=M}q({8a?c zKUz&mnrh96Hm}$M!93ld>>zCAJ7qlkeWHGp2KLnY1C46F7+%hZK;LH|esX}8w;=j} zV|7ys@%#z27ehU?&s&x(Kq)`|*(=$y+RoNs@|@odvZJc@2tjm5a~7nrKT?93DtVw) ztbKI}=|G)TEx8kD(B0KsW2$NQLz1sRP^_BYCAI&EY$5{k&INHb zkJkb*^UU>GsEgvP#yVu`9e2{N(|m&bXn8|dz3D7{nynBDMB87 z^^D*b^QdYGFO!UA%Dh}XnL;-7?!9-|)^yT6=wqV((ZGHhUOmSorvaGZM-*?tEm1wS z`A_g6s*a;)YG6~*&O;UZCVAq34lW6wf5~~A=f20 zkq#88xC*k?0-@Ga?5$9r$-D@e360^KGn((IBy8CXhwnRDIRfl>ZzFvj0`jSKm;g{Z zchBWY7}lB|x;^g}zSlD1mofiJPmB4EsEfuTa?xsIE+*?-`i5K;QwE6^vqmW+t-Hpy z56gOGpgA}<@d!WWqca$5t~sgp;S-9N=zbOe!IVag<&%^RR6trqYiAo zGwVx?8Q20)S_!^8TX+~2;(qF6Rfb!gPrMb2_?>-92LDc&Lj4=xnl`nx?AE^*qvF?p z=|8vYxcBPI!RWREUobf9=s}RG0vE*UaJbgLzftwn#}-l~n{zt6qx|7H;5=~axl1q< zyZY+QgtfhWabe8Lh2OQ)=NKzHZgODk=E0>yN4Fck{^->6!}Q5OPfL5*FpaAA#!1eb zJN{$c@Z$CGZjhh{*R$a}BOjKvJlG$0b2acFk2H6!dYdtve$|P$OSpf zUgq^I%-X!`P>nyhE@moc%P&R_Y%@o#WrMwF>@TLdmwbo;m$AVaTVcf2iAa8Ccjr`k z2Y0gcRmaUhPte?iGQR>)0aApL*5xinOYjfOV@ql=NJL^(@H2O3Jh1Ja&zZ8R9)l!6 z8-&4#A9zCf6@&n^ZfH0SPyN1zAHd)W_%=I8j5tzT2F(NN^dR=-!jOcoMG)Hh&uIQt zv;!9fJ+#QQ;J@{Fq$1dwPTS0Bf}lABbAm3UIv>P9R^<>V>as^D zJjJjKH$W}`P=y+x(i(vhF1zpgnc0Ey6Tv7fg~h z|1e-WK^y4j{qj6%CC9Uvkc3bIju#W_UzMzKd-3Jdy-2s?ue>MBIu5cMHcpI#Fl!BR z@NMbB$xf?jI&~lYJTQPL@=G<-TDjU-eQtbtyeuGu+WRdvI8+KWfJg&(l=9kGmY+Le zEk}sBs&;m_51vR765w=`I81m*^Gk>1YPlWdQbE%QNCy2Gn=apAiv;npC5$B;vO40i zm`V`q5fc`sARuxSs3;t2$;9Z#h?E9tVflzyI7-4HMk1nEovO|~B_V@xi3+S60BiOK z<{)yi;E4gkFcd$|nl%Bd)Ar$;F%;4^g?5Apw~7rK_0uW^&kg@%%Opj7 zTDZRh@~Z4I11RTp>iFX5e>=eb2t%fHG~GVo;^b6+m47xWtwbua{Bq+JFhZzxlhle% zc8+hjw7~XUm0lC$R!pPyN*C5_eYf-bQr6Z(PkN7;YP!kdkGkQ=6B97xq(ws?E_N;y zRwgWYLR6Xf14cs1tB%$EQH!ieNvI%!DbL;MA4@%;kcJp|FRcU~&!xnBt2qd9o~DV# zCLm681C}DjU|9r*as)4pM-Lo*KPG_mK~^x`ZkG5ANCALx8K7f$a?}rv4p`jmh~)PJ z9470V=jt^6j&SKl;1~MQMaah+ss07cxAFSs3j0o}==1FA8x<__=t5KA>x0!GiB{Uu;z4JXRnIu^tIcObZz$y_!B@%2%O5X9H5_4 zpFJ+OVGS4RPrcp0=nz-%P#;7Yl+Jl93$c($mCq(cijs68Qih5g2T5;HG~7)p84%bJ zQj82qux;pO_?tx}c4*r=K%1eu3jHwCwE_iOLLp7Z5|ZEIF2DXJcZVx={{yQ0LWsns zo^&r%1=VM%|Eh{fX`ys)qeEkpLr!5LJVGv>>%DmBl$QY(NUc@m1J?+Gq^!*riY;^b ztV#Y)SNhSH&nE`bfC=Z{;&k7t)8n|?vYgbf)W0=RhO4CpQokV6vVgB9k^QqT=*DKq z@JG%(%mNL8CEjx@3%qgD;{$?8*DT&q@j^J#Mp`)7ShOjZ_Dubi1ej{ve+Be*CJCFQ zWdRYs_dvGy;@YT(tI3T4@sEm+0gdziaBRUjzC#xpCq&W%BMr0Z51`c0C@nU;DN9%0 zaeO*={sm+$F|XcJeTfAT}!uH-n(cbHg0CO`z$+>gTHGV8cNpt8Gcy_oq+}O@GQl6Ogr$y- zXhf>;U?Kz4%roRtMf9gKW6}4~{($sAsVggSF{#|AV-FF2{)zDlq-Y&V_>T`#leNnd zKsQZFcI(?zE=TfM6|*S9TilJ@)S>_x0U4X@r)LP;AKqrwr>F#))9w3}xdyYbrgq~vKb`Wm z{s1@MQ3BP`NSAG)Neq(_v(Vi24;CaGw2zbFy@-)Mll5C8+!LPQa?X@J{Ud@U0fgzy zhNuVu46*UY-#kyU$lDBr0+bxIQ+S{UMJmKv0)FX!^k9~dGnBmQfei7h6KCb+?&hFv z{2*z(AtveA{Dr>UK`9ttEvB`+r395C5@q`eAcIvic+u6Jvaa}9+d+M}pNNj(%g2H@ zl7q1G5YVU7-OQ5y!!jGr8`z&Du?-tT7BX#m?k@;C*>NT9O@f=ZI_3{ZCk~?Om@o$e z(p3R6p})QqS@8ztLr7*c24pCP;r=UDF%gN^AS0ZJK2#W}qQAPF5c^NqB-5U5xc@q4 z)Zm$}|D+TNLa}cZHF7s33057#FY%9eh=ekKQn+Nv1kTMb=c4_&L~!l`qqTa~3E;pG zDo9O+qUZza$R`~LSe%x0?i&PkjI-F$J_6h#V(w--8QK)USHQ!1l>&OY)Wwnn zBwfaXDnvRm76)U$79od$>4b_O^I<9X$O@3<`@b$eI$t;@VId2Qf=r+pLNm@!M>_Ql zl9+HG2(2ss2K8F?I()u;pz`pPQuHddM#=M$-&-|>r);3CL#-mA6@+a+TPEcNsn!rel^f2pJPqq!0liSeqj{T94~bcFieg#-_vlmp7h z+<+nJ5%jU#odxu7LNz*n*E`)fz(|^X*HeT8B}!^x=0iQW@<-K_uBR1uxPRB1$n{GN z3Lxeb#uMQwUsIg_6ij5vo!62?i1{U|{_bzX#29cPx0<8scx&{|-8&$w6`2^)dVSQ* zZigmGHVTNB@SigQsJRt^ygn86_Il!EtnjjddvsW{nYSayQB&m=azq!g$mUgv?Jvq} zJI@Pekmd^SIIS?05wW9+S~ZKl*j@way2TDpBCeQ+7@IIxQK5OzsaAGFeBlDyX}Xy2 zr#UhCgK<9EupgH=IS(gJiqntA&$TR#m2>~x%gt0&AWc5aptfFc6c+Pdj>O%?v*9?2 z{Bo{w7*#zDAm{WNvB!xxc-$6jB>UaH3v617O_L6bF5?TNj_c6?o8~g+waKEYr4&9F zY`8x9-5oIr{kA~@up(CpTI=!goL5)qnE^SYi6{nj~jonux+^L6wv!77WDe{D>8 zqH?FeaYj5|;{*EEiCH)zi&1{-4*L`pEgh}QkH-hgS!OL`u{aWt_jG~UVz|m#C!GgH z(vQVfN2q4dcAA!7AW|LdJe9UQ(RB$rO`zuo(F!i0tHS8g$%wV9d%iTi-TRIxey-D{ zCkypdZO0NEeSe2HJ%fMt2YN8M@~A0je0GWtKMq{uetd4h-@I25CppSebu7zk6ptOsfHh z9v^c4TO5G~)EtBwOJCdv$Osqzc8h?&b=s|b;^e_cYyNQ-HDeY|WwIZ7$-?%t-;WSB zPIg;nbx^zUojPOeRFET_Wz&SZh&iAk ze7{Wse6|S;v*{2Ztcfl3CsBLM7{8{2_Mrn(!zmM!M|aw%KMy(_mVnop&mVG$r0zt* zxim@G@$}_5-@KEMe?MyUMz4nKl2z%Pcf7?xin0!rR))wOU?mqv&8?iNKqA=0z4*P1ls)xD9I6fg- zz?O;l14;@90tA_&fi8Y)F6WH&{rSQRnAy*6XTwk6P9qxRn1E z8o&K>q~0YLO5b5L;%t^rRO{BVt_WIL@Q%ED*3JTC6{!gaWRPuZPV*d+>=R4BPSD~( zFK>n>{+cYU_axy^MG%iP=?j>2zG=uE;*#H*04g$p%)=RCnr_Z z#zN~SjHd8+GxqEte(7KS5jkXukG4hLVaUU>j&j~sjC;B&=Ijc?9fz2SOPF(2w1>-r zjOqIp{F2`4y>JgA@X-YY2_Bl?c61uNK1Q_ctNL|MtK3&=0O(o&O|h#Wd@3E(et*P3 z-%$>S{3~(g?mfGOarS|6A!9o!2VL^@4BV0A8!^ zf-8^^RmS>fIgsl&I%ar6t;na$ZnEO_H(Z<0bj5kS8<%@|Z^e%M-2R4_UKi&tPPrbP zSjeicVyPq`l;Vc~G1lOeanNMxnqsf{LU?p0cX(SMl*Aj5CdcRH6Od6a2M0c|Q5M$R z72$Ixrj|FIhQsHyEExy1$QNzjWj%5E;%@)9a#d%{fZ`%vtac@tP)1M6ZM0g;BJ0vpAhE}$48?y{fcW=} zv3~GhLSrow^QjjpjF1~xuaUtD|JZA0`eo>Wu)PW??4|pk;0~Qm`re)kGa<2eW-`&p z5>uOI<k3?2*Myo&W6Z_4&xM7opZ4%joR^7RuEFu&PqIN*KS z$Z+MS{1Rb0_m=p6|C!bPQO&N*i6T1n-p}FZFTHyR*4Mi)rW8c2)PrP$w^S`q6x0Wt z9EOK~w?1xQgG4q&p)ptRt409O<@a8cTZ!~3rS)9ZrR=`VF zb;C511qE=dTR6#eKayvVP0+I&ayJYCY2u_OYgN$eL%In_cV|_Ia#_@9w+a3Pi*l|m+ zJB)U^H-^8jI1F{01P8eXvvqoff;l^3%HMYD`}O{G|1;21Yqs=?(~?J~{TQqtwuq4& zh{UF3c~}*t25qyb)a2B`f9TB3qRdPrKL$hPzqdj&GYooA{9#J(a743|4aF9Z!9 z66l>U>h(&8J;wBn4wxR*Gmkak&wV$p z(C@-3Vl)kk=DS;6Pn%lSF!#a+fv-AnFfp=C%=cwpid}U&o!q9azAV= zp%6kSWRQ=&YvsIOyz7E0AqT_oyvrEv8q0yk zh4&NU>K4aVD;-?zW==-uZ}i_v;dfG4B_}+RRZQ{%W#uW zdXr7)Eh*+K^7ZgxX)-ZeF_GiUkEnT}k3|Ud1y)gNO44XKA6X+~Arux~?GLB$b-!Z! zznkLUoHcE| z{beRnP2fu?ImpYR|l zql1tL72I!#jPS{Qv|?XZOGPa+30}uV$cfM;)@K|Ow$pf4&|lhnwAflccP9PJQ1tHT z5mcS0st=ie$c*^?90 z_=qT$8tFj;NYE>ng(dD$B47W1X^c&ATbT)ND*>r9c`5#`U=)4 zB8{>~DG-RfuFnv4Xi+^I1DyW z(gyJCNa4$m*T-f2eBY6o)f~pzPK$3XEpjD}gb%?D#tlhcv6z?+0=<=(!%~m9Mhi3r zG?%_qt5}CqdG{z4Uf{{KW*&PXP-sDOMI>JYcg0Z4X|otp&xTXT;o*#%Xim%bY@xK@ zl+J&G-PvecYa?kgCWy1xA}PP@&<+y_bW^9fedm#y7H}I9ekI|j!zkOQEMyZcD{HBLm=7SQ+s+1L7 sGw|1bcu@AjGL>Lx5w2$3caFG*ngnG7zcKF-qzM0ZT3c=szVOHY0siJbm;e9( literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/__init__.py b/zoo/smac/envs/maps/SMAC_Maps/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/zoo/smac/envs/maps/SMAC_Maps/bane_vs_bane.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/bane_vs_bane.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..bb81284cc1e7396278b972d39aeb14c2f86d906d GIT binary patch literal 16782 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 literal 0 HcmV?d00001 diff --git a/zoo/smac/envs/maps/SMAC_Maps/corridor.SC2Map b/zoo/smac/envs/maps/SMAC_Maps/corridor.SC2Map new file mode 100644 index 0000000000000000000000000000000000000000..90daed607b72b7d0cc14f4d2ccad7302ecc3bd01 GIT binary patch literal 18055 zcmeFYWmF}-+BUdh4tz)9Ft`>3=C58blQzmQ>KWq#d2%NA2Lx1Fvx@jPH7OR zK$cu5h5}mQoOVmna$$e~6f1<_DABQqGQTI}lkZYKU^q^gpbKVbe05&tLV5RPeIUg4 zn*bxWaz5&I^?*fmo?;Rz%6M_A`-7V&(#Rzxzw>g})XUh@J79N1Y*IgI-LSl7q45?| z1!muottuM~JZN2W)y8h^HOUclAi2Y(N?|_OA?$jeAq;|I`1Wi&ZQ%DxZra-49&m#- z)B5hs?ykI~Bp^K1hS3@807($3dIISIy2!v$`Zi3jz5^N|6Oimhi^{?INqKoDVbaIpYtd7*3P+&!K$$K z(CLX8HMvFvMPl1*B63t>U1Wd46-2}L<1g?!-;_FxxvwdY4GWKcqP=BKCnA6SC6d&P zaroNT!J^t?kW69MQPTGC@Nl+aZ+{*^^CMu;c#_!dE4AEiSZAy!ifl_(Ua_R8Xi`eS zO<-6spQ^kWi!!W#+lK$G5+gZU{L!lTWUo9CfH2&><-M_-=7iK7=#4(5!{%x zm3$Rk5C-)Cl(2Gaj`Gh#PGJtHhV2*s2I=WfUnQ(${fwHV4R&y4cIaVY*AVs;Aw;MC zN3rG;G;#$5VbJY9N~C02!XDe#@oTD?pO4k-1p{IM9On(P33+qb&QU;;^;=TMcbb6m zzJ~x2xztATF6ey zevsj~-d#p8xPEtLZ5r>;26y$--%)_7JzHg~OCU2T2>&vnkN;s%)aWI6s`7I_X#lmw z)wQEE_{4n#t)puINS3IJciwvTi#Iaaf;di>KH~Jzc>KNWRG~6N z@QTn-6p^H>@vz2-2g)8)rbVYc%ZoEaUQI;Hs9{a>GD}NLxg=a6Q3ud?6gu>{ksj;CU)uxH5A=r$q5W)^C_z|~?op_KXpi&L0 zGlzXW;8w^x!kABy{+x!M_phR(le|^4Ff^=2Hw6G8smz0ov4^`i<24hs1Pp|sO+l3IBqmlSQKlXbBp4Cm&p6n(<>#XCLaAd8;6Nsp+%$NwS2|6# z1R%g!6-|tlqs$+L_!^}xo9f`Wms$u^UQ(Q#43HTm^dj)XDAif^W?l}wjedJrMo*FN z7PGFVeB92IGveJ_M6DRQU;;1Hy)!eQWYJzEc#&z`=QHkZB609^Q6-@}V(0E4e9+1K zlh&H}fr$IfCHl9_t#@xBOFA_wb-#t>xfq5FkgSZyv{4oQ}!z6ND8lc zVTts_Z^O7>Op4jgur-HOJBlc+Fr685Lm@?es#KO$35vqQ!|Ix@C{LU*E{Qo>Ri>z* zAa}AGFTrX~z3zHyG@eO4#;z)!5mlm=7c3F0HJ;9VPS`P-YB;KKIo|{!R{hZm(xIuDn+i5tQ$2 zss}EJ2+!YfCE=DPQm;+&yB;|>c@8uD{o~10&Z^N@&!?3KAO>WJ!rJODd1^I=yi|!h zHb$(hZ;L0lpx7M|v5$SyAyj*-?M%?*hYjxs#eK89K? zt7@&}g)~Kju+^9T8vjT{7}hM%YYxzZ<(SdmSCPV78wGG;JNzhsa)A8XZ0bFBD@+I- zxR)BcrM7Es6U0Z$1wuiPu5HHjp+Ys-I>mH2iRlb4&r*pQ`9Ie5-B!t&pNcJhe#?L3 z8qer4up;T-1#4!pb9K(3V0Yg$wWjBKxx(~qgX-~pB?^{9BWO=RyoMW)VVlt8jiv-n zJo`JUODk@l&bEEZ+W7JK<(cAKAYj*2V5t+?ZW-r5D&vzbw<-{Ioo$mI#qdA7>Q705W}aO{QgMv`D#bdw_r?shrugZNX|+Uq(^RKpxy z)l*Oh8*F4_*3&2`a&Src3Qsx@f@o`6DZs75YKk}|Iy8`eS_8wKziIs-OW3ZLuM