continual-foragax 0.8.2__tar.gz → 0.10.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/PKG-INFO +10 -1
  2. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/README.md +9 -0
  3. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/pyproject.toml +2 -2
  4. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/PKG-INFO +10 -1
  5. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/SOURCES.txt +2 -0
  6. continual_foragax-0.10.0/src/foragax/colors.py +74 -0
  7. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/env.py +71 -10
  8. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/objects.py +1 -1
  9. continual_foragax-0.10.0/src/foragax/rendering.py +74 -0
  10. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/tests/test_foragax.py +166 -1
  11. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/setup.cfg +0 -0
  12. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/dependency_links.txt +0 -0
  13. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/entry_points.txt +0 -0
  14. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/requires.txt +0 -0
  15. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/continual_foragax.egg-info/top_level.txt +0 -0
  16. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/__init__.py +0 -0
  17. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100897.txt +0 -0
  18. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100928.txt +0 -0
  19. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100929.txt +0 -0
  20. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100930.txt +0 -0
  21. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100931.txt +0 -0
  22. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106714.txt +0 -0
  23. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106715.txt +0 -0
  24. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106716.txt +0 -0
  25. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106717.txt +0 -0
  26. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106718.txt +0 -0
  27. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106930.txt +0 -0
  28. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106931.txt +0 -0
  29. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106932.txt +0 -0
  30. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106933.txt +0 -0
  31. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106934.txt +0 -0
  32. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106935.txt +0 -0
  33. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106936.txt +0 -0
  34. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106937.txt +0 -0
  35. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106938.txt +0 -0
  36. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106939.txt +0 -0
  37. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106940.txt +0 -0
  38. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106941.txt +0 -0
  39. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106942.txt +0 -0
  40. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106943.txt +0 -0
  41. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106994.txt +0 -0
  42. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106995.txt +0 -0
  43. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106996.txt +0 -0
  44. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106997.txt +0 -0
  45. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106998.txt +0 -0
  46. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106999.txt +0 -0
  47. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107000.txt +0 -0
  48. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107001.txt +0 -0
  49. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107002.txt +0 -0
  50. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107003.txt +0 -0
  51. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107004.txt +0 -0
  52. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107005.txt +0 -0
  53. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107006.txt +0 -0
  54. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107007.txt +0 -0
  55. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107008.txt +0 -0
  56. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107009.txt +0 -0
  57. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107010.txt +0 -0
  58. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107011.txt +0 -0
  59. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107012.txt +0 -0
  60. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107013.txt +0 -0
  61. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107014.txt +0 -0
  62. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107015.txt +0 -0
  63. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107016.txt +0 -0
  64. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107017.txt +0 -0
  65. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107018.txt +0 -0
  66. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107019.txt +0 -0
  67. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107020.txt +0 -0
  68. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107021.txt +0 -0
  69. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107022.txt +0 -0
  70. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107023.txt +0 -0
  71. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107024.txt +0 -0
  72. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107025.txt +0 -0
  73. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107026.txt +0 -0
  74. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107027.txt +0 -0
  75. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107028.txt +0 -0
  76. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107029.txt +0 -0
  77. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107030.txt +0 -0
  78. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107031.txt +0 -0
  79. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107032.txt +0 -0
  80. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107033.txt +0 -0
  81. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107034.txt +0 -0
  82. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107035.txt +0 -0
  83. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107036.txt +0 -0
  84. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107037.txt +0 -0
  85. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107038.txt +0 -0
  86. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107039.txt +0 -0
  87. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107040.txt +0 -0
  88. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107041.txt +0 -0
  89. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107042.txt +0 -0
  90. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107043.txt +0 -0
  91. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107044.txt +0 -0
  92. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107045.txt +0 -0
  93. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107046.txt +0 -0
  94. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107047.txt +0 -0
  95. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107048.txt +0 -0
  96. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107049.txt +0 -0
  97. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107050.txt +0 -0
  98. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107051.txt +0 -0
  99. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107052.txt +0 -0
  100. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107053.txt +0 -0
  101. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107054.txt +0 -0
  102. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107055.txt +0 -0
  103. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107056.txt +0 -0
  104. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107057.txt +0 -0
  105. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107058.txt +0 -0
  106. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107059.txt +0 -0
  107. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107060.txt +0 -0
  108. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107061.txt +0 -0
  109. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107062.txt +0 -0
  110. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107063.txt +0 -0
  111. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107064.txt +0 -0
  112. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107065.txt +0 -0
  113. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107066.txt +0 -0
  114. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107067.txt +0 -0
  115. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107068.txt +0 -0
  116. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107069.txt +0 -0
  117. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107070.txt +0 -0
  118. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107071.txt +0 -0
  119. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115808.txt +0 -0
  120. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115812.txt +0 -0
  121. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID146811.txt +0 -0
  122. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156831.txt +0 -0
  123. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156835.txt +0 -0
  124. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156839.txt +0 -0
  125. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156843.txt +0 -0
  126. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156847.txt +0 -0
  127. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156851.txt +0 -0
  128. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156855.txt +0 -0
  129. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156859.txt +0 -0
  130. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156863.txt +0 -0
  131. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156867.txt +0 -0
  132. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156871.txt +0 -0
  133. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156875.txt +0 -0
  134. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156879.txt +0 -0
  135. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156883.txt +0 -0
  136. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156887.txt +0 -0
  137. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/elements.txt +0 -0
  138. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/metadata.txt +0 -0
  139. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/data/ECA_non-blended_custom/sources.txt +0 -0
  140. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/registry.py +0 -0
  141. {continual_foragax-0.8.2 → continual_foragax-0.10.0}/src/foragax/weather.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: continual-foragax
