tabletask 0.2.0__tar.gz → 0.2.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 (228) hide show
  1. {tabletask-0.2.0 → tabletask-0.2.1}/PKG-INFO +1 -1
  2. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/__init__.py +5 -1
  3. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/env.py +14 -3
  4. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/monitor.py +72 -1
  5. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/schema.py +1 -0
  6. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/transformations.py +32 -4
  7. {tabletask-0.2.0 → tabletask-0.2.1}/.gitignore +0 -0
  8. {tabletask-0.2.0 → tabletask-0.2.1}/README.md +0 -0
  9. {tabletask-0.2.0 → tabletask-0.2.1}/examples/README.md +0 -0
  10. {tabletask-0.2.0 → tabletask-0.2.1}/pyproject.toml +0 -0
  11. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/__main__.py +0 -0
  12. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/fetching.py +0 -0
  13. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/inspection.py +0 -0
  14. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/__init__.py +0 -0
  15. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/errors.py +0 -0
  16. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/evaluation.py +0 -0
  17. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/format.py +0 -0
  18. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/grammar.py +0 -0
  19. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/kernel.py +0 -0
  20. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/modules.py +0 -0
  21. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/rotation.py +0 -0
  22. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/state.py +0 -0
  23. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/vocabulary.json +0 -0
  24. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/language/vocabulary.py +0 -0
  25. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/__init__.py +0 -0
  26. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/appearance.py +0 -0
  27. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/checks.py +0 -0
  28. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/geometry.py +0 -0
  29. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/importing.py +0 -0
  30. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/model.py +0 -0
  31. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/place.py +0 -0
  32. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/regions.py +0 -0
  33. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/render.py +0 -0
  34. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/__init__.py +0 -0
  35. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/LICENSE.franka +0 -0
  36. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/LICENSE.robotiq +0 -0
  37. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/NOTICE.md +0 -0
  38. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/base.stl +0 -0
  39. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/base_coupling.stl +0 -0
  40. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/c-a01-85-open.stl +0 -0
  41. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/coupler.stl +0 -0
  42. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/driver.stl +0 -0
  43. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/follower.stl +0 -0
  44. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0.stl +0 -0
  45. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_0.obj +0 -0
  46. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_1.obj +0 -0
  47. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_10.obj +0 -0
  48. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_11.obj +0 -0
  49. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_2.obj +0 -0
  50. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_3.obj +0 -0
  51. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_4.obj +0 -0
  52. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_5.obj +0 -0
  53. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_7.obj +0 -0
  54. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_8.obj +0 -0
  55. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link0_9.obj +0 -0
  56. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link1.obj +0 -0
  57. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link1.stl +0 -0
  58. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link2.obj +0 -0
  59. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link2.stl +0 -0
  60. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link3.stl +0 -0
  61. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link3_0.obj +0 -0
  62. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link3_1.obj +0 -0
  63. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link3_2.obj +0 -0
  64. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link3_3.obj +0 -0
  65. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link4.stl +0 -0
  66. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link4_0.obj +0 -0
  67. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link4_1.obj +0 -0
  68. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link4_2.obj +0 -0
  69. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link4_3.obj +0 -0
  70. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link5_0.obj +0 -0
  71. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link5_1.obj +0 -0
  72. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link5_2.obj +0 -0
  73. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link5_collision_0.obj +0 -0
  74. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link5_collision_1.obj +0 -0
  75. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link5_collision_2.obj +0 -0
  76. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6.stl +0 -0
  77. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_0.obj +0 -0
  78. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_1.obj +0 -0
  79. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_10.obj +0 -0
  80. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_11.obj +0 -0
  81. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_12.obj +0 -0
  82. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_13.obj +0 -0
  83. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_14.obj +0 -0
  84. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_15.obj +0 -0
  85. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_16.obj +0 -0
  86. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_2.obj +0 -0
  87. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_3.obj +0 -0
  88. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_4.obj +0 -0
  89. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_5.obj +0 -0
  90. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_6.obj +0 -0
  91. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_7.obj +0 -0
  92. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_8.obj +0 -0
  93. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link6_9.obj +0 -0
  94. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link7.stl +0 -0
  95. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link7_0.obj +0 -0
  96. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link7_1.obj +0 -0
  97. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link7_2.obj +0 -0
  98. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link7_3.obj +0 -0
  99. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link7_4.obj +0 -0
  100. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link7_5.obj +0 -0
  101. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link7_6.obj +0 -0
  102. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/link7_7.obj +0 -0
  103. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/spring_link.stl +0 -0
  104. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/meshes/tongue.stl +0 -0
  105. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/droid/model.xml +0 -0
  106. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/carriage.obj +0 -0
  107. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/finger.obj +0 -0
  108. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/finger_back.obj +0 -0
  109. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/finger_rib_0.obj +0 -0
  110. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/finger_rib_1.obj +0 -0
  111. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/finger_rib_2.obj +0 -0
  112. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/finger_rib_3.obj +0 -0
  113. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/finger_rib_4.obj +0 -0
  114. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/finger_root.obj +0 -0
  115. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/model.xml +0 -0
  116. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/pad.obj +0 -0
  117. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/palm.obj +0 -0
  118. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/rail.obj +0 -0
  119. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/rubber-normal.png +0 -0
  120. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/rubber.png +0 -0
  121. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/assets/gripper/wrist_motor.obj +0 -0
  122. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/droid.py +0 -0
  123. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/gripper.py +0 -0
  124. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/robots/ik.py +0 -0
  125. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/rtx.py +0 -0
  126. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/runtime.py +0 -0
  127. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/sky.py +0 -0
  128. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/surface.py +0 -0
  129. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/mujoco/usd.py +0 -0
  130. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/privileged.py +0 -0
  131. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/robots/__init__.py +0 -0
  132. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/robots/base.py +0 -0
  133. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/sampling.py +0 -0
  134. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/scenes/main/LICENSE +0 -0
  135. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/scenes/main/d405.stl +0 -0
  136. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/scenes/main/walnut.png +0 -0
  137. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/scenes/main.xml +0 -0
  138. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/scenes/textures.json +0 -0
  139. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/validation.py +0 -0
  140. {tabletask-0.2.0 → tabletask-0.2.1}/tabletask/vector.py +0 -0
  141. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/2stack.json +0 -0
  142. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/3stack.json +0 -0
  143. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/4stack.json +0 -0
  144. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-build_wood_block_tower.json +0 -0
  145. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-conveyor_pick_static.json +0 -0
  146. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-cube_in_drawer.json +0 -0
  147. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-find_hidden_letter.json +0 -0
  148. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-grab_specific_object_from_clutter.json +0 -0
  149. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-hang_mug_on_mug_rack.json +0 -0
  150. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-load_plates_into_dish_rack.json +0 -0
  151. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-open_drawer.json +0 -0
  152. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-open_drawer_random.json +0 -0
  153. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-pouring.json +0 -0
  154. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-put_markers_in_drawer.json +0 -0
  155. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-sort_nuts_and_bolts.json +0 -0
  156. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-spell_letters.json +0 -0
  157. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-throw_plastic_bottles_in_bin.json +0 -0
  158. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/abc-turn_mug_right_side_up.json +0 -0
  159. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/citrus_fruits_on_plate.json +0 -0
  160. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/cube_to_bowl.json +0 -0
  161. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/john_drawer.json +0 -0
  162. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/orange_from_drawer_to_bowl.json +0 -0
  163. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/orange_in_bowl_then_bowl_on_tray.json +0 -0
  164. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/peg_in_hole.json +0 -0
  165. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/pick_cube.json +0 -0
  166. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/pick_cube_lift3cm.json +0 -0
  167. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/pick_mug.json +0 -0
  168. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-a_cupcake_on_every_plate.json +0 -0
  169. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-a_dice_in_every_cup.json +0 -0
  170. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-all_the_mugs_upright.json +0 -0
  171. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-apple_and_yogurt_in_bowl.json +0 -0
  172. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-at_least_two_tomatoes_in_basket.json +0 -0
  173. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-ball_in_bucket_without_toppling_pins.json +0 -0
  174. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-balls_in_the_basket.json +0 -0
  175. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-banana_in_bowl.json +0 -0
  176. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-banana_in_the_named_bowl.json +0 -0
  177. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-banana_on_plate.json +0 -0
  178. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-banana_then_rubiks_cube.json +0 -0
  179. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-bananas_out_of_bin.json +0 -0
  180. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-batteries_in_the_jar.json +0 -0
  181. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-blocks_in_a_tower_in_order.json +0 -0
  182. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-bowl_on_the_closed_box.json +0 -0
  183. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-chess_pieces_by_colour.json +0 -0
  184. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-close_both_laptops.json +0 -0
  185. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-close_laptop_put_mouse_on_it.json +0 -0
  186. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-close_the_laptop.json +0 -0
  187. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-cover_the_cookie_with_the_bowl.json +0 -0
  188. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-cube_in_the_bowl.json +0 -0
  189. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-cubes_and_blocks_in_bin.json +0 -0
  190. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-dice_in_the_cup.json +0 -0
  191. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-dinosaur_in_bin.json +0 -0
  192. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-donut_then_muffin_on_plate.json +0 -0
  193. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-drill_onto_the_table.json +0 -0
  194. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-dumbbells_in_the_crate.json +0 -0
  195. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-empty_the_tray.json +0 -0
  196. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-first_aid_in_the_pail.json +0 -0
  197. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-headphones_on_the_speaker.json +0 -0
  198. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-lay_the_bottle_down.json +0 -0
  199. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-left_bowl_on_the_right_bowl.json +0 -0
  200. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-lid_the_jar_with_the_saucer.json +0 -0
  201. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-marker_in_mug.json +0 -0
  202. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-mug_in_the_middle_of_the_tray.json +0 -0
  203. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-nest_the_bowls.json +0 -0
  204. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-orange_or_lime_in_the_wooden_bowl.json +0 -0
  205. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-pack_a_picnic.json +0 -0
  206. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-pens_in_the_tumbler.json +0 -0
  207. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-pumpkins_in_the_bin.json +0 -0
  208. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-red_items_in_bin.json +0 -0
  209. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-right_the_fallen_pins.json +0 -0
  210. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-rubiks_cube_left_of_bowl.json +0 -0
  211. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-screwdrivers_in_the_cup.json +0 -0
  212. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-set_tea_for_two.json +0 -0
  213. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-shells_and_stones_apart.json +0 -0
  214. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-sneaker_right_side_up.json +0 -0
  215. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-soda_and_food_cans_apart.json +0 -0
  216. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-stack_the_plates.json +0 -0
  217. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-stack_the_trays.json +0 -0
  218. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-sweet_and_savoury_plates.json +0 -0
  219. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-take_measuring_spoon_out.json +0 -0
  220. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-take_spatula_off_shelf.json +0 -0
  221. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-teapot_in_the_centre_of_the_table.json +0 -0
  222. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-three_boxes_in_the_bin.json +0 -0
  223. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-tidy_the_work_desk.json +0 -0
  224. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-toy_vehicles_in_the_crate.json +0 -0
  225. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-tumblers_upside_down_on_tray.json +0 -0
  226. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-white_mug_in_the_centre_of_the_table.json +0 -0
  227. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/base/robolab-yellow_and_white_objects_in_bin.json +0 -0
  228. {tabletask-0.2.0 → tabletask-0.2.1}/tasks/safety/baby-doll-knife.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tabletask
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Tabletop manipulation tasks as JSON, sampled and graded in MuJoCo
5
5
  Project-URL: Homepage, https://table-task.com
