continual-foragax 0.29.0__tar.gz → 0.30.0__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.29.0 → continual_foragax-0.30.0}/PKG-INFO +1 -1
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/pyproject.toml +2 -2
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/PKG-INFO +1 -1
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/env.py +14 -14
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/objects.py +24 -24
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/registry.py +6 -17
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/tests/test_foragax.py +3 -3
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/tests/test_registry.py +72 -101
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/README.md +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/setup.cfg +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/SOURCES.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/dependency_links.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/entry_points.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/requires.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/top_level.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/__init__.py +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/colors.py +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100897.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100928.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100929.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100930.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100931.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106714.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106715.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106716.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106717.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106718.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106930.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106931.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106932.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106933.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106934.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106935.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106936.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106937.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106938.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106939.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106940.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106941.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106942.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106943.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106994.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106995.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106996.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106997.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106998.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106999.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107000.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107001.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107002.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107003.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107004.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107005.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107006.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107007.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107008.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107009.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107010.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107011.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107012.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107013.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107014.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107015.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107016.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107017.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107018.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107019.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107020.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107021.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107022.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107023.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107024.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107025.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107026.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107027.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107028.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107029.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107030.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107031.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107032.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107033.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107034.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107035.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107036.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107037.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107038.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107039.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107040.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107041.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107042.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107043.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107044.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107045.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107046.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107047.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107048.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107049.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107050.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107051.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107052.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107053.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107054.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107055.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107056.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107057.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107058.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107059.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107060.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107061.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107062.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107063.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107064.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107065.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107066.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107067.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107068.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107069.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107070.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107071.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115808.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115812.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID146811.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156831.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156835.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156839.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156843.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156847.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156851.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156855.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156859.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156863.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156867.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156871.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156875.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156879.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156883.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156887.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/elements.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/metadata.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/sources.txt +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/rendering.py +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/weather.py +0 -0
- {continual_foragax-0.29.0 → continual_foragax-0.30.0}/tests/test_benchmark.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "continual-foragax"
|
3
|
-
version = "0.
|
3
|
+
version = "0.30.0"
|
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.30.0"
|
34
34
|
tag_format = "$version"
|
35
35
|
version_files = ["pyproject.toml"]
|
36
36
|
|
@@ -113,12 +113,12 @@ class ForagaxEnv(environment.Environment):
|
|
113
113
|
|
114
114
|
self.reward_fns = [o.reward for o in objects]
|
115
115
|
self.regen_delay_fns = [o.regen_delay for o in objects]
|
116
|
-
self.
|
116
|
+
self.reward_delay_fns = [o.reward_delay for o in objects]
|
117
117
|
|
118
|
-
# Compute
|
119
|
-
|
120
|
-
self.
|
121
|
-
int(jnp.max(
|
118
|
+
# Compute reward steps per object (using max_reward_delay attribute)
|
119
|
+
object_max_reward_delay = jnp.array([o.max_reward_delay for o in objects])
|
120
|
+
self.max_reward_delay = (
|
121
|
+
int(jnp.max(object_max_reward_delay)) + 1 if len(objects) > 0 else 0
|
122
122
|
)
|
123
123
|
|
124
124
|
self.biome_object_frequencies = jnp.array(
|
@@ -250,21 +250,21 @@ class ForagaxEnv(environment.Environment):
|
|
250
250
|
obj_at_pos, self.reward_fns, state.time, reward_subkey
|
251
251
|
)
|
252
252
|
key, digestion_subkey = jax.random.split(key)
|
253
|
-
|
254
|
-
obj_at_pos, self.
|
253
|
+
reward_delay = jax.lax.switch(
|
254
|
+
obj_at_pos, self.reward_delay_fns, state.time, digestion_subkey
|
255
255
|
)
|
256
|
-
reward = jnp.where(should_collect & (
|
257
|
-
if self.
|
256
|
+
reward = jnp.where(should_collect & (reward_delay == 0), object_reward, 0.0)
|
257
|
+
if self.max_reward_delay > 0:
|
258
258
|
# Add delayed rewards to buffer
|
259
259
|
digestion_buffer = jax.lax.cond(
|
260
|
-
should_collect & (
|
260
|
+
should_collect & (reward_delay > 0),
|
261
261
|
lambda: digestion_buffer.at[
|
262
|
-
(state.time +
|
262
|
+
(state.time + reward_delay) % self.max_reward_delay
|
263
263
|
].add(object_reward),
|
264
264
|
lambda: digestion_buffer,
|
265
265
|
)
|
266
266
|
# Deliver current rewards
|
267
|
-
current_index = state.time % self.
|
267
|
+
current_index = state.time % self.max_reward_delay
|
268
268
|
reward += digestion_buffer[current_index]
|
269
269
|
digestion_buffer = digestion_buffer.at[current_index].set(0.0)
|
270
270
|
|
@@ -383,7 +383,7 @@ class ForagaxEnv(environment.Environment):
|
|
383
383
|
object_grid=object_grid,
|
384
384
|
biome_grid=biome_grid,
|
385
385
|
time=0,
|
386
|
-
digestion_buffer=jnp.zeros((self.
|
386
|
+
digestion_buffer=jnp.zeros((self.max_reward_delay,)),
|
387
387
|
)
|
388
388
|
|
389
389
|
return self.get_obs(state, params), state
|
@@ -447,7 +447,7 @@ class ForagaxEnv(environment.Environment):
|
|
447
447
|
"digestion_buffer": spaces.Box(
|
448
448
|
-jnp.inf,
|
449
449
|
jnp.inf,
|
450
|
-
(self.
|
450
|
+
(self.max_reward_delay,),
|
451
451
|
float,
|
452
452
|
),
|
453
453
|
}
|
@@ -17,14 +17,14 @@ class BaseForagaxObject:
|
|
17
17
|
collectable: bool = False,
|
18
18
|
color: Tuple[int, int, int] = (0, 0, 0),
|
19
19
|
random_respawn: bool = False,
|
20
|
-
|
20
|
+
max_reward_delay: int = 0,
|
21
21
|
):
|
22
22
|
self.name = name
|
23
23
|
self.blocking = blocking
|
24
24
|
self.collectable = collectable
|
25
25
|
self.color = color
|
26
26
|
self.random_respawn = random_respawn
|
27
|
-
self.
|
27
|
+
self.max_reward_delay = max_reward_delay
|
28
28
|
|
29
29
|
@abc.abstractmethod
|
30
30
|
def reward(self, clock: int, rng: jax.Array) -> float:
|
@@ -32,8 +32,8 @@ class BaseForagaxObject:
|
|
32
32
|
raise NotImplementedError
|
33
33
|
|
34
34
|
@abc.abstractmethod
|
35
|
-
def
|
36
|
-
"""
|
35
|
+
def reward_delay(self, clock: int, rng: jax.Array) -> int:
|
36
|
+
"""Reward delay function."""
|
37
37
|
raise NotImplementedError
|
38
38
|
|
39
39
|
|
@@ -49,17 +49,17 @@ class DefaultForagaxObject(BaseForagaxObject):
|
|
49
49
|
regen_delay: Tuple[int, int] = (10, 100),
|
50
50
|
color: Tuple[int, int, int] = (255, 255, 255),
|
51
51
|
random_respawn: bool = False,
|
52
|
-
|
53
|
-
|
52
|
+
reward_delay: int = 0,
|
53
|
+
max_reward_delay: Optional[int] = None,
|
54
54
|
):
|
55
|
-
if
|
56
|
-
|
55
|
+
if max_reward_delay is None:
|
56
|
+
max_reward_delay = reward_delay
|
57
57
|
super().__init__(
|
58
|
-
name, blocking, collectable, color, random_respawn,
|
58
|
+
name, blocking, collectable, color, random_respawn, max_reward_delay
|
59
59
|
)
|
60
60
|
self.reward_val = reward
|
61
61
|
self.regen_delay_range = regen_delay
|
62
|
-
self.
|
62
|
+
self.reward_delay_val = reward_delay
|
63
63
|
|
64
64
|
def reward(self, clock: int, rng: jax.Array) -> float:
|
65
65
|
"""Default reward function."""
|
@@ -70,9 +70,9 @@ class DefaultForagaxObject(BaseForagaxObject):
|
|
70
70
|
min_delay, max_delay = self.regen_delay_range
|
71
71
|
return jax.random.randint(rng, (), min_delay, max_delay)
|
72
72
|
|
73
|
-
def
|
74
|
-
"""Default
|
75
|
-
return self.
|
73
|
+
def reward_delay(self, clock: int, rng: jax.Array) -> int:
|
74
|
+
"""Default reward delay function."""
|
75
|
+
return self.reward_delay_val
|
76
76
|
|
77
77
|
|
78
78
|
class NormalRegenForagaxObject(DefaultForagaxObject):
|
@@ -87,8 +87,8 @@ class NormalRegenForagaxObject(DefaultForagaxObject):
|
|
87
87
|
std_regen_delay: int = 1,
|
88
88
|
color: Tuple[int, int, int] = (0, 0, 0),
|
89
89
|
random_respawn: bool = False,
|
90
|
-
|
91
|
-
|
90
|
+
reward_delay: int = 0,
|
91
|
+
max_reward_delay: Optional[int] = None,
|
92
92
|
):
|
93
93
|
super().__init__(
|
94
94
|
name=name,
|
@@ -97,8 +97,8 @@ class NormalRegenForagaxObject(DefaultForagaxObject):
|
|
97
97
|
regen_delay=(mean_regen_delay, mean_regen_delay),
|
98
98
|
color=color,
|
99
99
|
random_respawn=random_respawn,
|
100
|
-
|
101
|
-
|
100
|
+
reward_delay=reward_delay,
|
101
|
+
max_reward_delay=max_reward_delay,
|
102
102
|
)
|
103
103
|
self.mean_regen_delay = mean_regen_delay
|
104
104
|
self.std_regen_delay = std_regen_delay
|
@@ -122,8 +122,8 @@ class WeatherObject(NormalRegenForagaxObject):
|
|
122
122
|
std_regen_delay: int = 1,
|
123
123
|
color: Tuple[int, int, int] = (0, 0, 0),
|
124
124
|
random_respawn: bool = False,
|
125
|
-
|
126
|
-
|
125
|
+
reward_delay: int = 0,
|
126
|
+
max_reward_delay: Optional[int] = None,
|
127
127
|
):
|
128
128
|
super().__init__(
|
129
129
|
name=name,
|
@@ -132,8 +132,8 @@ class WeatherObject(NormalRegenForagaxObject):
|
|
132
132
|
std_regen_delay=std_regen_delay,
|
133
133
|
color=color,
|
134
134
|
random_respawn=random_respawn,
|
135
|
-
|
136
|
-
|
135
|
+
reward_delay=reward_delay,
|
136
|
+
max_reward_delay=max_reward_delay,
|
137
137
|
)
|
138
138
|
self.rewards = rewards
|
139
139
|
self.repeat = repeat
|
@@ -340,7 +340,7 @@ def create_weather_objects(
|
|
340
340
|
multiplier: float = 1.0,
|
341
341
|
same_color: bool = False,
|
342
342
|
random_respawn: bool = False,
|
343
|
-
|
343
|
+
reward_delay: int = 0,
|
344
344
|
):
|
345
345
|
"""Create HOT and COLD WeatherObject instances using the specified file.
|
346
346
|
|
@@ -370,7 +370,7 @@ def create_weather_objects(
|
|
370
370
|
multiplier=multiplier,
|
371
371
|
color=hot_color,
|
372
372
|
random_respawn=random_respawn,
|
373
|
-
|
373
|
+
reward_delay=reward_delay,
|
374
374
|
)
|
375
375
|
|
376
376
|
cold_color = hot_color if same_color else (0, 255, 255)
|
@@ -381,7 +381,7 @@ def create_weather_objects(
|
|
381
381
|
multiplier=-multiplier,
|
382
382
|
color=cold_color,
|
383
383
|
random_respawn=random_respawn,
|
384
|
-
|
384
|
+
reward_delay=reward_delay,
|
385
385
|
)
|
386
386
|
|
387
387
|
return hot, cold
|
@@ -83,19 +83,6 @@ ENV_CONFIGS: Dict[str, Dict[str, Any]] = {
|
|
83
83
|
"nowrap": False,
|
84
84
|
"deterministic_spawn": True,
|
85
85
|
},
|
86
|
-
"ForagaxWeather-v6": {
|
87
|
-
"size": (15, 15),
|
88
|
-
"aperture_size": None,
|
89
|
-
"objects": None,
|
90
|
-
"biomes": (
|
91
|
-
# Hot biome
|
92
|
-
Biome(start=(0, 3), stop=(15, 5), object_frequencies=(0.5, 0.0)),
|
93
|
-
# Cold biome
|
94
|
-
Biome(start=(0, 10), stop=(15, 12), object_frequencies=(0.0, 0.5)),
|
95
|
-
),
|
96
|
-
"nowrap": False,
|
97
|
-
"deterministic_spawn": True,
|
98
|
-
},
|
99
86
|
"ForagaxTwoBiome-v1": {
|
100
87
|
"size": (15, 15),
|
101
88
|
"aperture_size": None,
|
@@ -361,6 +348,8 @@ def make(
|
|
361
348
|
observation_type: str = "color",
|
362
349
|
aperture_size: Optional[Tuple[int, int]] = (5, 5),
|
363
350
|
file_index: int = 0,
|
351
|
+
repeat: int = 500,
|
352
|
+
reward_delay: int = 0,
|
364
353
|
**kwargs: Any,
|
365
354
|
) -> ForagaxEnv:
|
366
355
|
"""Create a Foragax environment.
|
@@ -371,6 +360,8 @@ def make(
|
|
371
360
|
aperture_size: The size of the agent's observation aperture. If -1, full world observation.
|
372
361
|
If None, the default for the environment is used.
|
373
362
|
file_index: File index for weather objects.
|
363
|
+
repeat: How many steps each temperature value repeats for (weather environments).
|
364
|
+
reward_delay: Number of steps required to digest food items (weather environments).
|
374
365
|
**kwargs: Additional keyword arguments to pass to the ForagaxEnv constructor.
|
375
366
|
|
376
367
|
Returns:
|
@@ -467,19 +458,17 @@ def make(
|
|
467
458
|
"ForagaxWeather-v3",
|
468
459
|
"ForagaxWeather-v4",
|
469
460
|
"ForagaxWeather-v5",
|
470
|
-
"ForagaxWeather-v6",
|
471
461
|
)
|
472
462
|
random_respawn = env_id in (
|
473
463
|
"ForagaxWeather-v4",
|
474
464
|
"ForagaxWeather-v5",
|
475
|
-
"ForagaxWeather-v6",
|
476
465
|
)
|
477
|
-
digestion_steps = 10 if env_id in ("ForagaxWeather-v6") else 0
|
478
466
|
hot, cold = create_weather_objects(
|
479
467
|
file_index=file_index,
|
468
|
+
repeat=repeat,
|
480
469
|
same_color=same_color,
|
481
470
|
random_respawn=random_respawn,
|
482
|
-
|
471
|
+
reward_delay=reward_delay,
|
483
472
|
)
|
484
473
|
config["objects"] = (hot, cold)
|
485
474
|
|
@@ -1154,8 +1154,8 @@ def test_info_object_collected_id():
|
|
1154
1154
|
assert reward == 0.0
|
1155
1155
|
|
1156
1156
|
|
1157
|
-
def
|
1158
|
-
"""Test that rewards are delayed by
|
1157
|
+
def test_reward_delay():
|
1158
|
+
"""Test that rewards are delayed by reward_delay for objects with k > 0."""
|
1159
1159
|
key = jax.random.key(0)
|
1160
1160
|
|
1161
1161
|
# Create an object with digestion delay of 2 steps
|
@@ -1164,7 +1164,7 @@ def test_digestion_delay():
|
|
1164
1164
|
reward=5.0,
|
1165
1165
|
collectable=True,
|
1166
1166
|
color=(0, 255, 0),
|
1167
|
-
|
1167
|
+
reward_delay=2,
|
1168
1168
|
)
|
1169
1169
|
|
1170
1170
|
env = ForagaxEnv(
|
@@ -181,107 +181,6 @@ def test_foragax_weather_v5_color_configuration():
|
|
181
181
|
assert hot_v5.color == cold_v5.color, "v5 should use same color for hot and cold"
|
182
182
|
|
183
183
|
|
184
|
-
def test_foragax_weather_v6_registry():
|
185
|
-
"""Test that ForagaxWeather-v6 can be created via registry and has correct config."""
|
186
|
-
env = make("ForagaxWeather-v6", aperture_size=(5, 5))
|
187
|
-
|
188
|
-
# Check basic configuration
|
189
|
-
assert env.name == "ForagaxWeather-v6"
|
190
|
-
assert env.deterministic_spawn is True
|
191
|
-
assert env.nowrap is False # v6 enables wrapping
|
192
|
-
|
193
|
-
# Check that weather objects have random_respawn=True
|
194
|
-
hot, cold = env.objects[1], env.objects[2] # Skip EMPTY (index 0)
|
195
|
-
assert hot.name == "hot"
|
196
|
-
assert cold.name == "cold"
|
197
|
-
assert hot.random_respawn is True
|
198
|
-
assert cold.random_respawn is True
|
199
|
-
|
200
|
-
# Check digestion steps
|
201
|
-
assert hot.max_digestion_steps == 10 # digestion_steps=10
|
202
|
-
assert cold.max_digestion_steps == 10 # digestion_steps=10
|
203
|
-
|
204
|
-
# Test basic functionality
|
205
|
-
key = jax.random.key(0)
|
206
|
-
obs, state = env.reset(key, env.default_params)
|
207
|
-
assert obs.shape == (5, 5, 1) # 1 color channel (hot/cold same color, no padding)
|
208
|
-
|
209
|
-
# Test stepping
|
210
|
-
key, step_key = jax.random.split(key)
|
211
|
-
action = env.action_space(env.default_params).sample(step_key)
|
212
|
-
obs2, state2, reward, done, info = env.step(
|
213
|
-
step_key, state, action, env.default_params
|
214
|
-
)
|
215
|
-
assert obs2.shape == (5, 5, 1)
|
216
|
-
assert not done
|
217
|
-
|
218
|
-
|
219
|
-
def test_foragax_weather_v6_deterministic_spawn():
|
220
|
-
"""Test that ForagaxWeather-v6 uses deterministic spawning."""
|
221
|
-
env = make("ForagaxWeather-v6", aperture_size=(5, 5))
|
222
|
-
params = env.default_params
|
223
|
-
|
224
|
-
# Test that multiple resets with same key produce same object placement
|
225
|
-
key = jax.random.key(42)
|
226
|
-
_, state1 = env.reset(key, params)
|
227
|
-
|
228
|
-
key = jax.random.key(42) # Same key
|
229
|
-
_, state2 = env.reset(key, params)
|
230
|
-
|
231
|
-
# Object grids should be identical (deterministic spawn)
|
232
|
-
chex.assert_trees_all_equal(state1.object_grid, state2.object_grid)
|
233
|
-
|
234
|
-
# But different keys should produce different placements
|
235
|
-
key1 = jax.random.key(42)
|
236
|
-
key2 = jax.random.key(43)
|
237
|
-
_, state1 = env.reset(key1, params)
|
238
|
-
_, state2 = env.reset(key2, params)
|
239
|
-
|
240
|
-
# Should be different (shuffled deterministically)
|
241
|
-
assert not jnp.array_equal(state1.object_grid, state2.object_grid)
|
242
|
-
|
243
|
-
# Test that number of objects is the same
|
244
|
-
num_hot_1 = jnp.sum(state1.object_grid == 1)
|
245
|
-
num_cold_1 = jnp.sum(state1.object_grid == 2)
|
246
|
-
num_hot_2 = jnp.sum(state2.object_grid == 1)
|
247
|
-
num_cold_2 = jnp.sum(state2.object_grid == 2)
|
248
|
-
assert num_hot_1 == num_hot_2
|
249
|
-
assert num_cold_1 == num_cold_2
|
250
|
-
|
251
|
-
|
252
|
-
def test_foragax_weather_v6_random_respawn():
|
253
|
-
"""Test that ForagaxWeather-v6 weather objects have random_respawn=True."""
|
254
|
-
env = make("ForagaxWeather-v6", aperture_size=(5, 5))
|
255
|
-
|
256
|
-
# Check that weather objects have random_respawn=True
|
257
|
-
hot, cold = env.objects[1], env.objects[2] # Skip EMPTY
|
258
|
-
assert hot.random_respawn is True, "Hot objects should have random_respawn=True"
|
259
|
-
assert cold.random_respawn is True, "Cold objects should have random_respawn=True"
|
260
|
-
|
261
|
-
|
262
|
-
def test_foragax_weather_v6_color_configuration():
|
263
|
-
"""Test that ForagaxWeather-v6 weather objects use the same color."""
|
264
|
-
env = make("ForagaxWeather-v6", aperture_size=(5, 5))
|
265
|
-
hot_v6, cold_v6 = env.objects[1], env.objects[2]
|
266
|
-
|
267
|
-
# Same color configuration: v6 uses same color
|
268
|
-
assert hot_v6.color == cold_v6.color, "v6 should use same color for hot and cold"
|
269
|
-
|
270
|
-
|
271
|
-
def test_foragax_weather_v6_digestion_steps():
|
272
|
-
"""Test that ForagaxWeather-v6 weather objects have digestion_steps=10."""
|
273
|
-
env = make("ForagaxWeather-v6", aperture_size=(5, 5))
|
274
|
-
|
275
|
-
# Check that weather objects have digestion_steps=10
|
276
|
-
hot, cold = env.objects[1], env.objects[2] # Skip EMPTY
|
277
|
-
assert hot.digestion_steps(0, jax.random.key(0)) == 10, (
|
278
|
-
"Hot objects should have digestion_steps=10"
|
279
|
-
)
|
280
|
-
assert cold.digestion_steps(0, jax.random.key(0)) == 10, (
|
281
|
-
"Cold objects should have digestion_steps=10"
|
282
|
-
)
|
283
|
-
|
284
|
-
|
285
184
|
def test_foragax_twobiome_v10_registry():
|
286
185
|
"""Test that ForagaxTwoBiome-v10 can be created via registry and has correct config."""
|
287
186
|
env = make("ForagaxTwoBiome-v10", aperture_size=(5, 5))
|
@@ -480,3 +379,75 @@ def test_foragax_twobiome_v13_random_respawn():
|
|
480
379
|
"Deathcap objects should have random_respawn=True"
|
481
380
|
)
|
482
381
|
assert fake.random_respawn is True, "Fake objects should have random_respawn=True"
|
382
|
+
|
383
|
+
|
384
|
+
def test_repeat_parameter_weather_environments():
|
385
|
+
"""Test that the repeat parameter controls temperature cycling speed."""
|
386
|
+
# Create environments with different repeat values
|
387
|
+
env_repeat_100 = make("ForagaxWeather-v1", repeat=100, aperture_size=(5, 5))
|
388
|
+
env_repeat_200 = make("ForagaxWeather-v1", repeat=200, aperture_size=(5, 5))
|
389
|
+
|
390
|
+
# Get the weather objects
|
391
|
+
hot_100, cold_100 = env_repeat_100.objects[1], env_repeat_100.objects[2]
|
392
|
+
hot_200, cold_200 = env_repeat_200.objects[1], env_repeat_200.objects[2]
|
393
|
+
|
394
|
+
# Check that repeat values are set correctly
|
395
|
+
assert hot_100.repeat == 100
|
396
|
+
assert cold_100.repeat == 100
|
397
|
+
assert hot_200.repeat == 200
|
398
|
+
assert cold_200.repeat == 200
|
399
|
+
|
400
|
+
# Test temperature cycling by checking rewards at different clock times
|
401
|
+
key = jax.random.key(0)
|
402
|
+
|
403
|
+
# At clock=0, both should give the same temperature (first value)
|
404
|
+
temp_100_t0 = hot_100.reward(0, key)
|
405
|
+
temp_200_t0 = hot_200.reward(0, key)
|
406
|
+
assert temp_100_t0 == temp_200_t0, "Temperatures should be identical at clock=0"
|
407
|
+
|
408
|
+
# At clock=100, repeat_100 should move to next temperature (index 1), repeat_200 should stay at first (index 0)
|
409
|
+
temp_100_t100 = hot_100.reward(100, key)
|
410
|
+
temp_200_t100 = hot_200.reward(100, key)
|
411
|
+
assert temp_100_t0 != temp_100_t100, "repeat_100 should cycle at step 100"
|
412
|
+
assert temp_200_t0 == temp_200_t100, "repeat_200 should not cycle at step 100"
|
413
|
+
|
414
|
+
# At clock=200, repeat_100 should be at index 2, repeat_200 should be at index 1
|
415
|
+
temp_100_t200 = hot_100.reward(200, key)
|
416
|
+
temp_200_t200 = hot_200.reward(200, key)
|
417
|
+
assert temp_100_t200 != temp_200_t200, (
|
418
|
+
"Different repeat values should give different temperatures at step 200"
|
419
|
+
)
|
420
|
+
|
421
|
+
# At clock=400, repeat_100 should be at index 4, repeat_200 should be at index 2
|
422
|
+
temp_100_t400 = hot_100.reward(400, key)
|
423
|
+
temp_200_t400 = hot_200.reward(400, key)
|
424
|
+
assert temp_100_t400 != temp_100_t200, "repeat_100 should cycle again at step 400"
|
425
|
+
assert temp_200_t400 != temp_200_t200, "repeat_200 should cycle again at step 400"
|
426
|
+
assert temp_100_t400 != temp_200_t400, (
|
427
|
+
"Different repeat values should give different temperatures at step 400"
|
428
|
+
)
|
429
|
+
|
430
|
+
|
431
|
+
def test_reward_delay_parameter_weather_environments():
|
432
|
+
"""Test that the reward_delay parameter controls digestion delay."""
|
433
|
+
# Create environments with different reward_delay values
|
434
|
+
env_delays_0 = make("ForagaxWeather-v1", reward_delay=0, aperture_size=(5, 5))
|
435
|
+
env_delays_5 = make("ForagaxWeather-v1", reward_delay=5, aperture_size=(5, 5))
|
436
|
+
|
437
|
+
# Get the weather objects
|
438
|
+
hot_0, cold_0 = env_delays_0.objects[1], env_delays_0.objects[2]
|
439
|
+
hot_5, cold_5 = env_delays_5.objects[1], env_delays_5.objects[2]
|
440
|
+
|
441
|
+
# Check that reward_delay values are set correctly
|
442
|
+
assert hot_0.reward_delay_val == 0
|
443
|
+
assert cold_0.reward_delay_val == 0
|
444
|
+
assert hot_5.reward_delay_val == 5
|
445
|
+
assert cold_5.reward_delay_val == 5
|
446
|
+
|
447
|
+
# Test reward_delay function returns the correct values
|
448
|
+
key = jax.random.key(0)
|
449
|
+
delays_0 = hot_0.reward_delay(0, key)
|
450
|
+
delays_5 = hot_5.reward_delay(0, key)
|
451
|
+
|
452
|
+
assert delays_0 == 0, "reward_delay should return 0 for delays=0"
|
453
|
+
assert delays_5 == 5, "reward_delay should return 5 for delays=5"
|
File without changes
|
File without changes
|
{continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/SOURCES.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
{continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/requires.txt
RENAMED
File without changes
|
{continual_foragax-0.29.0 → continual_foragax-0.30.0}/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
|