3
- Version: 0.8.2
3
+ Version: 0.10.0
4
4
  Summary: A continual reinforcement learning benchmark
5
5
  Author-email: Steven Tang <stang5@ualberta.ca>
6
6
  Requires-Python: >=3.8
@@ -119,3 +119,12 @@ class into registry configs or construct environments programmatically.
119
119
  ## Development
120
120
 
121
121
  Run unit tests via pytest.
122
+
123
+ ## Acknowledgments
124
+
125
+ We acknowledge the data providers in the ECA&D project. Klein Tank, A.M.G. and
126
+ Coauthors, 2002. Daily dataset of 20th-century surface air temperature and
127
+ precipitation series for the European Climate Assessment. Int. J. of Climatol.,
128
+ 22, 1441-1453.
129
+
130
+ Data and metadata available at https://www.ecad.eu
@@ -104,3 +104,12 @@ class into registry configs or construct environments programmatically.
104
104
  ## Development
105
105
 
106
106
  Run unit tests via pytest.
107
+
108
+ ## Acknowledgments
109
+
110
+ We acknowledge the data providers in the ECA&D project. Klein Tank, A.M.G. and
111
+ Coauthors, 2002. Daily dataset of 20th-century surface air temperature and
112
+ precipitation series for the European Climate Assessment. Int. J. of Climatol.,
113
+ 22, 1441-1453.
114
+
115
+ Data and metadata available at https://www.ecad.eu
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "continual-foragax"
3
- version = "0.8.2"
3
+ version = "0.10.0"
4
4
  description = "A continual reinforcement learning benchmark"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -30,7 +30,7 @@ build-backend = "setuptools.build_meta"
30
30
  [tool]
31
31
  [tool.commitizen]
32
32
  name = "cz_conventional_commits"
33
- version = "0.8.2"
33
+ version = "0.10.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.10.0
4
4
  Summary: A continual reinforcement learning benchmark
5
5
  Author-email: Steven Tang <stang5@ualberta.ca>
6
6
  Requires-Python: >=3.8
@@ -119,3 +119,12 @@ class into registry configs or construct environments programmatically.
119
119
  ## Development
