continual-foragax 0.8.2__tar.gz → 0.9.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.
Files changed (139) hide show
  1. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/PKG-INFO +10 -1
  2. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/README.md +9 -0
  3. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/pyproject.toml +2 -2
  4. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/continual_foragax.egg-info/PKG-INFO +10 -1
  5. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/env.py +52 -5
  6. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/tests/test_foragax.py +166 -1
  7. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/setup.cfg +0 -0
  8. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/continual_foragax.egg-info/SOURCES.txt +0 -0
  9. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/continual_foragax.egg-info/dependency_links.txt +0 -0
  10. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/continual_foragax.egg-info/entry_points.txt +0 -0
  11. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/continual_foragax.egg-info/requires.txt +0 -0
  12. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/continual_foragax.egg-info/top_level.txt +0 -0
  13. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/__init__.py +0 -0
  14. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100897.txt +0 -0
  15. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100928.txt +0 -0
  16. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100929.txt +0 -0
  17. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100930.txt +0 -0
  18. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100931.txt +0 -0
  19. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106714.txt +0 -0
  20. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106715.txt +0 -0
  21. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106716.txt +0 -0
  22. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106717.txt +0 -0
  23. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106718.txt +0 -0
  24. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106930.txt +0 -0
  25. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106931.txt +0 -0
  26. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106932.txt +0 -0
  27. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106933.txt +0 -0
  28. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106934.txt +0 -0
  29. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106935.txt +0 -0
  30. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106936.txt +0 -0
  31. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106937.txt +0 -0
  32. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106938.txt +0 -0
  33. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106939.txt +0 -0
  34. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106940.txt +0 -0
  35. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106941.txt +0 -0
  36. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106942.txt +0 -0
  37. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106943.txt +0 -0
  38. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106994.txt +0 -0
  39. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106995.txt +0 -0
  40. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106996.txt +0 -0
  41. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106997.txt +0 -0
  42. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106998.txt +0 -0
  43. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106999.txt +0 -0
  44. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107000.txt +0 -0
  45. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107001.txt +0 -0
  46. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107002.txt +0 -0
  47. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107003.txt +0 -0
  48. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107004.txt +0 -0
  49. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107005.txt +0 -0
  50. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107006.txt +0 -0
  51. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107007.txt +0 -0
  52. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107008.txt +0 -0
  53. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107009.txt +0 -0
  54. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107010.txt +0 -0
  55. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107011.txt +0 -0
  56. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107012.txt +0 -0
  57. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107013.txt +0 -0
  58. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107014.txt +0 -0
  59. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107015.txt +0 -0
  60. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107016.txt +0 -0
  61. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107017.txt +0 -0
  62. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107018.txt +0 -0
  63. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107019.txt +0 -0
  64. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107020.txt +0 -0
  65. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107021.txt +0 -0
  66. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107022.txt +0 -0
  67. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107023.txt +0 -0
  68. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107024.txt +0 -0
  69. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107025.txt +0 -0
  70. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107026.txt +0 -0
  71. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107027.txt +0 -0
  72. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107028.txt +0 -0
  73. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107029.txt +0 -0
  74. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107030.txt +0 -0
  75. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107031.txt +0 -0
  76. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107032.txt +0 -0
  77. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107033.txt +0 -0
  78. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107034.txt +0 -0
  79. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107035.txt +0 -0
  80. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107036.txt +0 -0
  81. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107037.txt +0 -0
  82. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107038.txt +0 -0
  83. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107039.txt +0 -0
  84. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107040.txt +0 -0
  85. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107041.txt +0 -0
  86. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107042.txt +0 -0
  87. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107043.txt +0 -0
  88. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107044.txt +0 -0
  89. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107045.txt +0 -0
  90. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107046.txt +0 -0
  91. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107047.txt +0 -0
  92. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107048.txt +0 -0
  93. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107049.txt +0 -0
  94. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107050.txt +0 -0
  95. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107051.txt +0 -0
  96. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107052.txt +0 -0
  97. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107053.txt +0 -0
  98. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107054.txt +0 -0
  99. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107055.txt +0 -0
  100. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107056.txt +0 -0
  101. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107057.txt +0 -0
  102. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107058.txt +0 -0
  103. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107059.txt +0 -0
  104. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107060.txt +0 -0
  105. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107061.txt +0 -0
  106. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107062.txt +0 -0
  107. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107063.txt +0 -0
  108. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107064.txt +0 -0
  109. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107065.txt +0 -0
  110. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107066.txt +0 -0
  111. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107067.txt +0 -0
  112. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107068.txt +0 -0
  113. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107069.txt +0 -0
  114. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107070.txt +0 -0
  115. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107071.txt +0 -0
  116. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115808.txt +0 -0
  117. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115812.txt +0 -0
  118. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID146811.txt +0 -0
  119. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156831.txt +0 -0
  120. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156835.txt +0 -0
  121. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156839.txt +0 -0
  122. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156843.txt +0 -0
  123. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156847.txt +0 -0
  124. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156851.txt +0 -0
  125. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156855.txt +0 -0
  126. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156859.txt +0 -0
  127. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156863.txt +0 -0
  128. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156867.txt +0 -0
  129. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156871.txt +0 -0
  130. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156875.txt +0 -0
  131. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156879.txt +0 -0
  132. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156883.txt +0 -0
  133. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156887.txt +0 -0
  134. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/elements.txt +0 -0
  135. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/metadata.txt +0 -0
  136. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/data/ECA_non-blended_custom/sources.txt +0 -0
  137. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/objects.py +0 -0
  138. {continual_foragax-0.8.2 → continual_foragax-0.9.0}/src/foragax/registry.py +0 -0
  139. {continual_foragax-0.8.2 → continual_foragax-0.9.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.8.2
3
+ Version: 0.9.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.8.2"
3
+ version = "0.9.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.8.2"
33
+ version = "0.9.0"
34
34
  tag_format = "$version"
35
35
  version_files = ["pyproject.toml"]
36
36
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: continual-foragax
3
- Version: 0.8.2
3
+ Version: 0.9.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
@@ -380,22 +380,69 @@ class ForagaxEnv(environment.Environment):
380
380
  class ForagaxObjectEnv(ForagaxEnv):
381
381
  """Foragax environment with object-based aperture observation."""
382
382
 
383
+ def __init__(
384
+ self,
385
+ size: Union[Tuple[int, int], int] = (10, 10),
386
+ aperture_size: Union[Tuple[int, int], int] = (5, 5),
387
+ objects: Tuple[BaseForagaxObject, ...] = (),
388
+ biomes: Tuple[Biome, ...] = (Biome(object_frequencies=()),),
389
+ ):
390
+ super().__init__(size, aperture_size, objects, biomes)
391
+
392
+ # Compute unique colors and mapping for partial observability
393
+ # Exclude EMPTY (index 0) from color channels
394
+ object_colors_no_empty = self.object_colors[1:]
395
+
396
+ # Find unique colors in order of first appearance
397
+ unique_colors = []
398
+ color_indices = jnp.zeros(len(object_colors_no_empty), dtype=int)
399
+ color_map = {}
400
+ next_channel = 0
401
+
402
+ for i, color in enumerate(object_colors_no_empty):
403
+ color_tuple = tuple(color.tolist())
404
+ if color_tuple not in color_map:
405
+ color_map[color_tuple] = next_channel
406
+ unique_colors.append(color)
407
+ next_channel += 1
408
+ color_indices = color_indices.at[i].set(color_map[color_tuple])
409
+
410
+ self.unique_colors = jnp.array(unique_colors)
411
+ self.num_color_channels = len(unique_colors)
412
+ # color_indices maps from object_id-1 to color_channel_index
413
+ self.object_to_color_map = color_indices
414
+
383
415
  def get_obs(self, state: EnvState, params: EnvParams, key=None) -> jax.Array:
384
- num_obj_types = len(self.object_ids)
385
416
  # Decode grid for observation
386
417
  obs_grid = jnp.maximum(0, state.object_grid)
387
418
  aperture = self._get_aperture(obs_grid, state.pos)
388
419
  aperture = jnp.flip(aperture, axis=0)
389
- obs = jax.nn.one_hot(aperture, num_obj_types)
390
- obs = obs[:, :, 1:]
420
+
421
+ # Handle case with no objects (only EMPTY)
422
+ if self.num_color_channels == 0:
423
+ return jnp.zeros(aperture.shape + (0,), dtype=jnp.float32)
424
+
425
+ # Map object IDs to color channel indices
426
+ # aperture contains object IDs (0 = EMPTY, 1+ = objects)
427
+ # For EMPTY (0), we want no color channel activated
428
+ # For objects (1+), map to color channel using object_to_color_map
429
+ color_channels = jnp.where(
430
+ aperture == 0,
431
+ -1, # Special value for EMPTY
432
+ jnp.take(self.object_to_color_map, aperture - 1, axis=0),
433
+ )
434
+
435
+ # Create one-hot encoding for color channels
436
+ # jax.nn.one_hot produces all zeros for -1 (EMPTY positions)
437
+ obs = jax.nn.one_hot(color_channels, self.num_color_channels, axis=-1)
438
+
391
439
  return obs
392
440
 
393
441
  def observation_space(self, params: EnvParams) -> spaces.Box:
394
- num_obj_types = len(self.object_ids)
395
442
  obs_shape = (
396
443
  self.aperture_size[0],
397
444
  self.aperture_size[1],
398
- num_obj_types - 1,
445
+ self.num_color_channels,
399
446
  )
400
447
  return spaces.Box(0, 1, obs_shape, float)
401
448
 
@@ -9,7 +9,16 @@ from foragax.env import (
9
9
  ForagaxRGBEnv,
10
10
  ForagaxWorldEnv,
11
11
  )
12
- from foragax.objects import FLOWER, MOREL, OYSTER, THORNS, WALL
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