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