120
120
 
121
121
  Run unit tests via pytest.
122
+
123
+ ## Acknowledgments
124
+
125
+ We acknowledge the data providers in the ECA&D project. Klein Tank, A.M.G. and
126
+ Coauthors, 2002. Daily dataset of 20th-century surface air temperature and
127
+ precipitation series for the European Climate Assessment. Int. J. of Climatol.,
128
+ 22, 1441-1453.
129
+
130
+ Data and metadata available at https://www.ecad.eu
@@ -7,9 +7,11 @@ src/continual_foragax.egg-info/entry_points.txt
7
7
  src/continual_foragax.egg-info/requires.txt
8
8
  src/continual_foragax.egg-info/top_level.txt
9
9
  src/foragax/__init__.py
10
+ src/foragax/colors.py
10
11
  src/foragax/env.py
11
12
  src/foragax/objects.py
12
13
  src/foragax/registry.py
14
+ src/foragax/rendering.py
13
15
  src/foragax/weather.py
14
16
  src/foragax/data/ECA_non-blended_custom/TG_SOUID100897.txt
15
17
  src/foragax/data/ECA_non-blended_custom/TG_SOUID100928.txt
@@ -0,0 +1,74 @@
1
+ """Color utility functions for Foragax."""
2
+
3
+ import jax
4
+ import jax.numpy as jnp
5
+
6
+
7
+ def hsv_to_rgb(h: jax.Array, s: float = 1.0, v: float = 1.0) -> jax.Array:
8
+ """Convert HSV color values to RGB.
9
+
10
+ Args:
11
+ h: Hue values in range [0, 1]
12
+ s: Saturation value in range [0, 1], default 1.0
13
+ v: Value (brightness) in range [0, 1], default 1.0
14
+
15
+ Returns:
16
+ RGB values as array of shape (..., 3) with values in range [0, 1]
17
+ """
18
+ c = v * s
19
+ x = c * (1 - jnp.abs(jnp.mod(h * 6, 2) - 1))
20
+ m = v - c
21
+
22
+ # Create RGB arrays
23
+ r = jnp.zeros_like(h)
24
+ g = jnp.zeros_like(h)
25
+ b = jnp.zeros_like(h)
26
+
27
+ # Sector 0: 0-60 degrees (red to yellow)
28
+ mask0 = h < 1 / 6
29
+ r = jnp.where(mask0, c, r)
30
+ g = jnp.where(mask0, x, g)
31
+
32
+ # Sector 1: 60-120 degrees (yellow to green)
33
+ mask1 = (h >= 1 / 6) & (h < 2 / 6)
34
+ r = jnp.where(mask1, x, r)
35
+ g = jnp.where(mask1, c, g)
36
+
37
+ # Sector 2: 120-180 degrees (green to cyan)
38
+ mask2 = (h >= 2 / 6) & (h < 3 / 6)
39
+ g = jnp.where(mask2, c, g)
40
+ b = jnp.where(mask2, x, b)
41
+
42
+ # Sector 3: 180-240 degrees (cyan to blue)
43
+ mask3 = (h >= 3 / 6) & (h < 4 / 6)
44
+ g = jnp.where(mask3, x, g)
45
+ b = jnp.where(mask3, c, b)
46
+
47
+ # Sector 4: 240-300 degrees (blue to magenta)
48
+ mask4 = (h >= 4 / 6) & (h < 5 / 6)
49
+ r = jnp.where(mask4, x, r)
50
+ b = jnp.where(mask4, c, b)
51
+
52
+ # Sector 5: 300-360 degrees (magenta to red)
53
+ mask5 = h >= 5 / 6
54
+ r = jnp.where(mask5, c, r)
55
+ b = jnp.where(mask5, x, b)
56
+
57
+ # Add value offset
58
+ rgb = jnp.stack([r + m, g + m, b + m], axis=-1)
59
+ return rgb
60
+
61
+
62
+ def hsv_to_rgb_255(h: jax.Array, s: float = 0.9, v: float = 0.8) -> jax.Array:
63
+ """Convert HSV to RGB with values scaled to 0-255 range for image rendering.
64
+
65
+ Args:
66
+ h: Hue values in range [0, 1]
67
+ s: Saturation value, default 0.9
68
+ v: Value (brightness), default 0.8
69
+
70
+ Returns:
71
+ RGB values as uint8 array of shape (..., 3) with values in range [0, 255]
72
+ """
73
+ rgb = hsv_to_rgb(h, s, v)
74
+ return (rgb * 255).astype(jnp.uint8)
@@ -14,6 +14,7 @@ from flax import struct
14
14
  from gymnax.environments import environment, spaces