6
6
  Project-URL: Source, https://github.com/omarrayyann/tabletask
@@ -10,7 +10,7 @@ from .language.schema import Task
10
10
  from .sampling import instantiate
11
11
  from .vector import Envs
12
12
 
13
- __version__ = "0.2.0"
13
+ __version__ = "0.2.1"
14
14
 
15
15
  __all__ = [
16
16
  "Env",
@@ -38,6 +38,7 @@ def make(
38
38
  robot="droid",
39
39
  gpus=None,
40
40
  renderer=None,
41
+ reward="success",
41
42
  scene=None,
42
43
  bindings=None,
43
44
  monitor_interval=0.01,
@@ -52,6 +53,7 @@ def make(
52
53
  robot: The robot that acts in the scene: "droid", "gripper", a `Robot`, or None.
53
54
  gpus: With `num_envs`, CUDA GPU indices the environments render on, in turn.
54
55
  renderer: None to rasterise images, or "rtx" to path-trace them.
56
+ reward: "success" for 1.0 on success, or "subtasks" for 1.0 at each new milestone.
55
57
  scene: A scene XML file to use in place of the task's own.
56
58
  bindings: Assets for abstract objects, as {name: {"asset": path, "properties": {...}}}.
57
59
  monitor_interval: How often, in simulated seconds, task conditions are checked.
@@ -67,6 +69,7 @@ def make(
67
69
  robot=robot,
68
70
  gpus=gpus,
69
71
  renderer=renderer,
72
+ reward=reward,
70
73
  scene=scene,
71
74
  bindings=bindings,
72
75
  monitor_interval=monitor_interval,
@@ -76,6 +79,7 @@ def make(
76
79
  raise ValueError("gpus go with num_envs")
77
80
  env = Env(load(source), scene, bindings, monitor_interval=monitor_interval, backend=backend)
78
81
  env.renderer = renderer
82
+ env.reward = reward
79
83
  if isinstance(robot, str):
80
84
  robot = _robot(robot)
81
85
  return env if robot is None else env.add(robot)
@@ -26,6 +26,7 @@ class Env:
26
26
  end_on_fall: Whether an object falling off the table ends the episode.
27
27
  image_size: Observation image size as (width, height).
28
28
  renderer: None to rasterise images, or "rtx" to path-trace them.
29
+ reward: "success" or "subtasks", as `step` describes.
29
30
  """
30
31
 
31
32
  def __init__(
@@ -45,6 +46,7 @@ class Env:
45
46
  self.end_on_fall = True
46
47
  self.image_size = (640, 368) # 16:9, the shape of DROID's camera frames
47
48
  self.renderer = None
49
+ self.reward = "success"
48
50
 
49
51
  @property
50
52
  def monitor_interval(self) -> float:
@@ -84,6 +86,8 @@ class Env:
84
86
  """
85
87
  if self.renderer not in (None, "rtx"):
86
88
  raise ValueError(f"unknown renderer {self.renderer!r}; use None or 'rtx'")
89
+ if self.reward not in ("success", "subtasks"):
90
+ raise ValueError(f"unknown reward {self.reward!r}; use 'success' or 'subtasks'")
87
91
  self.close()
88
92
  episode = episode if seed is None else seed
89
93
  if self.robot is not None and hasattr(self.robot, "start_pose"):
@@ -103,6 +107,7 @@ class Env:
103
107
  self.runtime.use_rtx(*self.image_size)
104
108
  self.monitor = Monitor(self.task)
105
109
  self.status = self.monitor.reset(self.runtime)
110
+ self._best = self.status.progress
106
111
  return self.observe(), self._info()
107
112
  except BaseException:
108
113
  self.close()
@@ -120,8 +125,10 @@ class Env:
120
125
 
121
126
  Returns:
122
127
  (observation, reward, terminated, truncated, info). The reward is 1.0 once
123
- the task has succeeded. An episode terminates on success or on a broken
124
- always condition, and is truncated at the task's `time_limit`, if it has one.
128
+ the task has succeeded; with `reward` set to "subtasks", it is 1.0 at each step
129
+ that first reaches a new milestone (see `Monitor`), and never paid twice. An
130
+ episode terminates on success or on a broken always condition, and is truncated
131
+ at the task's `time_limit`, if it has one.
125
132
  """
126
133
  self._require_reset()
127
134
  if self.robot is None and action is not None:
@@ -147,7 +154,11 @@ class Env:
147
154
  succeeded = self.status.succeeded(self.task)
148
155
  terminated = succeeded or bool(self.status.violated)
149
156
  truncated = bool(self.status.timed_out)
150
- return self.observe(), float(succeeded), terminated, truncated, self._info()
157
+ reward = float(succeeded)
158
+ if self.reward == "subtasks":
159
+ reward = float(max(self.status.progress - self._best, 0))
160
+ self._best = max(self._best, self.status.progress)
161
+ return self.observe(), reward, terminated, truncated, self._info()
151
162
 
152
163
  def _info(self) -> dict:
153
164
  return {
@@ -8,7 +8,7 @@ from dataclasses import dataclass, field
8
8
  from .evaluation import evaluate, observe_history, unpack_expression
9
9
  from .modules import require_capabilities
10
10
  from .schema import Task
11
- from .transformations import concrete
11
+ from .transformations import concrete, concrete_condition
12
12
  from .vocabulary import CONNECTIVES
13
13
 
14
14
  # An object that moved more than this between two checks is still moving.
@@ -24,6 +24,7 @@ class Status:
24
24
  done: list[str] = field(default_factory=list)
25
25
  violated: str = ""
26
26
  timed_out: bool = False
27
+ progress: int = 0
27
28
 
28
29
  @property
29
30
  def failed(self) -> bool:
@@ -57,11 +58,52 @@ def _placed_in(tree) -> list[str]:
57
58
  return [args[0]] if isinstance(args[0], str) else []
58
59
 
59
60
 
61
+ def _milestones(tree, task: Task):
62
+ """A condition as the milestones it counts: its words, joined as the goal joins them."""
63
+ name, args = unpack_expression(tree)
64
+ if name == "and":
65
+ return ("all", [_milestones(a, task) for a in args])
66
+ if name == "or":
67
+ return ("any", [_milestones(a, task) for a in args])
68
+ if name in ("at_least", "between") and isinstance(args[0], dict) and "tally" in args[0]:
69
+ _, (parts,) = unpack_expression(args[0])
70
+ return ("count", [_milestones(p, task) for p in parts], int(args[1]))
71
+ placed = {n.split("/")[0] for n in _placed_in(tree)}
72
+ return ("word", concrete_condition(task, tree), placed)
73
+
74
+
75
+ def _most(node) -> int:
76
+ """How many milestones a node counts in all."""
77
+ if node[0] == "all":
78
+ return sum(_most(n) for n in node[1])
79
+ if node[0] == "any":
80
+ return max((_most(n) for n in node[1]), default=0)
81
+ if node[0] == "count":
82
+ return node[2]
83
+ return 1
84
+
85
+
86
+ def _reached(node, state, history, handled) -> int:
87
+ """How many of a node's milestones hold now, with none of their objects handled."""
88
+ if node[0] == "all":
89
+ return sum(_reached(n, state, history, handled) for n in node[1])
90
+ if node[0] == "any":
91
+ return max((_reached(n, state, history, handled) for n in node[1]), default=0)
92
+ if node[0] == "count":
93
+ return min(sum(_reached(n, state, history, handled) for n in node[1]), node[2])
94
+ _, condition, placed = node
95
+ return int(not handled & placed and evaluate(condition, state, history))
96
+
97
+
60
98
  class Monitor:
61
99
  """Evaluates a concrete task's stages and always conditions as an episode runs.
62
100
 
63
101
  A stage completes once its condition has held for `hold` seconds while none of
64
102
  the objects it places is touched by the robot or still moving.
103
+
104
+ Progress counts the milestones reached the same way: each word of a stage's
105
+ condition, with `and` adding, `or` taking the best and `at_least` of a `tally`
106
+ counting up to its bound. Milestones that hold at the start count from the start.
65
107
  """
66
108
 
67
109
  def __init__(self, task: Task):
@@ -74,6 +116,10 @@ class Monitor:
74
116
  name: {n.split("/")[0] for n in _placed_in(stage.condition)}
75
117
  for name, stage in self.task.goal.stages.items()
76
118
  }
119
+ self._milestones = {
120
+ name: _milestones(condition, self.task)
121
+ for name, condition in self.task.milestones.items()
122
+ }
77
123
 
78
124
  def _moved(self, state) -> set[str]:
79
125
  """The placed objects that moved since the last check.
@@ -104,6 +150,7 @@ class Monitor:
104
150
  self.status = Status()
105
151
  self.history = {}
106
152
  self._held = dict.fromkeys(self.task.goal.stages, 0.0)
153
+ self._levels = {name: [math.inf] * _most(tree) for name, tree in self._milestones.items()}
107
154
  self._previous = dict.fromkeys(self.task.goal.stages, False)
108
155
  self._started = True
109
156
  self._finished_at = None
@@ -153,6 +200,7 @@ class Monitor:
153
200
  else:
154
201
  self._held[name] = 0.0
155
202
  self._previous[name] = eligible and holding
203
+ self.status.progress = self._progress(state, dt, handled)
156
204
  if self.status.succeeded(self.task) and self._finished_at is None:
157
205
  self._finished_at = time
158
206
  if self.task.time_limit is not None and time > self.task.time_limit:
@@ -160,3 +208,26 @@ class Monitor:
160
208
  self._finished_at is None or self._finished_at > self.task.time_limit
161
209
  )
162
210
  return self.status
211
+
212
+ def _progress(self, state, dt: float, handled: set) -> int:
213
+ """The milestones reached, each held for its stage's `hold` seconds."""
214
+ total = 0
215
+ for name, stage in self.task.goal.stages.items():
216
+ levels = self._levels[name]
217
+ if name in self.status.done:
218
+ total += len(levels)
219
+ continue
220
+ eligible = all(p in self.status.done for p in stage.after)
221
+ tree = self._milestones[name]
222
+ reached = (
223
+ _reached(tree, state, self.history, set() if stage.held else handled)
224
+ if eligible
225
+ else 0
226
+ )
227
+ for level, held in enumerate(levels):
228
+ if reached <= level:
229
+ levels[level] = None
230
+ else:
231
+ levels[level] = 0.0 if held is None else held + dt
232
+ total += sum(held is not None and held + 1e-9 >= stage.hold for held in levels)
233
+ return total
@@ -186,6 +186,7 @@ class Task(msgspec.Struct, omit_defaults=True):
186
186
  states: dict[str, dict[str, Any]] = {}
187
187
  time_limit: float | None = None
188
188
  source: Any = msgspec.field(default=None, name="__source__")
189
+ milestones: dict[str, Any] = msgspec.field(default_factory=dict, name="__milestones__")
189
190
 
190
191
  @property
191
192
  def root(self) -> Path:
@@ -153,6 +153,12 @@ def inline(task: Task) -> Task:
153
153
 
154
154
 
155
155
  def _expand_definitions(task: Task, words: dict) -> Task:
156
+ return _transform_conditions(task, _definitions(words))
157
+
158
+
159
+ def _definitions(words: dict):
160
+ """A function that expands the given words in a condition."""
161
+
156
162
  def fill(node, bindings):
157
163
  if isinstance(node, str):
158
164
  if node in bindings:
@@ -201,11 +207,16 @@ def _expand_definitions(task: Task, words: dict) -> Task:
201
207
  return {name: [args[0], walk(args[1]), *args[2:]]}
202
208
  return {name: [walk(a) for a in args]}
203
209
 
204
- return _transform_conditions(task, walk)
210
+ return walk
205
211
 
206
212
 
207
213
  def expand(task: Task) -> Task:
208
214
  """Expand `#tag` groups and quantifiers into conditions on named objects."""
215
+ return _transform_conditions(task, _quantifiers(task))
216
+
217
+
218
+ def _quantifiers(task: Task):
219
+ """A function that expands a task's `#tag` groups and quantifiers in a condition."""
209
220
 
210
221
  def rename(node, names: dict):
211
222
  if isinstance(node, str):
@@ -249,10 +260,27 @@ def expand(task: Task) -> Task:
249
260
  return {name: walk(args)}
250
261
  return {name: [members(a) if str(a).startswith("#") else walk(a) for a in args]}
251
262
 
252
- return _transform_conditions(task, walk)
263
+ return walk
253
264
 
254
265
 
255
266
  def concrete(task: Task) -> Task:
256
- """Groups, quantifiers and defined words all expanded, ready to evaluate."""
267
+ """Groups, quantifiers and defined words all expanded, ready to evaluate.
268
+
269
+ The stage conditions as they were before their words were expanded are kept in
270
+ `milestones`, for counting progress.
271
+ """
272
+ grouped = expand(task)
257
273
  # expand again after inlining: a defined word's body can hold quantifiers too
258
- return expand(inline(expand(task)))
274
+ result = expand(inline(grouped))
275
+ if not result.milestones:
276
+ result.milestones = {name: s.condition for name, s in grouped.goal.stages.items()}
277
+ return result
278
+
279
+
280
+ def concrete_condition(task: Task, condition):
281
+ """One of a task's conditions expanded as `concrete` expands the task's own."""
282
+ grow = _quantifiers(task)
283
+ condition = grow(condition)
284
+ if task.states:
285
+ condition = _definitions(task.states)(condition)
286
+ return grow(_definitions(VOCABULARY)(condition))
File without changes
File without changes
File without changes
File without changes