continual-foragax 0.22.0__tar.gz → 0.23.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/PKG-INFO +1 -1
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/pyproject.toml +2 -2
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/continual_foragax.egg-info/PKG-INFO +1 -1
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/env.py +62 -6
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/objects.py +42 -1
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/registry.py +68 -1
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/tests/test_foragax.py +99 -3
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/README.md +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/setup.cfg +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/continual_foragax.egg-info/SOURCES.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/continual_foragax.egg-info/dependency_links.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/continual_foragax.egg-info/entry_points.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/continual_foragax.egg-info/requires.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/continual_foragax.egg-info/top_level.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/__init__.py +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/colors.py +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100897.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100928.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100929.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100930.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100931.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106714.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106715.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106716.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106717.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106718.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106930.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106931.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106932.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106933.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106934.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106935.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106936.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106937.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106938.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106939.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106940.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106941.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106942.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106943.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106994.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106995.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106996.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106997.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106998.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106999.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107000.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107001.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107002.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107003.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107004.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107005.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107006.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107007.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107008.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107009.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107010.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107011.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107012.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107013.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107014.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107015.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107016.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107017.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107018.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107019.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107020.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107021.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107022.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107023.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107024.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107025.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107026.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107027.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107028.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107029.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107030.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107031.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107032.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107033.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107034.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107035.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107036.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107037.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107038.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107039.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107040.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107041.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107042.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107043.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107044.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107045.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107046.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107047.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107048.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107049.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107050.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107051.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107052.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107053.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107054.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107055.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107056.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107057.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107058.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107059.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107060.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107061.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107062.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107063.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107064.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107065.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107066.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107067.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107068.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107069.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107070.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107071.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115808.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115812.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID146811.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156831.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156835.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156839.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156843.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156847.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156851.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156855.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156859.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156863.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156867.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156871.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156875.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156879.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156883.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156887.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/elements.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/metadata.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/data/ECA_non-blended_custom/sources.txt +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/rendering.py +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/foragax/weather.py +0 -0
- {continual_foragax-0.22.0 → continual_foragax-0.23.1}/tests/test_benchmark.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "continual-foragax"
|
3
|
-
version = "0.
|
3
|
+
version = "0.23.1"
|
4
4
|
description = "A continual reinforcement learning benchmark"
|
5
5
|
readme = "README.md"
|
6
6
|
authors = [
|
@@ -30,7 +30,7 @@ build-backend = "setuptools.build_meta"
|
|
30
30
|
[tool]
|
31
31
|
[tool.commitizen]
|
32
32
|
name = "cz_conventional_commits"
|
33
|
-
version = "0.
|
33
|
+
version = "0.23.1"
|
34
34
|
tag_format = "$version"
|
35
35
|
version_files = ["pyproject.toml"]
|
36
36
|
|
@@ -59,6 +59,7 @@ class EnvParams(environment.EnvParams):
|
|
59
59
|
class EnvState(environment.EnvState):
|
60
60
|
pos: jax.Array
|
61
61
|
object_grid: jax.Array
|
62
|
+
biome_grid: jax.Array
|
62
63
|
time: int
|
63
64
|
|
64
65
|
|
@@ -101,6 +102,7 @@ class ForagaxEnv(environment.Environment):
|
|
101
102
|
self.object_blocking = jnp.array([o.blocking for o in objects])
|
102
103
|
self.object_collectable = jnp.array([o.collectable for o in objects])
|
103
104
|
self.object_colors = jnp.array([o.color for o in objects])
|
105
|
+
self.object_random_respawn = jnp.array([o.random_respawn for o in objects])
|
104
106
|
|
105
107
|
self.reward_fns = [o.reward for o in objects]
|
106
108
|
self.regen_delay_fns = [o.regen_delay for o in objects]
|
@@ -179,7 +181,7 @@ class ForagaxEnv(environment.Environment):
|
|
179
181
|
is_collectable = self.object_collectable[obj_at_pos]
|
180
182
|
|
181
183
|
# 3. HANDLE OBJECT COLLECTION AND RESPAWNING
|
182
|
-
key, subkey = jax.random.split(key)
|
184
|
+
key, subkey, rand_key = jax.random.split(key, 3)
|
183
185
|
|
184
186
|
# Decrement timers (stored as negative values)
|
185
187
|
is_timer = state.object_grid < 0
|
@@ -193,10 +195,49 @@ class ForagaxEnv(environment.Environment):
|
|
193
195
|
)
|
194
196
|
encoded_timer = obj_at_pos - ((regen_delay + 1) * num_obj_types)
|
195
197
|
|
198
|
+
def place_at_current_pos(current_grid, timer_val):
|
199
|
+
return current_grid.at[pos[1], pos[0]].set(timer_val)
|
200
|
+
|
201
|
+
def place_at_random_pos(current_grid, timer_val):
|
202
|
+
# Set the collected position to empty temporarily
|
203
|
+
grid = current_grid.at[pos[1], pos[0]].set(0)
|
204
|
+
|
205
|
+
# Find all valid spawn locations (empty cells within the same biome)
|
206
|
+
biome_id = state.biome_grid[pos[1], pos[0]]
|
207
|
+
biome_mask = state.biome_grid == biome_id
|
208
|
+
empty_mask = grid == 0
|
209
|
+
valid_spawn_mask = biome_mask & empty_mask
|
210
|
+
|
211
|
+
num_valid_spawns = jnp.sum(valid_spawn_mask)
|
212
|
+
|
213
|
+
# Get indices of valid spawn locations, padded to a static size
|
214
|
+
y_indices, x_indices = jnp.nonzero(
|
215
|
+
valid_spawn_mask, size=self.size[0] * self.size[1], fill_value=-1
|
216
|
+
)
|
217
|
+
valid_spawn_indices = jnp.stack([y_indices, x_indices], axis=1)
|
218
|
+
|
219
|
+
# Select a random valid location
|
220
|
+
random_idx = jax.random.randint(rand_key, (), 0, num_valid_spawns)
|
221
|
+
new_spawn_pos = valid_spawn_indices[random_idx]
|
222
|
+
|
223
|
+
# Place the timer at the new random position
|
224
|
+
return grid.at[new_spawn_pos[0], new_spawn_pos[1]].set(timer_val)
|
225
|
+
|
196
226
|
# If collected, replace object with timer; otherwise, keep it
|
197
227
|
val_at_pos = object_grid[pos[1], pos[0]]
|
198
|
-
|
199
|
-
|
228
|
+
should_collect = is_collectable & (val_at_pos > 0)
|
229
|
+
|
230
|
+
# When not collecting, the value at the position remains unchanged.
|
231
|
+
# When collecting, we either place the timer at the current position or a random one.
|
232
|
+
object_grid = jax.lax.cond(
|
233
|
+
should_collect,
|
234
|
+
lambda: jax.lax.cond(
|
235
|
+
self.object_random_respawn[obj_at_pos],
|
236
|
+
lambda: place_at_random_pos(object_grid, encoded_timer),
|
237
|
+
lambda: place_at_current_pos(object_grid, encoded_timer),
|
238
|
+
),
|
239
|
+
lambda: object_grid,
|
240
|
+
)
|
200
241
|
|
201
242
|
info = {"discount": self.discount(state, params)}
|
202
243
|
if self.weather_object is not None:
|
@@ -208,6 +249,7 @@ class ForagaxEnv(environment.Environment):
|
|
208
249
|
state = EnvState(
|
209
250
|
pos=pos,
|
210
251
|
object_grid=object_grid,
|
252
|
+
biome_grid=state.biome_grid,
|
211
253
|
time=state.time + 1,
|
212
254
|
)
|
213
255
|
|
@@ -225,10 +267,12 @@ class ForagaxEnv(environment.Environment):
|
|
225
267
|
) -> Tuple[jax.Array, EnvState]:
|
226
268
|
"""Reset environment state."""
|
227
269
|
object_grid = jnp.zeros((self.size[1], self.size[0]), dtype=int)
|
270
|
+
biome_grid = jnp.full((self.size[1], self.size[0]), -1, dtype=int)
|
228
271
|
key, iter_key = jax.random.split(key)
|
229
272
|
for i in range(self.biome_object_frequencies.shape[0]):
|
230
273
|
iter_key, biome_key = jax.random.split(iter_key)
|
231
274
|
mask = self.biome_masks[i]
|
275
|
+
biome_grid = jnp.where(mask, i, biome_grid)
|
232
276
|
|
233
277
|
if self.deterministic_spawn:
|
234
278
|
biome_objects = self.generate_biome_new(i, biome_key)
|
@@ -237,13 +281,13 @@ class ForagaxEnv(environment.Environment):
|
|
237
281
|
biome_objects = self.generate_biome_old(i, biome_key)
|
238
282
|
object_grid = jnp.where(mask, biome_objects, object_grid)
|
239
283
|
|
240
|
-
# Place agent in the center of the world
|
284
|
+
# Place agent in the center of the world
|
241
285
|
agent_pos = jnp.array([self.size[0] // 2, self.size[1] // 2])
|
242
|
-
object_grid = object_grid.at[agent_pos[1], agent_pos[0]].set(0)
|
243
286
|
|
244
287
|
state = EnvState(
|
245
288
|
pos=agent_pos,
|
246
289
|
object_grid=object_grid,
|
290
|
+
biome_grid=biome_grid,
|
247
291
|
time=0,
|
248
292
|
)
|
249
293
|
|
@@ -298,6 +342,12 @@ class ForagaxEnv(environment.Environment):
|
|
298
342
|
(self.size[1], self.size[0]),
|
299
343
|
int,
|
300
344
|
),
|
345
|
+
"biome_grid": spaces.Box(
|
346
|
+
0,
|
347
|
+
self.biome_object_frequencies.shape[0],
|
348
|
+
(self.size[1], self.size[0]),
|
349
|
+
int,
|
350
|
+
),
|
301
351
|
"time": spaces.Discrete(params.max_steps_in_episode),
|
302
352
|
}
|
303
353
|
)
|
@@ -455,7 +505,13 @@ class ForagaxObjectEnv(ForagaxEnv):
|
|
455
505
|
deterministic_spawn: bool = False,
|
456
506
|
):
|
457
507
|
super().__init__(
|
458
|
-
name,
|
508
|
+
name,
|
509
|
+
size,
|
510
|
+
aperture_size,
|
511
|
+
objects,
|
512
|
+
biomes,
|
513
|
+
nowrap,
|
514
|
+
deterministic_spawn,
|
459
515
|
)
|
460
516
|
|
461
517
|
# Compute unique colors and mapping for partial observability
|
@@ -16,11 +16,13 @@ class BaseForagaxObject:
|
|
16
16
|
blocking: bool = False,
|
17
17
|
collectable: bool = False,
|
18
18
|
color: Tuple[int, int, int] = (0, 0, 0),
|
19
|
+
random_respawn: bool = False,
|
19
20
|
):
|
20
21
|
self.name = name
|
21
22
|
self.blocking = blocking
|
22
23
|
self.collectable = collectable
|
23
24
|
self.color = color
|
25
|
+
self.random_respawn = random_respawn
|
24
26
|
|
25
27
|
@abc.abstractmethod
|
26
28
|
def reward(self, clock: int, rng: jax.Array) -> float:
|
@@ -44,8 +46,9 @@ class DefaultForagaxObject(BaseForagaxObject):
|
|
44
46
|
collectable: bool = False,
|
45
47
|
regen_delay: Tuple[int, int] = (10, 100),
|
46
48
|
color: Tuple[int, int, int] = (255, 255, 255),
|
49
|
+
random_respawn: bool = False,
|
47
50
|
):
|
48
|
-
super().__init__(name, blocking, collectable, color)
|
51
|
+
super().__init__(name, blocking, collectable, color, random_respawn)
|
49
52
|
self.reward_val = reward
|
50
53
|
self.regen_delay_range = regen_delay
|
51
54
|
|
@@ -70,6 +73,7 @@ class NormalRegenForagaxObject(DefaultForagaxObject):
|
|
70
73
|
mean_regen_delay: int = 10,
|
71
74
|
std_regen_delay: int = 1,
|
72
75
|
color: Tuple[int, int, int] = (0, 0, 0),
|
76
|
+
random_respawn: bool = False,
|
73
77
|
):
|
74
78
|
super().__init__(
|
75
79
|
name=name,
|
@@ -77,6 +81,7 @@ class NormalRegenForagaxObject(DefaultForagaxObject):
|
|
77
81
|
collectable=collectable,
|
78
82
|
regen_delay=(mean_regen_delay, mean_regen_delay),
|
79
83
|
color=color,
|
84
|
+
random_respawn=random_respawn,
|
80
85
|
)
|
81
86
|
self.mean_regen_delay = mean_regen_delay
|
82
87
|
self.std_regen_delay = std_regen_delay
|
@@ -99,6 +104,7 @@ class WeatherObject(NormalRegenForagaxObject):
|
|
99
104
|
mean_regen_delay: int = 10,
|
100
105
|
std_regen_delay: int = 1,
|
101
106
|
color: Tuple[int, int, int] = (0, 0, 0),
|
107
|
+
random_respawn: bool = False,
|
102
108
|
):
|
103
109
|
super().__init__(
|
104
110
|
name=name,
|
@@ -106,6 +112,7 @@ class WeatherObject(NormalRegenForagaxObject):
|
|
106
112
|
mean_regen_delay=mean_regen_delay,
|
107
113
|
std_regen_delay=std_regen_delay,
|
108
114
|
color=color,
|
115
|
+
random_respawn=random_respawn,
|
109
116
|
)
|
110
117
|
self.rewards = rewards
|
111
118
|
self.repeat = repeat
|
@@ -271,6 +278,40 @@ GREEN_FAKE_UNIFORM = DefaultForagaxObject(
|
|
271
278
|
regen_delay=(9, 11),
|
272
279
|
)
|
273
280
|
|
281
|
+
# Random respawn variants
|
282
|
+
BROWN_MOREL_UNIFORM_RANDOM = DefaultForagaxObject(
|
283
|
+
name="brown_morel",
|
284
|
+
reward=10.0,
|
285
|
+
collectable=True,
|
286
|
+
color=(63, 30, 25),
|
287
|
+
regen_delay=(90, 110),
|
288
|
+
random_respawn=True,
|
289
|
+
)
|
290
|
+
BROWN_OYSTER_UNIFORM_RANDOM = DefaultForagaxObject(
|
291
|
+
name="brown_oyster",
|
292
|
+
reward=1.0,
|
293
|
+
collectable=True,
|
294
|
+
color=(63, 30, 25),
|
295
|
+
regen_delay=(9, 11),
|
296
|
+
random_respawn=True,
|
297
|
+
)
|
298
|
+
GREEN_DEATHCAP_UNIFORM_RANDOM = DefaultForagaxObject(
|
299
|
+
name="green_deathcap",
|
300
|
+
reward=-5.0,
|
301
|
+
collectable=True,
|
302
|
+
color=(0, 255, 0),
|
303
|
+
regen_delay=(9, 11),
|
304
|
+
random_respawn=True,
|
305
|
+
)
|
306
|
+
GREEN_FAKE_UNIFORM_RANDOM = DefaultForagaxObject(
|
307
|
+
name="green_fake",
|
308
|
+
reward=0.0,
|
309
|
+
collectable=True,
|
310
|
+
color=(0, 255, 0),
|
311
|
+
regen_delay=(9, 11),
|
312
|
+
random_respawn=True,
|
313
|
+
)
|
314
|
+
|
274
315
|
|
275
316
|
def create_weather_objects(
|
276
317
|
file_index: int = 0,
|
@@ -13,15 +13,19 @@ from foragax.objects import (
|
|
13
13
|
BROWN_MOREL,
|
14
14
|
BROWN_MOREL_2,
|
15
15
|
BROWN_MOREL_UNIFORM,
|
16
|
+
BROWN_MOREL_UNIFORM_RANDOM,
|
16
17
|
BROWN_OYSTER,
|
17
18
|
BROWN_OYSTER_UNIFORM,
|
19
|
+
BROWN_OYSTER_UNIFORM_RANDOM,
|
18
20
|
GREEN_DEATHCAP,
|
19
21
|
GREEN_DEATHCAP_2,
|
20
22
|
GREEN_DEATHCAP_3,
|
21
23
|
GREEN_DEATHCAP_UNIFORM,
|
24
|
+
GREEN_DEATHCAP_UNIFORM_RANDOM,
|
22
25
|
GREEN_FAKE,
|
23
26
|
GREEN_FAKE_2,
|
24
27
|
GREEN_FAKE_UNIFORM,
|
28
|
+
GREEN_FAKE_UNIFORM_RANDOM,
|
25
29
|
LARGE_MOREL,
|
26
30
|
LARGE_OYSTER,
|
27
31
|
MEDIUM_MOREL,
|
@@ -176,6 +180,45 @@ ENV_CONFIGS: Dict[str, Dict[str, Any]] = {
|
|
176
180
|
"nowrap": True,
|
177
181
|
"deterministic_spawn": True,
|
178
182
|
},
|
183
|
+
"ForagaxTwoBiome-v10": {
|
184
|
+
"size": None,
|
185
|
+
"aperture_size": None,
|
186
|
+
"objects": (
|
187
|
+
BROWN_MOREL_UNIFORM_RANDOM,
|
188
|
+
BROWN_OYSTER_UNIFORM_RANDOM,
|
189
|
+
GREEN_DEATHCAP_UNIFORM_RANDOM,
|
190
|
+
GREEN_FAKE_UNIFORM_RANDOM,
|
191
|
+
),
|
192
|
+
"biomes": None,
|
193
|
+
"nowrap": True,
|
194
|
+
"deterministic_spawn": True,
|
195
|
+
},
|
196
|
+
"ForagaxTwoBiome-v11": {
|
197
|
+
"size": None,
|
198
|
+
"aperture_size": None,
|
199
|
+
"objects": (
|
200
|
+
BROWN_MOREL_UNIFORM,
|
201
|
+
BROWN_OYSTER_UNIFORM,
|
202
|
+
GREEN_DEATHCAP_UNIFORM,
|
203
|
+
GREEN_FAKE_UNIFORM,
|
204
|
+
),
|
205
|
+
"biomes": None,
|
206
|
+
"nowrap": True,
|
207
|
+
"deterministic_spawn": True,
|
208
|
+
},
|
209
|
+
"ForagaxTwoBiome-v12": {
|
210
|
+
"size": None,
|
211
|
+
"aperture_size": None,
|
212
|
+
"objects": (
|
213
|
+
BROWN_MOREL_UNIFORM_RANDOM,
|
214
|
+
BROWN_OYSTER_UNIFORM_RANDOM,
|
215
|
+
GREEN_DEATHCAP_UNIFORM_RANDOM,
|
216
|
+
GREEN_FAKE_UNIFORM_RANDOM,
|
217
|
+
),
|
218
|
+
"biomes": None,
|
219
|
+
"nowrap": True,
|
220
|
+
"deterministic_spawn": True,
|
221
|
+
},
|
179
222
|
"ForagaxTwoBiomeSmall-v1": {
|
180
223
|
"size": (16, 8),
|
181
224
|
"aperture_size": None,
|
@@ -246,7 +289,12 @@ def make(
|
|
246
289
|
if nowrap is not None:
|
247
290
|
config["nowrap"] = nowrap
|
248
291
|
|
249
|
-
if env_id in (
|
292
|
+
if env_id in (
|
293
|
+
"ForagaxTwoBiome-v7",
|
294
|
+
"ForagaxTwoBiome-v8",
|
295
|
+
"ForagaxTwoBiome-v9",
|
296
|
+
"ForagaxTwoBiome-v10",
|
297
|
+
):
|
250
298
|
margin = aperture_size[1] // 2 + 1
|
251
299
|
width = 2 * margin + 9
|
252
300
|
config["size"] = (width, 15)
|
@@ -265,6 +313,25 @@ def make(
|
|
265
313
|
),
|
266
314
|
)
|
267
315
|
|
316
|
+
if env_id in ("ForagaxTwoBiome-v11", "ForagaxTwoBiome-v12"):
|
317
|
+
margin = aperture_size[1] // 2 + 1
|
318
|
+
width = 2 * margin + 9
|
319
|
+
config["size"] = (width, 15)
|
320
|
+
config["biomes"] = (
|
321
|
+
# Morel biome
|
322
|
+
Biome(
|
323
|
+
start=(margin, 0),
|
324
|
+
stop=(margin + 2, 15),
|
325
|
+
object_frequencies=(0.5, 0.0, 0.25, 0.0),
|
326
|
+
),
|
327
|
+
# Oyster biome
|
328
|
+
Biome(
|
329
|
+
start=(margin + 7, 0),
|
330
|
+
stop=(margin + 9, 15),
|
331
|
+
object_frequencies=(0.0, 0.5, 0.0, 0.25),
|
332
|
+
),
|
333
|
+
)
|
334
|
+
|
268
335
|
if env_id == "ForagaxWeather-v3":
|
269
336
|
margin = aperture_size[1] // 2 + 1
|
270
337
|
width = 2 * margin + 9
|
@@ -257,7 +257,7 @@ def test_respawn():
|
|
257
257
|
objects=object_types,
|
258
258
|
)
|
259
259
|
params = env.default_params
|
260
|
-
_, state = env.
|
260
|
+
_, state = env.reset(key, params)
|
261
261
|
|
262
262
|
flower_id = 1 # 0 is EMPTY
|
263
263
|
|
@@ -268,7 +268,7 @@ def test_respawn():
|
|
268
268
|
|
269
269
|
# Collect the flower
|
270
270
|
key, step_key = jax.random.split(key)
|
271
|
-
_, state, reward, _, _ = env.
|
271
|
+
_, state, reward, _, _ = env.step(step_key, state, Actions.DOWN, params)
|
272
272
|
assert reward == FLOWER.reward_val
|
273
273
|
assert state.object_grid[4, 3] < 0
|
274
274
|
|
@@ -277,7 +277,7 @@ def test_respawn():
|
|
277
277
|
# Step until it respawns
|
278
278
|
for i in range(steps_until_respawn):
|
279
279
|
key, step_key = jax.random.split(key)
|
280
|
-
_, state, _, _, _ = env.
|
280
|
+
_, state, _, _, _ = env.step(step_key, state, Actions.DOWN, params)
|
281
281
|
assert state.object_grid[4, 3] < 0
|
282
282
|
|
283
283
|
key, step_key = jax.random.split(key)
|
@@ -285,6 +285,102 @@ def test_respawn():
|
|
285
285
|
assert state.object_grid[4, 3] == flower_id
|
286
286
|
|
287
287
|
|
288
|
+
def test_random_respawn():
|
289
|
+
"""Test that an object respawns at a random empty location within its biome."""
|
290
|
+
key = jax.random.key(0)
|
291
|
+
|
292
|
+
flower_random = DefaultForagaxObject(
|
293
|
+
name="flower",
|
294
|
+
reward=1.0,
|
295
|
+
collectable=True,
|
296
|
+
color=(0, 255, 0),
|
297
|
+
random_respawn=True,
|
298
|
+
)
|
299
|
+
|
300
|
+
object_types = (flower_random, WALL)
|
301
|
+
biome = Biome(start=(2, 2), stop=(5, 5), object_frequencies=(0.0, 0.0))
|
302
|
+
env = ForagaxObjectEnv(
|
303
|
+
size=7,
|
304
|
+
aperture_size=3,
|
305
|
+
objects=object_types,
|
306
|
+
biomes=(biome,),
|
307
|
+
)
|
308
|
+
params = env.default_params
|
309
|
+
_, state = env.reset(key, params)
|
310
|
+
|
311
|
+
flower_id = 1 # 0 is EMPTY
|
312
|
+
original_pos = jnp.array([3, 3])
|
313
|
+
|
314
|
+
# Place a flower and move the agent to it
|
315
|
+
grid = jnp.zeros((7, 7), dtype=int)
|
316
|
+
grid = grid.at[original_pos[1], original_pos[0]].set(flower_id)
|
317
|
+
# Add a wall to make sure it doesn't spawn there
|
318
|
+
grid = grid.at[4, 4].set(2) # Use a fixed ID for the wall
|
319
|
+
state = state.replace(object_grid=grid, pos=jnp.array([2, 3]))
|
320
|
+
|
321
|
+
# Collect the flower
|
322
|
+
key, step_key = jax.random.split(key)
|
323
|
+
_, new_state, reward, _, _ = env.step(step_key, state, Actions.RIGHT, params)
|
324
|
+
|
325
|
+
assert reward == flower_random.reward_val
|
326
|
+
# Original position should be empty
|
327
|
+
assert new_state.object_grid[original_pos[1], original_pos[0]] == 0
|
328
|
+
|
329
|
+
# A timer should be placed somewhere
|
330
|
+
assert jnp.sum(new_state.object_grid < 0) == 1
|
331
|
+
timer_pos_flat = jnp.argmin(new_state.object_grid)
|
332
|
+
timer_pos = jnp.array(jnp.unravel_index(timer_pos_flat, (7, 7)))
|
333
|
+
# New position should not be the original position
|
334
|
+
assert not jnp.array_equal(timer_pos, original_pos)
|
335
|
+
|
336
|
+
# New position should be within the biome
|
337
|
+
assert jnp.all(timer_pos >= jnp.array(biome.start))
|
338
|
+
assert jnp.all(timer_pos < jnp.array(biome.stop))
|
339
|
+
|
340
|
+
# New position should be on an empty cell (not the wall)
|
341
|
+
assert not jnp.array_equal(timer_pos, jnp.array([4, 4]))
|
342
|
+
|
343
|
+
|
344
|
+
def test_random_respawn_no_empty_space():
|
345
|
+
"""Test that an object respawns at the same spot if no empty space is available."""
|
346
|
+
key = jax.random.key(0)
|
347
|
+
|
348
|
+
flower_random = DefaultForagaxObject(
|
349
|
+
name="flower",
|
350
|
+
reward=1.0,
|
351
|
+
collectable=True,
|
352
|
+
color=(0, 255, 0),
|
353
|
+
random_respawn=True,
|
354
|
+
)
|
355
|
+
|
356
|
+
object_types = (WALL, flower_random)
|
357
|
+
# A 1x1 biome
|
358
|
+
biome = Biome(start=(3, 3), stop=(4, 4), object_frequencies=(0.0, 0.0))
|
359
|
+
env = ForagaxObjectEnv(
|
360
|
+
size=7,
|
361
|
+
objects=object_types,
|
362
|
+
biomes=(biome,),
|
363
|
+
)
|
364
|
+
params = env.default_params
|
365
|
+
_, state = env.reset(key, params)
|
366
|
+
|
367
|
+
flower_id = 2 # WALL is 1
|
368
|
+
original_pos = jnp.array([3, 3])
|
369
|
+
|
370
|
+
# Place a flower in the 1x1 biome
|
371
|
+
grid = jnp.zeros((7, 7), dtype=int)
|
372
|
+
grid = grid.at[original_pos[1], original_pos[0]].set(flower_id)
|
373
|
+
state = state.replace(object_grid=grid, pos=jnp.array([2, 3]))
|
374
|
+
|
375
|
+
# Collect the flower
|
376
|
+
key, step_key = jax.random.split(key)
|
377
|
+
_, new_state, reward, _, _ = env.step(step_key, state, Actions.RIGHT, params)
|
378
|
+
|
379
|
+
assert reward == flower_random.reward_val
|
380
|
+
# The timer should be placed back at the original position
|
381
|
+
assert new_state.object_grid[original_pos[1], original_pos[0]] < 0
|
382
|
+
|
383
|
+
|
288
384
|
def test_wrapping_dynamics():
|
289
385
|
"""Test that the agent wraps around the environment boundaries."""
|
290
386
|
key = jax.random.key(0)
|
File without changes
|
File without changes
|
{continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/continual_foragax.egg-info/SOURCES.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
{continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/continual_foragax.egg-info/requires.txt
RENAMED
File without changes
|
{continual_foragax-0.22.0 → continual_foragax-0.23.1}/src/continual_foragax.egg-info/top_level.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|