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.
Files changed (143) hide show
  1. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/PKG-INFO +1 -1
  2. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/pyproject.toml +2 -2
  3. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/PKG-INFO +1 -1
  4. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/env.py +14 -14
  5. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/objects.py +24 -24
  6. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/registry.py +6 -17
  7. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/tests/test_foragax.py +3 -3
  8. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/tests/test_registry.py +72 -101
  9. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/README.md +0 -0
  10. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/setup.cfg +0 -0
  11. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/SOURCES.txt +0 -0
  12. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/dependency_links.txt +0 -0
  13. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/entry_points.txt +0 -0
  14. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/requires.txt +0 -0
  15. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/continual_foragax.egg-info/top_level.txt +0 -0
  16. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/__init__.py +0 -0
  17. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/colors.py +0 -0
  18. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100897.txt +0 -0
  19. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100928.txt +0 -0
  20. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100929.txt +0 -0
  21. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100930.txt +0 -0
  22. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100931.txt +0 -0
  23. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106714.txt +0 -0
  24. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106715.txt +0 -0
  25. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106716.txt +0 -0
  26. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106717.txt +0 -0
  27. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106718.txt +0 -0
  28. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106930.txt +0 -0
  29. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106931.txt +0 -0
  30. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106932.txt +0 -0
  31. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106933.txt +0 -0
  32. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106934.txt +0 -0
  33. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106935.txt +0 -0
  34. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106936.txt +0 -0
  35. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106937.txt +0 -0
  36. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106938.txt +0 -0
  37. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106939.txt +0 -0
  38. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106940.txt +0 -0
  39. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106941.txt +0 -0
  40. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106942.txt +0 -0
  41. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106943.txt +0 -0
  42. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106994.txt +0 -0
  43. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106995.txt +0 -0
  44. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106996.txt +0 -0
  45. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106997.txt +0 -0
  46. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106998.txt +0 -0
  47. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106999.txt +0 -0
  48. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107000.txt +0 -0
  49. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107001.txt +0 -0
  50. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107002.txt +0 -0
  51. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107003.txt +0 -0
  52. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107004.txt +0 -0
  53. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107005.txt +0 -0
  54. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107006.txt +0 -0
  55. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107007.txt +0 -0
  56. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107008.txt +0 -0
  57. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107009.txt +0 -0
  58. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107010.txt +0 -0
  59. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107011.txt +0 -0
  60. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107012.txt +0 -0
  61. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107013.txt +0 -0
  62. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107014.txt +0 -0
  63. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107015.txt +0 -0
  64. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107016.txt +0 -0
  65. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107017.txt +0 -0
  66. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107018.txt +0 -0
  67. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107019.txt +0 -0
  68. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107020.txt +0 -0
  69. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107021.txt +0 -0
  70. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107022.txt +0 -0
  71. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107023.txt +0 -0
  72. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107024.txt +0 -0
  73. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107025.txt +0 -0
  74. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107026.txt +0 -0
  75. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107027.txt +0 -0
  76. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107028.txt +0 -0
  77. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107029.txt +0 -0
  78. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107030.txt +0 -0
  79. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107031.txt +0 -0
  80. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107032.txt +0 -0
  81. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107033.txt +0 -0
  82. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107034.txt +0 -0
  83. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107035.txt +0 -0
  84. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107036.txt +0 -0
  85. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107037.txt +0 -0
  86. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107038.txt +0 -0
  87. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107039.txt +0 -0
  88. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107040.txt +0 -0
  89. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107041.txt +0 -0
  90. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107042.txt +0 -0
  91. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107043.txt +0 -0
  92. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107044.txt +0 -0
  93. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107045.txt +0 -0
  94. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107046.txt +0 -0
  95. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107047.txt +0 -0
  96. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107048.txt +0 -0
  97. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107049.txt +0 -0
  98. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107050.txt +0 -0
  99. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107051.txt +0 -0
  100. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107052.txt +0 -0
  101. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107053.txt +0 -0
  102. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107054.txt +0 -0
  103. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107055.txt +0 -0
  104. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107056.txt +0 -0
  105. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107057.txt +0 -0
  106. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107058.txt +0 -0
  107. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107059.txt +0 -0
  108. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107060.txt +0 -0
  109. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107061.txt +0 -0
  110. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107062.txt +0 -0
  111. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107063.txt +0 -0
  112. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107064.txt +0 -0
  113. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107065.txt +0 -0
  114. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107066.txt +0 -0
  115. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107067.txt +0 -0
  116. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107068.txt +0 -0
  117. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107069.txt +0 -0
  118. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107070.txt +0 -0
  119. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107071.txt +0 -0
  120. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115808.txt +0 -0
  121. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115812.txt +0 -0
  122. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID146811.txt +0 -0
  123. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156831.txt +0 -0
  124. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156835.txt +0 -0
  125. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156839.txt +0 -0
  126. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156843.txt +0 -0
  127. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156847.txt +0 -0
  128. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156851.txt +0 -0
  129. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156855.txt +0 -0
  130. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156859.txt +0 -0
  131. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156863.txt +0 -0
  132. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156867.txt +0 -0
  133. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156871.txt +0 -0
  134. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156875.txt +0 -0
  135. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156879.txt +0 -0
  136. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156883.txt +0 -0
  137. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156887.txt +0 -0
  138. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/elements.txt +0 -0
  139. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/metadata.txt +0 -0
  140. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/data/ECA_non-blended_custom/sources.txt +0 -0
  141. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/rendering.py +0 -0
  142. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/src/foragax/weather.py +0 -0
  143. {continual_foragax-0.29.0 → continual_foragax-0.30.0}/tests/test_benchmark.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: continual-foragax