15
15
 
16
16
  from foragax.objects import AGENT, EMPTY, BaseForagaxObject, WeatherObject
17
+ from foragax.rendering import apply_true_borders
17
18
  from foragax.weather import get_temperature
18
19
 
19
20
 
@@ -295,7 +296,11 @@ class ForagaxEnv(environment.Environment):
295
296
  @partial(jax.jit, static_argnames=("self", "render_mode"))
296
297
  def render(self, state: EnvState, params: EnvParams, render_mode: str = "world"):
297
298
  """Render the environment state."""
298
- if render_mode == "world":
299
+ is_world_mode = render_mode in ("world", "world_true")
300
+ is_aperture_mode = render_mode in ("aperture", "aperture_true")
301
+ is_true_mode = render_mode in ("world_true", "aperture_true")
302
+
303
+ if is_world_mode:
299
304
  # Create an RGB image from the object grid
300
305
  img = jnp.zeros((self.size[1], self.size[0], 3))
301
306
  # Decode grid for rendering: non-negative are objects, negative are empty
@@ -341,15 +346,18 @@ class ForagaxEnv(environment.Environment):
341
346
  jax.image.ResizeMethod.NEAREST,
342
347
  )
343
348
 
349
+ if is_true_mode:
350
+ # Apply true object borders by overlaying true colors on border pixels
351
+ img = apply_true_borders(img, render_grid, self.size)
352
+
353
+ # Add grid lines for world mode
344
354
  grid_color = jnp.zeros(3, dtype=jnp.uint8)
345
355
  row_indices = jnp.arange(1, self.size[1]) * 24
346
356
  col_indices = jnp.arange(1, self.size[0]) * 24
347
357
  img = img.at[row_indices, :].set(grid_color)
348
358
  img = img.at[:, col_indices].set(grid_color)
349
359
 
350
- return img
351
-
352
- elif render_mode == "aperture":
360
+ elif is_aperture_mode:
353
361
  obs_grid = jnp.maximum(0, state.object_grid)
354
362
  aperture = self._get_aperture(obs_grid, state.pos)
355
363
  aperture_one_hot = jax.nn.one_hot(aperture, len(self.object_ids))
@@ -366,36 +374,89 @@ class ForagaxEnv(environment.Environment):
366
374
  jax.image.ResizeMethod.NEAREST,
367
375
  )
368
376
 
377
+ if is_true_mode:
378
+ # Apply true object borders by overlaying true colors on border pixels
379
+ img = apply_true_borders(img, aperture, self.aperture_size)
380
+
381
+ # Add grid lines for aperture mode
369
382
  grid_color = jnp.zeros(3, dtype=jnp.uint8)
370
383
  row_indices = jnp.arange(1, self.aperture_size[0]) * 24
371
384
  col_indices = jnp.arange(1, self.aperture_size[1]) * 24
372
385
  img = img.at[row_indices, :].set(grid_color)
373
386
  img = img.at[:, col_indices].set(grid_color)
374
387
 
375
- return img
376
388
  else:
377
389
  raise ValueError(f"Unknown render_mode: {render_mode}")
378
390
 
