continual-foragax 0.8.2__tar.gz → 0.10.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.8.2 → continual_foragax-0.10.0}/PKG-INFO +10 -1
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/README.md +9 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/pyproject.toml +2 -2
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/PKG-INFO +10 -1
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/SOURCES.txt +2 -0
- continual_foragax-0.10.0/src/foragax/colors.py +74 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/env.py +71 -10
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/objects.py +1 -1
- continual_foragax-0.10.0/src/foragax/rendering.py +74 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/tests/test_foragax.py +166 -1
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/setup.cfg +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/dependency_links.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/entry_points.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/requires.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/top_level.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/__init__.py +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100897.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100928.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100929.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100930.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100931.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106714.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106715.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106716.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106717.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106718.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106930.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106931.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106932.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106933.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106934.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106935.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106936.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106937.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106938.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106939.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106940.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106941.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106942.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106943.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106994.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106995.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106996.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106997.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106998.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106999.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107000.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107001.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107002.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107003.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107004.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107005.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107006.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107007.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107008.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107009.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107010.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107011.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107012.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107013.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107014.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107015.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107016.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107017.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107018.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107019.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107020.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107021.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107022.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107023.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107024.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107025.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107026.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107027.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107028.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107029.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107030.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107031.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107032.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107033.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107034.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107035.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107036.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107037.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107038.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107039.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107040.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107041.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107042.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107043.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107044.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107045.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107046.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107047.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107048.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107049.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107050.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107051.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107052.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107053.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107054.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107055.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107056.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107057.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107058.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107059.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107060.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107061.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107062.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107063.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107064.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107065.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107066.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107067.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107068.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107069.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107070.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107071.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115808.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115812.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID146811.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156831.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156835.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156839.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156843.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156847.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156851.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156855.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156859.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156863.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156867.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156871.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156875.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156879.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156883.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156887.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/elements.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/metadata.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/sources.txt +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/registry.py +0 -0
- {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/weather.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: continual-foragax
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.10.0
|
4
4
|
Summary: A continual reinforcement learning benchmark
|
5
5
|
Author-email: Steven Tang <stang5@ualberta.ca>
|
6
6
|
Requires-Python: >=3.8
|
@@ -119,3 +119,12 @@ class into registry configs or construct environments programmatically.
|
|
119
119
|
## Development
|
120
120
|
|
121
121
|
Run unit tests via pytest.
|
122
|
+
|
123
|
+
## Acknowledgments
|
124
|
+
|
125
|
+
We acknowledge the data providers in the ECA&D project. Klein Tank, A.M.G. and
|
126
|
+
Coauthors, 2002. Daily dataset of 20th-century surface air temperature and
|
127
|
+
precipitation series for the European Climate Assessment. Int. J. of Climatol.,
|
128
|
+
22, 1441-1453.
|
129
|
+
|
130
|
+
Data and metadata available at https://www.ecad.eu
|
@@ -104,3 +104,12 @@ class into registry configs or construct environments programmatically.
|
|
104
104
|
## Development
|
105
105
|
|
106
106
|
Run unit tests via pytest.
|
107
|
+
|
108
|
+
## Acknowledgments
|
109
|
+
|
110
|
+
We acknowledge the data providers in the ECA&D project. Klein Tank, A.M.G. and
|
111
|
+
Coauthors, 2002. Daily dataset of 20th-century surface air temperature and
|
112
|
+
precipitation series for the European Climate Assessment. Int. J. of Climatol.,
|
113
|
+
22, 1441-1453.
|
114
|
+
|
115
|
+
Data and metadata available at https://www.ecad.eu
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "continual-foragax"
|
3
|
-
version = "0.
|
3
|
+
version = "0.10.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.10.0"
|
34
34
|
tag_format = "$version"
|
35
35
|
version_files = ["pyproject.toml"]
|
36
36
|
|
{continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: continual-foragax
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.10.0
|
4
4
|
Summary: A continual reinforcement learning benchmark
|
5
5
|
Author-email: Steven Tang <stang5@ualberta.ca>
|
6
6
|
Requires-Python: >=3.8
|
@@ -119,3 +119,12 @@ class into registry configs or construct environments programmatically.
|
|
119
119
|
## Development
|
120
120
|
|
121
121
|
Run unit tests via pytest.
|
122
|
+
|
123
|
+
## Acknowledgments
|
124
|
+
|
125
|
+
We acknowledge the data providers in the ECA&D project. Klein Tank, A.M.G. and
|
126
|
+
Coauthors, 2002. Daily dataset of 20th-century surface air temperature and
|
127
|
+
precipitation series for the European Climate Assessment. Int. J. of Climatol.,
|
128
|
+
22, 1441-1453.
|
129
|
+
|
130
|
+
Data and metadata available at https://www.ecad.eu
|
{continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/SOURCES.txt
RENAMED
@@ -7,9 +7,11 @@ src/continual_foragax.egg-info/entry_points.txt
|
|
7
7
|
src/continual_foragax.egg-info/requires.txt
|
8
8
|
src/continual_foragax.egg-info/top_level.txt
|
9
9
|
src/foragax/__init__.py
|
10
|
+
src/foragax/colors.py
|
10
11
|
src/foragax/env.py
|
11
12
|
src/foragax/objects.py
|
12
13
|
src/foragax/registry.py
|
14
|
+
src/foragax/rendering.py
|
13
15
|
src/foragax/weather.py
|
14
16
|
src/foragax/data/ECA_non-blended_custom/TG_SOUID100897.txt
|
15
17
|
src/foragax/data/ECA_non-blended_custom/TG_SOUID100928.txt
|
@@ -0,0 +1,74 @@
|
|
1
|
+
"""Color utility functions for Foragax."""
|
2
|
+
|
3
|
+
import jax
|
4
|
+
import jax.numpy as jnp
|
5
|
+
|
6
|
+
|
7
|
+
def hsv_to_rgb(h: jax.Array, s: float = 1.0, v: float = 1.0) -> jax.Array:
|
8
|
+
"""Convert HSV color values to RGB.
|
9
|
+
|
10
|
+
Args:
|
11
|
+
h: Hue values in range [0, 1]
|
12
|
+
s: Saturation value in range [0, 1], default 1.0
|
13
|
+
v: Value (brightness) in range [0, 1], default 1.0
|
14
|
+
|
15
|
+
Returns:
|
16
|
+
RGB values as array of shape (..., 3) with values in range [0, 1]
|
17
|
+
"""
|
18
|
+
c = v * s
|
19
|
+
x = c * (1 - jnp.abs(jnp.mod(h * 6, 2) - 1))
|
20
|
+
m = v - c
|
21
|
+
|
22
|
+
# Create RGB arrays
|
23
|
+
r = jnp.zeros_like(h)
|
24
|
+
g = jnp.zeros_like(h)
|
25
|
+
b = jnp.zeros_like(h)
|
26
|
+
|
27
|
+
# Sector 0: 0-60 degrees (red to yellow)
|
28
|
+
mask0 = h < 1 / 6
|
29
|
+
r = jnp.where(mask0, c, r)
|
30
|
+
g = jnp.where(mask0, x, g)
|
31
|
+
|
32
|
+
# Sector 1: 60-120 degrees (yellow to green)
|
33
|
+
mask1 = (h >= 1 / 6) & (h < 2 / 6)
|
34
|
+
r = jnp.where(mask1, x, r)
|
35
|
+
g = jnp.where(mask1, c, g)
|
36
|
+
|
37
|
+
# Sector 2: 120-180 degrees (green to cyan)
|
38
|
+
mask2 = (h >= 2 / 6) & (h < 3 / 6)
|
39
|
+
g = jnp.where(mask2, c, g)
|
40
|
+
b = jnp.where(mask2, x, b)
|
41
|
+
|
42
|
+
# Sector 3: 180-240 degrees (cyan to blue)
|
43
|
+
mask3 = (h >= 3 / 6) & (h < 4 / 6)
|
44
|
+
g = jnp.where(mask3, x, g)
|
45
|
+
b = jnp.where(mask3, c, b)
|
46
|
+
|
47
|
+
# Sector 4: 240-300 degrees (blue to magenta)
|
48
|
+
mask4 = (h >= 4 / 6) & (h < 5 / 6)
|
49
|
+
r = jnp.where(mask4, x, r)
|
50
|
+
b = jnp.where(mask4, c, b)
|
51
|
+
|
52
|
+
# Sector 5: 300-360 degrees (magenta to red)
|
53
|
+
mask5 = h >= 5 / 6
|
54
|
+
r = jnp.where(mask5, c, r)
|
55
|
+
b = jnp.where(mask5, x, b)
|
56
|
+
|
57
|
+
# Add value offset
|
58
|
+
rgb = jnp.stack([r + m, g + m, b + m], axis=-1)
|
59
|
+
return rgb
|
60
|
+
|
61
|
+
|
62
|
+
def hsv_to_rgb_255(h: jax.Array, s: float = 0.9, v: float = 0.8) -> jax.Array:
|
63
|
+
"""Convert HSV to RGB with values scaled to 0-255 range for image rendering.
|
64
|
+
|
65
|
+
Args:
|
66
|
+
h: Hue values in range [0, 1]
|
67
|
+
s: Saturation value, default 0.9
|
68
|
+
v: Value (brightness), default 0.8
|
69
|
+
|
70
|
+
Returns:
|
71
|
+
RGB values as uint8 array of shape (..., 3) with values in range [0, 255]
|
72
|
+
"""
|
73
|
+
rgb = hsv_to_rgb(h, s, v)
|
74
|
+
return (rgb * 255).astype(jnp.uint8)
|
@@ -14,6 +14,7 @@ from flax import struct
|
|
14
14
|
from gymnax.environments import environment, spaces
|
15
15
|
|
16
16
|
from foragax.objects import AGENT, EMPTY, BaseForagaxObject, WeatherObject
|
17
|
+
from foragax.rendering import apply_true_borders
|
17
18
|
from foragax.weather import get_temperature
|
18
19
|
|
19
20
|
|
@@ -295,7 +296,11 @@ class ForagaxEnv(environment.Environment):
|
|
295
296
|
@partial(jax.jit, static_argnames=("self", "render_mode"))
|
296
297
|
def render(self, state: EnvState, params: EnvParams, render_mode: str = "world"):
|
297
298
|
"""Render the environment state."""
|
298
|
-
|
299
|
+
is_world_mode = render_mode in ("world", "world_true")
|
300
|
+
is_aperture_mode = render_mode in ("aperture", "aperture_true")
|
301
|
+
is_true_mode = render_mode in ("world_true", "aperture_true")
|
302
|
+
|
303
|
+
if is_world_mode:
|
299
304
|
# Create an RGB image from the object grid
|
300
305
|
img = jnp.zeros((self.size[1], self.size[0], 3))
|
301
306
|
# Decode grid for rendering: non-negative are objects, negative are empty
|
@@ -341,15 +346,18 @@ class ForagaxEnv(environment.Environment):
|
|
341
346
|
jax.image.ResizeMethod.NEAREST,
|
342
347
|
)
|
343
348
|
|
349
|
+
if is_true_mode:
|
350
|
+
# Apply true object borders by overlaying true colors on border pixels
|
351
|
+
img = apply_true_borders(img, render_grid, self.size)
|
352
|
+
|
353
|
+
# Add grid lines for world mode
|
344
354
|
grid_color = jnp.zeros(3, dtype=jnp.uint8)
|
345
355
|
row_indices = jnp.arange(1, self.size[1]) * 24
|
346
356
|
col_indices = jnp.arange(1, self.size[0]) * 24
|
347
357
|
img = img.at[row_indices, :].set(grid_color)
|
348
358
|
img = img.at[:, col_indices].set(grid_color)
|
349
359
|
|
350
|
-
|
351
|
-
|
352
|
-
elif render_mode == "aperture":
|
360
|
+
elif is_aperture_mode:
|
353
361
|
obs_grid = jnp.maximum(0, state.object_grid)
|
354
362
|
aperture = self._get_aperture(obs_grid, state.pos)
|
355
363
|
aperture_one_hot = jax.nn.one_hot(aperture, len(self.object_ids))
|
@@ -366,36 +374,89 @@ class ForagaxEnv(environment.Environment):
|
|
366
374
|
jax.image.ResizeMethod.NEAREST,
|
367
375
|
)
|
368
376
|
|
377
|
+
if is_true_mode:
|
378
|
+
# Apply true object borders by overlaying true colors on border pixels
|
379
|
+
img = apply_true_borders(img, aperture, self.aperture_size)
|
380
|
+
|
381
|
+
# Add grid lines for aperture mode
|
369
382
|
grid_color = jnp.zeros(3, dtype=jnp.uint8)
|
370
383
|
row_indices = jnp.arange(1, self.aperture_size[0]) * 24
|
371
384
|
col_indices = jnp.arange(1, self.aperture_size[1]) * 24
|
372
385
|
img = img.at[row_indices, :].set(grid_color)
|
373
386
|
img = img.at[:, col_indices].set(grid_color)
|
374
387
|
|
375
|
-
return img
|
376
388
|
else:
|
377
389
|
raise ValueError(f"Unknown render_mode: {render_mode}")
|
378
390
|
|
391
|
+
return img
|
392
|
+
|
379
393
|
|
380
394
|
class ForagaxObjectEnv(ForagaxEnv):
|
381
395
|
"""Foragax environment with object-based aperture observation."""
|
382
396
|
|
397
|
+
def __init__(
|
398
|
+
self,
|
399
|
+
size: Union[Tuple[int, int], int] = (10, 10),
|
400
|
+
aperture_size: Union[Tuple[int, int], int] = (5, 5),
|
401
|
+
objects: Tuple[BaseForagaxObject, ...] = (),
|
402
|
+
biomes: Tuple[Biome, ...] = (Biome(object_frequencies=()),),
|
403
|
+
):
|
404
|
+
super().__init__(size, aperture_size, objects, biomes)
|
405
|
+
|
406
|
+
# Compute unique colors and mapping for partial observability
|
407
|
+
# Exclude EMPTY (index 0) from color channels
|
408
|
+
object_colors_no_empty = self.object_colors[1:]
|
409
|
+
|
410
|
+
# Find unique colors in order of first appearance
|
411
|
+
unique_colors = []
|
412
|
+
color_indices = jnp.zeros(len(object_colors_no_empty), dtype=int)
|
413
|
+
color_map = {}
|
414
|
+
next_channel = 0
|
415
|
+
|
416
|
+
for i, color in enumerate(object_colors_no_empty):
|
417
|
+
color_tuple = tuple(color.tolist())
|
418
|
+
if color_tuple not in color_map:
|
419
|
+
color_map[color_tuple] = next_channel
|
420
|
+
unique_colors.append(color)
|
421
|
+
next_channel += 1
|
422
|
+
color_indices = color_indices.at[i].set(color_map[color_tuple])
|
423
|
+
|
424
|
+
self.unique_colors = jnp.array(unique_colors)
|
425
|
+
self.num_color_channels = len(unique_colors)
|
426
|
+
# color_indices maps from object_id-1 to color_channel_index
|
427
|
+
self.object_to_color_map = color_indices
|
428
|
+
|
383
429
|
def get_obs(self, state: EnvState, params: EnvParams, key=None) -> jax.Array:
|
384
|
-
num_obj_types = len(self.object_ids)
|
385
430
|
# Decode grid for observation
|
386
431
|
obs_grid = jnp.maximum(0, state.object_grid)
|
387
432
|
aperture = self._get_aperture(obs_grid, state.pos)
|
388
433
|
aperture = jnp.flip(aperture, axis=0)
|
389
|
-
|
390
|
-
|
434
|
+
|
435
|
+
# Handle case with no objects (only EMPTY)
|
436
|
+
if self.num_color_channels == 0:
|
437
|
+
return jnp.zeros(aperture.shape + (0,), dtype=jnp.float32)
|
438
|
+
|
439
|
+
# Map object IDs to color channel indices
|
440
|
+
# aperture contains object IDs (0 = EMPTY, 1+ = objects)
|
441
|
+
# For EMPTY (0), we want no color channel activated
|
442
|
+
# For objects (1+), map to color channel using object_to_color_map
|
443
|
+
color_channels = jnp.where(
|
444
|
+
aperture == 0,
|
445
|
+
-1, # Special value for EMPTY
|
446
|
+
jnp.take(self.object_to_color_map, aperture - 1, axis=0),
|
447
|
+
)
|
448
|
+
|
449
|
+
# Create one-hot encoding for color channels
|
450
|
+
# jax.nn.one_hot produces all zeros for -1 (EMPTY positions)
|
451
|
+
obs = jax.nn.one_hot(color_channels, self.num_color_channels, axis=-1)
|
452
|
+
|
391
453
|
return obs
|
392
454
|
|
393
455
|
def observation_space(self, params: EnvParams) -> spaces.Box:
|
394
|
-
num_obj_types = len(self.object_ids)
|
395
456
|
obs_shape = (
|
396
457
|
self.aperture_size[0],
|
397
458
|
self.aperture_size[1],
|
398
|
-
|
459
|
+
self.num_color_channels,
|
399
460
|
)
|
400
461
|
return spaces.Box(0, 1, obs_shape, float)
|
401
462
|
|
@@ -181,7 +181,7 @@ AGENT = DefaultForagaxObject(name="agent", blocking=True, color=(0, 0, 255))
|
|
181
181
|
|
182
182
|
|
183
183
|
def create_weather_objects(
|
184
|
-
file_index: int = 0, repeat: int =
|
184
|
+
file_index: int = 0, repeat: int = 500, multiplier: float = 1.0
|
185
185
|
):
|
186
186
|
"""Create HOT and COLD WeatherObject instances using the specified file.
|
187
187
|
|
@@ -0,0 +1,74 @@
|
|
1
|
+
"""Rendering utilities for Foragax environments."""
|
2
|
+
|
3
|
+
from typing import Tuple
|
4
|
+
|
5
|
+
import jax
|
6
|
+
import jax.numpy as jnp
|
7
|
+
|
8
|
+
from foragax.colors import hsv_to_rgb_255
|
9
|
+
|
10
|
+
|
11
|
+
def apply_true_borders(
|
12
|
+
base_img: jax.Array, true_grid: jax.Array, grid_size: Tuple[int, int]
|
13
|
+
) -> jax.Array:
|
14
|
+
"""Apply true object borders by overlaying HSV border colors on border pixels.
|
15
|
+
|
16
|
+
Args:
|
17
|
+
base_img: Base image with object colors
|
18
|
+
true_grid: Grid of object IDs for determining border colors
|
19
|
+
grid_size: (height, width) of the grid
|
20
|
+
|
21
|
+
Returns:
|
22
|
+
Image with HSV borders overlaid on border pixels
|
23
|
+
"""
|
24
|
+
# Create HSV border colors for each object type
|
25
|
+
num_objects = true_grid.max() + 1 # Assume object IDs start from 0
|
26
|
+
hues = jnp.linspace(0, 1, num_objects, endpoint=False)
|
27
|
+
|
28
|
+
# Convert HSV to RGB for border colors
|
29
|
+
border_colors = hsv_to_rgb_255(hues[true_grid])
|
30
|
+
|
31
|
+
# Resize border colors to match rendered image size
|
32
|
+
border_img = jax.image.resize(
|
33
|
+
border_colors,
|
34
|
+
(grid_size[0] * 24, grid_size[1] * 24, 3),
|
35
|
+
jax.image.ResizeMethod.NEAREST,
|
36
|
+
)
|
37
|
+
|
38
|
+
# Create border mask (2-pixel thick borders) - vectorized like grid lines
|
39
|
+
height, width = grid_size
|
40
|
+
img_height, img_width = height * 24, width * 24
|
41
|
+
|
42
|
+
border_mask = jnp.zeros((img_height, img_width), dtype=bool)
|
43
|
+
|
44
|
+
# Create border row and column indices for all cells at once
|
45
|
+
cell_rows = jnp.arange(height)
|
46
|
+
cell_cols = jnp.arange(width)
|
47
|
+
|
48
|
+
# Top border rows: 2 rows per cell
|
49
|
+
top_border_rows = cell_rows[:, None] * 24 + jnp.arange(2)[None, :]
|
50
|
+
top_border_rows_flat = top_border_rows.flatten()
|
51
|
+
|
52
|
+
# Bottom border rows: 2 rows per cell
|
53
|
+
bottom_border_rows = cell_rows[:, None] * 24 + 22 + jnp.arange(2)[None, :]
|
54
|
+
bottom_border_rows_flat = bottom_border_rows.flatten()
|
55
|
+
|
56
|
+
# Left border columns: 2 columns per cell
|
57
|
+
left_border_cols = cell_cols[:, None] * 24 + jnp.arange(2)[None, :]
|
58
|
+
left_border_cols_flat = left_border_cols.flatten()
|
59
|
+
|
60
|
+
# Right border columns: 2 columns per cell
|
61
|
+
right_border_cols = cell_cols[:, None] * 24 + 22 + jnp.arange(2)[None, :]
|
62
|
+
right_border_cols_flat = right_border_cols.flatten()
|
63
|
+
|
64
|
+
# Set top and bottom borders (full width rectangles)
|
65
|
+
all_border_rows = jnp.concatenate([top_border_rows_flat, bottom_border_rows_flat])
|
66
|
+
border_mask = border_mask.at[all_border_rows, :].set(True)
|
67
|
+
|
68
|
+
# Set left and right borders (full height rectangles)
|
69
|
+
all_border_cols = jnp.concatenate([left_border_cols_flat, right_border_cols_flat])
|
70
|
+
border_mask = border_mask.at[:, all_border_cols].set(True)
|
71
|
+
|
72
|
+
# Apply border mask: use HSV border colors for border pixels, base colors elsewhere
|
73
|
+
result_img = jnp.where(border_mask[..., None], border_img, base_img)
|
74
|
+
return result_img
|
@@ -9,7 +9,16 @@ from foragax.env import (
|
|
9
9
|
ForagaxRGBEnv,
|
10
10
|
ForagaxWorldEnv,
|
11
11
|
)
|
12
|
-
from foragax.objects import
|
12
|
+
from foragax.objects import (
|
13
|
+
FLOWER,
|
14
|
+
LARGE_MOREL,
|
15
|
+
MEDIUM_MOREL,
|
16
|
+
MOREL,
|
17
|
+
OYSTER,
|
18
|
+
THORNS,
|
19
|
+
WALL,
|
20
|
+
DefaultForagaxObject,
|
21
|
+
)
|
13
22
|
|
14
23
|
|
15
24
|
def test_observation_shape():
|
@@ -423,6 +432,162 @@ def test_generate_objects_in_biome():
|
|
423
432
|
assert thorns_id not in unique_objects
|
424
433
|
|
425
434
|
|
435
|
+
def test_color_based_partial_observability():
|
436
|
+
"""Test that objects with the same color are grouped into the same observation channel."""
|
437
|
+
env = ForagaxObjectEnv(
|
438
|
+
size=(10, 10),
|
439
|
+
aperture_size=(5, 5),
|
440
|
+
objects=(MOREL, LARGE_MOREL, MEDIUM_MOREL, FLOWER),
|
441
|
+
)
|
442
|
+
params = env.default_params
|
443
|
+
key = jax.random.key(0)
|
444
|
+
|
445
|
+
# Check that morels (all same color) use 1 channel, plus flower = 2 total
|
446
|
+
assert env.num_color_channels == 2
|
447
|
+
|
448
|
+
# Create a state with different morels and a flower
|
449
|
+
state = env.reset(key, params)[1]
|
450
|
+
|
451
|
+
# Manually place objects
|
452
|
+
grid = jnp.zeros((10, 10), dtype=int)
|
453
|
+
grid = grid.at[5, 5].set(1) # MOREL
|
454
|
+
grid = grid.at[5, 6].set(2) # LARGE_MOREL
|
455
|
+
grid = grid.at[5, 7].set(3) # MEDIUM_MOREL
|
456
|
+
grid = grid.at[6, 5].set(4) # FLOWER
|
457
|
+
state = state.replace(object_grid=grid)
|
458
|
+
|
459
|
+
obs = env.get_obs(state, params)
|
460
|
+
|
461
|
+
# All morels should activate the same channel (channel 0 for brown)
|
462
|
+
# Flower should activate channel 1 (green)
|
463
|
+
center_obs = obs[2, 2, :] # MOREL at center
|
464
|
+
morel_obs = obs[2, 3, :] # LARGE_MOREL
|
465
|
+
med_morel_obs = obs[2, 4, :] # MEDIUM_MOREL
|
466
|
+
flower_obs = obs[1, 2, :] # FLOWER (flipped coordinates)
|
467
|
+
|
468
|
+
# All morels should have the same observation (channel 0 activated)
|
469
|
+
chex.assert_trees_all_equal(center_obs, jnp.array([1.0, 0.0]))
|
470
|
+
chex.assert_trees_all_equal(center_obs, morel_obs)
|
471
|
+
chex.assert_trees_all_equal(center_obs, med_morel_obs)
|
472
|
+
|
473
|
+
# Flower should have different observation (channel 1 activated)
|
474
|
+
chex.assert_trees_all_equal(flower_obs, jnp.array([0.0, 1.0]))
|
475
|
+
|
476
|
+
|
477
|
+
def test_color_channel_mapping():
|
478
|
+
"""Test that the color channel mapping is correct."""
|
479
|
+
env = ForagaxObjectEnv(
|
480
|
+
size=(10, 10),
|
481
|
+
aperture_size=(3, 3),
|
482
|
+
objects=(WALL, FLOWER, THORNS),
|
483
|
+
)
|
484
|
+
|
485
|
+
# WALL (gray), FLOWER (green), THORNS (red) - all different colors
|
486
|
+
assert env.num_color_channels == 3
|
487
|
+
|
488
|
+
# Check that unique colors are correctly identified in order of first appearance
|
489
|
+
expected_colors = jnp.array(
|
490
|
+
[
|
491
|
+
[127, 127, 127], # gray (WALL) - appears first
|
492
|
+
[0, 255, 0], # green (FLOWER) - appears second
|
493
|
+
[255, 0, 0], # red (THORNS) - appears third
|
494
|
+
]
|
495
|
+
)
|
496
|
+
chex.assert_trees_all_equal(env.unique_colors, expected_colors)
|
497
|
+
|
498
|
+
|
499
|
+
def test_same_color_objects_same_channel():
|
500
|
+
"""Test that objects with identical colors produce identical observations."""
|
501
|
+
obj1 = DefaultForagaxObject(name="obj1", color=(100, 50, 25))
|
502
|
+
obj2 = DefaultForagaxObject(name="obj2", color=(100, 50, 25)) # Same color
|
503
|
+
obj3 = DefaultForagaxObject(name="obj3", color=(200, 100, 50)) # Different color
|
504
|
+
|
505
|
+
env = ForagaxObjectEnv(
|
506
|
+
size=(7, 7),
|
507
|
+
aperture_size=(3, 3),
|
508
|
+
objects=(obj1, obj2, obj3),
|
509
|
+
)
|
510
|
+
params = env.default_params
|
511
|
+
|
512
|
+
# Should have 2 color channels
|
513
|
+
assert env.num_color_channels == 2
|
514
|
+
|
515
|
+
# Create test state
|
516
|
+
key = jax.random.key(0)
|
517
|
+
state = env.reset(key, params)[1]
|
518
|
+
|
519
|
+
# Place objects
|
520
|
+
grid = jnp.zeros((7, 7), dtype=int)
|
521
|
+
grid = grid.at[3, 3].set(1) # obj1
|
522
|
+
grid = grid.at[3, 4].set(2) # obj2 (same color as obj1)
|
523
|
+
grid = grid.at[4, 3].set(3) # obj3 (different color)
|
524
|
+
state = state.replace(object_grid=grid)
|
525
|
+
|
526
|
+
obs = env.get_obs(state, params)
|
527
|
+
|
528
|
+
# obj1 and obj2 should have identical observations
|
529
|
+
obj1_obs = obs[1, 1, :] # Center
|
530
|
+
obj2_obs = obs[1, 2, :] # Right of center
|
531
|
+
obj3_obs = obs[2, 1, :] # Below center
|
532
|
+
|
533
|
+
chex.assert_trees_all_equal(obj1_obs, obj2_obs)
|
534
|
+
assert not jnp.allclose(obj1_obs, obj3_obs)
|
535
|
+
|
536
|
+
|
537
|
+
def test_empty_environment_observation():
|
538
|
+
"""Test observation shape when no objects are present."""
|
539
|
+
env = ForagaxObjectEnv(
|
540
|
+
size=(5, 5),
|
541
|
+
aperture_size=(3, 3),
|
542
|
+
objects=(), # No objects
|
543
|
+
)
|
544
|
+
params = env.default_params
|
545
|
+
key = jax.random.key(0)
|
546
|
+
obs, state = env.reset(key, params)
|
547
|
+
|
548
|
+
# Should have 0 color channels
|
549
|
+
assert env.num_color_channels == 0
|
550
|
+
assert obs.shape == (3, 3, 0)
|
551
|
+
|
552
|
+
|
553
|
+
def test_single_color_all_objects():
|
554
|
+
"""Test when all objects have the same color."""
|
555
|
+
# Create multiple objects with same color
|
556
|
+
from foragax.objects import DefaultForagaxObject
|
557
|
+
|
558
|
+
obj1 = DefaultForagaxObject(name="obj1", color=(50, 100, 150))
|
559
|
+
obj2 = DefaultForagaxObject(name="obj2", color=(50, 100, 150))
|
560
|
+
obj3 = DefaultForagaxObject(name="obj3", color=(50, 100, 150))
|
561
|
+
|
562
|
+
env = ForagaxObjectEnv(
|
563
|
+
size=(7, 7),
|
564
|
+
aperture_size=(3, 3),
|
565
|
+
objects=(obj1, obj2, obj3),
|
566
|
+
)
|
567
|
+
params = env.default_params
|
568
|
+
|
569
|
+
# Should have 1 color channel
|
570
|
+
assert env.num_color_channels == 1
|
571
|
+
|
572
|
+
# Create test state
|
573
|
+
key = jax.random.key(0)
|
574
|
+
state = env.reset(key, params)[1]
|
575
|
+
|
576
|
+
# Place all objects
|
577
|
+
grid = jnp.zeros((7, 7), dtype=int)
|
578
|
+
grid = grid.at[3, 2].set(1) # obj1
|
579
|
+
grid = grid.at[3, 3].set(2) # obj2
|
580
|
+
grid = grid.at[3, 4].set(3) # obj3
|
581
|
+
state = state.replace(object_grid=grid)
|
582
|
+
|
583
|
+
obs = env.get_obs(state, params)
|
584
|
+
|
585
|
+
# All objects should activate the same channel
|
586
|
+
for i in range(3):
|
587
|
+
obj_obs = obs[1, i, :] # Row 1, columns 0-2
|
588
|
+
chex.assert_trees_all_equal(obj_obs, jnp.array([1.0]))
|
589
|
+
|
590
|
+
|
426
591
|
def test_benchmark_vision(benchmark):
|
427
592
|
env = ForagaxObjectEnv(size=7, aperture_size=3, objects=(WALL,))
|
428
593
|
params = env.default_params
|
File without changes
|
File without changes
|
{continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/entry_points.txt
RENAMED
File without changes
|
{continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/requires.txt
RENAMED
File without changes
|
{continual_foragax-0.8.2 → continual_foragax-0.10.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
|