3
- Version: 0.29.0
3
+ Version: 0.30.0
4
4
  Summary: A continual reinforcement learning benchmark
5
5
  Author-email: Steven Tang <stang5@ualberta.ca>
6
6
  Requires-Python: >=3.8
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "continual-foragax"
3
- version = "0.29.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.29.0"
33
+ version = "0.30.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.29.0
3
+ Version: 0.30.0
4
4
  Summary: A continual reinforcement learning benchmark
5
5
  Author-email: Steven Tang <stang5@ualberta.ca>
6
6
  Requires-Python: >=3.8
@@ -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.digestion_steps_fns = [o.digestion_steps for o in objects]
116
+ self.reward_delay_fns = [o.reward_delay for o in objects]
117
117
 
118
- # Compute digestion steps per object (using max_digestion_steps attribute)
119
- object_max_digestion_steps = jnp.array([o.max_digestion_steps for o in objects])
120
- self.max_digestion_steps = (
121
- int(jnp.max(object_max_digestion_steps)) + 1 if len(objects) > 0 else 0
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
- digestion_steps = jax.lax.switch(
254
- obj_at_pos, self.digestion_steps_fns, state.time, digestion_subkey
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 & (digestion_steps == 0), object_reward, 0.0)
257
- if self.max_digestion_steps > 0:
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 & (digestion_steps > 0),
260
+ should_collect & (reward_delay > 0),
261
261
  lambda: digestion_buffer.at[
262
- (state.time + digestion_steps) % self.max_digestion_steps
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.max_digestion_steps
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.max_digestion_steps,)),
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.max_digestion_steps,),
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
- max_digestion_steps: int = 0,
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.max_digestion_steps = max_digestion_steps
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 digestion_steps(self, clock: int, rng: jax.Array) -> int:
36
- """Digestion steps function."""
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
- digestion_steps: int = 0,
53
- max_digestion_steps: Optional[int] = None,
52
+ reward_delay: int = 0,
53
+ max_reward_delay: Optional[int] = None,
54
54
  ):
55
- if max_digestion_steps is None:
56
- max_digestion_steps = digestion_steps
55
+ if max_reward_delay is None:
56
+ max_reward_delay = reward_delay
57
57
  super().__init__(
58
- name, blocking, collectable, color, random_respawn, max_digestion_steps
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.digestion_steps_val = digestion_steps
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 digestion_steps(self, clock: int, rng: jax.Array) -> int:
74
- """Default digestion steps function."""
75
- return self.digestion_steps_val
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
- digestion_steps: int = 0,
91
- max_digestion_steps: Optional[int] = None,
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
- digestion_steps=digestion_steps,
101
- max_digestion_steps=max_digestion_steps,
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
- digestion_steps: int = 0,
126
- max_digestion_steps: Optional[int] = None,
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
- digestion_steps=digestion_steps,
136
- max_digestion_steps=max_digestion_steps,
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
- digestion_steps: int = 0,
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
- digestion_steps=digestion_steps,
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
- digestion_steps=digestion_steps,
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
- digestion_steps=digestion_steps,
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 test_digestion_delay():
1158
- """Test that rewards are delayed by digestion_steps for objects with k > 0."""
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
- digestion_steps=2,
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"