391
+ return img
392
+
379
393
 
380
394
  class ForagaxObjectEnv(ForagaxEnv):
381
395
  """Foragax environment with object-based aperture observation."""
382
396
 
397
+ def __init__(
398
+ self,
399
+ size: Union[Tuple[int, int], int] = (10, 10),
400
+ aperture_size: Union[Tuple[int, int], int] = (5, 5),
401
+ objects: Tuple[BaseForagaxObject, ...] = (),
402
+ biomes: Tuple[Biome, ...] = (Biome(object_frequencies=()),),
403
+ ):
404
+ super().__init__(size, aperture_size, objects, biomes)
405
+
406
+ # Compute unique colors and mapping for partial observability
407
+ # Exclude EMPTY (index 0) from color channels
408
+ object_colors_no_empty = self.object_colors[1:]
409
+
410
+ # Find unique colors in order of first appearance
411
+ unique_colors = []
412
+ color_indices = jnp.zeros(len(object_colors_no_empty), dtype=int)
413
+ color_map = {}
414
+ next_channel = 0
415
+
416
+ for i, color in enumerate(object_colors_no_empty):
417
+ color_tuple = tuple(color.tolist())
418
+ if color_tuple not in color_map:
419
+ color_map[color_tuple] = next_channel
420
+ unique_colors.append(color)
421
+ next_channel += 1
422
+ color_indices = color_indices.at[i].set(color_map[color_tuple])
423
+
424
+ self.unique_colors = jnp.array(unique_colors)
425
+ self.num_color_channels = len(unique_colors)
426
+ # color_indices maps from object_id-1 to color_channel_index
427
+ self.object_to_color_map = color_indices
428
+
383
429
  def get_obs(self, state: EnvState, params: EnvParams, key=None) -> jax.Array:
384
- num_obj_types = len(self.object_ids)
385
430
  # Decode grid for observation
386
431
  obs_grid = jnp.maximum(0, state.object_grid)
387
432
  aperture = self._get_aperture(obs_grid, state.pos)
388
433
  aperture = jnp.flip(aperture, axis=0)
389
- obs = jax.nn.one_hot(aperture, num_obj_types)
390
- obs = obs[:, :, 1:]
434
+
435
+ # Handle case with no objects (only EMPTY)
436
+ if self.num_color_channels == 0:
437
+ return jnp.zeros(aperture.shape + (0,), dtype=jnp.float32)
438
+
439
+ # Map object IDs to color channel indices
440
+ # aperture contains object IDs (0 = EMPTY, 1+ = objects)
441
+ # For EMPTY (0), we want no color channel activated
442
+ # For objects (1+), map to color channel using object_to_color_map
443
+ color_channels = jnp.where(
444
+ aperture == 0,
445
+ -1, # Special value for EMPTY
446
+ jnp.take(self.object_to_color_map, aperture - 1, axis=0),
447
+ )
448
+
449
+ # Create one-hot encoding for color channels
450
+ # jax.nn.one_hot produces all zeros for -1 (EMPTY positions)
451
+ obs = jax.nn.one_hot(color_channels, self.num_color_channels, axis=-1)
452
+
391
453
  return obs
392
454
 
393
455
  def observation_space(self, params: EnvParams) -> spaces.Box:
394
- num_obj_types = len(self.object_ids)
395
456
  obs_shape = (
396
457
  self.aperture_size[0],
397
458
  self.aperture_size[1],
398
- num_obj_types - 1,
459
+ self.num_color_channels,
399
460
  )
400
461
  return spaces.Box(0, 1, obs_shape, float)
401
462
 
@@ -181,7 +181,7 @@ AGENT = DefaultForagaxObject(name="agent", blocking=True, color=(0, 0, 255))
181
181
 
182
182
 
183
183
  def create_weather_objects(
184
- file_index: int = 0, repeat: int = 100, multiplier: float = 1.0
184
+ file_index: int = 0, repeat: int = 500, multiplier: float = 1.0
185
185
  ):
