continual-foragax 0.9.0__tar.gz → 0.10.1__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.9.0 → continual_foragax-0.10.1}/PKG-INFO +1 -1
  2. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/pyproject.toml +2 -2
  3. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/continual_foragax.egg-info/PKG-INFO +1 -1
  4. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/continual_foragax.egg-info/SOURCES.txt +2 -0
  5. continual_foragax-0.10.1/src/foragax/colors.py +74 -0
  6. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/env.py +27 -6
  7. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/objects.py +1 -1
  8. continual_foragax-0.10.1/src/foragax/rendering.py +74 -0
  9. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/tests/test_foragax.py +16 -3
  10. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/README.md +0 -0
  11. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/setup.cfg +0 -0
  12. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/continual_foragax.egg-info/dependency_links.txt +0 -0
  13. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/continual_foragax.egg-info/entry_points.txt +0 -0
  14. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/continual_foragax.egg-info/requires.txt +0 -0
  15. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/continual_foragax.egg-info/top_level.txt +0 -0
  16. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/__init__.py +0 -0
  17. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100897.txt +0 -0
  18. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100928.txt +0 -0
  19. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100929.txt +0 -0
  20. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100930.txt +0 -0
  21. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID100931.txt +0 -0
  22. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106714.txt +0 -0
  23. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106715.txt +0 -0
  24. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106716.txt +0 -0
  25. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106717.txt +0 -0
  26. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106718.txt +0 -0
  27. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106930.txt +0 -0
  28. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106931.txt +0 -0
  29. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106932.txt +0 -0
  30. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106933.txt +0 -0
  31. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106934.txt +0 -0
  32. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106935.txt +0 -0
  33. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106936.txt +0 -0
  34. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106937.txt +0 -0
  35. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106938.txt +0 -0
  36. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106939.txt +0 -0
  37. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106940.txt +0 -0
  38. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106941.txt +0 -0
  39. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106942.txt +0 -0
  40. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106943.txt +0 -0
  41. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106994.txt +0 -0
  42. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106995.txt +0 -0
  43. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106996.txt +0 -0
  44. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106997.txt +0 -0
  45. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106998.txt +0 -0
  46. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID106999.txt +0 -0
  47. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107000.txt +0 -0
  48. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107001.txt +0 -0
  49. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107002.txt +0 -0
  50. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107003.txt +0 -0
  51. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107004.txt +0 -0
  52. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107005.txt +0 -0
  53. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107006.txt +0 -0
  54. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107007.txt +0 -0
  55. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107008.txt +0 -0
  56. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107009.txt +0 -0
  57. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107010.txt +0 -0
  58. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107011.txt +0 -0
  59. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107012.txt +0 -0
  60. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107013.txt +0 -0
  61. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107014.txt +0 -0
  62. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107015.txt +0 -0
  63. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107016.txt +0 -0
  64. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107017.txt +0 -0
  65. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107018.txt +0 -0
  66. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107019.txt +0 -0
  67. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107020.txt +0 -0
  68. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107021.txt +0 -0
  69. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107022.txt +0 -0
  70. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107023.txt +0 -0
  71. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107024.txt +0 -0
  72. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107025.txt +0 -0
  73. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107026.txt +0 -0
  74. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107027.txt +0 -0
  75. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107028.txt +0 -0
  76. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107029.txt +0 -0
  77. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107030.txt +0 -0
  78. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107031.txt +0 -0
  79. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107032.txt +0 -0
  80. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107033.txt +0 -0
  81. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107034.txt +0 -0
  82. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107035.txt +0 -0
  83. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107036.txt +0 -0
  84. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107037.txt +0 -0
  85. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107038.txt +0 -0
  86. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107039.txt +0 -0
  87. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107040.txt +0 -0
  88. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107041.txt +0 -0
  89. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107042.txt +0 -0
  90. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107043.txt +0 -0
  91. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107044.txt +0 -0
  92. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107045.txt +0 -0
  93. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107046.txt +0 -0
  94. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107047.txt +0 -0
  95. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107048.txt +0 -0
  96. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107049.txt +0 -0
  97. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107050.txt +0 -0
  98. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107051.txt +0 -0
  99. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107052.txt +0 -0
  100. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107053.txt +0 -0
  101. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107054.txt +0 -0
  102. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107055.txt +0 -0
  103. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107056.txt +0 -0
  104. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107057.txt +0 -0
  105. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107058.txt +0 -0
  106. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107059.txt +0 -0
  107. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107060.txt +0 -0
  108. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107061.txt +0 -0
  109. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107062.txt +0 -0
  110. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107063.txt +0 -0
  111. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107064.txt +0 -0
  112. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107065.txt +0 -0
  113. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107066.txt +0 -0
  114. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107067.txt +0 -0
  115. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107068.txt +0 -0
  116. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107069.txt +0 -0
  117. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107070.txt +0 -0
  118. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID107071.txt +0 -0
  119. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115808.txt +0 -0
  120. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID115812.txt +0 -0
  121. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID146811.txt +0 -0
  122. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156831.txt +0 -0
  123. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156835.txt +0 -0
  124. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156839.txt +0 -0
  125. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156843.txt +0 -0
  126. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156847.txt +0 -0
  127. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156851.txt +0 -0
  128. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156855.txt +0 -0
  129. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156859.txt +0 -0
  130. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156863.txt +0 -0
  131. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156867.txt +0 -0
  132. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156871.txt +0 -0
  133. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156875.txt +0 -0
  134. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156879.txt +0 -0
  135. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156883.txt +0 -0
  136. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/TG_SOUID156887.txt +0 -0
  137. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/elements.txt +0 -0
  138. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/metadata.txt +0 -0
  139. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/data/ECA_non-blended_custom/sources.txt +0 -0
  140. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/registry.py +0 -0
  141. {continual_foragax-0.9.0 → continual_foragax-0.10.1}/src/foragax/weather.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: continual-foragax