186
186
  """Create HOT and COLD WeatherObject instances using the specified file.
187
187
 
@@ -0,0 +1,74 @@
1
+ """Rendering utilities for Foragax environments."""
2
+
3
+ from typing import Tuple
4
+
5
+ import jax
6
+ import jax.numpy as jnp
7
+
8
+ from foragax.colors import hsv_to_rgb_255
9
+
10
+
11
+ def apply_true_borders(
12
+ base_img: jax.Array, true_grid: jax.Array, grid_size: Tuple[int, int]
13
+ ) -> jax.Array:
14
+ """Apply true object borders by overlaying HSV border colors on border pixels.
15
+
16
+ Args:
17
+ base_img: Base image with object colors
18
+ true_grid: Grid of object IDs for determining border colors
19
+ grid_size: (height, width) of the grid
20
+
21
+ Returns:
22
+ Image with HSV borders overlaid on border pixels
23
+ """
24
+ # Create HSV border colors for each object type
25
+ num_objects = true_grid.max() + 1 # Assume object IDs start from 0
26
+ hues = jnp.linspace(0, 1, num_objects, endpoint=False)
27
+
28
+ # Convert HSV to RGB for border colors
29
+ border_colors = hsv_to_rgb_255(hues[true_grid])
30
+
31
+ # Resize border colors to match rendered image size
32
+ border_img = jax.image.resize(
33
+ border_colors,
34
+ (grid_size[0] * 24, grid_size[1] * 24, 3),
35
+ jax.image.ResizeMethod.NEAREST,
36
+ )
37
+
38
+ # Create border mask (2-pixel thick borders) - vectorized like grid lines
39
+ height, width = grid_size
40
+ img_height, img_width = height * 24, width * 24
41
+
42
+ border_mask = jnp.zeros((img_height, img_width), dtype=bool)
43
+
44
+ # Create border row and column indices for all cells at once
45
+ cell_rows = jnp.arange(height)
46
+ cell_cols = jnp.arange(width)
47
+
48
+ # Top border rows: 2 rows per cell
49
+ top_border_rows = cell_rows[:, None] * 24 + jnp.arange(2)[None, :]
50
+ top_border_rows_flat = top_border_rows.flatten()
51
+
52
+ # Bottom border rows: 2 rows per cell
53
+ bottom_border_rows = cell_rows[:, None] * 24 + 22 + jnp.arange(2)[None, :]
54
+ bottom_border_rows_flat = bottom_border_rows.flatten()
55
+
56
+ # Left border columns: 2 columns per cell
57
+ left_border_cols = cell_cols[:, None] * 24 + jnp.arange(2)[None, :]
58
+ left_border_cols_flat = left_border_cols.flatten()
59
+
60
+ # Right border columns: 2 columns per cell
61
+ right_border_cols = cell_cols[:, None] * 24 + 22 + jnp.arange(2)[None, :]
62
+ right_border_cols_flat = right_border_cols.flatten()
63
+
64
+ # Set top and bottom borders (full width rectangles)
65
+ all_border_rows = jnp.concatenate([top_border_rows_flat, bottom_border_rows_flat])
66
+ border_mask = border_mask.at[all_border_rows, :].set(True)
67
+
68
+ # Set left and right borders (full height rectangles)
69
+ all_border_cols = jnp.concatenate([left_border_cols_flat, right_border_cols_flat])
70
+ border_mask = border_mask.at[:, all_border_cols].set(True)
71
+
72
+ # Apply border mask: use HSV border colors for border pixels, base colors elsewhere
73
+ result_img = jnp.where(border_mask[..., None], border_img, base_img)
74
+ return result_img
@@ -9,7 +9,16 @@ from foragax.env import (
9
9
  ForagaxRGBEnv,
10
10
  ForagaxWorldEnv,
11
11
  )
12
- from foragax.objects import 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