3
- Version: 0.9.0
3
+ Version: 0.10.1
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.9.0"
3
+ version = "0.10.1"
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.9.0"
33
+ version = "0.10.1"
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.9.0
3
+ Version: 0.10.1
4
4
  Summary: A continual reinforcement learning benchmark
5
5
  Author-email: Steven Tang <stang5@ualberta.ca>
6
6
  Requires-Python: >=3.8
@@ -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,16 +374,22 @@ 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."""
@@ -478,7 +492,14 @@ class ForagaxWorldEnv(ForagaxEnv):
478
492
  num_obj_types = len(self.object_ids)
479
493
  # Decode grid for observation
480
494
  obs_grid = jnp.maximum(0, state.object_grid)
481
- obs = jax.nn.one_hot(obs_grid, num_obj_types)
495
+ obs = jnp.zeros((self.size[1], self.size[0], num_obj_types), dtype=jnp.float32)
496
+
497
+ num_object_channels = num_obj_types - 1
498
+ # create masks for all objects at once
499
+ object_ids = jnp.arange(1, num_obj_types)
500
+ object_masks = obs_grid[..., None] == object_ids[None, None, :]
501
+ obs = obs.at[:, :, :num_object_channels].set(object_masks.astype(float))
502
+
482
503
  obs = obs.at[state.pos[1], state.pos[0], -1].set(1)
483
504
  return obs
484
505
 
@@ -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
@@ -13,7 +13,7 @@ from foragax.objects import (
13
13
  FLOWER,
14
14
  LARGE_MOREL,
15
15
  MEDIUM_MOREL,
16
- MOREL,
16
+ MOREL,
17
17
  OYSTER,
18
18
  THORNS,
19
19
  WALL,
@@ -143,12 +143,25 @@ def test_rgb_observation_mode_large_aperture():
143
143
 
144
144
  def test_world_observation_mode():
145
145
  # can use world observation mode
146
- env = ForagaxWorldEnv(size=(10, 10))
146
+ env = ForagaxWorldEnv(
147
+ size=(10, 10),
148
+ aperture_size=5,
149
+ objects=(WALL, FLOWER),
150
+ biomes=(Biome(object_frequencies=(0.1, 0.1)),),
151
+ )
147
152
  params = env.default_params
148
153
  key = jax.random.key(0)
149
154
  obs, state = env.reset(key, params)
150
155
 
151
- assert obs.shape == (10, 10, 1)
156
+ assert obs.shape == (10, 10, 3)
157
+ # Check agent channel (last channel) is 0 except 1 at agent position
158
+ agent_channel = obs[:, :, 2]
159
+ assert jnp.sum(agent_channel) == 1
160
+ assert agent_channel[state.pos[1], state.pos[0]] == 1
161
+
162
+ # check non-zero values in other channels
163
+ assert jnp.sum(obs[:, :, 0]) > 0
164
+ assert jnp.sum(obs[:, :, 1]) > 0
152
165
 
153
166
 
154
167
  def test_basic_movement():