From 0b0c517bf4212aa7d12c8acbc3aacaa0fe1d5994 Mon Sep 17 00:00:00 2001 From: Kaiyu Zheng Date: Tue, 12 Mar 2024 19:22:24 -0400 Subject: [PATCH] docs --- docs/_sphinx_src/api/modules.rst | 1 + .../api/pomdp_py.problems.lasertag.rst | 10 - .../api/pomdp_py.problems.light_dark.rst | 2 + .../api/pomdp_py.problems.load_unload.rst | 2 + .../api/pomdp_py.problems.maze.rst | 2 + .../pomdp_py.problems.multi_object_search.rst | 2 + .../api/pomdp_py.problems.rocksample.rst | 2 + .../api/pomdp_py.problems.tiger.rst | 2 + docs/_sphinx_src/building_docs.rst | 6 +- docs/_sphinx_src/index.rst | 2 - docs/_sphinx_src/simple_rl_integration.rst | 6 - docs/html/_modules/index.html | 16 +- .../pomdp_py/algorithms/bsp/blqr.html | 22 +- .../pomdp_py/problems/light_dark/env/env.html | 10 +- .../problems/light_dark/env/plotting.html | 261 ++++++ .../problems/load_unload/load_unload.html | 535 ++++++++++++ .../problems/maze/domain/observation.html | 10 +- .../pomdp_py/problems/maze/domain/state.html | 10 +- .../pomdp_py/problems/maze/env/env.html | 10 +- .../multi_object_search/agent/agent.html | 10 +- .../multi_object_search/agent/belief.html | 10 +- .../multi_object_search/domain/action.html | 14 +- .../domain/observation.html | 10 +- .../multi_object_search/domain/state.html | 10 +- .../problems/multi_object_search/env/env.html | 10 +- .../multi_object_search/env/visual.html | 532 ++++++++++++ .../multi_object_search/example_worlds.html | 10 +- .../models/components/grid_map.html | 10 +- .../models/components/sensor.html | 10 +- .../models/observation_model.html | 10 +- .../models/policy_model.html | 18 +- .../models/reward_model.html | 10 +- .../models/transition_model.html | 10 +- .../problems/multi_object_search/problem.html | 510 +++++++++++ .../rocksample/rocksample_problem.html | 89 +- .../pomdp_py/problems/tag/agent/agent.html | 10 +- .../pomdp_py/problems/tag/domain/action.html | 10 +- .../problems/tag/domain/observation.html | 10 +- .../pomdp_py/problems/tag/domain/state.html | 10 +- .../pomdp_py/problems/tag/env/env.html | 193 +++++ .../pomdp_py/problems/tag/env/visual.html | 438 ++++++++++ .../pomdp_py/problems/tag/experiment.html | 187 ++++ .../tag/models/components/grid_map.html | 10 +- .../tag/models/components/motion_policy.html | 10 +- .../tag/models/observation_model.html | 10 +- .../problems/tag/models/policy_model.html | 10 +- .../problems/tag/models/reward_model.html | 10 +- .../problems/tag/models/transition_model.html | 10 +- .../pomdp_py/problems/tag/problem.html | 319 +++++++ .../problems/tiger/tiger_problem.html | 10 +- .../representations/belief/histogram.html | 10 +- docs/html/_modules/pomdp_py/utils/colors.html | 10 +- .../_modules/pomdp_py/utils/debugging.html | 50 +- .../pomdp_py/utils/interfaces/conversion.html | 10 +- .../pomdp_py/utils/interfaces/solvers.html | 10 +- docs/html/_modules/pomdp_py/utils/math.html | 10 +- docs/html/_modules/pomdp_py/utils/misc.html | 10 +- .../_modules/pomdp_py/utils/templates.html | 10 +- docs/html/_modules/pomdp_py/utils/typ.html | 10 +- .../problems/load_unload/load_unload.html | 535 ++++++++++++ .../problems/maze/domain/observation.html | 171 ++++ .../_modules/problems/maze/domain/state.html | 179 ++++ docs/html/_modules/problems/maze/env/env.html | 149 ++++ .../multi_object_search/agent/agent.html | 214 +++++ .../multi_object_search/agent/belief.html | 352 ++++++++ .../multi_object_search/domain/action.html | 327 +++++++ .../domain/observation.html | 248 ++++++ .../multi_object_search/domain/state.html | 255 ++++++ .../problems/multi_object_search/env/env.html | 412 +++++++++ .../multi_object_search/env/visual.html | 532 ++++++++++++ .../multi_object_search/example_worlds.html | 263 ++++++ .../models/components/grid_map.html | 206 +++++ .../models/components/sensor.html | 420 +++++++++ .../models/observation_model.html | 442 ++++++++++ .../models/policy_model.html | 208 +++++ .../models/reward_model.html | 231 +++++ .../models/transition_model.html | 386 +++++++++ .../problems/multi_object_search/problem.html | 510 +++++++++++ .../rocksample/rocksample_problem.html | 810 ++++++++++++++++++ .../_modules/problems/tag/agent/agent.html | 281 ++++++ .../_modules/problems/tag/domain/action.html | 166 ++++ .../problems/tag/domain/observation.html | 168 ++++ .../_modules/problems/tag/domain/state.html | 186 ++++ docs/html/_modules/problems/tag/env/env.html | 193 +++++ .../_modules/problems/tag/env/visual.html | 438 ++++++++++ .../_modules/problems/tag/experiment.html | 187 ++++ .../tag/models/components/grid_map.html | 207 +++++ .../tag/models/components/motion_policy.html | 249 ++++++ .../tag/models/observation_model.html | 186 ++++ .../problems/tag/models/policy_model.html | 176 ++++ .../problems/tag/models/reward_model.html | 180 ++++ .../problems/tag/models/transition_model.html | 245 ++++++ docs/html/_modules/problems/tag/problem.html | 319 +++++++ .../problems/tiger/tiger_problem.html | 589 +++++++++++++ docs/html/_sources/api/modules.rst.txt | 1 + .../api/pomdp_py.problems.light_dark.rst.txt | 2 + .../api/pomdp_py.problems.load_unload.rst.txt | 2 + .../api/pomdp_py.problems.maze.rst.txt | 2 + ...dp_py.problems.multi_object_search.rst.txt | 2 + .../api/pomdp_py.problems.rocksample.rst.txt | 2 + .../api/pomdp_py.problems.tiger.rst.txt | 2 + docs/html/_sources/building_docs.rst.txt | 6 +- docs/html/_sources/changelog.rst.txt | 26 + docs/html/_sources/index.rst.txt | 2 - docs/html/_sources/problems/modules.rst.txt | 7 + .../problems/problems.lasertag.rst.txt | 10 + .../problems.light_dark.agent.rst.txt | 21 + .../problems.light_dark.domain.rst.txt | 37 + .../problems/problems.light_dark.env.rst.txt | 37 + .../problems.light_dark.models.rst.txt | 29 + .../problems/problems.light_dark.rst.txt | 40 + .../problems/problems.load_unload.rst.txt | 21 + .../problems/problems.maze.domain.rst.txt | 37 + .../problems/problems.maze.env.rst.txt | 21 + .../problems.maze.models.components.rst.txt | 21 + .../problems/problems.maze.models.rst.txt | 18 + .../_sources/problems/problems.maze.rst.txt | 20 + ...problems.multi_object_search.agent.rst.txt | 29 + ...roblems.multi_object_search.domain.rst.txt | 37 + .../problems.multi_object_search.env.rst.txt | 29 + ...ti_object_search.models.components.rst.txt | 29 + ...roblems.multi_object_search.models.rst.txt | 53 ++ .../problems.multi_object_search.rst.txt | 40 + .../problems.rocksample.cythonize.rst.txt | 37 + .../problems/problems.rocksample.rst.txt | 29 + docs/html/_sources/problems/problems.rst.txt | 25 + .../problems/problems.tag.agent.rst.txt | 21 + .../problems/problems.tag.domain.rst.txt | 37 + .../problems/problems.tag.env.rst.txt | 29 + .../problems.tag.models.components.rst.txt | 29 + .../problems/problems.tag.models.rst.txt | 53 ++ .../_sources/problems/problems.tag.rst.txt | 56 ++ .../problems/problems.tiger.cythonize.rst.txt | 37 + .../_sources/problems/problems.tiger.rst.txt | 29 + docs/html/_static/documentation_options.js | 2 +- docs/html/_static/pygments.css | 1 - docs/html/api/modules.html | 79 +- docs/html/api/pomdp_py.algorithms.bsp.html | 10 +- docs/html/api/pomdp_py.algorithms.html | 47 +- docs/html/api/pomdp_py.algorithms.visual.html | 8 +- docs/html/api/pomdp_py.framework.html | 53 +- docs/html/api/pomdp_py.html | 23 +- docs/html/api/pomdp_py.problems.html | 117 ++- docs/html/api/pomdp_py.problems.lasertag.html | 10 +- .../pomdp_py.problems.light_dark.agent.html | 30 +- .../pomdp_py.problems.light_dark.domain.html | 30 +- .../api/pomdp_py.problems.light_dark.env.html | 68 +- .../api/pomdp_py.problems.light_dark.html | 55 +- .../pomdp_py.problems.light_dark.models.html | 30 +- .../api/pomdp_py.problems.load_unload.html | 375 +++++++- .../api/pomdp_py.problems.maze.domain.html | 10 +- docs/html/api/pomdp_py.problems.maze.env.html | 10 +- docs/html/api/pomdp_py.problems.maze.html | 57 +- ...dp_py.problems.maze.models.components.html | 32 +- .../api/pomdp_py.problems.maze.models.html | 30 +- ...py.problems.multi_object_search.agent.html | 10 +- ...y.problems.multi_object_search.domain.html | 10 +- ...p_py.problems.multi_object_search.env.html | 135 ++- ...pomdp_py.problems.multi_object_search.html | 121 ++- ...multi_object_search.models.components.html | 10 +- ...y.problems.multi_object_search.models.html | 10 +- ...omdp_py.problems.rocksample.cythonize.html | 30 +- .../api/pomdp_py.problems.rocksample.html | 62 +- .../html/api/pomdp_py.problems.tag.agent.html | 10 +- .../api/pomdp_py.problems.tag.domain.html | 10 +- docs/html/api/pomdp_py.problems.tag.env.html | 162 +++- docs/html/api/pomdp_py.problems.tag.html | 90 +- ...mdp_py.problems.tag.models.components.html | 10 +- .../api/pomdp_py.problems.tag.models.html | 10 +- .../pomdp_py.problems.tiger.cythonize.html | 36 +- docs/html/api/pomdp_py.problems.tiger.html | 39 +- .../api/pomdp_py.representations.belief.html | 10 +- ...pomdp_py.representations.distribution.html | 20 +- docs/html/api/pomdp_py.representations.html | 11 +- docs/html/api/pomdp_py.utils.debugging.html | 10 +- docs/html/api/pomdp_py.utils.html | 11 +- docs/html/api/pomdp_py.utils.interfaces.html | 11 +- docs/html/api/pomdp_py.visual.html | 8 +- docs/html/building_docs.html | 17 +- docs/html/changelog.html | 37 +- docs/html/design_principles.html | 10 +- docs/html/examples.action_prior.html | 16 +- docs/html/examples.external_solvers.html | 10 +- docs/html/examples.html | 10 +- docs/html/examples.mos.html | 14 +- docs/html/examples.tiger.html | 10 +- docs/html/existing_domains.html | 21 +- docs/html/existing_solvers.html | 16 +- docs/html/extensions.html | 10 +- docs/html/genindex.html | 351 +++++++- docs/html/index.html | 16 +- docs/html/installation.html | 10 +- docs/html/modules.html | 10 +- docs/html/objects.inv | Bin 6481 -> 7092 bytes docs/html/other_libraries.html | 10 +- docs/html/problems/modules.html | 217 +++++ docs/html/problems/problems.html | 526 ++++++++++++ docs/html/problems/problems.lasertag.html | 172 ++++ .../problems/problems.light_dark.agent.html | 182 ++++ .../problems/problems.light_dark.domain.html | 190 ++++ .../problems/problems.light_dark.env.html | 190 ++++ docs/html/problems/problems.light_dark.html | 221 +++++ .../problems/problems.light_dark.models.html | 186 ++++ docs/html/problems/problems.load_unload.html | 500 +++++++++++ docs/html/problems/problems.maze.domain.html | 211 +++++ docs/html/problems/problems.maze.env.html | 191 +++++ docs/html/problems/problems.maze.html | 234 +++++ .../problems.maze.models.components.html | 184 ++++ docs/html/problems/problems.maze.models.html | 188 ++++ .../problems.multi_object_search.agent.html | 265 ++++++ .../problems.multi_object_search.domain.html | 485 +++++++++++ .../problems.multi_object_search.env.html | 460 ++++++++++ .../problems.multi_object_search.html | 450 ++++++++++ ...multi_object_search.models.components.html | 349 ++++++++ .../problems.multi_object_search.models.html | 621 ++++++++++++++ .../problems.rocksample.cythonize.html | 249 ++++++ docs/html/problems/problems.rocksample.html | 657 ++++++++++++++ docs/html/problems/problems.tag.agent.html | 238 +++++ docs/html/problems/problems.tag.domain.html | 229 +++++ docs/html/problems/problems.tag.env.html | 327 +++++++ docs/html/problems/problems.tag.html | 355 ++++++++ .../problems.tag.models.components.html | 253 ++++++ docs/html/problems/problems.tag.models.html | 454 ++++++++++ .../problems/problems.tiger.cythonize.html | 248 ++++++ docs/html/problems/problems.tiger.html | 512 +++++++++++ docs/html/py-modindex.html | 49 +- docs/html/search.html | 8 +- docs/html/searchindex.js | 2 +- 228 files changed, 26569 insertions(+), 661 deletions(-) delete mode 100644 docs/_sphinx_src/api/pomdp_py.problems.lasertag.rst delete mode 100644 docs/_sphinx_src/simple_rl_integration.rst create mode 100644 docs/html/_modules/pomdp_py/problems/light_dark/env/plotting.html create mode 100644 docs/html/_modules/pomdp_py/problems/load_unload/load_unload.html create mode 100644 docs/html/_modules/pomdp_py/problems/multi_object_search/env/visual.html create mode 100644 docs/html/_modules/pomdp_py/problems/multi_object_search/problem.html create mode 100644 docs/html/_modules/pomdp_py/problems/tag/env/env.html create mode 100644 docs/html/_modules/pomdp_py/problems/tag/env/visual.html create mode 100644 docs/html/_modules/pomdp_py/problems/tag/experiment.html create mode 100644 docs/html/_modules/pomdp_py/problems/tag/problem.html create mode 100644 docs/html/_modules/problems/load_unload/load_unload.html create mode 100644 docs/html/_modules/problems/maze/domain/observation.html create mode 100644 docs/html/_modules/problems/maze/domain/state.html create mode 100644 docs/html/_modules/problems/maze/env/env.html create mode 100644 docs/html/_modules/problems/multi_object_search/agent/agent.html create mode 100644 docs/html/_modules/problems/multi_object_search/agent/belief.html create mode 100644 docs/html/_modules/problems/multi_object_search/domain/action.html create mode 100644 docs/html/_modules/problems/multi_object_search/domain/observation.html create mode 100644 docs/html/_modules/problems/multi_object_search/domain/state.html create mode 100644 docs/html/_modules/problems/multi_object_search/env/env.html create mode 100644 docs/html/_modules/problems/multi_object_search/env/visual.html create mode 100644 docs/html/_modules/problems/multi_object_search/example_worlds.html create mode 100644 docs/html/_modules/problems/multi_object_search/models/components/grid_map.html create mode 100644 docs/html/_modules/problems/multi_object_search/models/components/sensor.html create mode 100644 docs/html/_modules/problems/multi_object_search/models/observation_model.html create mode 100644 docs/html/_modules/problems/multi_object_search/models/policy_model.html create mode 100644 docs/html/_modules/problems/multi_object_search/models/reward_model.html create mode 100644 docs/html/_modules/problems/multi_object_search/models/transition_model.html create mode 100644 docs/html/_modules/problems/multi_object_search/problem.html create mode 100644 docs/html/_modules/problems/rocksample/rocksample_problem.html create mode 100644 docs/html/_modules/problems/tag/agent/agent.html create mode 100644 docs/html/_modules/problems/tag/domain/action.html create mode 100644 docs/html/_modules/problems/tag/domain/observation.html create mode 100644 docs/html/_modules/problems/tag/domain/state.html create mode 100644 docs/html/_modules/problems/tag/env/env.html create mode 100644 docs/html/_modules/problems/tag/env/visual.html create mode 100644 docs/html/_modules/problems/tag/experiment.html create mode 100644 docs/html/_modules/problems/tag/models/components/grid_map.html create mode 100644 docs/html/_modules/problems/tag/models/components/motion_policy.html create mode 100644 docs/html/_modules/problems/tag/models/observation_model.html create mode 100644 docs/html/_modules/problems/tag/models/policy_model.html create mode 100644 docs/html/_modules/problems/tag/models/reward_model.html create mode 100644 docs/html/_modules/problems/tag/models/transition_model.html create mode 100644 docs/html/_modules/problems/tag/problem.html create mode 100644 docs/html/_modules/problems/tiger/tiger_problem.html create mode 100644 docs/html/_sources/problems/modules.rst.txt create mode 100644 docs/html/_sources/problems/problems.lasertag.rst.txt create mode 100644 docs/html/_sources/problems/problems.light_dark.agent.rst.txt create mode 100644 docs/html/_sources/problems/problems.light_dark.domain.rst.txt create mode 100644 docs/html/_sources/problems/problems.light_dark.env.rst.txt create mode 100644 docs/html/_sources/problems/problems.light_dark.models.rst.txt create mode 100644 docs/html/_sources/problems/problems.light_dark.rst.txt create mode 100644 docs/html/_sources/problems/problems.load_unload.rst.txt create mode 100644 docs/html/_sources/problems/problems.maze.domain.rst.txt create mode 100644 docs/html/_sources/problems/problems.maze.env.rst.txt create mode 100644 docs/html/_sources/problems/problems.maze.models.components.rst.txt create mode 100644 docs/html/_sources/problems/problems.maze.models.rst.txt create mode 100644 docs/html/_sources/problems/problems.maze.rst.txt create mode 100644 docs/html/_sources/problems/problems.multi_object_search.agent.rst.txt create mode 100644 docs/html/_sources/problems/problems.multi_object_search.domain.rst.txt create mode 100644 docs/html/_sources/problems/problems.multi_object_search.env.rst.txt create mode 100644 docs/html/_sources/problems/problems.multi_object_search.models.components.rst.txt create mode 100644 docs/html/_sources/problems/problems.multi_object_search.models.rst.txt create mode 100644 docs/html/_sources/problems/problems.multi_object_search.rst.txt create mode 100644 docs/html/_sources/problems/problems.rocksample.cythonize.rst.txt create mode 100644 docs/html/_sources/problems/problems.rocksample.rst.txt create mode 100644 docs/html/_sources/problems/problems.rst.txt create mode 100644 docs/html/_sources/problems/problems.tag.agent.rst.txt create mode 100644 docs/html/_sources/problems/problems.tag.domain.rst.txt create mode 100644 docs/html/_sources/problems/problems.tag.env.rst.txt create mode 100644 docs/html/_sources/problems/problems.tag.models.components.rst.txt create mode 100644 docs/html/_sources/problems/problems.tag.models.rst.txt create mode 100644 docs/html/_sources/problems/problems.tag.rst.txt create mode 100644 docs/html/_sources/problems/problems.tiger.cythonize.rst.txt create mode 100644 docs/html/_sources/problems/problems.tiger.rst.txt create mode 100644 docs/html/problems/modules.html create mode 100644 docs/html/problems/problems.html create mode 100644 docs/html/problems/problems.lasertag.html create mode 100644 docs/html/problems/problems.light_dark.agent.html create mode 100644 docs/html/problems/problems.light_dark.domain.html create mode 100644 docs/html/problems/problems.light_dark.env.html create mode 100644 docs/html/problems/problems.light_dark.html create mode 100644 docs/html/problems/problems.light_dark.models.html create mode 100644 docs/html/problems/problems.load_unload.html create mode 100644 docs/html/problems/problems.maze.domain.html create mode 100644 docs/html/problems/problems.maze.env.html create mode 100644 docs/html/problems/problems.maze.html create mode 100644 docs/html/problems/problems.maze.models.components.html create mode 100644 docs/html/problems/problems.maze.models.html create mode 100644 docs/html/problems/problems.multi_object_search.agent.html create mode 100644 docs/html/problems/problems.multi_object_search.domain.html create mode 100644 docs/html/problems/problems.multi_object_search.env.html create mode 100644 docs/html/problems/problems.multi_object_search.html create mode 100644 docs/html/problems/problems.multi_object_search.models.components.html create mode 100644 docs/html/problems/problems.multi_object_search.models.html create mode 100644 docs/html/problems/problems.rocksample.cythonize.html create mode 100644 docs/html/problems/problems.rocksample.html create mode 100644 docs/html/problems/problems.tag.agent.html create mode 100644 docs/html/problems/problems.tag.domain.html create mode 100644 docs/html/problems/problems.tag.env.html create mode 100644 docs/html/problems/problems.tag.html create mode 100644 docs/html/problems/problems.tag.models.components.html create mode 100644 docs/html/problems/problems.tag.models.html create mode 100644 docs/html/problems/problems.tiger.cythonize.html create mode 100644 docs/html/problems/problems.tiger.html diff --git a/docs/_sphinx_src/api/modules.rst b/docs/_sphinx_src/api/modules.rst index a7d235a8..7d2b9ddd 100644 --- a/docs/_sphinx_src/api/modules.rst +++ b/docs/_sphinx_src/api/modules.rst @@ -5,3 +5,4 @@ pomdp_py :maxdepth: 4 pomdp_py + pomdp_py.problems diff --git a/docs/_sphinx_src/api/pomdp_py.problems.lasertag.rst b/docs/_sphinx_src/api/pomdp_py.problems.lasertag.rst deleted file mode 100644 index 1c5004c3..00000000 --- a/docs/_sphinx_src/api/pomdp_py.problems.lasertag.rst +++ /dev/null @@ -1,10 +0,0 @@ -pomdp\_py.problems.lasertag package -=================================== - -Module contents ---------------- - -.. automodule:: pomdp_py.problems.lasertag - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_sphinx_src/api/pomdp_py.problems.light_dark.rst b/docs/_sphinx_src/api/pomdp_py.problems.light_dark.rst index 3dc382ef..e11f5d4a 100644 --- a/docs/_sphinx_src/api/pomdp_py.problems.light_dark.rst +++ b/docs/_sphinx_src/api/pomdp_py.problems.light_dark.rst @@ -1,6 +1,8 @@ pomdp\_py.problems.light\_dark package ====================================== +.. include:: ../../../pomdp_py/problems/light_dark/README.rst + Subpackages ----------- diff --git a/docs/_sphinx_src/api/pomdp_py.problems.load_unload.rst b/docs/_sphinx_src/api/pomdp_py.problems.load_unload.rst index 0c600479..bf357ffa 100644 --- a/docs/_sphinx_src/api/pomdp_py.problems.load_unload.rst +++ b/docs/_sphinx_src/api/pomdp_py.problems.load_unload.rst @@ -1,6 +1,8 @@ pomdp\_py.problems.load\_unload package ======================================= +.. include:: ../../../pomdp_py/problems/load_unload/README.rst + Submodules ---------- diff --git a/docs/_sphinx_src/api/pomdp_py.problems.maze.rst b/docs/_sphinx_src/api/pomdp_py.problems.maze.rst index b30ee522..f780b7f6 100644 --- a/docs/_sphinx_src/api/pomdp_py.problems.maze.rst +++ b/docs/_sphinx_src/api/pomdp_py.problems.maze.rst @@ -1,6 +1,8 @@ pomdp\_py.problems.maze package =============================== +.. include:: ../../../pomdp_py/problems/maze/README.rst + Subpackages ----------- diff --git a/docs/_sphinx_src/api/pomdp_py.problems.multi_object_search.rst b/docs/_sphinx_src/api/pomdp_py.problems.multi_object_search.rst index 229f9e56..2d03418d 100644 --- a/docs/_sphinx_src/api/pomdp_py.problems.multi_object_search.rst +++ b/docs/_sphinx_src/api/pomdp_py.problems.multi_object_search.rst @@ -1,6 +1,8 @@ pomdp\_py.problems.multi\_object\_search package ================================================ +.. include:: ../../../pomdp_py/problems/multi_object_search/README.rst + Subpackages ----------- diff --git a/docs/_sphinx_src/api/pomdp_py.problems.rocksample.rst b/docs/_sphinx_src/api/pomdp_py.problems.rocksample.rst index 81374a6d..00764146 100644 --- a/docs/_sphinx_src/api/pomdp_py.problems.rocksample.rst +++ b/docs/_sphinx_src/api/pomdp_py.problems.rocksample.rst @@ -1,6 +1,8 @@ pomdp\_py.problems.rocksample package ===================================== +.. include:: ../../../pomdp_py/problems/rocksample/README.rst + Subpackages ----------- diff --git a/docs/_sphinx_src/api/pomdp_py.problems.tiger.rst b/docs/_sphinx_src/api/pomdp_py.problems.tiger.rst index ada2838a..c2e06ded 100644 --- a/docs/_sphinx_src/api/pomdp_py.problems.tiger.rst +++ b/docs/_sphinx_src/api/pomdp_py.problems.tiger.rst @@ -1,6 +1,8 @@ pomdp\_py.problems.tiger package ================================ +.. include:: ../../../pomdp_py/problems/tiger/README.rst + Subpackages ----------- diff --git a/docs/_sphinx_src/building_docs.rst b/docs/_sphinx_src/building_docs.rst index 9367fd1c..5efe5c8e 100644 --- a/docs/_sphinx_src/building_docs.rst +++ b/docs/_sphinx_src/building_docs.rst @@ -44,7 +44,7 @@ Building docs for `pomdp_py.problems` 2. Building docs for `pomdp_py`. Run :code:`sphinx-apidoc`:: - sphinx-apidoc -o problems/ ../../pomdp_py.problems + sphinx-apidoc -o problems/ ../../pomdp_py/problems 3. Generate web pages:: @@ -54,13 +54,13 @@ Building docs for `pomdp_py.problems` Note that when creating the documentation for a problem under :code:`pomdp_py.problems`, you may want to re-use the README file on github for the documentation. To do that, -first create a read-me file at :code:`pomdp_py.problems//README.rst` with desirable +first create a read-me file at :code:`pomdp_py/problems//README.rst` with desirable content that describes the problem. Then, include this read-me file at the top of the generated :code:`pomdp_py.problems..rst`, like so: .. code-block:: - .. include:: ../../../pomdp_py.problems//README.rst + .. include:: ../../../pomdp_py/problems//README.rst Note on Changelog diff --git a/docs/_sphinx_src/index.rst b/docs/_sphinx_src/index.rst index 8601b6b1..b2979662 100644 --- a/docs/_sphinx_src/index.rst +++ b/docs/_sphinx_src/index.rst @@ -40,7 +40,6 @@ Further * :doc:`extensions` * :doc:`other_libraries` * :doc:`building_docs` -* :doc:`simple_rl_integration` .. toctree:: :maxdepth: 2 @@ -76,7 +75,6 @@ API References :caption: API References api/modules - problems/modules Tools ----- diff --git a/docs/_sphinx_src/simple_rl_integration.rst b/docs/_sphinx_src/simple_rl_integration.rst deleted file mode 100644 index c505ce89..00000000 --- a/docs/_sphinx_src/simple_rl_integration.rst +++ /dev/null @@ -1,6 +0,0 @@ -Integration with `simple_rl` -============================ - -.. include:: api/pomdp_py.utils.interfaces.rst - - diff --git a/docs/html/_modules/index.html b/docs/html/_modules/index.html index 9d9cb1c2..7858432c 100644 --- a/docs/html/_modules/index.html +++ b/docs/html/_modules/index.html @@ -4,10 +4,10 @@ - Overview: module code — pomdp_py 1.3.4 documentation - + Overview: module code — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

A framework to build and solve POMDP problems (v1.3.4).

+

A framework to build and solve POMDP problems (v1.3.5).

@@ -122,6 +122,8 @@

All modules for which code is available

  • pomdp_py.framework.oopomdp
  • pomdp_py.framework.planner
  • pomdp_py.problems.light_dark.env.env
  • +
  • pomdp_py.problems.light_dark.env.plotting
  • +
  • pomdp_py.problems.load_unload.load_unload
  • pomdp_py.problems.maze.domain.observation
  • pomdp_py.problems.maze.domain.state
  • pomdp_py.problems.maze.env.env
  • @@ -131,6 +133,7 @@

    All modules for which code is available

  • pomdp_py.problems.multi_object_search.domain.observation
  • pomdp_py.problems.multi_object_search.domain.state
  • pomdp_py.problems.multi_object_search.env.env
  • +
  • pomdp_py.problems.multi_object_search.env.visual
  • pomdp_py.problems.multi_object_search.example_worlds
  • pomdp_py.problems.multi_object_search.models.components.grid_map
  • pomdp_py.problems.multi_object_search.models.components.sensor
  • @@ -138,18 +141,23 @@

    All modules for which code is available

  • pomdp_py.problems.multi_object_search.models.policy_model
  • pomdp_py.problems.multi_object_search.models.reward_model
  • pomdp_py.problems.multi_object_search.models.transition_model
  • +
  • pomdp_py.problems.multi_object_search.problem
  • pomdp_py.problems.rocksample.cythonize.rocksample_problem
  • pomdp_py.problems.rocksample.rocksample_problem
  • pomdp_py.problems.tag.agent.agent
  • pomdp_py.problems.tag.domain.action
  • pomdp_py.problems.tag.domain.observation
  • pomdp_py.problems.tag.domain.state
  • +
  • pomdp_py.problems.tag.env.env
  • +
  • pomdp_py.problems.tag.env.visual
  • +
  • pomdp_py.problems.tag.experiment
  • pomdp_py.problems.tag.models.components.grid_map
  • pomdp_py.problems.tag.models.components.motion_policy
  • pomdp_py.problems.tag.models.observation_model
  • pomdp_py.problems.tag.models.policy_model
  • pomdp_py.problems.tag.models.reward_model
  • pomdp_py.problems.tag.models.transition_model
  • +
  • pomdp_py.problems.tag.problem
  • pomdp_py.problems.tiger.cythonize.tiger_problem
  • pomdp_py.problems.tiger.tiger_problem
  • pomdp_py.representations.belief.histogram
  • diff --git a/docs/html/_modules/pomdp_py/algorithms/bsp/blqr.html b/docs/html/_modules/pomdp_py/algorithms/bsp/blqr.html index 8b3c7a63..750af4e2 100644 --- a/docs/html/_modules/pomdp_py/algorithms/bsp/blqr.html +++ b/docs/html/_modules/pomdp_py/algorithms/bsp/blqr.html @@ -4,10 +4,10 @@ - pomdp_py.algorithms.bsp.blqr — pomdp_py 1.3.4 documentation - + pomdp_py.algorithms.bsp.blqr — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    @@ -124,7 +126,7 @@

    Source code for pomdp_py.algorithms.bsp.blqr

    -[docs]
    +[docs]
     class BLQR(pomdp_py.Planner):
         def __init__(
             self,
    @@ -187,7 +189,7 @@ 

    Source code for pomdp_py.algorithms.bsp.blqr

    self._dim_control = self._R.shape[0]
     
     
    -[docs] +[docs] def ekf_update_mlo(self, bt, ut): """ Performs the ekf belief update assuming maximum likelihood observation. @@ -261,7 +263,7 @@

    Source code for pomdp_py.algorithms.bsp.blqr

    return b_i_vec - b_ip1_vec
     
     
    -[docs] +[docs] def integrate_belief_segment(self, b_i, u_i, num_segments): """This is to represent equation 18. @@ -300,7 +302,7 @@

    Source code for pomdp_py.algorithms.bsp.blqr

    return self.segmented_cost_function(bu_traj, b_des, u_des, num_segments)
     
     
    -[docs] +[docs] def segmented_cost_function(self, bu_traj, b_des, u_des, num_segments): """The cost function in eq 17. @@ -339,7 +341,7 @@

    Source code for pomdp_py.algorithms.bsp.blqr

    -[docs]
    +[docs]
         def create_plan(
             self,
             b_0,
    @@ -422,7 +424,7 @@ 

    Source code for pomdp_py.algorithms.bsp.blqr

    -[docs]
    +[docs]
         def interpret_sqp_plan(self, opt_res, num_segments):
             x_res = opt_res.x
             plan = []
    diff --git a/docs/html/_modules/pomdp_py/problems/light_dark/env/env.html b/docs/html/_modules/pomdp_py/problems/light_dark/env/env.html
    index 563f8e94..81cbe0d1 100644
    --- a/docs/html/_modules/pomdp_py/problems/light_dark/env/env.html
    +++ b/docs/html/_modules/pomdp_py/problems/light_dark/env/env.html
    @@ -4,10 +4,10 @@
       
         
         
    -    pomdp_py.problems.light_dark.env.env — pomdp_py 1.3.4 documentation
    -    
    +    pomdp_py.problems.light_dark.env.env — pomdp_py 1.3.5 documentation
    +    
         
    -    
    +    
         
         
         
    @@ -34,7 +34,7 @@
     
     
     
    -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/light_dark/env/plotting.html b/docs/html/_modules/pomdp_py/problems/light_dark/env/plotting.html new file mode 100644 index 00000000..52445873 --- /dev/null +++ b/docs/html/_modules/pomdp_py/problems/light_dark/env/plotting.html @@ -0,0 +1,261 @@ + + + + + + + pomdp_py.problems.light_dark.env.plotting — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for pomdp_py.problems.light_dark.env.plotting

    +"""Plotting utilties"""
    +
    +import matplotlib.pyplot as plt
    +
    +
    +
    +[docs] +def plot_points( + xvals, + yvals, + color=None, + size=1.5, + label=None, + connected=True, + style="--", + linewidth=1.5, + xlabel="x", + ylabel="f(x)", + loc="lower right", +): + if not connected: + plt.scatter(xvals, yvals, s=size, c=color, label=label) + else: + plt.plot(xvals, yvals, style, linewidth=linewidth, label=label) + # plt.axhline(y=0, color='k') + # plt.axvline(x=0, color='k') + plt.xlabel(xlabel) + plt.ylabel(ylabel) + plt.legend(loc=loc)
    + + + +# Plot polygons with colors +
    +[docs] +def plot_polygons(verts, colors, ax=None, edgecolor=None): + """ + `verts` is a sequence of ( verts0, verts1, ...) where verts_i is a sequence of + xy tuples of vertices, or an equivalent numpy array of shape (nv, 2). + + `c` is a sequence of (color0, color1, ...) where color_i is a color, + represented by a hex string (7 characters #xxxxxx). + + Creates a PolygonCollection object in the axis `ax`.""" + if ax is None: + fig = plt.gcf() + ax = fig.add_subplot(1, 1, 1) + pc = PolyCollection(verts) + pc.set_edgecolor(edgecolor) + pc.set_facecolor(colors) + ax.add_collection(pc) + ax.set_xlabel("X axis") + ax.set_ylabel("Y axis")
    + + + +
    +[docs] +def plot_line( + ax, p1, p2, linewidth=1, color="black", zorder=0, alpha=1.0, linestyle="-" +): + p1x, p1y = p1 + p2x, p2y = p2 + line = lines.Line2D( + [p1x, p2x], + [p1y, p2y], + linewidth=linewidth, + color=color, + zorder=zorder, + alpha=alpha, + linestyle=linestyle, + ) + ax.add_line(line)
    + + + +
    +[docs] +def plot_circle( + ax, + center, + radius, + color="blue", + fill=False, + zorder=0, + linewidth=0, + edgecolor=None, + label_text=None, + alpha=1.0, + text_color="white", +): + px, py = center + circ = plt.Circle( + (px, py), + radius, + facecolor=color, + fill=fill, + zorder=zorder, + linewidth=linewidth, + edgecolor=edgecolor, + alpha=alpha, + ) + ax.add_artist(circ) + if label_text: + text = ax.text( + px, + py, + label_text, + color=text_color, + ha="center", + va="center", + size=7, + weight="bold", + ) + text.set_path_effects( + [ + path_effects.Stroke(linewidth=1, foreground="black"), + path_effects.Normal(), + ] + )
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/pomdp_py/problems/load_unload/load_unload.html b/docs/html/_modules/pomdp_py/problems/load_unload/load_unload.html new file mode 100644 index 00000000..8cf92a95 --- /dev/null +++ b/docs/html/_modules/pomdp_py/problems/load_unload/load_unload.html @@ -0,0 +1,535 @@ + + + + + + + pomdp_py.problems.load_unload.load_unload — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for pomdp_py.problems.load_unload.load_unload

    +"""The load unload problem. An agent is placed on a one dimensional grid world
    +and is tasked with loading itself up on the right side of the world and
    +unloading on the left. The agent can observe whether or not it is in the load or
    +unload block but can not tell its exact location of whether it is loaded or
    +unloaded. Therefore the agent must maintain belief about it's location and load
    +status.
    +
    +States are defined by the location of the agent and whether or not it is loaded
    +Actions: "move-left", "move-right"
    +Rewards:
    +    +100 for moving into the unload block while loaded
    +    -1 otherwise
    +
    +"""
    +
    +import pomdp_py
    +import random
    +import numpy as np
    +import sys
    +import copy
    +import matplotlib.pyplot as plt
    +from matplotlib.animation import FuncAnimation
    +
    +
    +EPSILON = 1e-3
    +LOAD_LOCATION = 10
    +
    +
    +
    +[docs] +class LUState(pomdp_py.State): + def __init__(self, x, loaded): + if type(x) != int or x < 0: + raise ValueError( + "Invalid state: {}\n".format((x, loaded)) + "x must be an integer > 0" + ) + if type(loaded) != bool: + raise ValueError( + "Invalid state: {}\n".format((x, loaded)) + "loaded must be a boolean" + ) + if x == 0 and loaded == True: + raise ValueError("Agent can not be loaded in the 0th position") + if x == LOAD_LOCATION and loaded == False: + raise ValueError("Agent can not be unloaded in the last position") + + self.x = x + self.loaded = loaded + + def __hash__(self): + return hash((self.x, self.loaded)) + + def __eq__(self, other): + if isinstance(other, LUState): + return self.x == other.x and self.loaded == self.loaded + elif type(other) == tuple: + return self.x == other[0] and self.loaded == other[1] + + def __str__(self): + return str((self.x, self.loaded)) + + def __repr__(self): + return "State({})".format(self)
    + + + +
    +[docs] +class LUAction(pomdp_py.Action): + def __init__(self, name): + if name not in ["move-left", "move-right"]: + raise ValueError("Invalid action: %s" % name) + + self.name = name + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, LUAction): + return self.name == other.name + elif type(other) == str: + return self.name == other + + def __str__(self): + return self.name + + def __repr__(self): + return "Action(%s)" % self.name
    + + + +
    +[docs] +class LUObservation(pomdp_py.Observation): + def __init__(self, obs): + if obs not in ["load", "unload", "middle"]: + raise ValueError( + "Invalid observation: {}\n".format(name) + + "Observation must be an integer > 0" + ) + self.name = obs + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, LUObservation): + return self.name == other.name + elif type(other) == str: + return self.name == other + + def __str__(self): + return str(self.name) + + def __repr__(self): + return "Observation(%s)" % str(self.x)
    + + + +# Observation model +
    +[docs] +class LUObservationModel(pomdp_py.ObservationModel): + """This problem is small enough for the probabilities to be directly given + externally""" + +
    +[docs] + def probability(self, observation, next_state, action, normalized=False, **kwargs): + if observation != self.sample(next_state, action): + # return EPSILON to avoid degradation of particles + return EPSILON + else: + return 1 - EPSILON
    + + +
    +[docs] + def sample(self, next_state, action, normalized=False, **kwargs): + if next_state.x == 0: + return LUObservation("unload") + elif next_state.x == LOAD_LOCATION: + return LUObservation("load") + else: + return LUObservation("middle")
    + + +
    +[docs] + def argmax(self, next_state, action, normalized=False, **kwargs): + """Returns the most likely observation""" + return self.sample(next_state, action)
    +
    + + + +# Transition Model +
    +[docs] +class LUTransitionModel(pomdp_py.TransitionModel): + """This problem is small enough for the probabilities to be directly given + externally""" + +
    +[docs] + def probability(self, next_state, state, action, normalized=False, **kwargs): + if next_state != self.sample(state, action): + return EPSILON + else: + return 1 - EPSILON
    + + +
    +[docs] + def sample(self, state, action, normalized=False, **kwargs): + if (state.x == LOAD_LOCATION and action == "move-right") or ( + state.x == 0 and action == "move-left" + ): + # trying to make invalid move, stay in the same place + return state + + if action == "move-right": + # make sure we're always loaded in the far right cell + if state.x == LOAD_LOCATION - 1: + return LUState(state.x + 1, True) + return LUState(state.x + 1, state.loaded) + + if action == "move-left": + # make sure we're always unloaded in the first cell + if state.x == 1: + return LUState(state.x - 1, False) + return LUState(state.x - 1, state.loaded)
    + + +
    +[docs] + def argmax(self, state, action, normalized=False, **kwargs): + """Returns the most likely next state""" + return self.sample(state, action)
    +
    + + + +# Reward Model +
    +[docs] +class LURewardModel(pomdp_py.RewardModel): +
    +[docs] + def probability( + self, reward, state, action, next_state, normalized=False, **kwargs + ): + if reward == self.sample(state, action): + return 1.0 + else: + return 0.0
    + + +
    +[docs] + def sample(self, state, action, next_state, normalized=False, **kwargs): + # if we are unloaded things, give reward 100, otherwise give -1 + if action == "move-left" and state.loaded == True and state.x == 1: + return 100 + else: + return -1
    + + +
    +[docs] + def argmax(self, state, action, next_state, normalized=False, **kwargs): + """Returns the most likely reward""" + return self.sample(state, action)
    +
    + + + +# Policy Model +
    +[docs] +class LUPolicyModel(pomdp_py.RandomRollout): + """This is an extremely dumb policy model; To keep consistent + with the framework.""" + + def __init__(self): + self._all_actions = {LUAction("move-right"), LUAction("move-left")} + +
    +[docs] + def probability(self, action, state, normalized=False, **kwargs): + raise NotImplementedError # Never used
    + + +
    +[docs] + def sample(self, state, normalized=False, **kwargs): + return self.get_all_actions().random()
    + + +
    +[docs] + def argmax(self, state, normalized=False, **kwargs): + """Returns the most likely reward""" + raise NotImplementedError
    + + +
    +[docs] + def get_all_actions(self, **kwargs): + return self._all_actions
    +
    + + + +
    +[docs] +class LoadUnloadProblem(pomdp_py.POMDP): + def __init__(self, init_state, init_belief): + """init_belief is a Distribution.""" + agent = pomdp_py.Agent( + init_belief, + LUPolicyModel(), + LUTransitionModel(), + LUObservationModel(), + LURewardModel(), + ) + + env = pomdp_py.Environment(init_state, LUTransitionModel(), LURewardModel()) + + super().__init__(agent, env, name="LoadUnloadProblem")
    + + + +
    +[docs] +def generate_random_state(): + # Flip a coin to determine if we are loaded + loaded = np.random.rand() > 0.5 + location = np.random.randint(0, LOAD_LOCATION + 1) + if location == 0: + loaded = False + if location == LOAD_LOCATION: + loaded = True + return LUState(location, loaded)
    + + + +
    +[docs] +def generate_init_belief(num_particles): + particles = [] + for _ in range(num_particles): + particles.append(generate_random_state()) + + return pomdp_py.Particles(particles)
    + + + +
    +[docs] +def test_planner(load_unload_problem, planner, nsteps=3, discount=0.95): + gamma = 1.0 + total_reward = 0 + total_discounted_reward = 0 + + fig = plt.figure() + plt.title("Load/Unload problem (Red = empty, Blue = full)") + plt.xlabel("Position") + + ax = fig.add_subplot(111) + ax.set_xlim(-1, LOAD_LOCATION + 1) + ax.set_ylim(0, 2) + x, y = [], [] + (scat,) = ax.plot(x, y, marker="x", markersize=20, ls=" ", color="black") + + def update(t): + nonlocal gamma, total_reward, total_discounted_reward + print("==== Step %d ====" % (t + 1)) + action = planner.plan(load_unload_problem.agent) + + env_reward = load_unload_problem.env.state_transition(action, execute=True) + true_state = copy.deepcopy(load_unload_problem.env.state) + + real_observation = load_unload_problem.env.provide_observation( + load_unload_problem.agent.observation_model, action + ) + load_unload_problem.agent.update_history(action, real_observation) + planner.update(load_unload_problem.agent, action, real_observation) + total_reward += env_reward + total_discounted_reward += env_reward * gamma + gamma *= discount + print("True state: %s" % true_state) + print("Action: %s" % str(action)) + print("Observation: %s" % str(real_observation)) + print("Reward: %s" % str(env_reward)) + print("Reward (Cumulative): %s" % str(total_reward)) + print("Reward (Cumulative Discounted): %s" % str(total_discounted_reward)) + print("Belief: %s" % str(load_unload_problem.agent.sample_belief())) + if isinstance(planner, pomdp_py.POUCT): + print("__num_sims__: %d" % planner.last_num_sims) + print("__plan_time__: %.5f" % planner.last_planning_time) + if isinstance(planner, pomdp_py.PORollout): + print("__best_reward__: %d" % planner.last_best_reward) + + new_x, new_y = [true_state.x], [1] + scat.set_data(new_x, new_y) + scat.set_color("b" if true_state.loaded else "r") + return (scat,) + + ani = FuncAnimation(fig, update, frames=nsteps, interval=500) + plt.show()
    + + + +
    +[docs] +def main(): + init_state = generate_random_state() + init_belief = generate_init_belief(num_particles=100) + load_unload_problem = LoadUnloadProblem(init_state, init_belief) + + print("** Testing POMCP **") + pomcp = pomdp_py.POMCP( + max_depth=100, + discount_factor=0.95, + num_sims=100, + exploration_const=110, + rollout_policy=load_unload_problem.agent.policy_model, + ) + test_planner(load_unload_problem, pomcp, nsteps=100)
    + + + +if __name__ == "__main__": + main() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/pomdp_py/problems/maze/domain/observation.html b/docs/html/_modules/pomdp_py/problems/maze/domain/observation.html index 55390774..1c3fd29a 100644 --- a/docs/html/_modules/pomdp_py/problems/maze/domain/observation.html +++ b/docs/html/_modules/pomdp_py/problems/maze/domain/observation.html @@ -4,10 +4,10 @@ - pomdp_py.problems.maze.domain.observation — pomdp_py 1.3.4 documentation - + pomdp_py.problems.maze.domain.observation — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/maze/domain/state.html b/docs/html/_modules/pomdp_py/problems/maze/domain/state.html index bac2ab30..ae64b6c6 100644 --- a/docs/html/_modules/pomdp_py/problems/maze/domain/state.html +++ b/docs/html/_modules/pomdp_py/problems/maze/domain/state.html @@ -4,10 +4,10 @@ - pomdp_py.problems.maze.domain.state — pomdp_py 1.3.4 documentation - + pomdp_py.problems.maze.domain.state — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/maze/env/env.html b/docs/html/_modules/pomdp_py/problems/maze/env/env.html index 500e54fa..5900cdb4 100644 --- a/docs/html/_modules/pomdp_py/problems/maze/env/env.html +++ b/docs/html/_modules/pomdp_py/problems/maze/env/env.html @@ -4,10 +4,10 @@ - pomdp_py.problems.maze.env.env — pomdp_py 1.3.4 documentation - + pomdp_py.problems.maze.env.env — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/agent/agent.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/agent/agent.html index 483da1ae..12dc9f02 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/agent/agent.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/agent/agent.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.agent.agent — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.agent.agent — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/agent/belief.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/agent/belief.html index 0e68d18c..f26aab99 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/agent/belief.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/agent/belief.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.agent.belief — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.agent.belief — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/action.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/action.html index 2f28d2d6..349ec576 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/action.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/action.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.domain.action — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.domain.action — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    @@ -296,9 +298,9 @@

    Source code for pomdp_py.problems.multi_object_search.domain.action

    Find = FindAction() if MOTION_SCHEME == "xy": - ALL_MOTION_ACTIONS = {MoveEast, MoveWest, MoveNorth, MoveSouth} + ALL_MOTION_ACTIONS = [MoveEast, MoveWest, MoveNorth, MoveSouth] elif MOTION_SCHEME == "vw": - ALL_MOTION_ACTIONS = {MoveForward, MoveBackward, MoveLeft, MoveRight} + ALL_MOTION_ACTIONS = [MoveForward, MoveBackward, MoveLeft, MoveRight] else: raise ValueError("motion scheme '%s' is invalid" % MOTION_SCHEME)
    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/observation.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/observation.html index 708e0fd4..5c528c22 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/observation.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/observation.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.domain.observation — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.domain.observation — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/state.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/state.html index dab6609f..3b5003eb 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/state.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/domain/state.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.domain.state — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.domain.state — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/env/env.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/env/env.html index 6b3d2c9a..b62b7df9 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/env/env.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/env/env.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.env.env — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.env.env — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/env/visual.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/env/visual.html new file mode 100644 index 00000000..4666176f --- /dev/null +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/env/visual.html @@ -0,0 +1,532 @@ + + + + + + + pomdp_py.problems.multi_object_search.env.visual — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for pomdp_py.problems.multi_object_search.env.visual

    +# Visualization of a MOS instance using pygame
    +#
    +# Note to run this file, you need to run the following
    +# in the parent directory of multi_object_search:
    +#
    +#   python -m multi_object_search.env.visual
    +#
    +
    +import pygame
    +import cv2
    +import math
    +import numpy as np
    +import random
    +import pomdp_py.utils as util
    +from pomdp_py.problems.multi_object_search.env.env import *
    +from pomdp_py.problems.multi_object_search.domain.observation import *
    +from pomdp_py.problems.multi_object_search.domain.action import *
    +from pomdp_py.problems.multi_object_search.domain.state import *
    +from pomdp_py.problems.multi_object_search.example_worlds import *
    +
    +
    +# Deterministic way to get object color
    +
    +[docs] +def object_color(objid, count): + color = [107, 107, 107] + if count % 3 == 0: + color[0] += 100 + (3 * (objid * 5 % 11)) + color[0] = max(12, min(222, color[0])) + elif count % 3 == 1: + color[1] += 100 + (3 * (objid * 5 % 11)) + color[1] = max(12, min(222, color[1])) + else: + color[2] += 100 + (3 * (objid * 5 % 11)) + color[2] = max(12, min(222, color[2])) + return tuple(color)
    + + + +#### Visualization through pygame #### +
    +[docs] +class MosViz: + def __init__(self, env, res=30, fps=30, controllable=False): + self._env = env + + self._res = res + self._img = self._make_gridworld_image(res) + self._last_observation = {} # map from robot id to MosOOObservation + self._last_viz_observation = {} # map from robot id to MosOOObservation + self._last_action = {} # map from robot id to Action + self._last_belief = {} # map from robot id to OOBelief + + self._controllable = controllable + self._running = False + self._fps = fps + self._playtime = 0.0 + + # Generate some colors, one per target object + colors = {} + for i, objid in enumerate(env.target_objects): + colors[objid] = object_color(objid, i) + self._target_colors = colors + + def _make_gridworld_image(self, r): + # Preparing 2d array + w, l = self._env.width, self._env.length + arr2d = np.full((self._env.width, self._env.length), 0) # free grids + state = self._env.state + for objid in state.object_states: + pose = state.object_states[objid]["pose"] + if state.object_states[objid].objclass == "robot": + arr2d[pose[0], pose[1]] = 0 # free grid + elif state.object_states[objid].objclass == "obstacle": + arr2d[pose[0], pose[1]] = 1 # obstacle + elif state.object_states[objid].objclass == "target": + arr2d[pose[0], pose[1]] = 2 # target + + # Creating image + img = np.full((w * r, l * r, 3), 255, dtype=np.int32) + for x in range(w): + for y in range(l): + if arr2d[x, y] == 0: # free + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (255, 255, 255), -1 + ) + elif arr2d[x, y] == 1: # obstacle + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (40, 31, 3), -1 + ) + elif arr2d[x, y] == 2: # target + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (255, 165, 0), -1 + ) + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (0, 0, 0), 1, 8 + ) + return img + + @property + def img_width(self): + return self._img.shape[0] + + @property + def img_height(self): + return self._img.shape[1] + + @property + def last_observation(self): + return self._last_observation + +
    +[docs] + def update(self, robot_id, action, observation, viz_observation, belief): + """ + Update the visualization after there is new real action and observation + and updated belief. + + Args: + observation (MosOOObservation): Real observation + viz_observation (MosOOObservation): An observation used to visualize + the sensing region. + """ + self._last_action[robot_id] = action + self._last_observation[robot_id] = observation + self._last_viz_observation[robot_id] = viz_observation + self._last_belief[robot_id] = belief
    + + +
    +[docs] + @staticmethod + def draw_robot(img, x, y, th, size, color=(255, 12, 12)): + radius = int(round(size / 2)) + cv2.circle(img, (y + radius, x + radius), radius, color, thickness=2) + + endpoint = ( + y + radius + int(round(radius * math.sin(th))), + x + radius + int(round(radius * math.cos(th))), + ) + cv2.line(img, (y + radius, x + radius), endpoint, color, 2)
    + + +
    +[docs] + @staticmethod + def draw_observation(img, z, rx, ry, rth, r, size, color=(12, 12, 255)): + assert type(z) == MosOOObservation, "%s != MosOOObservation" % (str(type(z))) + radius = int(round(r / 2)) + for objid in z.objposes: + if z.for_obj(objid).pose != ObjectObservation.NULL: + lx, ly = z.for_obj(objid).pose + cv2.circle( + img, (ly * r + radius, lx * r + radius), size, color, thickness=-1 + )
    + + +
    +[docs] + @staticmethod + def draw_belief(img, belief, r, size, target_colors): + """belief (OOBelief)""" + radius = int(round(r / 2)) + + circle_drawn = {} # map from pose to number of times drawn + + for objid in belief.object_beliefs: + if isinstance(belief.object_belief(objid).random(), RobotState): + continue + hist = belief.object_belief(objid).get_histogram() + color = target_colors[objid] + + last_val = -1 + count = 0 + for state in reversed(sorted(hist, key=hist.get)): + if state.objclass == "target": + if last_val != -1: + color = util.lighter(color, 1 - hist[state] / last_val) + if np.mean(np.array(color) / np.array([255, 255, 255])) < 0.99: + tx, ty = state["pose"] + if (tx, ty) not in circle_drawn: + circle_drawn[(tx, ty)] = 0 + circle_drawn[(tx, ty)] += 1 + + cv2.circle( + img, + (ty * r + radius, tx * r + radius), + size // circle_drawn[(tx, ty)], + color, + thickness=-1, + ) + last_val = hist[state] + + count += 1 + if last_val <= 0: + break
    + + + # PyGame interface functions +
    +[docs] + def on_init(self): + """pygame init""" + pygame.init() # calls pygame.font.init() + # init main screen and background + self._display_surf = pygame.display.set_mode( + (self.img_width, self.img_height), pygame.HWSURFACE + ) + self._background = pygame.Surface(self._display_surf.get_size()).convert() + self._clock = pygame.time.Clock() + + # Font + self._myfont = pygame.font.SysFont("Comic Sans MS", 30) + self._running = True
    + + +
    +[docs] + def on_event(self, event): + # TODO: Keyboard control multiple robots + robot_id = list(self._env.robot_ids)[0] # Just pick the first one. + + if event.type == pygame.QUIT: + self._running = False + elif event.type == pygame.KEYDOWN: + u = None # control signal according to motion model + action = None # control input by user + + # odometry model + if event.key == pygame.K_LEFT: + action = MoveLeft + elif event.key == pygame.K_RIGHT: + action = MoveRight + elif event.key == pygame.K_UP: + action = MoveForward + elif event.key == pygame.K_DOWN: + action = MoveBackward + # euclidean axis model + elif event.key == pygame.K_a: + action = MoveWest + elif event.key == pygame.K_d: + action = MoveEast + elif event.key == pygame.K_s: + action = MoveSouth + elif event.key == pygame.K_w: + action = MoveNorth + elif event.key == pygame.K_SPACE: + action = Look + elif event.key == pygame.K_RETURN: + action = Find + + if action is None: + return + + if self._controllable: + if isinstance(action, MotionAction): + reward = self._env.state_transition( + action, execute=True, robot_id=robot_id + ) + z = None + elif isinstance(action, LookAction) or isinstance(action, FindAction): + robot_pose = self._env.state.pose(robot_id) + z = self._env.sensors[robot_id].observe(robot_pose, self._env.state) + self._last_observation[robot_id] = z + self._last_viz_observation[robot_id] = z + reward = self._env.state_transition( + action, execute=True, robot_id=robot_id + ) + print("robot state: %s" % str(self._env.state.object_states[robot_id])) + print(" action: %s" % str(action.name)) + print(" observation: %s" % str(z)) + print(" reward: %s" % str(reward)) + print("------------") + return action
    + + +
    +[docs] + def on_loop(self): + self._playtime += self._clock.tick(self._fps) / 1000.0
    + + +
    +[docs] + def on_render(self): + # self._display_surf.blit(self._background, (0, 0)) + self.render_env(self._display_surf) + robot_id = list(self._env.robot_ids)[0] # Just pick the first one. + rx, ry, rth = self._env.state.pose(robot_id) + fps_text = "FPS: {0:.2f}".format(self._clock.get_fps()) + last_action = self._last_action.get(robot_id, None) + last_action_str = "no_action" if last_action is None else str(last_action) + pygame.display.set_caption( + "%s | Robot%d(%.2f,%.2f,%.2f) | %s | %s" + % ( + last_action_str, + robot_id, + rx, + ry, + rth * 180 / math.pi, + str(self._env.state.object_states[robot_id]["objects_found"]), + fps_text, + ) + ) + pygame.display.flip()
    + + +
    +[docs] + def on_cleanup(self): + pygame.quit()
    + + +
    +[docs] + def on_execute(self): + if self.on_init() == False: + self._running = False + + while self._running: + for event in pygame.event.get(): + self.on_event(event) + self.on_loop() + self.on_render() + self.on_cleanup()
    + + +
    +[docs] + def render_env(self, display_surf): + # draw robot, a circle and a vector + img = np.copy(self._img) + for i, robot_id in enumerate(self._env.robot_ids): + rx, ry, rth = self._env.state.pose(robot_id) + r = self._res # Not radius! + last_observation = self._last_observation.get(robot_id, None) + last_viz_observation = self._last_viz_observation.get(robot_id, None) + last_belief = self._last_belief.get(robot_id, None) + if last_belief is not None: + MosViz.draw_belief(img, last_belief, r, r // 3, self._target_colors) + if last_viz_observation is not None: + MosViz.draw_observation( + img, + last_viz_observation, + rx, + ry, + rth, + r, + r // 4, + color=(200, 200, 12), + ) + if last_observation is not None: + MosViz.draw_observation( + img, last_observation, rx, ry, rth, r, r // 8, color=(20, 20, 180) + ) + + MosViz.draw_robot( + img, rx * r, ry * r, rth, r, color=(12, 255 * (0.8 * (i + 1)), 12) + ) + pygame.surfarray.blit_array(display_surf, img)
    +
    + + + +
    +[docs] +def unittest(): + # If you don't want occlusion, use this: + laserstr = make_laser_sensor(90, (1, 8), 0.5, False) + # If you want occlusion, use this + # (the difference is mainly in angle_increment; this + # is due to the discretization - discretization may + # cause "strange" behavior when checking occlusion + # but the model is actually doing the right thing.) + laserstr_occ = make_laser_sensor(360, (1, 8), 0.5, True) + # Proximity sensor + proxstr = make_proximity_sensor(1.5, False) + proxstr_occ = make_proximity_sensor(1.5, True) + + worldmap, robot = world1 + worldstr = equip_sensors(worldmap, {robot: laserstr}) + + dim, robots, objects, obstacles, sensors = interpret(worldstr) + init_state = MosOOState({**objects, **robots}) + env = MosEnvironment(dim, init_state, sensors, obstacles=obstacles) + viz = MosViz(env, controllable=True) + viz.on_execute()
    + + + +if __name__ == "__main__": + unittest() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/example_worlds.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/example_worlds.html index 5d4427c5..b657b700 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/example_worlds.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/example_worlds.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.example_worlds — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.example_worlds — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/components/grid_map.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/components/grid_map.html index 0f09fb73..11bccbda 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/components/grid_map.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/components/grid_map.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.models.components.grid_map — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.models.components.grid_map — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/components/sensor.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/components/sensor.html index e6ba1c20..5e25b2bb 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/components/sensor.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/components/sensor.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.models.components.sensor — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.models.components.sensor — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/observation_model.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/observation_model.html index e5ce7ced..e093d1e2 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/observation_model.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/observation_model.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.models.observation_model — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.models.observation_model — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/policy_model.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/policy_model.html index 71ff962e..b492a6a7 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/policy_model.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/policy_model.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.models.policy_model — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.models.policy_model — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    @@ -163,17 +165,17 @@

    Source code for pomdp_py.problems.multi_object_search.models.policy_modellast_action = history[-1][0] if isinstance(last_action, LookAction): can_find = True - find_action = set({Find}) if can_find else set({}) + find_action = [Find] if can_find else [] if state is None: - return ALL_MOTION_ACTIONS | {Look} | find_action + return ALL_MOTION_ACTIONS + [Look] + find_action else: if self._grid_map is not None: valid_motions = self._grid_map.valid_motions( self.robot_id, state.pose(self.robot_id), ALL_MOTION_ACTIONS ) - return valid_motions | {Look} | find_action + return list(valid_motions) + [Look] + find_action else: - return ALL_MOTION_ACTIONS | {Look} | find_action

    + return ALL_MOTION_ACTIONS + [Look] + find_action
    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/reward_model.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/reward_model.html index 132c2e88..d95b0c14 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/reward_model.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/reward_model.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.models.reward_model — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.models.reward_model — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/transition_model.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/transition_model.html index 3de8f347..9cccfb03 100644 --- a/docs/html/_modules/pomdp_py/problems/multi_object_search/models/transition_model.html +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/models/transition_model.html @@ -4,10 +4,10 @@ - pomdp_py.problems.multi_object_search.models.transition_model — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.models.transition_model — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/multi_object_search/problem.html b/docs/html/_modules/pomdp_py/problems/multi_object_search/problem.html new file mode 100644 index 00000000..8efa2143 --- /dev/null +++ b/docs/html/_modules/pomdp_py/problems/multi_object_search/problem.html @@ -0,0 +1,510 @@ + + + + + + + pomdp_py.problems.multi_object_search.problem — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for pomdp_py.problems.multi_object_search.problem

    +"""2D Multi-Object Search (MOS) Task.
    +Uses the domain, models, and agent/environment
    +to actually define the POMDP problem for multi-object search.
    +Then, solve it using POUCT or POMCP."""
    +
    +import pomdp_py
    +from pomdp_py.problems.multi_object_search.env.env import *
    +from pomdp_py.problems.multi_object_search.env.visual import *
    +from pomdp_py.problems.multi_object_search.agent.agent import *
    +from pomdp_py.problems.multi_object_search.example_worlds import *
    +from pomdp_py.problems.multi_object_search.domain.observation import *
    +from pomdp_py.problems.multi_object_search.models.components.grid_map import *
    +import argparse
    +import time
    +import random
    +
    +
    +
    +[docs] +class MosOOPOMDP(pomdp_py.OOPOMDP): + """ + A MosOOPOMDP is instantiated given a string description + of the search world, sensor descriptions for robots, + and the necessary parameters for the agent's models. + + Note: This is of course a simulation, where you can + generate a world and know where the target objects are + and then construct the Environment object. But in the + real robot scenario, you don't know where the objects + are. In that case, as I have done it in the past, you + could construct an Environment object and give None to + the object poses. + """ + + def __init__( + self, + robot_id, + env=None, + grid_map=None, + sensors=None, + sigma=0.01, + epsilon=1, + belief_rep="histogram", + prior={}, + num_particles=100, + agent_has_map=False, + ): + """ + Args: + robot_id (int or str): the id of the agent that will solve this MosOOPOMDP. + If it is a `str`, it will be interpreted as an integer using `interpret_robot_id` + in env/env.py. + env (MosEnvironment): the environment. + grid_map (str): Search space description. See env/env.py:interpret. An example: + rx... + .x.xT + ..... + Ignored if env is not None + sensors (dict): map from robot character to sensor string. + For example: {'r': 'laser fov=90 min_range=1 max_range=5 + angle_increment=5'} + Ignored if env is not None + agent_has_map (bool): If True, we assume the agent is given the occupancy + grid map of the world. Then, the agent can use this + map to avoid planning invalid actions (bumping into things). + But this map does not help the agent's prior belief directly. + + sigma, epsilon: observation model paramters + belief_rep (str): belief representation. Either histogram or particles. + prior (dict or str): either a dictionary as defined in agent/belief.py + or a string, either "uniform" or "informed". For "uniform", a uniform + prior will be given. For "informed", a perfect prior will be given. + num_particles (int): setting for the particle belief representation + """ + if env is None: + assert grid_map is not None and sensors is not None, ( + "Since env is not provided, you must provide string descriptions" + "of the world and sensors." + ) + worldstr = equip_sensors(grid_map, sensors) + dim, robots, objects, obstacles, sensors = interpret(worldstr) + init_state = MosOOState({**objects, **robots}) + env = MosEnvironment(dim, init_state, sensors, obstacles=obstacles) + + # construct prior + if type(prior) == str: + if prior == "uniform": + prior = {} + elif prior == "informed": + prior = {} + for objid in env.target_objects: + groundtruth_pose = env.state.pose(objid) + prior[objid] = {groundtruth_pose: 1.0} + + # Potential extension: a multi-agent POMDP. For now, the environment + # can keep track of the states of multiple agents, but a POMDP is still + # only defined over a single agent. Perhaps, MultiAgent is just a kind + # of Agent, which will make the implementation of multi-agent POMDP cleaner. + robot_id = robot_id if type(robot_id) == int else interpret_robot_id(robot_id) + grid_map = ( + GridMap( + env.width, + env.length, + {objid: env.state.pose(objid) for objid in env.obstacles}, + ) + if agent_has_map + else None + ) + agent = MosAgent( + robot_id, + env.state.object_states[robot_id], + env.target_objects, + (env.width, env.length), + env.sensors[robot_id], + sigma=sigma, + epsilon=epsilon, + belief_rep=belief_rep, + prior=prior, + num_particles=num_particles, + grid_map=grid_map, + ) + super().__init__( + agent, + env, + name="MOS(%d,%d,%d)" % (env.width, env.length, len(env.target_objects)), + )
    + + + +### Belief Update ### +
    +[docs] +def belief_update(agent, real_action, real_observation, next_robot_state, planner): + """Updates the agent's belief; The belief update may happen + through planner update (e.g. when planner is POMCP).""" + # Updates the planner; In case of POMCP, agent's belief is also updated. + planner.update(agent, real_action, real_observation) + + # Update agent's belief, when planner is not POMCP + if not isinstance(planner, pomdp_py.POMCP): + # Update belief for every object + for objid in agent.cur_belief.object_beliefs: + belief_obj = agent.cur_belief.object_belief(objid) + if isinstance(belief_obj, pomdp_py.Histogram): + if objid == agent.robot_id: + # Assuming the agent can observe its own state: + new_belief = pomdp_py.Histogram({next_robot_state: 1.0}) + else: + # This is doing + # B(si') = normalizer * O(oi|si',sr',a) * sum_s T(si'|s,a)*B(si) + # + # Notes: First, objects are static; Second, + # O(oi|s',a) ~= O(oi|si',sr',a) according to the definition + # of the observation model in models/observation.py. Note + # that the exact belief update rule for this OOPOMDP needs to use + # a model like O(oi|si',sr',a) because it's intractable to + # consider s' (that means all combinations of all object + # states must be iterated). Of course, there could be work + # around (out of scope) - Consider a volumetric observaiton, + # instead of the object-pose observation. That means oi is a + # set of pixels (2D) or voxels (3D). Note the real + # observation, oi, is most likely sampled from O(oi|s',a) + # because real world considers the occlusion between objects + # (due to full state s'). The problem is how to compute the + # probability of this oi given s' and a, where it's + # intractable to obtain s'. To this end, we can make a + # simplifying assumption that an object is contained within + # one pixel (or voxel); The pixel (or voxel) is labeled to + # indicate free space or object. The label of each pixel or + # voxel is certainly a result of considering the full state + # s. The occlusion can be handled nicely with the volumetric + # observation definition. Then that assumption can reduce the + # observation model from O(oi|s',a) to O(label_i|s',a) and + # it becomes easy to define O(label_i=i|s',a) and O(label_i=FREE|s',a). + # These ideas are used in my recent 3D object search work. + new_belief = pomdp_py.update_histogram_belief( + belief_obj, + real_action, + real_observation.for_obj(objid), + agent.observation_model[objid], + agent.transition_model[objid], + # The agent knows the objects are static. + static_transition=objid != agent.robot_id, + oargs={"next_robot_state": next_robot_state}, + ) + else: + raise ValueError( + "Unexpected program state." + "Are you using the appropriate belief representation?" + ) + + agent.cur_belief.set_object_belief(objid, new_belief)
    + + + +### Solve the problem with POUCT/POMCP planner ### +### This is the main online POMDP solver logic ### +
    +[docs] +def solve( + problem, + max_depth=10, # planning horizon + discount_factor=0.99, + planning_time=1.0, # amount of time (s) to plan each step + exploration_const=1000, # exploration constant + visualize=True, + max_time=120, # maximum amount of time allowed to solve the problem + max_steps=500, +): # maximum number of planning steps the agent can take. + """ + This function terminates when: + - maximum time (max_time) reached; This time includes planning and updates + - agent has planned `max_steps` number of steps + - agent has taken n FindAction(s) where n = number of target objects. + + Args: + visualize (bool) if True, show the pygame visualization. + """ + + random_objid = random.sample(sorted(problem.env.target_objects), 1)[0] + random_object_belief = problem.agent.belief.object_beliefs[random_objid] + if isinstance(random_object_belief, pomdp_py.Histogram): + # Use POUCT + planner = pomdp_py.POUCT( + max_depth=max_depth, + discount_factor=discount_factor, + planning_time=planning_time, + exploration_const=exploration_const, + rollout_policy=problem.agent.policy_model, + ) # Random by default + elif isinstance(random_object_belief, pomdp_py.Particles): + # Use POMCP + planner = pomdp_py.POMCP( + max_depth=max_depth, + discount_factor=discount_factor, + planning_time=planning_time, + exploration_const=exploration_const, + rollout_policy=problem.agent.policy_model, + ) # Random by default + else: + raise ValueError( + "Unsupported object belief type %s" % str(type(random_object_belief)) + ) + + robot_id = problem.agent.robot_id + if visualize: + viz = MosViz( + problem.env, controllable=False + ) # controllable=False means no keyboard control. + if viz.on_init() == False: + raise Exception("Environment failed to initialize") + viz.update(robot_id, None, None, None, problem.agent.cur_belief) + viz.on_render() + + _time_used = 0 + _find_actions_count = 0 + _total_reward = 0 # total, undiscounted reward + for i in range(max_steps): + # Plan action + _start = time.time() + real_action = planner.plan(problem.agent) + _time_used += time.time() - _start + if _time_used > max_time: + break # no more time to update. + + # Execute action + reward = problem.env.state_transition( + real_action, execute=True, robot_id=robot_id + ) + + # Receive observation + _start = time.time() + real_observation = problem.env.provide_observation( + problem.agent.observation_model, real_action + ) + + # Updates + problem.agent.clear_history() # truncate history + problem.agent.update_history(real_action, real_observation) + belief_update( + problem.agent, + real_action, + real_observation, + problem.env.state.object_states[robot_id], + planner, + ) + _time_used += time.time() - _start + + # Info and render + _total_reward += reward + if isinstance(real_action, FindAction): + _find_actions_count += 1 + print("==== Step %d ====" % (i + 1)) + print("Action: %s" % str(real_action)) + print("Observation: %s" % str(real_observation)) + print("Reward: %s" % str(reward)) + print("Reward (Cumulative): %s" % str(_total_reward)) + print("Find Actions Count: %d" % _find_actions_count) + if isinstance(planner, pomdp_py.POUCT): + print("__num_sims__: %d" % planner.last_num_sims) + + if visualize: + # This is used to show the sensing range; Not sampled + # according to observation model. + robot_pose = problem.env.state.object_states[robot_id].pose + viz_observation = MosOOObservation({}) + if isinstance(real_action, LookAction) or isinstance( + real_action, FindAction + ): + viz_observation = problem.env.sensors[robot_id].observe( + robot_pose, problem.env.state + ) + viz.update( + robot_id, + real_action, + real_observation, + viz_observation, + problem.agent.cur_belief, + ) + viz.on_loop() + viz.on_render() + + # Termination check + if ( + set(problem.env.state.object_states[robot_id].objects_found) + == problem.env.target_objects + ): + print("Done!") + break + if _find_actions_count >= len(problem.env.target_objects): + print("FindAction limit reached.") + break + if _time_used > max_time: + print("Maximum time reached.") + break
    + + + +# Test +
    +[docs] +def unittest(): + # random world + grid_map, robot_char = random_world(10, 10, 5, 10) + laserstr = make_laser_sensor(90, (1, 4), 0.5, False) + proxstr = make_proximity_sensor(4, False) + problem = MosOOPOMDP( + robot_char, # r is the robot character + sigma=0.05, # observation model parameter + epsilon=0.95, # observation model parameter + grid_map=grid_map, + sensors={robot_char: proxstr}, + prior="uniform", + agent_has_map=True, + ) + solve( + problem, + max_depth=10, + discount_factor=0.99, + planning_time=1.0, + exploration_const=1000, + visualize=True, + max_time=120, + max_steps=500, + )
    + + + +if __name__ == "__main__": + unittest() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/pomdp_py/problems/rocksample/rocksample_problem.html b/docs/html/_modules/pomdp_py/problems/rocksample/rocksample_problem.html index 9e5333f9..ebcc7857 100644 --- a/docs/html/_modules/pomdp_py/problems/rocksample/rocksample_problem.html +++ b/docs/html/_modules/pomdp_py/problems/rocksample/rocksample_problem.html @@ -4,10 +4,10 @@ - pomdp_py.problems.rocksample.rocksample_problem — pomdp_py 1.3.4 documentation - + pomdp_py.problems.rocksample.rocksample_problem — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    @@ -114,8 +116,7 @@

    Donate/support

    Source code for pomdp_py.problems.rocksample.rocksample_problem

    -"""
    -RockSample(n,k) problem
    +"""RockSample(n,k) problem
     
     Origin: Heuristic Search Value Iteration for POMDPs (UAI 2004)
     
    @@ -140,12 +141,16 @@ 

    Source code for pomdp_py.problems.rocksample.rocksample_problem

    Check_i: receives a noisy observation about RockType_i (noise determined by eta (:math:`\eta`). eta=1 -> perfect sensor; eta=0 -> uniform) -Observation: observes the property of rock i when taking Check_i. +Observation: observes the property of rock i when taking Check_i. The + observation may be noisy, depending on an efficiency parameter which + decreases exponentially as the distance increases between the rover and + rock i. 'half_efficiency_dist' influences this parameter (larger, more robust) Reward: +10 for Sample a good rock. -10 for Sampling a bad rock. Move to exit area +10. Other actions have no cost or reward. Initial belief: every rock has equal probability of being Good or Bad. + """ import pomdp_py @@ -540,7 +545,7 @@

    Source code for pomdp_py.problems.rocksample.rocksample_problem

    def get_all_actions(self, **kwargs): state = kwargs.get("state", None) if state is None: - return self._all_actions + return list(self._all_actions) else: motions = set(self._all_actions) rover_x, rover_y = state.position @@ -550,7 +555,7 @@

    Source code for pomdp_py.problems.rocksample.rocksample_problem

    motions.remove(MoveNorth) if rover_y == self._n - 1: motions.remove(MoveSouth) - return motions | self._other_actions
    + return list(motions | self._other_actions)
    @@ -641,13 +646,15 @@

    Source code for pomdp_py.problems.rocksample.rocksample_problem

    print(string)
    - def __init__(self, n, k, init_state, rock_locs, init_belief): + def __init__( + self, n, k, init_state, rock_locs, init_belief, half_efficiency_dist=20 + ): self._n, self._k = n, k agent = pomdp_py.Agent( init_belief, RSPolicyModel(n, k), RSTransitionModel(n, rock_locs, self.in_exit_area), - RSObservationModel(rock_locs), + RSObservationModel(rock_locs, half_efficiency_dist=half_efficiency_dist), RSRewardModel(rock_locs, self.in_exit_area), ) env = pomdp_py.Environment( @@ -723,49 +730,57 @@

    Source code for pomdp_py.problems.rocksample.rocksample_problem

    -[docs] -def main(): - n, k = 5, 5 - init_state, rock_locs = RockSampleProblem.generate_instance(n, k) - # # For debugging purpose - # n, k = 2,2 - # rover_position = (0, 0) - # rock_locs = {} # map from rock location to rock id - # rock_locs[(0,1)] = 0 - # rock_locs[(1,1)] = 1 - # rocktypes = ('good', 'good') +
    +[docs] +def minimal_instance(**kwargs): + # A particular instance for debugging purpose + n, k = 2, 2 + rover_position = (0, 0) + rock_locs = {} # map from rock location to rock id + rock_locs[(0, 1)] = 0 + rock_locs[(1, 1)] = 1 + rocktypes = ("good", "good") # Ground truth state - # init_state = State(rover_position, rocktypes, False) - # belief = "uniform" - + init_state = State(rover_position, rocktypes, False) belief = "uniform" + init_belief = init_particles_belief(k, 200, init_state, belief=belief) + rocksample = RockSampleProblem(n, k, init_state, rock_locs, init_belief, **kwargs) + return rocksample
    + + - init_state_copy = copy.deepcopy(init_state) +
    +[docs] +def create_instance(n, k, **kwargs): + init_state, rock_locs = RockSampleProblem.generate_instance(n, k) + + belief = "uniform" # init belief (uniform), represented in particles; # We don't factor the state here; We are also not doing any action prior. init_belief = init_particles_belief(k, 200, init_state, belief=belief) - rocksample = RockSampleProblem(n, k, init_state, rock_locs, init_belief) + rocksample = RockSampleProblem(n, k, init_state, rock_locs, init_belief, **kwargs) + return rocksample
    + + + +
    +[docs] +def main(): + rocksample = debug_instance() # create_instance(7, 8) rocksample.print_state() print("*** Testing POMCP ***") pomcp = pomdp_py.POMCP( - max_depth=20, + max_depth=30, discount_factor=0.95, num_sims=10000, - exploration_const=20, + exploration_const=5, rollout_policy=rocksample.agent.policy_model, num_visits_init=1, ) - tt, ttd = test_planner(rocksample, pomcp, nsteps=100, discount=0.95) - - rocksample.env.state.position = init_state_copy.position - rocksample.env.state.rocktypes = init_state_copy.rocktypes - rocksample.env.state.terminal = False - init_belief = init_particles_belief(k, 200, rocksample.env.state, belief=belief) - rocksample.agent.set_belief(init_belief)
    + tt, ttd = test_planner(rocksample, pomcp, nsteps=100, discount=0.95)
    diff --git a/docs/html/_modules/pomdp_py/problems/tag/agent/agent.html b/docs/html/_modules/pomdp_py/problems/tag/agent/agent.html index e7156a09..9ba5c553 100644 --- a/docs/html/_modules/pomdp_py/problems/tag/agent/agent.html +++ b/docs/html/_modules/pomdp_py/problems/tag/agent/agent.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tag.agent.agent — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.agent.agent — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/tag/domain/action.html b/docs/html/_modules/pomdp_py/problems/tag/domain/action.html index 77905a83..a3f0806d 100644 --- a/docs/html/_modules/pomdp_py/problems/tag/domain/action.html +++ b/docs/html/_modules/pomdp_py/problems/tag/domain/action.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tag.domain.action — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.domain.action — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/tag/domain/observation.html b/docs/html/_modules/pomdp_py/problems/tag/domain/observation.html index ad81a5da..bf132c7d 100644 --- a/docs/html/_modules/pomdp_py/problems/tag/domain/observation.html +++ b/docs/html/_modules/pomdp_py/problems/tag/domain/observation.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tag.domain.observation — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.domain.observation — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/tag/domain/state.html b/docs/html/_modules/pomdp_py/problems/tag/domain/state.html index 32a4d0c8..b82f527d 100644 --- a/docs/html/_modules/pomdp_py/problems/tag/domain/state.html +++ b/docs/html/_modules/pomdp_py/problems/tag/domain/state.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tag.domain.state — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.domain.state — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/tag/env/env.html b/docs/html/_modules/pomdp_py/problems/tag/env/env.html new file mode 100644 index 00000000..44fa7806 --- /dev/null +++ b/docs/html/_modules/pomdp_py/problems/tag/env/env.html @@ -0,0 +1,193 @@ + + + + + + + pomdp_py.problems.tag.env.env — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for pomdp_py.problems.tag.env.env

    +import pomdp_py
    +from pomdp_py.problems.tag.domain.state import *
    +from pomdp_py.problems.tag.models.transition_model import *
    +from pomdp_py.problems.tag.models.reward_model import *
    +from pomdp_py.problems.tag.models.components.motion_policy import *
    +from pomdp_py.problems.tag.models.components.grid_map import *
    +from pomdp_py.problems.multi_object_search.env.env import interpret
    +from pomdp_py.problems.multi_object_search.env.visual import MosViz
    +
    +
    +
    +[docs] +class TagEnvironment(pomdp_py.Environment): + def __init__(self, init_state, grid_map, pr_stay=0.2, small=1, big=10): + self._grid_map = grid_map + target_motion_policy = TagTargetMotionPolicy(grid_map, pr_stay) + transition_model = TagTransitionModel(grid_map, target_motion_policy) + reward_model = TagRewardModel(small=small, big=big) + super().__init__(init_state, transition_model, reward_model) + + @property + def width(self): + return self._grid_map.width + + @property + def length(self): + return self._grid_map.length + + @property + def grid_map(self): + return self._grid_map + +
    +[docs] + @classmethod + def from_str(cls, worldstr, **kwargs): + dim, robots, objects, obstacles, _ = interpret(worldstr) + assert len(robots) == 1, "Does not support multiple robots." + robot_position = robots[list(robots.keys())[0]].pose[:2] + targets = [] + obstacle_poses = set({}) + for objid in objects: + if objid not in obstacles: + targets.append(objid) + else: + obstacle_poses.add(objects[objid].pose) + assert len(targets) == 1, "Does not support multiple objects." + target_position = objects[targets[0]].pose + init_state = TagState(robot_position, target_position, False) + grid_map = GridMap(dim[0], dim[1], obstacle_poses) + return TagEnvironment(init_state, grid_map, **kwargs)
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/pomdp_py/problems/tag/env/visual.html b/docs/html/_modules/pomdp_py/problems/tag/env/visual.html new file mode 100644 index 00000000..4ec4f395 --- /dev/null +++ b/docs/html/_modules/pomdp_py/problems/tag/env/visual.html @@ -0,0 +1,438 @@ + + + + + + + pomdp_py.problems.tag.env.visual — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for pomdp_py.problems.tag.env.visual

    +"""Largely based on MosViz, except this is not an OO-POMDP"""
    +
    +import pygame
    +import cv2
    +import math
    +import numpy as np
    +import random
    +import pomdp_py.utils as util
    +from pomdp_py.problems.tag.env.env import *
    +from pomdp_py.problems.tag.domain.observation import *
    +from pomdp_py.problems.tag.domain.action import *
    +from pomdp_py.problems.tag.domain.state import *
    +from pomdp_py.problems.tag.example_worlds import *
    +from pomdp_py.problems.tag.models.observation_model import *
    +
    +
    +#### Visualization through pygame ####
    +
    +[docs] +class TagViz: + def __init__(self, env, res=30, fps=30, controllable=False, observation_model=None): + self._env = env + + self._res = res + self._img = self._make_gridworld_image(res) + self._last_observation = None + self._last_action = None + self._last_belief = None + self._observation_model = observation_model + + self._controllable = controllable + self._running = False + self._fps = fps + self._playtime = 0.0 + + self._target_color = (200, 0, 50) + + def _make_gridworld_image(self, r): + # Preparing 2d array + w, l = self._env.width, self._env.length + arr2d = np.full((self._env.width, self._env.length), 0) # free grids + # Creating image + img = np.full((w * r, l * r, 3), 255, dtype=np.int32) + for x in range(w): + for y in range(l): + if (x, y) not in self._env.grid_map.obstacle_poses: + arr2d[x, y] == 0 # free + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (255, 255, 255), -1 + ) + else: + arr2d[x, y] == 1 # obstacle + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (40, 31, 3), -1 + ) + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (0, 0, 0), 1, 8 + ) + return img + + @property + def img_width(self): + return self._img.shape[0] + + @property + def img_height(self): + return self._img.shape[1] + + @property + def last_observation(self): + return self._last_observation + +
    +[docs] + def update(self, action, observation, belief): + """ + Update the visualization after there is new real action and observation + and updated belief. + """ + self._last_action = action + self._last_observation = observation + self._last_belief = belief
    + + +
    +[docs] + @staticmethod + def draw_robot(img, x, y, th, size, color=(255, 12, 12)): + radius = int(round(size / 2)) + cv2.circle(img, (y + radius, x + radius), radius, color, thickness=6)
    + + # endpoint = (y+radius + int(round(radius*math.sin(th))), + # x+radius + int(round(radius*math.cos(th)))) + # cv2.line(img, (y+radius,x+radius), endpoint, color, 2) + +
    +[docs] + @staticmethod + def draw_observation(img, z, rx, ry, rth, r, size, color=(12, 12, 255)): + assert type(z) == TagObservation, "%s != TagObservation" % (str(type(z))) + radius = int(round(r / 2)) + if z.target_position is not None: + lx, ly = z.target_position + cv2.circle( + img, (ly * r + radius, lx * r + radius), size, color, thickness=-1 + )
    + + + # TODO! Deprecated. +
    +[docs] + @staticmethod + def draw_belief(img, belief, r, size, target_color): + """belief (OOBelief)""" + radius = int(round(r / 2)) + + circle_drawn = {} # map from pose to number of times drawn + + hist = belief.get_histogram() + color = target_color + + last_val = -1 + count = 0 + for state in reversed(sorted(hist, key=hist.get)): + if last_val != -1: + color = util.lighter(color, 1 - hist[state] / last_val) + if np.mean(np.array(color) / np.array([255, 255, 255])) < 0.999: + tx, ty = state.target_position + if (tx, ty) not in circle_drawn: + circle_drawn[(tx, ty)] = 0 + circle_drawn[(tx, ty)] += 1 + + cv2.circle( + img, + (ty * r + radius, tx * r + radius), + size // circle_drawn[(tx, ty)], + color, + thickness=-1, + ) + last_val = hist[state] + + count += 1 + if last_val <= 0: + break
    + + + # PyGame interface functions +
    +[docs] + def on_init(self): + """pygame init""" + pygame.init() # calls pygame.font.init() + # init main screen and background + self._display_surf = pygame.display.set_mode( + (self.img_width, self.img_height), pygame.HWSURFACE + ) + self._background = pygame.Surface(self._display_surf.get_size()).convert() + self._clock = pygame.time.Clock() + + # Font + self._myfont = pygame.font.SysFont("Comic Sans MS", 30) + self._running = True
    + + +
    +[docs] + def on_event(self, event): + if event.type == pygame.QUIT: + self._running = False + # TODO! DEPRECATED! + elif event.type == pygame.KEYDOWN: + u = None # control signal according to motion model + action = None # control input by user + + if event.key == pygame.K_LEFT: + action = MoveWest2D + elif event.key == pygame.K_RIGHT: + action = MoveEast2D + elif event.key == pygame.K_DOWN: + action = MoveSouth2D + elif event.key == pygame.K_UP: + action = MoveNorth2D + elif event.key == pygame.K_SPACE: + action = TagAction() + + if action is None: + return + + if self._controllable: + reward = self._env.state_transition(action, execute=True) + robot_pose = self._env.state.robot_position + z = None + if self._observation_model is not None: + z = self._observation_model.sample(self._env.state, action) + self._last_observation = z + print(" state: %s" % str(self._env.state)) + print(" action: %s" % str(action.name)) + print(" observation: %s" % str(z)) + print(" reward: %s" % str(reward)) + print( + " valid motions: %s" + % str( + self._env.grid_map.valid_motions(self._env.state.robot_position) + ) + ) + print("------------") + if self._env.state.target_found: + self._running = False + return action
    + + +
    +[docs] + def on_loop(self): + self._playtime += self._clock.tick(self._fps) / 1000.0
    + + +
    +[docs] + def on_render(self): + # self._display_surf.blit(self._background, (0, 0)) + self.render_env(self._display_surf) + rx, ry = self._env.state.robot_position + fps_text = "FPS: {0:.2f}".format(self._clock.get_fps()) + last_action = self._last_action + last_action_str = "no_action" if last_action is None else str(last_action) + pygame.display.set_caption( + "%s | Robot(%.2f,%.2f,%.2f) | %s | %s" + % (last_action_str, rx, ry, 0, str(self._env.state.target_found), fps_text) + ) + pygame.display.flip()
    + + +
    +[docs] + def on_cleanup(self): + pygame.quit()
    + + +
    +[docs] + def on_execute(self): + if self.on_init() == False: + self._running = False + + while self._running: + for event in pygame.event.get(): + self.on_event(event) + self.on_loop() + self.on_render() + self.on_cleanup()
    + + +
    +[docs] + def render_env(self, display_surf): + img = np.copy(self._img) + r = self._res # Not radius! It's resolution. + + # draw target + tx, ty = self._env.state.target_position + cv2.rectangle( + img, (ty * r, tx * r), (ty * r + r, tx * r + r), (255, 165, 0), -1 + ) + + # draw robot + rx, ry = self._env.state.robot_position + r = self._res # Not radius! + # last_observation = self._last_observation.get(robot_id, None) + # last_viz_observation = self._last_viz_observation.get(robot_id, None) + # last_belief = self._last_belief.get(robot_id, None) + if self._last_belief is not None: + TagViz.draw_belief(img, self._last_belief, r, r // 3, self._target_color) + if self._last_observation is not None: + TagViz.draw_observation( + img, self._last_observation, rx, ry, 0, r, r // 8, color=(20, 20, 180) + ) + + TagViz.draw_robot(img, rx * r, ry * r, 0, r, color=(200, 12, 150)) + pygame.surfarray.blit_array(display_surf, img)
    +
    + + + +# TODO! DEPRECATED! +
    +[docs] +def unittest(): + worldmap, robot = world0 + env = TagEnvironment.from_str(worldmap) + observation_model = TagObservationModel() + viz = TagViz(env, controllable=True, observation_model=observation_model) + viz.on_execute()
    + + + +if __name__ == "__main__": + unittest() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/pomdp_py/problems/tag/experiment.html b/docs/html/_modules/pomdp_py/problems/tag/experiment.html new file mode 100644 index 00000000..621f6338 --- /dev/null +++ b/docs/html/_modules/pomdp_py/problems/tag/experiment.html @@ -0,0 +1,187 @@ + + + + + + + pomdp_py.problems.tag.experiment — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for pomdp_py.problems.tag.experiment

    +"""Simple experiment to get mean"""
    +
    +from pomdp_py.problems.tag.problem import *
    +import numpy as np
    +
    +
    +
    +[docs] +def trial(worldstr, **kwargs): + grid_map = GridMap.from_str(worldstr) + free_cells = grid_map.free_cells() + init_robot_position = random.sample(free_cells, 1)[0] + init_target_position = random.sample(free_cells, 1)[0] + + problem = TagProblem(init_robot_position, init_target_position, grid_map, **kwargs) + discounted_reward = solve( + problem, + max_depth=15, + discount_factor=0.95, + planning_time=0.7, + exploration_const=10, + visualize=True, + max_time=120, + max_steps=500, + ) + return discounted_reward
    + + + +
    +[docs] +def main(): + all_rewards = [] + try: + for i in range(100): + dr = trial(world0[0], pr_stay=0.5, small=1, big=10, prior="uniform") + all_rewards.append(dr) + finally: + print("All done!") + print("---------") + print("Average discounted reward: %.3f" % (np.mean(all_rewards))) + print("Std.dev discounted reward: %.3f" % (np.std(all_rewards)))
    + + + +if __name__ == "__main__": + main() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/pomdp_py/problems/tag/models/components/grid_map.html b/docs/html/_modules/pomdp_py/problems/tag/models/components/grid_map.html index 648da001..ae287fba 100644 --- a/docs/html/_modules/pomdp_py/problems/tag/models/components/grid_map.html +++ b/docs/html/_modules/pomdp_py/problems/tag/models/components/grid_map.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tag.models.components.grid_map — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.models.components.grid_map — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/tag/models/components/motion_policy.html b/docs/html/_modules/pomdp_py/problems/tag/models/components/motion_policy.html index 9c9e4cac..ee939c75 100644 --- a/docs/html/_modules/pomdp_py/problems/tag/models/components/motion_policy.html +++ b/docs/html/_modules/pomdp_py/problems/tag/models/components/motion_policy.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tag.models.components.motion_policy — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.models.components.motion_policy — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/tag/models/observation_model.html b/docs/html/_modules/pomdp_py/problems/tag/models/observation_model.html index c588bf78..27cdb7b5 100644 --- a/docs/html/_modules/pomdp_py/problems/tag/models/observation_model.html +++ b/docs/html/_modules/pomdp_py/problems/tag/models/observation_model.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tag.models.observation_model — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.models.observation_model — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/tag/models/policy_model.html b/docs/html/_modules/pomdp_py/problems/tag/models/policy_model.html index 13dd8bdd..cc1aee82 100644 --- a/docs/html/_modules/pomdp_py/problems/tag/models/policy_model.html +++ b/docs/html/_modules/pomdp_py/problems/tag/models/policy_model.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tag.models.policy_model — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.models.policy_model — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/tag/models/reward_model.html b/docs/html/_modules/pomdp_py/problems/tag/models/reward_model.html index 61920c26..890a6543 100644 --- a/docs/html/_modules/pomdp_py/problems/tag/models/reward_model.html +++ b/docs/html/_modules/pomdp_py/problems/tag/models/reward_model.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tag.models.reward_model — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.models.reward_model — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/tag/models/transition_model.html b/docs/html/_modules/pomdp_py/problems/tag/models/transition_model.html index 9a89b011..4a592c99 100644 --- a/docs/html/_modules/pomdp_py/problems/tag/models/transition_model.html +++ b/docs/html/_modules/pomdp_py/problems/tag/models/transition_model.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tag.models.transition_model — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.models.transition_model — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/problems/tag/problem.html b/docs/html/_modules/pomdp_py/problems/tag/problem.html new file mode 100644 index 00000000..cddd483e --- /dev/null +++ b/docs/html/_modules/pomdp_py/problems/tag/problem.html @@ -0,0 +1,319 @@ + + + + + + + pomdp_py.problems.tag.problem — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for pomdp_py.problems.tag.problem

    +import pomdp_py
    +import random
    +from pomdp_py.problems.tag.env.env import *
    +from pomdp_py.problems.tag.env.visual import *
    +from pomdp_py.problems.tag.agent.agent import *
    +from pomdp_py.problems.tag.example_worlds import *
    +import time
    +
    +
    +
    +[docs] +class TagProblem(pomdp_py.POMDP): + def __init__( + self, + init_robot_position, + init_target_position, + grid_map, + pr_stay=0.2, + small=1, + big=10, + prior="uniform", + belief_type="hist", + num_particles=6, + ): + init_state = TagState(init_robot_position, init_target_position, False) + env = TagEnvironment(init_state, grid_map, pr_stay=pr_stay, small=1, big=10) + if prior == "uniform": + prior = {} + elif prior == "informed": + prior = {init_target_position: 1.0} + else: + raise ValueError("Unrecognized prior type: %s" % prior) + + if belief_type == "particles": + init_belief = initialize_particles_belief( + grid_map, init_robot_position, prior=prior, num_particles=num_particles + ) + else: + init_belief = initialize_belief(grid_map, init_robot_position, prior=prior) + agent = TagAgent(init_belief, grid_map, pr_stay=pr_stay, small=1, big=10) + super().__init__(agent, env, name="TagProblem")
    + + + +
    +[docs] +def solve( + problem, + planner_type="pouct", + max_depth=10, # planning horizon + discount_factor=0.99, + planning_time=1.0, # amount of time (s) to plan each step + exploration_const=1000, # exploration constant + visualize=True, + max_time=120, # maximum amount of time allowed to solve the problem + max_steps=500, +): # maximum number of planning steps the agent can take. + if planner_type == "pouct": + planner = pomdp_py.POUCT( + max_depth=max_depth, + discount_factor=discount_factor, + planning_time=planning_time, + exploration_const=exploration_const, + rollout_policy=problem.agent.policy_model, + ) + else: + planner = pomdp_py.POMCP( + max_depth=max_depth, + discount_factor=discount_factor, + planning_time=planning_time, + exploration_const=exploration_const, + rollout_policy=problem.agent.policy_model, + ) + if visualize: + viz = TagViz(problem.env, controllable=False) + if viz.on_init() == False: + raise Exception("Environment failed to initialize") + viz.update(None, None, problem.agent.cur_belief) + viz.on_render() + + _discount = 1.0 + _time_used = 0 + _find_actions_count = 0 + _total_reward = 0 # total, undiscounted reward + _total_discounted_reward = 0 + for i in range(max_steps): + # Plan action + _start = time.time() + real_action = planner.plan(problem.agent) + _time_used += time.time() - _start + if _time_used > max_time: + break # no more time to update. + + # Execute action + reward = problem.env.state_transition(real_action, execute=True) + + # Receive observation + _start = time.time() + real_observation = problem.env.provide_observation( + problem.agent.observation_model, real_action + ) + + # Updates + problem.agent.clear_history() # truncate history + problem.agent.update_history(real_action, real_observation) + planner.update(problem.agent, real_action, real_observation) + if planner_type == "pouct": + belief_update(problem.agent, real_action, real_observation) + _time_used += time.time() - _start + + # Info and render + _total_reward += reward + _total_discounted_reward += reward * _discount + _discount = _discount * discount_factor + print("==== Step %d ====" % (i + 1)) + print("Action: %s" % str(real_action)) + print("Observation: %s" % str(real_observation)) + print("Reward: %s" % str(reward)) + print("Reward (Cumulative): %s" % str(_total_reward)) + print("Reward (Discounted): %s" % str(_total_discounted_reward)) + print("Find Actions Count: %d" % _find_actions_count) + if isinstance(planner, pomdp_py.POUCT): + print("__num_sims__: %d" % planner.last_num_sims) + + if visualize: + viz.update(real_action, real_observation, problem.agent.cur_belief) + viz.on_loop() + viz.on_render() + + # Termination check + if problem.env.state.target_found: + print("Done!") + break + if _time_used > max_time: + print("Maximum time reached.") + break + if _discount * 10 < 1e-4: + print("Discount factor already too small") + break + + return _total_discounted_reward
    + + + +
    +[docs] +def main(): + worldstr, robotstr = world0 + grid_map = GridMap.from_str(worldstr) + free_cells = grid_map.free_cells() + init_robot_position = random.sample(free_cells, 1)[0] + init_target_position = random.sample(free_cells, 1)[0] + + problem = TagProblem( + init_robot_position, + init_target_position, + grid_map, + pr_stay=0.2, + small=1, + big=10, + prior="uniform", + belief_type="histogram", + ) + solve( + problem, + max_depth=15, + discount_factor=0.95, + planning_time=0.8, + exploration_const=20, + visualize=True, + max_time=360, + max_steps=251, + planner_type="pouct", + )
    + + + +if __name__ == "__main__": + main() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/pomdp_py/problems/tiger/tiger_problem.html b/docs/html/_modules/pomdp_py/problems/tiger/tiger_problem.html index 97a0b2d2..4ad05dbd 100644 --- a/docs/html/_modules/pomdp_py/problems/tiger/tiger_problem.html +++ b/docs/html/_modules/pomdp_py/problems/tiger/tiger_problem.html @@ -4,10 +4,10 @@ - pomdp_py.problems.tiger.tiger_problem — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tiger.tiger_problem — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/representations/belief/histogram.html b/docs/html/_modules/pomdp_py/representations/belief/histogram.html index b4d9661e..86f372fc 100644 --- a/docs/html/_modules/pomdp_py/representations/belief/histogram.html +++ b/docs/html/_modules/pomdp_py/representations/belief/histogram.html @@ -4,10 +4,10 @@ - pomdp_py.representations.belief.histogram — pomdp_py 1.3.4 documentation - + pomdp_py.representations.belief.histogram — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/utils/colors.html b/docs/html/_modules/pomdp_py/utils/colors.html index 57f5f40c..123febd6 100644 --- a/docs/html/_modules/pomdp_py/utils/colors.html +++ b/docs/html/_modules/pomdp_py/utils/colors.html @@ -4,10 +4,10 @@ - pomdp_py.utils.colors — pomdp_py 1.3.4 documentation - + pomdp_py.utils.colors — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/utils/debugging.html b/docs/html/_modules/pomdp_py/utils/debugging.html index b9d33576..b76f7766 100644 --- a/docs/html/_modules/pomdp_py/utils/debugging.html +++ b/docs/html/_modules/pomdp_py/utils/debugging.html @@ -4,10 +4,10 @@ - pomdp_py.utils.debugging — pomdp_py 1.3.4 documentation - + pomdp_py.utils.debugging — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    @@ -439,7 +441,7 @@

    Source code for pomdp_py.utils.debugging

     
     
     
    -[docs] +[docs] class TreeDebugger: """ Helps you debug the search tree; A search tree is a tree @@ -491,7 +493,7 @@

    Source code for pomdp_py.utils.debugging

             return stats
     
     
    -[docs] +[docs] def num_nodes(self, kind="all"): """ Returns the total number of nodes in the tree rooted at "current" @@ -551,14 +553,14 @@

    Source code for pomdp_py.utils.debugging

             return self.num_nodes(kind="v")
     
     
    -[docs] +[docs] def l(self, depth, as_debuggers=True): """alias for layer""" return self.layer(depth, as_debuggers=as_debuggers)
    -[docs] +[docs] def layer(self, depth, as_debuggers=True): """ Returns a list of nodes at the given depth. Will only return VNodes. @@ -612,7 +614,7 @@

    Source code for pomdp_py.utils.debugging

             return leafs
     
     
    -[docs] +[docs] def step(self, key): """Updates current interaction node to follow the edge along key""" @@ -622,14 +624,14 @@

    Source code for pomdp_py.utils.debugging

     
     
     
    -[docs] +[docs] def s(self, key): """alias for step""" return self.step(key)
    -[docs] +[docs] def back(self): """move current node of interaction back to parent""" self.current = self.current.parent
    @@ -656,7 +658,7 @@

    Source code for pomdp_py.utils.debugging

             return self.current
     
     
    -[docs] +[docs] def p(self, *args, **kwargs): """print tree""" return self.current.p(*args, **kwargs)
    @@ -680,7 +682,7 @@

    Source code for pomdp_py.utils.debugging

             self.p("marked-only")
     
     
    -[docs] +[docs] def mark_sequence(self, seq, color=DEFAULT_MARK_COLOR): """ Given a list of keys (understandable by __getitem__ in _NodePP), @@ -696,21 +698,21 @@

    Source code for pomdp_py.utils.debugging

     
     
     
    -[docs] +[docs] def mark(self, seq, **kwargs): """alias for mark_sequence""" return self.mark_sequence(seq, **kwargs)
    -[docs] +[docs] def mark_path(self, dest, **kwargs): """paths the path to dest node""" return self.mark(self.path_to(dest), **kwargs)
    -[docs] +[docs] def markp(self, dest, **kwargs): """alias to mark_path""" return self.mark_path(dest, **kwargs)
    @@ -733,7 +735,7 @@

    Source code for pomdp_py.utils.debugging

             return self.preferred_actions(self.current, max_depth=None)
     
     
    -[docs] +[docs] def bestseqd(self, max_depth): """ alias for bestseq except with @@ -742,7 +744,7 @@

    Source code for pomdp_py.utils.debugging

     
     
     
    -[docs] +[docs] @staticmethod def single_node_str(node, parent_edge=None, indent=1, include_children=True): """ @@ -783,7 +785,7 @@

    Source code for pomdp_py.utils.debugging

     
     
     
    -[docs] +[docs] @staticmethod def preferred_actions(root, max_depth=None): """ @@ -827,7 +829,7 @@

    Source code for pomdp_py.utils.debugging

                 )
     
     
    -[docs] +[docs] def path(self, dest): """alias for path_to; Example usage: @@ -840,7 +842,7 @@

    Source code for pomdp_py.utils.debugging

     
     
     
    -[docs] +[docs] def path_to(self, dest): """Returns a list of keys (actions / observations) that represents the path from self.current to the given node `dest`. Returns None if the path does not @@ -875,7 +877,7 @@

    Source code for pomdp_py.utils.debugging

             return list(reversed(path))
     
     
    -[docs] +[docs] @staticmethod def tree_stats(root, max_depth=None): """Gether statistics about the tree""" @@ -925,14 +927,14 @@

    Source code for pomdp_py.utils.debugging

     
     
     
    -[docs] +[docs] def sorted_by_str(enumerable): return sorted(enumerable, key=lambda n: str(n))
    -[docs] +[docs] def interpret_color(colorstr): if colorstr.lower() in typ.colors: return eval("typ.{}".format(colorstr)) diff --git a/docs/html/_modules/pomdp_py/utils/interfaces/conversion.html b/docs/html/_modules/pomdp_py/utils/interfaces/conversion.html index c4076fd6..0b0938e5 100644 --- a/docs/html/_modules/pomdp_py/utils/interfaces/conversion.html +++ b/docs/html/_modules/pomdp_py/utils/interfaces/conversion.html @@ -4,10 +4,10 @@ - pomdp_py.utils.interfaces.conversion — pomdp_py 1.3.4 documentation - + pomdp_py.utils.interfaces.conversion — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/utils/interfaces/solvers.html b/docs/html/_modules/pomdp_py/utils/interfaces/solvers.html index a75429be..d4a8fa83 100644 --- a/docs/html/_modules/pomdp_py/utils/interfaces/solvers.html +++ b/docs/html/_modules/pomdp_py/utils/interfaces/solvers.html @@ -4,10 +4,10 @@ - pomdp_py.utils.interfaces.solvers — pomdp_py 1.3.4 documentation - + pomdp_py.utils.interfaces.solvers — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/utils/math.html b/docs/html/_modules/pomdp_py/utils/math.html index 52b470c9..3431f42a 100644 --- a/docs/html/_modules/pomdp_py/utils/math.html +++ b/docs/html/_modules/pomdp_py/utils/math.html @@ -4,10 +4,10 @@ - pomdp_py.utils.math — pomdp_py 1.3.4 documentation - + pomdp_py.utils.math — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/utils/misc.html b/docs/html/_modules/pomdp_py/utils/misc.html index 65b0dd3f..ffd3c2b9 100644 --- a/docs/html/_modules/pomdp_py/utils/misc.html +++ b/docs/html/_modules/pomdp_py/utils/misc.html @@ -4,10 +4,10 @@ - pomdp_py.utils.misc — pomdp_py 1.3.4 documentation - + pomdp_py.utils.misc — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/utils/templates.html b/docs/html/_modules/pomdp_py/utils/templates.html index 672fb1fa..0d130962 100644 --- a/docs/html/_modules/pomdp_py/utils/templates.html +++ b/docs/html/_modules/pomdp_py/utils/templates.html @@ -4,10 +4,10 @@ - pomdp_py.utils.templates — pomdp_py 1.3.4 documentation - + pomdp_py.utils.templates — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/pomdp_py/utils/typ.html b/docs/html/_modules/pomdp_py/utils/typ.html index c26554d5..1bea9c94 100644 --- a/docs/html/_modules/pomdp_py/utils/typ.html +++ b/docs/html/_modules/pomdp_py/utils/typ.html @@ -4,10 +4,10 @@ - pomdp_py.utils.typ — pomdp_py 1.3.4 documentation - + pomdp_py.utils.typ — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,10 +55,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/_modules/problems/load_unload/load_unload.html b/docs/html/_modules/problems/load_unload/load_unload.html new file mode 100644 index 00000000..c112a8bd --- /dev/null +++ b/docs/html/_modules/problems/load_unload/load_unload.html @@ -0,0 +1,535 @@ + + + + + + + problems.load_unload.load_unload — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.load_unload.load_unload

    +"""The load unload problem. An agent is placed on a one dimensional grid world
    +and is tasked with loading itself up on the right side of the world and
    +unloading on the left. The agent can observe whether or not it is in the load or
    +unload block but can not tell its exact location of whether it is loaded or
    +unloaded. Therefore the agent must maintain belief about it's location and load
    +status.
    +
    +States are defined by the location of the agent and whether or not it is loaded
    +Actions: "move-left", "move-right"
    +Rewards:
    +    +100 for moving into the unload block while loaded
    +    -1 otherwise
    +
    +"""
    +
    +import pomdp_py
    +import random
    +import numpy as np
    +import sys
    +import copy
    +import matplotlib.pyplot as plt
    +from matplotlib.animation import FuncAnimation
    +
    +
    +EPSILON = 1e-3
    +LOAD_LOCATION = 10
    +
    +
    +
    +[docs] +class LUState(pomdp_py.State): + def __init__(self, x, loaded): + if type(x) != int or x < 0: + raise ValueError( + "Invalid state: {}\n".format((x, loaded)) + "x must be an integer > 0" + ) + if type(loaded) != bool: + raise ValueError( + "Invalid state: {}\n".format((x, loaded)) + "loaded must be a boolean" + ) + if x == 0 and loaded == True: + raise ValueError("Agent can not be loaded in the 0th position") + if x == LOAD_LOCATION and loaded == False: + raise ValueError("Agent can not be unloaded in the last position") + + self.x = x + self.loaded = loaded + + def __hash__(self): + return hash((self.x, self.loaded)) + + def __eq__(self, other): + if isinstance(other, LUState): + return self.x == other.x and self.loaded == self.loaded + elif type(other) == tuple: + return self.x == other[0] and self.loaded == other[1] + + def __str__(self): + return str((self.x, self.loaded)) + + def __repr__(self): + return "State({})".format(self)
    + + + +
    +[docs] +class LUAction(pomdp_py.Action): + def __init__(self, name): + if name not in ["move-left", "move-right"]: + raise ValueError("Invalid action: %s" % name) + + self.name = name + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, LUAction): + return self.name == other.name + elif type(other) == str: + return self.name == other + + def __str__(self): + return self.name + + def __repr__(self): + return "Action(%s)" % self.name
    + + + +
    +[docs] +class LUObservation(pomdp_py.Observation): + def __init__(self, obs): + if obs not in ["load", "unload", "middle"]: + raise ValueError( + "Invalid observation: {}\n".format(name) + + "Observation must be an integer > 0" + ) + self.name = obs + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, LUObservation): + return self.name == other.name + elif type(other) == str: + return self.name == other + + def __str__(self): + return str(self.name) + + def __repr__(self): + return "Observation(%s)" % str(self.x)
    + + + +# Observation model +
    +[docs] +class LUObservationModel(pomdp_py.ObservationModel): + """This problem is small enough for the probabilities to be directly given + externally""" + +
    +[docs] + def probability(self, observation, next_state, action, normalized=False, **kwargs): + if observation != self.sample(next_state, action): + # return EPSILON to avoid degradation of particles + return EPSILON + else: + return 1 - EPSILON
    + + +
    +[docs] + def sample(self, next_state, action, normalized=False, **kwargs): + if next_state.x == 0: + return LUObservation("unload") + elif next_state.x == LOAD_LOCATION: + return LUObservation("load") + else: + return LUObservation("middle")
    + + +
    +[docs] + def argmax(self, next_state, action, normalized=False, **kwargs): + """Returns the most likely observation""" + return self.sample(next_state, action)
    +
    + + + +# Transition Model +
    +[docs] +class LUTransitionModel(pomdp_py.TransitionModel): + """This problem is small enough for the probabilities to be directly given + externally""" + +
    +[docs] + def probability(self, next_state, state, action, normalized=False, **kwargs): + if next_state != self.sample(state, action): + return EPSILON + else: + return 1 - EPSILON
    + + +
    +[docs] + def sample(self, state, action, normalized=False, **kwargs): + if (state.x == LOAD_LOCATION and action == "move-right") or ( + state.x == 0 and action == "move-left" + ): + # trying to make invalid move, stay in the same place + return state + + if action == "move-right": + # make sure we're always loaded in the far right cell + if state.x == LOAD_LOCATION - 1: + return LUState(state.x + 1, True) + return LUState(state.x + 1, state.loaded) + + if action == "move-left": + # make sure we're always unloaded in the first cell + if state.x == 1: + return LUState(state.x - 1, False) + return LUState(state.x - 1, state.loaded)
    + + +
    +[docs] + def argmax(self, state, action, normalized=False, **kwargs): + """Returns the most likely next state""" + return self.sample(state, action)
    +
    + + + +# Reward Model +
    +[docs] +class LURewardModel(pomdp_py.RewardModel): +
    +[docs] + def probability( + self, reward, state, action, next_state, normalized=False, **kwargs + ): + if reward == self.sample(state, action): + return 1.0 + else: + return 0.0
    + + +
    +[docs] + def sample(self, state, action, next_state, normalized=False, **kwargs): + # if we are unloaded things, give reward 100, otherwise give -1 + if action == "move-left" and state.loaded == True and state.x == 1: + return 100 + else: + return -1
    + + +
    +[docs] + def argmax(self, state, action, next_state, normalized=False, **kwargs): + """Returns the most likely reward""" + return self.sample(state, action)
    +
    + + + +# Policy Model +
    +[docs] +class LUPolicyModel(pomdp_py.RandomRollout): + """This is an extremely dumb policy model; To keep consistent + with the framework.""" + + def __init__(self): + self._all_actions = {LUAction("move-right"), LUAction("move-left")} + +
    +[docs] + def probability(self, action, state, normalized=False, **kwargs): + raise NotImplementedError # Never used
    + + +
    +[docs] + def sample(self, state, normalized=False, **kwargs): + return self.get_all_actions().random()
    + + +
    +[docs] + def argmax(self, state, normalized=False, **kwargs): + """Returns the most likely reward""" + raise NotImplementedError
    + + +
    +[docs] + def get_all_actions(self, **kwargs): + return self._all_actions
    +
    + + + +
    +[docs] +class LoadUnloadProblem(pomdp_py.POMDP): + def __init__(self, init_state, init_belief): + """init_belief is a Distribution.""" + agent = pomdp_py.Agent( + init_belief, + LUPolicyModel(), + LUTransitionModel(), + LUObservationModel(), + LURewardModel(), + ) + + env = pomdp_py.Environment(init_state, LUTransitionModel(), LURewardModel()) + + super().__init__(agent, env, name="LoadUnloadProblem")
    + + + +
    +[docs] +def generate_random_state(): + # Flip a coin to determine if we are loaded + loaded = np.random.rand() > 0.5 + location = np.random.randint(0, LOAD_LOCATION + 1) + if location == 0: + loaded = False + if location == LOAD_LOCATION: + loaded = True + return LUState(location, loaded)
    + + + +
    +[docs] +def generate_init_belief(num_particles): + particles = [] + for _ in range(num_particles): + particles.append(generate_random_state()) + + return pomdp_py.Particles(particles)
    + + + +
    +[docs] +def test_planner(load_unload_problem, planner, nsteps=3, discount=0.95): + gamma = 1.0 + total_reward = 0 + total_discounted_reward = 0 + + fig = plt.figure() + plt.title("Load/Unload problem (Red = empty, Blue = full)") + plt.xlabel("Position") + + ax = fig.add_subplot(111) + ax.set_xlim(-1, LOAD_LOCATION + 1) + ax.set_ylim(0, 2) + x, y = [], [] + (scat,) = ax.plot(x, y, marker="x", markersize=20, ls=" ", color="black") + + def update(t): + nonlocal gamma, total_reward, total_discounted_reward + print("==== Step %d ====" % (t + 1)) + action = planner.plan(load_unload_problem.agent) + + env_reward = load_unload_problem.env.state_transition(action, execute=True) + true_state = copy.deepcopy(load_unload_problem.env.state) + + real_observation = load_unload_problem.env.provide_observation( + load_unload_problem.agent.observation_model, action + ) + load_unload_problem.agent.update_history(action, real_observation) + planner.update(load_unload_problem.agent, action, real_observation) + total_reward += env_reward + total_discounted_reward += env_reward * gamma + gamma *= discount + print("True state: %s" % true_state) + print("Action: %s" % str(action)) + print("Observation: %s" % str(real_observation)) + print("Reward: %s" % str(env_reward)) + print("Reward (Cumulative): %s" % str(total_reward)) + print("Reward (Cumulative Discounted): %s" % str(total_discounted_reward)) + print("Belief: %s" % str(load_unload_problem.agent.sample_belief())) + if isinstance(planner, pomdp_py.POUCT): + print("__num_sims__: %d" % planner.last_num_sims) + print("__plan_time__: %.5f" % planner.last_planning_time) + if isinstance(planner, pomdp_py.PORollout): + print("__best_reward__: %d" % planner.last_best_reward) + + new_x, new_y = [true_state.x], [1] + scat.set_data(new_x, new_y) + scat.set_color("b" if true_state.loaded else "r") + return (scat,) + + ani = FuncAnimation(fig, update, frames=nsteps, interval=500) + plt.show()
    + + + +
    +[docs] +def main(): + init_state = generate_random_state() + init_belief = generate_init_belief(num_particles=100) + load_unload_problem = LoadUnloadProblem(init_state, init_belief) + + print("** Testing POMCP **") + pomcp = pomdp_py.POMCP( + max_depth=100, + discount_factor=0.95, + num_sims=100, + exploration_const=110, + rollout_policy=load_unload_problem.agent.policy_model, + ) + test_planner(load_unload_problem, pomcp, nsteps=100)
    + + + +if __name__ == "__main__": + main() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/maze/domain/observation.html b/docs/html/_modules/problems/maze/domain/observation.html new file mode 100644 index 00000000..64067b8d --- /dev/null +++ b/docs/html/_modules/problems/maze/domain/observation.html @@ -0,0 +1,171 @@ + + + + + + + problems.maze.domain.observation — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.maze.domain.observation

    +import pomdp_py
    +
    +
    +# we index the walls around a grid cell in
    +# clockwise fashion: top wall (0), right wall (1),
    +# bottom wall (2), left wall (3).
    +WALL = {0: "top", 1: "right", 2: "bottom", 3: "left"}
    +
    +
    +
    +[docs] +class Observation(pomdp_py.Observation): + def __init__(self, walls, orientation): + """ + Args: + walls (tuple) is a tuple of integers, that indicate the walls + around a grid cell that are present. + orientation (float) is the orientation of the robot. + """ + self.walls = walls + self.orientation = orientation + + def __hash__(self): + return hash((self.wall_case, self.orientation)) + + def __eq__(self, other): + if not isinstance(other, Observation): + return False + else: + return self.walls == other.walls and self.orientation == other.orientation
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/maze/domain/state.html b/docs/html/_modules/problems/maze/domain/state.html new file mode 100644 index 00000000..ab02857e --- /dev/null +++ b/docs/html/_modules/problems/maze/domain/state.html @@ -0,0 +1,179 @@ + + + + + + + problems.maze.domain.state — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.maze.domain.state

    +"""Defines the State for the maze domain, which is the position of the robot and its orientation.
    +"""
    +
    +import pomdp_py
    +import numpy as np
    +
    +
    +
    +[docs] +class State(pomdp_py.State): + """The state of the problem is just the robot position""" + + def __init__(self, positition, orientation): + """ + Initializes a state in light dark domain. + + Args: + position (tuple): position of the robot. + """ + if len(position) != 2: + raise ValueError("State position must be a vector of length 2") + self.position = positition + self.orientation = orientation + + def __hash__(self): + return hash(self.position, self.orientation) + + def __eq__(self, other): + if isinstance(other, State): + return self.position == other.position + else: + return False + + def __str__(self): + return self.__repr__() + + def __repr__(self): + return "State(%s)" % (str(self.position, self.orientation))
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/maze/env/env.html b/docs/html/_modules/problems/maze/env/env.html new file mode 100644 index 00000000..429e025a --- /dev/null +++ b/docs/html/_modules/problems/maze/env/env.html @@ -0,0 +1,149 @@ + + + + + + + problems.maze.env.env — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.maze.env.env

    +import pomdp_py
    +
    +
    +
    +[docs] +class MazeEnvironment(pomdp_py.Environment): + def __init__(self, init_state): + pass
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/agent/agent.html b/docs/html/_modules/problems/multi_object_search/agent/agent.html new file mode 100644 index 00000000..98259a66 --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/agent/agent.html @@ -0,0 +1,214 @@ + + + + + + + problems.multi_object_search.agent.agent — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.agent.agent

    +# Defines the agent. There's nothing special
    +# about the MOS agent in fact, except that
    +# it uses models defined in ..models, and
    +# makes use of the belief initialization
    +# functions in belief.py
    +import pomdp_py
    +from .belief import *
    +from ..models.transition_model import *
    +from ..models.observation_model import *
    +from ..models.reward_model import *
    +from ..models.policy_model import *
    +
    +
    +
    +[docs] +class MosAgent(pomdp_py.Agent): + """One agent is one robot.""" + + def __init__( + self, + robot_id, + init_robot_state, # initial robot state (assuming robot state is observable perfectly) + object_ids, # target object ids + dim, # tuple (w,l) of the width (w) and length (l) of the gridworld search space. + sensor, # Sensor equipped on the robot + sigma=0.01, # parameter for observation model + epsilon=1, # parameter for observation model + belief_rep="histogram", # belief representation, either "histogram" or "particles". + prior={}, # prior belief, as defined in belief.py:initialize_belief + num_particles=100, # used if the belief representation is particles + grid_map=None, + ): # GridMap used to avoid collision with obstacles (None if not provided) + self.robot_id = robot_id + self._object_ids = object_ids + self.sensor = sensor + + # since the robot observes its own pose perfectly, it will have 100% prior + # on this pose. + prior[robot_id] = {init_robot_state.pose: 1.0} + rth = init_robot_state.pose[2] + + # initialize belief + init_belief = initialize_belief( + dim, + self.robot_id, + self._object_ids, + prior=prior, + representation=belief_rep, + robot_orientations={self.robot_id: rth}, + num_particles=num_particles, + ) + transition_model = MosTransitionModel( + dim, {self.robot_id: self.sensor}, self._object_ids + ) + observation_model = MosObservationModel( + dim, self.sensor, self._object_ids, sigma=sigma, epsilon=epsilon + ) + reward_model = GoalRewardModel(self._object_ids, robot_id=self.robot_id) + policy_model = PolicyModel(self.robot_id, grid_map=grid_map) + super().__init__( + init_belief, + policy_model, + transition_model=transition_model, + observation_model=observation_model, + reward_model=reward_model, + ) + +
    +[docs] + def clear_history(self): + """Custum function; clear history""" + self._history = None
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/agent/belief.html b/docs/html/_modules/problems/multi_object_search/agent/belief.html new file mode 100644 index 00000000..82f126ea --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/agent/belief.html @@ -0,0 +1,352 @@ + + + + + + + problems.multi_object_search.agent.belief — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.agent.belief

    +# Defines the belief distribution and update for the 2D Multi-Object Search domain;
    +#
    +# The belief distribution is represented as a Histogram (or Tabular representation).
    +# Since the observation only contains mapping from object id to their location,
    +# the belief update has no leverage on the shape of the sensing region; this is
    +# makes the belief update algorithm more general to any sensing region but then
    +# requires updating the belief by iterating over the state space in a nested
    +# loop. The alternative is to use particle representation but also object-oriented.
    +# We try both here.
    +#
    +# We can directly make use of the Histogram and Particle classes in pomdp_py.
    +import pomdp_py
    +import random
    +import copy
    +from ..domain.state import *
    +
    +
    +
    +[docs] +class MosOOBelief(pomdp_py.OOBelief): + """This is needed to make sure the belief is sampling the right + type of State for this problem.""" + + def __init__(self, robot_id, object_beliefs): + """ + robot_id (int): The id of the robot that has this belief. + object_beliefs (objid -> GenerativeDistribution) + (includes robot) + """ + self.robot_id = robot_id + super().__init__(object_beliefs) + +
    +[docs] + def mpe(self, **kwargs): + return MosOOState(pomdp_py.OOBelief.mpe(self, **kwargs).object_states)
    + + +
    +[docs] + def random(self, **kwargs): + return MosOOState(pomdp_py.OOBelief.random(self, **kwargs).object_states)
    +
    + + + +
    +[docs] +def initialize_belief( + dim, + robot_id, + object_ids, + prior={}, + representation="histogram", + robot_orientations={}, + num_particles=100, +): + """ + Returns a GenerativeDistribution that is the belief representation for + the multi-object search problem. + + Args: + dim (tuple): a tuple (width, length) of the search space gridworld. + robot_id (int): robot id that this belief is initialized for. + object_ids (dict): a set of object ids that we want to model the belief distribution + over; They are `assumed` to be the target objects, not obstacles, + because the robot doesn't really care about obstacle locations and + modeling them just adds computation cost. + prior (dict): A mapping {(objid|robot_id) -> {(x,y) -> [0,1]}}. If used, then + all locations not included in the prior will be treated to have 0 probability. + If unspecified for an object, then the belief over that object is assumed + to be a uniform distribution. + robot_orientations (dict): Mapping from robot id to their initial orientation (radian). + Assumed to be 0 if robot id not in this dictionary. + num_particles (int): Maximum number of particles used to represent the belief + + Returns: + GenerativeDistribution: the initial belief representation. + """ + if representation == "histogram": + return _initialize_histogram_belief( + dim, robot_id, object_ids, prior, robot_orientations + ) + elif representation == "particles": + return _initialize_particles_belief( + dim, robot_id, object_ids, robot_orientations, num_particles=num_particles + ) + else: + raise ValueError("Unsupported belief representation %s" % representation)
    + + + +def _initialize_histogram_belief(dim, robot_id, object_ids, prior, robot_orientations): + """ + Returns the belief distribution represented as a histogram + """ + oo_hists = {} # objid -> Histogram + width, length = dim + for objid in object_ids: + hist = {} # pose -> prob + total_prob = 0 + if objid in prior: + # prior knowledge provided. Just use the prior knowledge + for pose in prior[objid]: + state = ObjectState(objid, "target", pose) + hist[state] = prior[objid][pose] + total_prob += hist[state] + else: + # no prior knowledge. So uniform. + for x in range(width): + for y in range(length): + state = ObjectState(objid, "target", (x, y)) + hist[state] = 1.0 + total_prob += hist[state] + + # Normalize + for state in hist: + hist[state] /= total_prob + + hist_belief = pomdp_py.Histogram(hist) + oo_hists[objid] = hist_belief + + # For the robot, we assume it can observe its own state; + # Its pose must have been provided in the `prior`. + assert robot_id in prior, "Missing initial robot pose in prior." + init_robot_pose = list(prior[robot_id].keys())[0] + oo_hists[robot_id] = pomdp_py.Histogram( + {RobotState(robot_id, init_robot_pose, (), None): 1.0} + ) + + return MosOOBelief(robot_id, oo_hists) + + +def _initialize_particles_belief( + dim, robot_id, object_ids, prior, robot_orientations, num_particles=100 +): + """This returns a single set of particles that represent the distribution over a + joint state space of all objects. + + Since it is very difficult to provide a prior knowledge over the joint state + space when the number of objects scales, the prior (which is + object-oriented), is used to create particles separately for each object to + satisfy the prior; That is, particles beliefs are generated for each object + as if object_oriented=True. Then, `num_particles` number of particles with + joint state is sampled randomly from these particle beliefs. + + """ + # For the robot, we assume it can observe its own state; + # Its pose must have been provided in the `prior`. + assert robot_id in prior, "Missing initial robot pose in prior." + init_robot_pose = list(prior[robot_id].keys())[0] + + oo_particles = {} # objid -> Particageles + width, length = dim + for objid in object_ids: + particles = [ + RobotState(robot_id, init_robot_pose, (), None) + ] # list of states; Starting the observable robot state. + if objid in prior: + # prior knowledge provided. Just use the prior knowledge + prior_sum = sum(prior[objid][pose] for pose in prior[objid]) + for pose in prior[objid]: + state = ObjectState(objid, "target", pose) + amount_to_add = (prior[objid][pose] / prior_sum) * num_particles + for _ in range(amount_to_add): + particles.append(state) + else: + # no prior knowledge. So uniformly sample `num_particles` number of states. + for _ in range(num_particles): + x = random.randrange(0, width) + y = random.randrange(0, length) + state = ObjectState(objid, "target", (x, y)) + particles.append(state) + + particles_belief = pomdp_py.Particles(particles) + oo_particles[objid] = particles_belief + + # Return Particles distribution which contains particles + # that represent joint object states + particles = [] + for _ in range(num_particles): + object_states = {} + for objid in oo_particles: + random_particle = random.sample(oo_particles[objid], 1)[0] + object_states[_id] = copy.deepcopy(random_particle) + particles.append(MosOOState(object_states)) + return pomdp_py.Particles(particles) + + +"""If `object oriented` is True, then just like histograms, there will be +one set of particles per object; Otherwise, there is a single set +of particles that represent the distribution over a joint state space +of all <objects. + +When updating the particle belief, Monte Carlo simulation is used instead of +computing the probabilities using T/O models. This means one must sample +(s',o,r) from G(s,a). If this belief representation if object oriented, then +you have N particle sets for N objects. Thanks to the fact that in this +particular domain, objects are static, you could have si' = si if i is an +object. However, if robot state sr' needs to consider collision with other +objects, then it can't be obtained just from sr. This means eventually you +would have to build an s by sampling randomly from the particle set for each +object. + +More details on the non-object-oriented case: Since it is extremely +difficult to provide a prior knowledge over the joint state space when +the number of objects scales, the prior (which is object-oriented), +is used to create particles separately for each object to satisfy +the prior; That is, particles beliefs are generated for each object +as if object_oriented=True. Then, `num_particles` number of particles +with joint state is sampled randomly from these particle beliefs. +""" +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/domain/action.html b/docs/html/_modules/problems/multi_object_search/domain/action.html new file mode 100644 index 00000000..c3a9457c --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/domain/action.html @@ -0,0 +1,327 @@ + + + + + + + problems.multi_object_search.domain.action — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.domain.action

    +"""
    +Defines the Action for the 2D Multi-Object Search domain;
    +
    +Action space:
    +
    +    Motion :math:`\cup` Look :math:`\cup` Find
    +
    +* Motion Actions scheme 1: South, East, West, North.
    +* Motion Actions scheme 2: Left 45deg, Right 45deg, Forward
    +* Look: Interprets sensor input as observation
    +* Find: Marks objects observed in the last Look action as
    +  (differs from original paper; reduces action space)
    +
    +It is possible to force "Look" after every N/S/E/W action;
    +then the Look action could be dropped. This is optional behavior.
    +"""
    +
    +import pomdp_py
    +import math
    +
    +
    +###### Actions ######
    +
    +[docs] +class Action(pomdp_py.Action): + """Mos action; Simple named action.""" + + def __init__(self, name): + self.name = name + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, Action): + return self.name == other.name + elif type(other) == str: + return self.name == other + + def __str__(self): + return self.name + + def __repr__(self): + return "Action(%s)" % self.name
    + + + +MOTION_SCHEME = "xy" # can be either xy or vw +STEP_SIZE = 1 + + +
    +[docs] +class MotionAction(Action): + # scheme 1 (vx,vy,th) + SCHEME_XYTH = "xyth" + EAST = (STEP_SIZE, 0, 0) # x is horizontal; x+ is right. y is vertical; y+ is down. + WEST = (-STEP_SIZE, 0, math.pi) + NORTH = (0, -STEP_SIZE, 3 * math.pi / 2) + SOUTH = (0, STEP_SIZE, math.pi / 2) + + # scheme 2 (vt, vw) translational, rotational velocities. + SCHEME_VW = "vw" + FORWARD = (STEP_SIZE, 0) + BACKWARD = (-STEP_SIZE, 0) + LEFT = (0, -math.pi / 4) # left 45 deg + RIGHT = (0, math.pi / 4) # right 45 deg + + # scheme 3 (vx,vy) + SCHEME_XY = "xy" + EAST2D = (STEP_SIZE, 0) # x is horizontal; x+ is right. y is vertical; y+ is down. + WEST2D = (-STEP_SIZE, 0) + NORTH2D = (0, -STEP_SIZE) + SOUTH2D = (0, STEP_SIZE) + + SCHEMES = {"xyth", "xy", "vw"} + + def __init__(self, motion, scheme=MOTION_SCHEME, distance_cost=1, motion_name=None): + """ + motion (tuple): a tuple of floats that describes the motion; + scheme (str): description of the motion scheme; Either + "xy" or "vw" + """ + if scheme not in MotionAction.SCHEMES: + raise ValueError("Invalid motion scheme %s" % scheme) + + if scheme == MotionAction.SCHEME_XYTH: + if motion not in { + MotionAction.EAST, + MotionAction.WEST, + MotionAction.NORTH, + MotionAction.SOUTH, + }: + raise ValueError("Invalid move motion %s" % str(motion)) + elif scheme == MotionAction.SCHEME_VW: + if motion not in { + MotionAction.FORWARD, + MotionAction.BACKWARD, + MotionAction.LEFT, + MotionAction.RIGHT, + }: + raise ValueError("Invalid move motion %s" % str(motion)) + elif scheme == MotionAction.SCHEME_XY: + if motion not in { + MotionAction.EAST2D, + MotionAction.WEST2D, + MotionAction.NORTH2D, + MotionAction.SOUTH2D, + }: + raise ValueError("Invalid move motion %s" % str(motion)) + + self.motion = motion + self.scheme = scheme + self.distance_cost = distance_cost + if motion_name is None: + motion_name = str(motion) + super().__init__("move-%s-%s" % (scheme, motion_name))
    + + + +# Define some constant actions +MoveEast = MotionAction( + MotionAction.EAST, scheme=MotionAction.SCHEME_XYTH, motion_name="East" +) +MoveWest = MotionAction( + MotionAction.WEST, scheme=MotionAction.SCHEME_XYTH, motion_name="West" +) +MoveNorth = MotionAction( + MotionAction.NORTH, scheme=MotionAction.SCHEME_XYTH, motion_name="North" +) +MoveSouth = MotionAction( + MotionAction.SOUTH, scheme=MotionAction.SCHEME_XYTH, motion_name="South" +) + +MoveForward = MotionAction( + MotionAction.FORWARD, scheme=MotionAction.SCHEME_VW, motion_name="Forward" +) +MoveBackward = MotionAction( + MotionAction.BACKWARD, scheme=MotionAction.SCHEME_VW, motion_name="Backward" +) +MoveLeft = MotionAction( + MotionAction.LEFT, scheme=MotionAction.SCHEME_VW, motion_name="TurnLeft" +) +MoveRight = MotionAction( + MotionAction.RIGHT, scheme=MotionAction.SCHEME_VW, motion_name="TurnRight" +) + +MoveEast2D = MotionAction( + MotionAction.EAST2D, scheme=MotionAction.SCHEME_XY, motion_name="East2D" +) +MoveWest2D = MotionAction( + MotionAction.WEST2D, scheme=MotionAction.SCHEME_XY, motion_name="West2D" +) +MoveNorth2D = MotionAction( + MotionAction.NORTH2D, scheme=MotionAction.SCHEME_XY, motion_name="North2D" +) +MoveSouth2D = MotionAction( + MotionAction.SOUTH2D, scheme=MotionAction.SCHEME_XY, motion_name="South2D" +) + + +
    +[docs] +class LookAction(Action): + # For simplicity, this LookAction is not parameterized by direction + def __init__(self): + super().__init__("look")
    + + + +
    +[docs] +class FindAction(Action): + def __init__(self): + super().__init__("find")
    + + + +Look = LookAction() +Find = FindAction() + +if MOTION_SCHEME == "xy": + ALL_MOTION_ACTIONS = [MoveEast, MoveWest, MoveNorth, MoveSouth] +elif MOTION_SCHEME == "vw": + ALL_MOTION_ACTIONS = [MoveForward, MoveBackward, MoveLeft, MoveRight] +else: + raise ValueError("motion scheme '%s' is invalid" % MOTION_SCHEME) +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/domain/observation.html b/docs/html/_modules/problems/multi_object_search/domain/observation.html new file mode 100644 index 00000000..7471b98c --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/domain/observation.html @@ -0,0 +1,248 @@ + + + + + + + problems.multi_object_search.domain.observation — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.domain.observation

    +"""
    +Defines the Observation for the 2D Multi-Object Search domain;
    +
    +Origin: Multi-Object Search using Object-Oriented POMDPs (ICRA 2019)
    +(extensions: action space changes, different sensor model, gridworld instead of topological graph)
    +
    +Observation:
    +
    +    :code:`{objid : pose(x,y) or NULL}`.
    +    The sensor model could vary;
    +    it could be a fan-shaped model as the original paper, or
    +    it could be something else. But the resulting observation
    +    should be a map from object id to observed pose or NULL (not observed).
    +"""
    +
    +import pomdp_py
    +
    +
    +###### Observation ######
    +
    +[docs] +class ObjectObservation(pomdp_py.Observation): + """The xy pose of the object is observed; or NULL if not observed""" + + NULL = None + + def __init__(self, objid, pose): + self.objid = objid + if type(pose) == tuple and len(pose) == 2 or pose == ObjectObservation.NULL: + self.pose = pose + else: + raise ValueError("Invalid observation %s for object" % (str(pose), objid)) + + def __hash__(self): + return hash((self.objid, self.pose)) + + def __eq__(self, other): + if not isinstance(other, ObjectObservation): + return False + else: + return self.objid == other.objid and self.pose == other.pose
    + + + +
    +[docs] +class MosOOObservation(pomdp_py.OOObservation): + """Observation for Mos that can be factored by objects; + thus this is an OOObservation.""" + + def __init__(self, objposes): + """ + objposes (dict): map from objid to 2d pose or NULL (not ObjectObservation!). + """ + self._hashcode = hash(frozenset(objposes.items())) + self.objposes = objposes + +
    +[docs] + def for_obj(self, objid): + if objid in self.objposes: + return ObjectObservation(objid, self.objposes[objid]) + else: + return ObjectObservation(objid, ObjectObservation.NULL)
    + + + def __hash__(self): + return self._hashcode + + def __eq__(self, other): + if not isinstance(other, MosOOObservation): + return False + else: + return self.objposes == other.objposes + + def __str__(self): + return "MosOOObservation(%s)" % str(self.objposes) + + def __repr__(self): + return str(self) + +
    +[docs] + def factor(self, next_state, *params, **kwargs): + """Factor this OO-observation by objects""" + return { + objid: ObjectObservation(objid, self.objposes[objid]) + for objid in next_state.object_states + if objid != next_state.robot_id + }
    + + +
    +[docs] + @classmethod + def merge(cls, object_observations, next_state, *params, **kwargs): + """Merge `object_observations` into a single OOObservation object; + + object_observation (dict): Maps from objid to ObjectObservation""" + return MosOOObservation( + { + objid: object_observations[objid].pose + for objid in object_observations + if objid != next_state.object_states[objid].objclass != "robot" + } + )
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/domain/state.html b/docs/html/_modules/problems/multi_object_search/domain/state.html new file mode 100644 index 00000000..285c97d2 --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/domain/state.html @@ -0,0 +1,255 @@ + + + + + + + problems.multi_object_search.domain.state — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.domain.state

    +"""Defines the State for the 2D Multi-Object Search domain;
    +
    +Origin: Multi-Object Search using Object-Oriented POMDPs (ICRA 2019)
    +(extensions: action space changes, different sensor model, gridworld instead of
    +topological graph)
    +
    +Description: Multi-Object Search in a 2D grid world.
    +
    +State space:
    +
    +    :math:`S_1 \\times S_2 \\times ... S_n \\times S_r`
    +    where :math:`S_i (1\leq i\leq n)` is the object state, with attribute
    +    "pose" :math:`(x,y)` and Sr is the state of the robot, with attribute
    +    "pose" :math:`(x,y)` and "objects_found" (set).
    +"""
    +
    +import pomdp_py
    +import math
    +
    +
    +###### States ######
    +
    +[docs] +class ObjectState(pomdp_py.ObjectState): + def __init__(self, objid, objclass, pose): + if objclass != "obstacle" and objclass != "target": + raise ValueError( + "Only allow object class to beeither 'target' or 'obstacle'.Got %s" + % objclass + ) + super().__init__(objclass, {"pose": pose, "id": objid}) + + def __str__(self): + return "ObjectState(%s,%s)" % (str(self.objclass), str(self.pose)) + + @property + def pose(self): + return self.attributes["pose"] + + @property + def objid(self): + return self.attributes["id"]
    + + + +
    +[docs] +class RobotState(pomdp_py.ObjectState): + def __init__(self, robot_id, pose, objects_found, camera_direction): + """Note: camera_direction is None unless the robot is looking at a direction, + in which case camera_direction is the string e.g. look+x, or 'look'""" + super().__init__( + "robot", + { + "id": robot_id, + "pose": pose, # x,y,th + "objects_found": objects_found, + "camera_direction": camera_direction, + }, + ) + + def __str__(self): + return "RobotState(%s,%s|%s)" % ( + str(self.objclass), + str(self.pose), + str(self.objects_found), + ) + + def __repr__(self): + return str(self) + + @property + def pose(self): + return self.attributes["pose"] + + @property + def robot_pose(self): + return self.attributes["pose"] + + @property + def objects_found(self): + return self.attributes["objects_found"]
    + + + +
    +[docs] +class MosOOState(pomdp_py.OOState): + def __init__(self, object_states): + super().__init__(object_states) + +
    +[docs] + def object_pose(self, objid): + return self.object_states[objid]["pose"]
    + + +
    +[docs] + def pose(self, objid): + return self.object_pose(objid)
    + + + @property + def object_poses(self): + return { + objid: self.object_states[objid]["pose"] for objid in self.object_states + } + + def __str__(self): + return "MosOOState%s" % (str(self.object_states)) + + def __repr__(self): + return str(self)
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/env/env.html b/docs/html/_modules/problems/multi_object_search/env/env.html new file mode 100644 index 00000000..14dabd1c --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/env/env.html @@ -0,0 +1,412 @@ + + + + + + + problems.multi_object_search.env.env — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.env.env

    +"""The Environment"""
    +
    +import pomdp_py
    +import copy
    +from pomdp_py.problems.multi_object_search.models.transition_model import *
    +from pomdp_py.problems.multi_object_search.models.reward_model import *
    +from pomdp_py.problems.multi_object_search.models.components.sensor import *
    +from pomdp_py.problems.multi_object_search.domain.state import *
    +
    +
    +
    +[docs] +class MosEnvironment(pomdp_py.Environment): + """""" + + def __init__(self, dim, init_state, sensors, obstacles=set({})): + """ + Args: + sensors (dict): Map from robot_id to sensor (Sensor); + Sensors equipped on robots; Used to determine + which objects should be marked as found. + obstacles (set): set of object ids that are obstacles; + The set difference of all object ids then + yields the target object ids.""" + self.width, self.length = dim + self.sensors = sensors + self.obstacles = obstacles + transition_model = MosTransitionModel( + dim, sensors, set(init_state.object_states.keys()) + ) + # Target objects, a set of ids, are not robot nor obstacles + self.target_objects = { + objid + for objid in set(init_state.object_states.keys()) - self.obstacles + if not isinstance(init_state.object_states[objid], RobotState) + } + reward_model = GoalRewardModel(self.target_objects) + super().__init__(init_state, transition_model, reward_model) + + @property + def robot_ids(self): + return set(self.sensors.keys()) + +
    +[docs] + def state_transition(self, action, execute=True, robot_id=None): + """state_transition(self, action, execute=True, **kwargs) + + Overriding parent class function. + Simulates a state transition given `action`. If `execute` is set to True, + then the resulting state will be the new current state of the environment. + + Args: + action (Action): action that triggers the state transition + execute (bool): If True, the resulting state of the transition will + become the current state. + + Returns: + float or tuple: reward as a result of `action` and state + transition, if `execute` is True (next_state, reward) if `execute` + is False. + + """ + assert ( + robot_id is not None + ), "state transition should happen for a specific robot" + + next_state = copy.deepcopy(self.state) + next_state.object_states[robot_id] = self.transition_model[robot_id].sample( + self.state, action + ) + + reward = self.reward_model.sample( + self.state, action, next_state, robot_id=robot_id + ) + if execute: + self.apply_transition(next_state) + return reward + else: + return next_state, reward
    +
    + + + +#### Interpret string as an initial world state #### +
    +[docs] +def interpret(worldstr): + """ + Interprets a problem instance description in `worldstr` + and returns the corresponding MosEnvironment. + + For example: This string + + .. code-block:: text + + rx... + .x.xT + ..... + *** + r: laser fov=90 min_range=1 max_range=10 + + describes a 3 by 5 world where x indicates obsticles and T indicates + the "target object". T could be replaced by any upper-case letter A-Z + which will serve as the object's id. Lower-case letters a-z (except for x) + serve as id for robot(s). + + After the world, the :code:`***` signals description of the sensor for each robot. + For example "r laser 90 1 10" means that robot `r` will have a Laser2Dsensor + with fov 90, min_range 1.0, and max_range of 10.0. + + Args: + worldstr (str): a string that describes the initial state of the world. + + Returns: + MosEnvironment: the corresponding environment for the world description. + + """ + worldlines = [] + sensorlines = [] + mode = "world" + for line in worldstr.splitlines(): + line = line.strip() + if len(line) > 0: + if line == "***": + mode = "sensor" + continue + if mode == "world": + worldlines.append(line) + if mode == "sensor": + sensorlines.append(line) + + lines = [line for line in worldlines if len(line) > 0] + w, l = len(worldlines[0]), len(worldlines) + + objects = {} # objid -> object_state(pose) + obstacles = set({}) # objid + robots = {} # robot_id -> robot_state(pose) + sensors = {} # robot_id -> Sensor + + # Parse world + for y, line in enumerate(worldlines): + if len(line) != w: + raise ValueError( + "World size inconsistent.Expected width: %d; Actual Width: %d" + % (w, len(line)) + ) + for x, c in enumerate(line): + if c == "x": + # obstacle + objid = 1000 + len(obstacles) # obstacle id + objects[objid] = ObjectState(objid, "obstacle", (x, y)) + obstacles.add(objid) + + elif c.isupper(): + # target object + objid = len(objects) + objects[objid] = ObjectState(objid, "target", (x, y)) + + elif c.islower(): + # robot + robot_id = interpret_robot_id(c) + robots[robot_id] = RobotState(robot_id, (x, y, 0), (), None) + + else: + assert c == ".", "Unrecognized character %s in worldstr" % c + if len(robots) == 0: + raise ValueError("No initial robot pose!") + if len(objects) == 0: + raise ValueError("No object!") + + # Parse sensors + for line in sensorlines: + if "," in line: + raise ValueError( + "Wrong Fromat. SHould not have ','. Separate tokens with space." + ) + robot_name = line.split(":")[0].strip() + robot_id = interpret_robot_id(robot_name) + assert robot_id in robots, "Sensor specified for unknown robot %s" % ( + robot_name + ) + + sensor_setting = line.split(":")[1].strip() + sensor_type = sensor_setting.split(" ")[0].strip() + sensor_params = {} + for token in sensor_setting.split(" ")[1:]: + param_name = token.split("=")[0].strip() + param_value = eval(token.split("=")[1].strip()) + sensor_params[param_name] = param_value + + if sensor_type == "laser": + sensor = Laser2DSensor(robot_id, **sensor_params) + elif sensor_type == "proximity": + sensor = ProximitySensor(robot_id, **sensor_params) + else: + raise ValueError("Unknown sensor type %s" % sensor_type) + sensors[robot_id] = sensor + + return (w, l), robots, objects, obstacles, sensors
    + + + +
    +[docs] +def interpret_robot_id(robot_name): + return -ord(robot_name)
    + + + +#### Utility functions for building the worldstr #### +
    +[docs] +def equip_sensors(worldmap, sensors): + """ + Args: + worldmap (str): a string that describes the initial state of the world. + sensors (dict) a map from robot character representation (e.g. 'r') to a + string that describes its sensor (e.g. 'laser fov=90 min_range=1 max_range=5 + angle_increment=5') + + Returns: + str: A string that can be used as input to the `interpret` function + """ + worldmap += "\n***\n" + for robot_char in sensors: + worldmap += "%s: %s\n" % (robot_char, sensors[robot_char]) + return worldmap
    + + + +
    +[docs] +def make_laser_sensor(fov, dist_range, angle_increment, occlusion): + """ + Returns string representation of the laser scanner configuration. + For example: "laser fov=90 min_range=1 max_range=10" + + Args: + fov (int or float): angle between the start and end beams of one scan (degree). + dist_range (tuple): (min_range, max_range) + angle_increment (int or float): angular distance between measurements (rad). + occlusion (bool): True if consider occlusion + + Returns: + str: String representation of the laser scanner configuration. + """ + fovstr = "fov=%s" % str(fov) + rangestr = "min_range=%s max_range=%s" % (str(dist_range[0]), str(dist_range[1])) + angicstr = "angle_increment=%s" % (str(angle_increment)) + occstr = "occlusion_enabled=%s" % str(occlusion) + return "laser %s %s %s %s" % (fovstr, rangestr, angicstr, occstr)
    + + + +
    +[docs] +def make_proximity_sensor(radius, occlusion): + """ + Returns string representation of the proximity sensor configuration. + For example: "proximity radius=5 occlusion_enabled=False" + + Args: + radius (int or float) + occlusion (bool): True if consider occlusion + Returns: + str: String representation of the proximity sensor configuration. + """ + radiustr = "radius=%s" % str(radius) + occstr = "occlusion_enabled=%s" % str(occlusion) + return "proximity %s %s" % (radiustr, occstr)
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/env/visual.html b/docs/html/_modules/problems/multi_object_search/env/visual.html new file mode 100644 index 00000000..d4f2d484 --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/env/visual.html @@ -0,0 +1,532 @@ + + + + + + + problems.multi_object_search.env.visual — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.env.visual

    +# Visualization of a MOS instance using pygame
    +#
    +# Note to run this file, you need to run the following
    +# in the parent directory of multi_object_search:
    +#
    +#   python -m multi_object_search.env.visual
    +#
    +
    +import pygame
    +import cv2
    +import math
    +import numpy as np
    +import random
    +import pomdp_py.utils as util
    +from pomdp_py.problems.multi_object_search.env.env import *
    +from pomdp_py.problems.multi_object_search.domain.observation import *
    +from pomdp_py.problems.multi_object_search.domain.action import *
    +from pomdp_py.problems.multi_object_search.domain.state import *
    +from pomdp_py.problems.multi_object_search.example_worlds import *
    +
    +
    +# Deterministic way to get object color
    +
    +[docs] +def object_color(objid, count): + color = [107, 107, 107] + if count % 3 == 0: + color[0] += 100 + (3 * (objid * 5 % 11)) + color[0] = max(12, min(222, color[0])) + elif count % 3 == 1: + color[1] += 100 + (3 * (objid * 5 % 11)) + color[1] = max(12, min(222, color[1])) + else: + color[2] += 100 + (3 * (objid * 5 % 11)) + color[2] = max(12, min(222, color[2])) + return tuple(color)
    + + + +#### Visualization through pygame #### +
    +[docs] +class MosViz: + def __init__(self, env, res=30, fps=30, controllable=False): + self._env = env + + self._res = res + self._img = self._make_gridworld_image(res) + self._last_observation = {} # map from robot id to MosOOObservation + self._last_viz_observation = {} # map from robot id to MosOOObservation + self._last_action = {} # map from robot id to Action + self._last_belief = {} # map from robot id to OOBelief + + self._controllable = controllable + self._running = False + self._fps = fps + self._playtime = 0.0 + + # Generate some colors, one per target object + colors = {} + for i, objid in enumerate(env.target_objects): + colors[objid] = object_color(objid, i) + self._target_colors = colors + + def _make_gridworld_image(self, r): + # Preparing 2d array + w, l = self._env.width, self._env.length + arr2d = np.full((self._env.width, self._env.length), 0) # free grids + state = self._env.state + for objid in state.object_states: + pose = state.object_states[objid]["pose"] + if state.object_states[objid].objclass == "robot": + arr2d[pose[0], pose[1]] = 0 # free grid + elif state.object_states[objid].objclass == "obstacle": + arr2d[pose[0], pose[1]] = 1 # obstacle + elif state.object_states[objid].objclass == "target": + arr2d[pose[0], pose[1]] = 2 # target + + # Creating image + img = np.full((w * r, l * r, 3), 255, dtype=np.int32) + for x in range(w): + for y in range(l): + if arr2d[x, y] == 0: # free + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (255, 255, 255), -1 + ) + elif arr2d[x, y] == 1: # obstacle + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (40, 31, 3), -1 + ) + elif arr2d[x, y] == 2: # target + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (255, 165, 0), -1 + ) + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (0, 0, 0), 1, 8 + ) + return img + + @property + def img_width(self): + return self._img.shape[0] + + @property + def img_height(self): + return self._img.shape[1] + + @property + def last_observation(self): + return self._last_observation + +
    +[docs] + def update(self, robot_id, action, observation, viz_observation, belief): + """ + Update the visualization after there is new real action and observation + and updated belief. + + Args: + observation (MosOOObservation): Real observation + viz_observation (MosOOObservation): An observation used to visualize + the sensing region. + """ + self._last_action[robot_id] = action + self._last_observation[robot_id] = observation + self._last_viz_observation[robot_id] = viz_observation + self._last_belief[robot_id] = belief
    + + +
    +[docs] + @staticmethod + def draw_robot(img, x, y, th, size, color=(255, 12, 12)): + radius = int(round(size / 2)) + cv2.circle(img, (y + radius, x + radius), radius, color, thickness=2) + + endpoint = ( + y + radius + int(round(radius * math.sin(th))), + x + radius + int(round(radius * math.cos(th))), + ) + cv2.line(img, (y + radius, x + radius), endpoint, color, 2)
    + + +
    +[docs] + @staticmethod + def draw_observation(img, z, rx, ry, rth, r, size, color=(12, 12, 255)): + assert type(z) == MosOOObservation, "%s != MosOOObservation" % (str(type(z))) + radius = int(round(r / 2)) + for objid in z.objposes: + if z.for_obj(objid).pose != ObjectObservation.NULL: + lx, ly = z.for_obj(objid).pose + cv2.circle( + img, (ly * r + radius, lx * r + radius), size, color, thickness=-1 + )
    + + +
    +[docs] + @staticmethod + def draw_belief(img, belief, r, size, target_colors): + """belief (OOBelief)""" + radius = int(round(r / 2)) + + circle_drawn = {} # map from pose to number of times drawn + + for objid in belief.object_beliefs: + if isinstance(belief.object_belief(objid).random(), RobotState): + continue + hist = belief.object_belief(objid).get_histogram() + color = target_colors[objid] + + last_val = -1 + count = 0 + for state in reversed(sorted(hist, key=hist.get)): + if state.objclass == "target": + if last_val != -1: + color = util.lighter(color, 1 - hist[state] / last_val) + if np.mean(np.array(color) / np.array([255, 255, 255])) < 0.99: + tx, ty = state["pose"] + if (tx, ty) not in circle_drawn: + circle_drawn[(tx, ty)] = 0 + circle_drawn[(tx, ty)] += 1 + + cv2.circle( + img, + (ty * r + radius, tx * r + radius), + size // circle_drawn[(tx, ty)], + color, + thickness=-1, + ) + last_val = hist[state] + + count += 1 + if last_val <= 0: + break
    + + + # PyGame interface functions +
    +[docs] + def on_init(self): + """pygame init""" + pygame.init() # calls pygame.font.init() + # init main screen and background + self._display_surf = pygame.display.set_mode( + (self.img_width, self.img_height), pygame.HWSURFACE + ) + self._background = pygame.Surface(self._display_surf.get_size()).convert() + self._clock = pygame.time.Clock() + + # Font + self._myfont = pygame.font.SysFont("Comic Sans MS", 30) + self._running = True
    + + +
    +[docs] + def on_event(self, event): + # TODO: Keyboard control multiple robots + robot_id = list(self._env.robot_ids)[0] # Just pick the first one. + + if event.type == pygame.QUIT: + self._running = False + elif event.type == pygame.KEYDOWN: + u = None # control signal according to motion model + action = None # control input by user + + # odometry model + if event.key == pygame.K_LEFT: + action = MoveLeft + elif event.key == pygame.K_RIGHT: + action = MoveRight + elif event.key == pygame.K_UP: + action = MoveForward + elif event.key == pygame.K_DOWN: + action = MoveBackward + # euclidean axis model + elif event.key == pygame.K_a: + action = MoveWest + elif event.key == pygame.K_d: + action = MoveEast + elif event.key == pygame.K_s: + action = MoveSouth + elif event.key == pygame.K_w: + action = MoveNorth + elif event.key == pygame.K_SPACE: + action = Look + elif event.key == pygame.K_RETURN: + action = Find + + if action is None: + return + + if self._controllable: + if isinstance(action, MotionAction): + reward = self._env.state_transition( + action, execute=True, robot_id=robot_id + ) + z = None + elif isinstance(action, LookAction) or isinstance(action, FindAction): + robot_pose = self._env.state.pose(robot_id) + z = self._env.sensors[robot_id].observe(robot_pose, self._env.state) + self._last_observation[robot_id] = z + self._last_viz_observation[robot_id] = z + reward = self._env.state_transition( + action, execute=True, robot_id=robot_id + ) + print("robot state: %s" % str(self._env.state.object_states[robot_id])) + print(" action: %s" % str(action.name)) + print(" observation: %s" % str(z)) + print(" reward: %s" % str(reward)) + print("------------") + return action
    + + +
    +[docs] + def on_loop(self): + self._playtime += self._clock.tick(self._fps) / 1000.0
    + + +
    +[docs] + def on_render(self): + # self._display_surf.blit(self._background, (0, 0)) + self.render_env(self._display_surf) + robot_id = list(self._env.robot_ids)[0] # Just pick the first one. + rx, ry, rth = self._env.state.pose(robot_id) + fps_text = "FPS: {0:.2f}".format(self._clock.get_fps()) + last_action = self._last_action.get(robot_id, None) + last_action_str = "no_action" if last_action is None else str(last_action) + pygame.display.set_caption( + "%s | Robot%d(%.2f,%.2f,%.2f) | %s | %s" + % ( + last_action_str, + robot_id, + rx, + ry, + rth * 180 / math.pi, + str(self._env.state.object_states[robot_id]["objects_found"]), + fps_text, + ) + ) + pygame.display.flip()
    + + +
    +[docs] + def on_cleanup(self): + pygame.quit()
    + + +
    +[docs] + def on_execute(self): + if self.on_init() == False: + self._running = False + + while self._running: + for event in pygame.event.get(): + self.on_event(event) + self.on_loop() + self.on_render() + self.on_cleanup()
    + + +
    +[docs] + def render_env(self, display_surf): + # draw robot, a circle and a vector + img = np.copy(self._img) + for i, robot_id in enumerate(self._env.robot_ids): + rx, ry, rth = self._env.state.pose(robot_id) + r = self._res # Not radius! + last_observation = self._last_observation.get(robot_id, None) + last_viz_observation = self._last_viz_observation.get(robot_id, None) + last_belief = self._last_belief.get(robot_id, None) + if last_belief is not None: + MosViz.draw_belief(img, last_belief, r, r // 3, self._target_colors) + if last_viz_observation is not None: + MosViz.draw_observation( + img, + last_viz_observation, + rx, + ry, + rth, + r, + r // 4, + color=(200, 200, 12), + ) + if last_observation is not None: + MosViz.draw_observation( + img, last_observation, rx, ry, rth, r, r // 8, color=(20, 20, 180) + ) + + MosViz.draw_robot( + img, rx * r, ry * r, rth, r, color=(12, 255 * (0.8 * (i + 1)), 12) + ) + pygame.surfarray.blit_array(display_surf, img)
    +
    + + + +
    +[docs] +def unittest(): + # If you don't want occlusion, use this: + laserstr = make_laser_sensor(90, (1, 8), 0.5, False) + # If you want occlusion, use this + # (the difference is mainly in angle_increment; this + # is due to the discretization - discretization may + # cause "strange" behavior when checking occlusion + # but the model is actually doing the right thing.) + laserstr_occ = make_laser_sensor(360, (1, 8), 0.5, True) + # Proximity sensor + proxstr = make_proximity_sensor(1.5, False) + proxstr_occ = make_proximity_sensor(1.5, True) + + worldmap, robot = world1 + worldstr = equip_sensors(worldmap, {robot: laserstr}) + + dim, robots, objects, obstacles, sensors = interpret(worldstr) + init_state = MosOOState({**objects, **robots}) + env = MosEnvironment(dim, init_state, sensors, obstacles=obstacles) + viz = MosViz(env, controllable=True) + viz.on_execute()
    + + + +if __name__ == "__main__": + unittest() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/example_worlds.html b/docs/html/_modules/problems/multi_object_search/example_worlds.html new file mode 100644 index 00000000..d7f00703 --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/example_worlds.html @@ -0,0 +1,263 @@ + + + + + + + problems.multi_object_search.example_worlds — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.example_worlds

    +"""This file has some examples of world string."""
    +
    +import random
    +
    +############# Example Worlds ###########
    +# See env.py:interpret for definition of
    +# the format
    +
    +world0 = (
    +    """
    +rx...
    +.x.xT
    +.....
    +""",
    +    "r",
    +)
    +
    +world1 = (
    +    """
    +rx.T...
    +.x.....
    +...xx..
    +.......
    +.xxx.T.
    +.xxx...
    +.......
    +""",
    +    "r",
    +)
    +
    +# Used to test the shape of the sensor
    +world2 = (
    +    """
    +.................
    +.................
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxTxxxx..
    +..xxxxxxrxTxxxx..
    +..xxxxxxxxTxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +.................
    +.................
    +""",
    +    "r",
    +)
    +
    +# Used to test sensor occlusion
    +world3 = (
    +    """
    +.................
    +.................
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxTxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxx...xxxxxx..
    +..xxxx..xx.xxxx..
    +..xxxx..r.Txxxx..
    +..xxxx..xx.xxxx..
    +..xxxxxx..xxxxx..
    +..xxxxTx..xxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +..xxxxxxxxxxxxx..
    +.................
    +.................
    +""",
    +    "r",
    +)
    +
    +
    +
    +[docs] +def random_world(width, length, num_obj, num_obstacles, robot_char="r"): + worldstr = [["." for i in range(width)] for j in range(length)] + # First place obstacles + num_obstacles_placed = 0 + while num_obstacles_placed < num_obstacles: + x = random.randrange(0, width) + y = random.randrange(0, length) + if worldstr[y][x] == ".": + worldstr[y][x] = "x" + num_obstacles_placed += 1 + + num_obj_placed = 0 + while num_obj_placed < num_obj: + x = random.randrange(0, width) + y = random.randrange(0, length) + if worldstr[y][x] == ".": + worldstr[y][x] = "T" + num_obj_placed += 1 + + # Finally place the robot + while True: + x = random.randrange(0, width) + y = random.randrange(0, length) + if worldstr[y][x] == ".": + worldstr[y][x] = robot_char + break + + # Create the string. + finalstr = [] + for row_chars in worldstr: + finalstr.append("".join(row_chars)) + finalstr = "\n".join(finalstr) + return finalstr, robot_char
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/models/components/grid_map.html b/docs/html/_modules/problems/multi_object_search/models/components/grid_map.html new file mode 100644 index 00000000..52143814 --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/models/components/grid_map.html @@ -0,0 +1,206 @@ + + + + + + + problems.multi_object_search.models.components.grid_map — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.models.components.grid_map

    +"""Optional grid map to assist collision avoidance during planning."""
    +
    +from pomdp_py.problems.multi_object_search.models.transition_model import (
    +    RobotTransitionModel,
    +)
    +from pomdp_py.problems.multi_object_search.domain.action import *
    +from pomdp_py.problems.multi_object_search.domain.state import *
    +
    +
    +
    +[docs] +class GridMap: + """This map assists the agent to avoid planning invalid + actions that will run into obstacles. Used if we assume + the agent has a map. This map does not contain information + about the object locations.""" + + def __init__(self, width, length, obstacles): + """ + Args: + obstacles (dict): Map from objid to (x,y); The object is + supposed to be an obstacle. + width (int): width of the grid map + length (int): length of the grid map + """ + self.width = width + self.length = length + self._obstacles = obstacles + # An MosOOState that only contains poses for obstacles; + # This is to allow calling RobotTransitionModel.if_move_by + # function. + self._obstacle_states = { + objid: ObjectState(objid, "obstacle", self._obstacles[objid]) + for objid in self._obstacles + } + # set of obstacle poses + self.obstacle_poses = set({self._obstacles[objid] for objid in self._obstacles}) + +
    +[docs] + def valid_motions(self, robot_id, robot_pose, all_motion_actions): + """ + Returns a set of MotionAction(s) that are valid to + be executed from robot pose (i.e. they will not bump + into obstacles). The validity is determined under + the assumption that the robot dynamics is deterministic. + """ + state = MosOOState(self._obstacle_states) + state.set_object_state(robot_id, RobotState(robot_id, robot_pose, None, None)) + + valid = set({}) + for motion_action in all_motion_actions: + if not isinstance(motion_action, MotionAction): + raise ValueError( + "This (%s) is not a motion action" % str(motion_action) + ) + + next_pose = RobotTransitionModel.if_move_by( + robot_id, state, motion_action, (self.width, self.length) + ) + if next_pose != robot_pose: + # robot moved --> valid motion + valid.add(motion_action) + return valid
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/models/components/sensor.html b/docs/html/_modules/problems/multi_object_search/models/components/sensor.html new file mode 100644 index 00000000..4e89c337 --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/models/components/sensor.html @@ -0,0 +1,420 @@ + + + + + + + problems.multi_object_search.models.components.sensor — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.models.components.sensor

    +"""Sensor model (for example, laser scanner)"""
    +
    +import math
    +import numpy as np
    +from pomdp_py.problems.multi_object_search.domain.action import *
    +from pomdp_py.problems.multi_object_search.domain.observation import *
    +
    +# Note that the occlusion of an object is implemented based on
    +# whether a beam will hit an obstacle or some other object before
    +# that object. Because the world is discretized, this leads to
    +# some strange pattern of the field of view. But what's for sure
    +# is that, when occlusion is enabled, the sensor will definitely
    +# not receive observation for some regions in the field of view
    +# making it a more challenging situation to deal with.
    +
    +
    +# Utility functions
    +
    +[docs] +def euclidean_dist(p1, p2): + return math.sqrt(sum([(a - b) ** 2 for a, b in zip(p1, p2)]))
    + + + +
    +[docs] +def to_rad(deg): + return deg * math.pi / 180.0
    + + + +
    +[docs] +def in_range(val, rang): + # Returns True if val is in range (a,b); Inclusive. + return val >= rang[0] and val <= rang[1]
    + + + +#### Sensors #### +
    +[docs] +class Sensor: + LASER = "laser" + PROXIMITY = "proximity" + +
    +[docs] + def observe(self, robot_pose, env_state): + """ + Returns an Observation with this sensor model. + """ + raise NotImplementedError
    + + +
    +[docs] + def within_range(self, robot_pose, point): + """Returns true if the point is within range of the sensor; but the point might not + actually be visible due to occlusion or "gap" between beams""" + raise ValueError
    + + + @property + def sensing_region_size(self): + return self._sensing_region_size + + @property + def robot_id(self): + # id of the robot equipped with this sensor + return self._robot_id
    + + + +
    +[docs] +class Laser2DSensor: + """Fan shaped 2D laser sensor""" + + def __init__( + self, + robot_id, + fov=90, + min_range=1, + max_range=5, + angle_increment=5, + occlusion_enabled=False, + ): + """ + fov (float): angle between the start and end beams of one scan (degree). + min_range (int or float) + max_range (int or float) + angle_increment (float): angular distance between measurements (rad). + """ + self.robot_id = robot_id + self.fov = to_rad(fov) # convert to radian + self.min_range = min_range + self.max_range = max_range + self.angle_increment = to_rad(angle_increment) + self._occlusion_enabled = occlusion_enabled + + # determines the range of angles; + # For example, the fov=pi, means the range scanner scans 180 degrees + # in front of the robot. By our angle convention, 180 degrees maps to [0,90] and [270, 360].""" + self._fov_left = (0, self.fov / 2) + self._fov_right = (2 * math.pi - self.fov / 2, 2 * math.pi) + + # beams that are actually within the fov (set of angles) + self._beams = { + round(th, 2) + for th in np.linspace( + self._fov_left[0], + self._fov_left[1], + int( + round( + (self._fov_left[1] - self._fov_left[0]) / self.angle_increment + ) + ), + ) + } | { + round(th, 2) + for th in np.linspace( + self._fov_right[0], + self._fov_right[1], + int( + round( + (self._fov_right[1] - self._fov_right[0]) / self.angle_increment + ) + ), + ) + } + # The size of the sensing region here is the area covered by the fan + self._sensing_region_size = ( + self.fov / (2 * math.pi) * math.pi * (max_range - min_range) ** 2 + ) + +
    +[docs] + def in_field_of_view(th, view_angles): + """Determines if the beame at angle `th` is in a field of view of size `view_angles`. + For example, the view_angles=180, means the range scanner scans 180 degrees + in front of the robot. By our angle convention, 180 degrees maps to [0,90] and [270, 360]. + """ + fov_right = (0, view_angles / 2) + fov_left = (2 * math.pi - view_angles / 2, 2 * math.pi)
    + + +
    +[docs] + def within_range(self, robot_pose, point): + """Returns true if the point is within range of the sensor; but the point might not + actually be visible due to occlusion or "gap" between beams""" + dist, bearing = self.shoot_beam(robot_pose, point) + if not in_range(dist, (self.min_range, self.max_range)): + return False + if (not in_range(bearing, self._fov_left)) and ( + not in_range(bearing, self._fov_right) + ): + return False + return True
    + + +
    +[docs] + def shoot_beam(self, robot_pose, point): + """Shoots a beam from robot_pose at point. Returns the distance and bearing + of the beame (i.e. the length and orientation of the beame)""" + rx, ry, rth = robot_pose + dist = euclidean_dist(point, (rx, ry)) + bearing = (math.atan2(point[1] - ry, point[0] - rx) - rth) % ( + 2 * math.pi + ) # bearing (i.e. orientation) + return (dist, bearing)
    + + +
    +[docs] + def valid_beam(self, dist, bearing): + """Returns true beam length (i.e. `dist`) is within range and its angle + `bearing` is valid, that is, it is within the fov range and in + accordance with the angle increment.""" + return ( + dist >= self.min_range + and dist <= self.max_range + and round(bearing, 2) in self._beams + )
    + + + def _build_beam_map(self, beam, point, beam_map={}): + """beam_map (dict): Maps from bearing to (dist, point)""" + dist, bearing = beam + valid = self.valid_beam(dist, bearing) + if not valid: + return + bearing_key = round(bearing, 2) + if bearing_key in beam_map: + # There's an object covered by this beame already. + # see if this beame is closer + if dist < beam_map[bearing_key][0]: + # point is closer; Update beam map + print("HEY") + beam_map[bearing_key] = (dist, point) + else: + # point is farther than current hit + pass + else: + beam_map[bearing_key] = (dist, point) + +
    +[docs] + def observe(self, robot_pose, env_state): + """ + Returns a MosObservation with this sensor model. + """ + rx, ry, rth = robot_pose + + # Check every object + objposes = {} + beam_map = {} + for objid in env_state.object_states: + objposes[objid] = ObjectObservation.NULL + object_pose = env_state.object_states[objid]["pose"] + beam = self.shoot_beam(robot_pose, object_pose) + + if not self._occlusion_enabled: + if self.valid_beam(*beam): + d, bearing = beam # distance, bearing + lx = rx + int(round(d * math.cos(rth + bearing))) + ly = ry + int(round(d * math.sin(rth + bearing))) + objposes[objid] = (lx, ly) + else: + self._build_beam_map(beam, object_pose, beam_map=beam_map) + + if self._occlusion_enabled: + # The observed objects are in the beam_map + for bearing_key in beam_map: + d, objid = beam_map[bearing_key] + lx = rx + int(round(d * math.cos(rth + bearing_key))) + ly = ry + int(round(d * math.sin(rth + bearing_key))) + objposes[objid] = (lx, ly) + + return MosOOObservation(objposes)
    + + + @property + def sensing_region_size(self): + return self._sensing_region_size
    + + + +
    +[docs] +class ProximitySensor(Laser2DSensor): + """This is a simple sensor; Observes a region centered + at the robot.""" + + def __init__(self, robot_id, radius=5, occlusion_enabled=False): + """ + radius (int or float) radius of the sensing region. + """ + self.robot_id = robot_id + self.radius = radius + self._occlusion_enabled = occlusion_enabled + + # This is in fact just a specific kind of Laser2DSensor + # that has a 360 field of view, min_range = 0.1 and + # max_range = radius + if occlusion_enabled: + angle_increment = 5 + else: + angle_increment = 0.25 + super().__init__( + robot_id, + fov=360, + min_range=0.1, + max_range=radius, + angle_increment=angle_increment, + occlusion_enabled=occlusion_enabled, + )
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/models/observation_model.html b/docs/html/_modules/problems/multi_object_search/models/observation_model.html new file mode 100644 index 00000000..9938feee --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/models/observation_model.html @@ -0,0 +1,442 @@ + + + + + + + problems.multi_object_search.models.observation_model — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.models.observation_model

    +"""Defines the ObservationModel for the 2D Multi-Object Search domain.
    +
    +Origin: Multi-Object Search using Object-Oriented POMDPs (ICRA 2019)
    +(extensions: action space changes, different sensor model, gridworld instead of
    +topological graph)
    +
    +Observation: {objid : pose(x,y) or NULL}. The sensor model could vary;
    +             it could be a fan-shaped model as the original paper, or
    +             it could be something else. But the resulting observation
    +             should be a map from object id to observed pose or NULL (not observed).
    +
    +Observation Model
    +
    +  The agent can observe its own state, as well as object poses
    +  that are within its sensor range. We only need to model object
    +  observation.
    +
    +"""
    +
    +import pomdp_py
    +import math
    +import random
    +import numpy as np
    +from pomdp_py.problems.multi_object_search.domain.state import *
    +from pomdp_py.problems.multi_object_search.domain.action import *
    +from pomdp_py.problems.multi_object_search.domain.observation import *
    +
    +
    +#### Observation Models ####
    +
    +[docs] +class MosObservationModel(pomdp_py.OOObservationModel): + """Object-oriented transition model""" + + def __init__(self, dim, sensor, object_ids, sigma=0.01, epsilon=1): + self.sigma = sigma + self.epsilon = epsilon + observation_models = { + objid: ObjectObservationModel( + objid, sensor, dim, sigma=sigma, epsilon=epsilon + ) + for objid in object_ids + } + pomdp_py.OOObservationModel.__init__(self, observation_models) + +
    +[docs] + def sample(self, next_state, action, argmax=False, **kwargs): + if not isinstance(action, LookAction): + return MosOOObservation({}) + # return MosOOObservation({objid: ObjectObservationModel.NULL + # for objid in next_state.object_states + # if objid != next_state.object_states[objid].objclass != "robot"}) + + factored_observations = super().sample(next_state, action, argmax=argmax) + return MosOOObservation.merge(factored_observations, next_state)
    +
    + + + +
    +[docs] +class ObjectObservationModel(pomdp_py.ObservationModel): + def __init__(self, objid, sensor, dim, sigma=0, epsilon=1): + """ + sigma and epsilon are parameters of the observation model (see paper), + dim (tuple): a tuple (width, length) for the dimension of the world""" + self._objid = objid + self._sensor = sensor + self._dim = dim + self.sigma = sigma + self.epsilon = epsilon + + def _compute_params(self, object_in_sensing_region): + if object_in_sensing_region: + # Object is in the sensing region + alpha = self.epsilon + beta = (1.0 - self.epsilon) / 2.0 + gamma = (1.0 - self.epsilon) / 2.0 + else: + # Object is not in the sensing region. + alpha = (1.0 - self.epsilon) / 2.0 + beta = (1.0 - self.epsilon) / 2.0 + gamma = self.epsilon + return alpha, beta, gamma + +
    +[docs] + def probability(self, observation, next_state, action, **kwargs): + """ + Returns the probability of Pr (observation | next_state, action). + + Args: + observation (ObjectObservation) + next_state (State) + action (Action) + """ + if not isinstance(action, LookAction): + # No observation should be received + if observation.pose == ObjectObservation.NULL: + return 1.0 + else: + return 0.0 + + if observation.objid != self._objid: + raise ValueError("The observation is not about the same object") + + # The (funny) business of allowing histogram belief update using O(oi|si',sr',a). + next_robot_state = kwargs.get("next_robot_state", None) + if next_robot_state is not None: + assert ( + next_robot_state["id"] == self._sensor.robot_id + ), "Robot id of observation model mismatch with given state" + robot_pose = next_robot_state.pose + + if isinstance(next_state, ObjectState): + assert ( + next_state["id"] == self._objid + ), "Object id of observation model mismatch with given state" + object_pose = next_state.pose + else: + object_pose = next_state.pose(self._objid) + else: + robot_pose = next_state.pose(self._sensor.robot_id) + object_pose = next_state.pose(self._objid) + + # Compute the probability + zi = observation.pose + alpha, beta, gamma = self._compute_params( + self._sensor.within_range(robot_pose, object_pose) + ) + + # Requires Python >= 3.6 + prob = 0.0 + # Event A: + # object in sensing region and observation comes from object i + if zi == ObjectObservation.NULL: + # Even though event A occurred, the observation is NULL. + # This has 0.0 probability. + prob += 0.0 * alpha + else: + gaussian = pomdp_py.Gaussian( + list(object_pose), [[self.sigma**2, 0], [0, self.sigma**2]] + ) + prob += gaussian[zi] * alpha + + # Event B + prob += (1.0 / self._sensor.sensing_region_size) * beta + + # Event C + pr_c = 1.0 if zi == ObjectObservation.NULL else 0.0 # indicator zi == NULL + prob += pr_c * gamma + return prob
    + + +
    +[docs] + def sample(self, next_state, action, **kwargs): + """Returns observation""" + if not isinstance(action, LookAction): + # Not a look action. So no observation + return ObjectObservation(self._objid, ObjectObservation.NULL) + + robot_pose = next_state.pose(self._sensor.robot_id) + object_pose = next_state.pose(self._objid) + + # Obtain observation according to distribution. + alpha, beta, gamma = self._compute_params( + self._sensor.within_range(robot_pose, object_pose) + ) + + # Requires Python >= 3.6 + event_occured = random.choices( + ["A", "B", "C"], weights=[alpha, beta, gamma], k=1 + )[0] + zi = self._sample_zi(event_occured, next_state) + + return ObjectObservation(self._objid, zi)
    + + +
    +[docs] + def argmax(self, next_state, action, **kwargs): + # Obtain observation according to distribution. + alpha, beta, gamma = self._compute_params( + self._sensor.within_range(robot_pose, object_pose) + ) + + event_probs = {"A": alpha, "B": beta, "C": gamma} + event_occured = max(event_probs, key=lambda e: event_probs[e]) + zi = self._sample_zi(event_occured, next_state, argmax=True) + return ObjectObservation(self._objid, zi)
    + + + def _sample_zi(self, event, next_state, argmax=False): + if event == "A": + object_true_pose = next_state.object_pose(self._objid) + gaussian = pomdp_py.Gaussian( + list(object_true_pose), [[self.sigma**2, 0], [0, self.sigma**2]] + ) + if not argmax: + zi = gaussian.random() + else: + zi = gaussian.mpe() + zi = (int(round(zi[0])), int(round(zi[1]))) + + elif event == "B": + # TODO: FIX. zi should ONLY come from the field of view. + # There is currently no easy way to sample from the field of view. + width, height = self._dim + zi = ( + random.randint(0, width), # x axis + random.randint(0, height), + ) # y axis + else: # event == C + zi = ObjectObservation.NULL + return zi
    + + + +### Unit test ### +
    +[docs] +def unittest(): + from ..env.env import ( + make_laser_sensor, + make_proximity_sensor, + equip_sensors, + interpret, + interpret_robot_id, + ) + + # Test within search region check, + # and the observation model probability and + # sampling functions. + worldmap = """ + .......... + ....T..... + ......x... + ..T.r.T... + ..x....... + ....T..... + .......... + """ + # 0123456789 + # 10 x 8 + worldstr = equip_sensors(worldmap, {"r": make_laser_sensor(90, (1, 5), 0.5, False)}) + env = interpret(worldstr) + robot_id = interpret_robot_id("r") + robot_pose = env.state.pose(robot_id) + + # within_range test + sensor = env.sensors[robot_id] + assert sensor.within_range(robot_pose, (4, 3)) == False + assert sensor.within_range(robot_pose, (5, 3)) == True + assert sensor.within_range(robot_pose, (6, 3)) == True + assert sensor.within_range(robot_pose, (7, 2)) == True + assert sensor.within_range(robot_pose, (7, 3)) == True + assert sensor.within_range(robot_pose, (4, 3)) == False + assert sensor.within_range(robot_pose, (2, 4)) == False + assert sensor.within_range(robot_pose, (4, 1)) == False + assert sensor.within_range(robot_pose, (4, 5)) == False + assert sensor.within_range(robot_pose, (0, 0)) == False + + print(env.state) + + # observation model test + O0 = ObjectObservationModel( + 0, sensor, (env.width, env.length), sigma=0.01, epsilon=1 + ) + O2 = ObjectObservationModel( + 2, sensor, (env.width, env.length), sigma=0.01, epsilon=1 + ) + O3 = ObjectObservationModel( + 3, sensor, (env.width, env.length), sigma=0.01, epsilon=1 + ) + O5 = ObjectObservationModel( + 5, sensor, (env.width, env.length), sigma=0.01, epsilon=1 + ) + + z0 = O0.sample(env.state, Look) + assert z0.pose == ObjectObservation.NULL + z2 = O2.sample(env.state, Look) + assert z2.pose == ObjectObservation.NULL + z3 = O3.sample(env.state, Look) + assert z3.pose == (6, 3) + z5 = O5.sample(env.state, Look) + assert z5.pose == ObjectObservation.NULL + + assert O0.probability(z0, env.state, Look) == 1.0 + assert O2.probability(z2, env.state, Look) == 1.0 + assert O3.probability(z3, env.state, Look) >= 1.0 + assert ( + O3.probability(ObjectObservation(3, ObjectObservation.NULL), env.state, Look) + == 0.0 + ) + assert O5.probability(z5, env.state, Look) == 1.0
    + + + +if __name__ == "__main__": + unittest() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/models/policy_model.html b/docs/html/_modules/problems/multi_object_search/models/policy_model.html new file mode 100644 index 00000000..f1d18c77 --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/models/policy_model.html @@ -0,0 +1,208 @@ + + + + + + + problems.multi_object_search.models.policy_model — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.models.policy_model

    +"""Policy model for 2D Multi-Object Search domain.
    +It is optional for the agent to be equipped with an occupancy
    +grid map of the environment.
    +"""
    +
    +import pomdp_py
    +import random
    +from pomdp_py.problems.multi_object_search.domain.action import *
    +
    +
    +
    +[docs] +class PolicyModel(pomdp_py.RolloutPolicy): + """Simple policy model. All actions are possible at any state.""" + + def __init__(self, robot_id, grid_map=None): + """FindAction can only be taken after LookAction""" + self.robot_id = robot_id + self._grid_map = grid_map + +
    +[docs] + def sample(self, state, **kwargs): + return random.sample(self._get_all_actions(**kwargs), 1)[0]
    + + +
    +[docs] + def probability(self, action, state, **kwargs): + raise NotImplementedError
    + + +
    +[docs] + def argmax(self, state, **kwargs): + """Returns the most likely action""" + raise NotImplementedError
    + + +
    +[docs] + def get_all_actions(self, state=None, history=None): + """note: find can only happen after look.""" + can_find = False + if history is not None and len(history) > 1: + # last action + last_action = history[-1][0] + if isinstance(last_action, LookAction): + can_find = True + find_action = [Find] if can_find else [] + if state is None: + return ALL_MOTION_ACTIONS + [Look] + find_action + else: + if self._grid_map is not None: + valid_motions = self._grid_map.valid_motions( + self.robot_id, state.pose(self.robot_id), ALL_MOTION_ACTIONS + ) + return list(valid_motions) + [Look] + find_action + else: + return ALL_MOTION_ACTIONS + [Look] + find_action
    + + +
    +[docs] + def rollout(self, state, history=None): + return random.sample(self.get_all_actions(state=state, history=history), 1)[0]
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/models/reward_model.html b/docs/html/_modules/problems/multi_object_search/models/reward_model.html new file mode 100644 index 00000000..ff9a727f --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/models/reward_model.html @@ -0,0 +1,231 @@ + + + + + + + problems.multi_object_search.models.reward_model — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.models.reward_model

    +"""Reward model for 2D Multi-object Search domain"""
    +
    +import pomdp_py
    +from pomdp_py.problems.multi_object_search.domain.action import *
    +
    +
    +
    +[docs] +class MosRewardModel(pomdp_py.RewardModel): + def __init__(self, target_objects, big=1000, small=1, robot_id=None): + """ + robot_id (int): This model is the reward for one agent (i.e. robot), + If None, then this model could be for the environment. + target_objects (set): a set of objids for target objects. + """ + self._robot_id = robot_id + self.big = big + self.small = small + self._target_objects = target_objects + +
    +[docs] + def probability( + self, reward, state, action, next_state, normalized=False, **kwargs + ): + if reward == self._reward_func(state, action): + return 1.0 + else: + return 0.0
    + + +
    +[docs] + def sample(self, state, action, next_state, normalized=False, robot_id=None): + # deterministic + return self._reward_func(state, action, next_state, robot_id=robot_id)
    + + +
    +[docs] + def argmax(self, state, action, next_state, normalized=False, robot_id=None): + """Returns the most likely reward""" + return self._reward_func(state, action, next_state, robot_id=robot_id)
    +
    + + + +
    +[docs] +class GoalRewardModel(MosRewardModel): + """ + This is a reward where the agent gets reward only for detect-related actions. + """ + + def _reward_func(self, state, action, next_state, robot_id=None): + if robot_id is None: + assert ( + self._robot_id is not None + ), "Reward must be computed with respect to one robot." + robot_id = self._robot_id + + reward = 0 + + # If the robot has detected all objects + if len(state.object_states[robot_id]["objects_found"]) == len( + self._target_objects + ): + return 0 # no reward or penalty; the task is finished. + + if isinstance(action, MotionAction): + reward = reward - self.small - action.distance_cost + elif isinstance(action, LookAction): + reward = reward - self.small + elif isinstance(action, FindAction): + if state.object_states[robot_id]["camera_direction"] is None: + # The robot didn't look before detect. So nothing is in the field of view. + reward -= self.big + else: + # transition function should've taken care of the detection. + new_objects_count = len( + set(next_state.object_states[robot_id].objects_found) + - set(state.object_states[robot_id].objects_found) + ) + if new_objects_count == 0: + # No new detection. "detect" is a bad action. + reward -= self.big + else: + # Has new detection. Award. + reward += self.big + return reward
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/models/transition_model.html b/docs/html/_modules/problems/multi_object_search/models/transition_model.html new file mode 100644 index 00000000..0df0d956 --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/models/transition_model.html @@ -0,0 +1,386 @@ + + + + + + + problems.multi_object_search.models.transition_model — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.models.transition_model

    +"""Defines the TransitionModel for the 2D Multi-Object Search domain.
    +
    +Origin: Multi-Object Search using Object-Oriented POMDPs (ICRA 2019)
    +(extensions: action space changes, different sensor model, gridworld instead of
    +topological graph)
    +
    +Description: Multi-Object Search in a 2D grid world.
    +
    +Transition: deterministic
    +"""
    +
    +import pomdp_py
    +import copy
    +from pomdp_py.problems.multi_object_search.domain.state import *
    +from pomdp_py.problems.multi_object_search.domain.observation import *
    +from pomdp_py.problems.multi_object_search.domain.action import *
    +
    +
    +####### Transition Model #######
    +
    +[docs] +class MosTransitionModel(pomdp_py.OOTransitionModel): + """Object-oriented transition model; The transition model supports the + multi-robot case, where each robot is equipped with a sensor; The + multi-robot transition model should be used by the Environment, but + not necessarily by each robot for planning. + """ + + def __init__(self, dim, sensors, object_ids, epsilon=1e-9): + """ + sensors (dict): robot_id -> Sensor + for_env (bool): True if this is a robot transition model used by the + Environment. see RobotTransitionModel for details. + """ + self._sensors = sensors + transition_models = { + objid: StaticObjectTransitionModel(objid, epsilon=epsilon) + for objid in object_ids + if objid not in sensors + } + for robot_id in sensors: + transition_models[robot_id] = RobotTransitionModel( + sensors[robot_id], dim, epsilon=epsilon + ) + super().__init__(transition_models) + +
    +[docs] + def sample(self, state, action, **kwargs): + oostate = pomdp_py.OOTransitionModel.sample(self, state, action, **kwargs) + return MosOOState(oostate.object_states)
    + + +
    +[docs] + def argmax(self, state, action, normalized=False, **kwargs): + oostate = pomdp_py.OOTransitionModel.argmax(self, state, action, **kwargs) + return MosOOState(oostate.object_states)
    +
    + + + +
    +[docs] +class StaticObjectTransitionModel(pomdp_py.TransitionModel): + """This model assumes the object is static.""" + + def __init__(self, objid, epsilon=1e-9): + self._objid = objid + self._epsilon = epsilon + +
    +[docs] + def probability(self, next_object_state, state, action): + if next_object_state != state.object_states[next_object_state["id"]]: + return self._epsilon + else: + return 1.0 - self._epsilon
    + + +
    +[docs] + def sample(self, state, action): + """Returns next_object_state""" + return self.argmax(state, action)
    + + +
    +[docs] + def argmax(self, state, action): + """Returns the most likely next object_state""" + return copy.deepcopy(state.object_states[self._objid])
    +
    + + + +
    +[docs] +class RobotTransitionModel(pomdp_py.TransitionModel): + """We assume that the robot control is perfect and transitions are deterministic.""" + + def __init__(self, sensor, dim, epsilon=1e-9): + """ + dim (tuple): a tuple (width, length) for the dimension of the world + """ + # this is used to determine objects found for FindAction + self._sensor = sensor + self._robot_id = sensor.robot_id + self._dim = dim + self._epsilon = epsilon + +
    +[docs] + @classmethod + def if_move_by(cls, robot_id, state, action, dim, check_collision=True): + """Defines the dynamics of robot motion; + dim (tuple): the width, length of the search world.""" + if not isinstance(action, MotionAction): + raise ValueError("Cannot move robot with %s action" % str(type(action))) + + robot_pose = state.pose(robot_id) + rx, ry, rth = robot_pose + if action.scheme == MotionAction.SCHEME_XYTH: + dx, dy, th = action.motion + rx += dx + ry += dy + rth = th + elif action.scheme == MotionAction.SCHEME_VW: + # odometry motion model + forward, angle = action.motion + rth += angle # angle (radian) + rx = int(round(rx + forward * math.cos(rth))) + ry = int(round(ry + forward * math.sin(rth))) + rth = rth % (2 * math.pi) + + if valid_pose( + (rx, ry, rth), + dim[0], + dim[1], + state=state, + check_collision=check_collision, + pose_objid=robot_id, + ): + return (rx, ry, rth) + else: + return robot_pose # no change because change results in invalid pose
    + + +
    +[docs] + def probability(self, next_robot_state, state, action): + if next_robot_state != self.argmax(state, action): + return self._epsilon + else: + return 1.0 - self._epsilon
    + + +
    +[docs] + def argmax(self, state, action): + """Returns the most likely next robot_state""" + if isinstance(state, RobotState): + robot_state = state + else: + robot_state = state.object_states[self._robot_id] + + next_robot_state = copy.deepcopy(robot_state) + # camera direction is only not None when looking + next_robot_state["camera_direction"] = None + if isinstance(action, MotionAction): + # motion action + next_robot_state["pose"] = RobotTransitionModel.if_move_by( + self._robot_id, state, action, self._dim + ) + elif isinstance(action, LookAction): + if hasattr(action, "motion") and action.motion is not None: + # rotate the robot + next_robot_state["pose"] = self._if_move_by( + self._robot_id, state, action, self._dim + ) + next_robot_state["camera_direction"] = action.name + elif isinstance(action, FindAction): + robot_pose = state.pose(self._robot_id) + z = self._sensor.observe(robot_pose, state) + # Update "objects_found" set for target objects + observed_target_objects = { + objid + for objid in z.objposes + if ( + state.object_states[objid].objclass == "target" + and z.objposes[objid] != ObjectObservation.NULL + ) + } + next_robot_state["objects_found"] = tuple( + set(next_robot_state["objects_found"]) | set(observed_target_objects) + ) + return next_robot_state
    + + +
    +[docs] + def sample(self, state, action): + """Returns next_robot_state""" + return self.argmax(state, action)
    +
    + + + +# Utility functions +
    +[docs] +def valid_pose(pose, width, length, state=None, check_collision=True, pose_objid=None): + """ + Returns True if the given `pose` (x,y) is a valid pose; + If `check_collision` is True, then the pose is only valid + if it is not overlapping with any object pose in the environment state. + """ + x, y = pose[:2] + + # Check collision with obstacles + if check_collision and state is not None: + object_poses = state.object_poses + for objid in object_poses: + if state.object_states[objid].objclass.startswith("obstacle"): + if objid == pose_objid: + continue + if (x, y) == object_poses[objid]: + return False + return in_boundary(pose, width, length)
    + + + +
    +[docs] +def in_boundary(pose, width, length): + # Check if in boundary + x, y = pose[:2] + if x >= 0 and x < width: + if y >= 0 and y < length: + if len(pose) == 3: + th = pose[2] # radian + if th < 0 or th > 2 * math.pi: + return False + return True + return False
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/multi_object_search/problem.html b/docs/html/_modules/problems/multi_object_search/problem.html new file mode 100644 index 00000000..efc8628d --- /dev/null +++ b/docs/html/_modules/problems/multi_object_search/problem.html @@ -0,0 +1,510 @@ + + + + + + + problems.multi_object_search.problem — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.multi_object_search.problem

    +"""2D Multi-Object Search (MOS) Task.
    +Uses the domain, models, and agent/environment
    +to actually define the POMDP problem for multi-object search.
    +Then, solve it using POUCT or POMCP."""
    +
    +import pomdp_py
    +from pomdp_py.problems.multi_object_search.env.env import *
    +from pomdp_py.problems.multi_object_search.env.visual import *
    +from pomdp_py.problems.multi_object_search.agent.agent import *
    +from pomdp_py.problems.multi_object_search.example_worlds import *
    +from pomdp_py.problems.multi_object_search.domain.observation import *
    +from pomdp_py.problems.multi_object_search.models.components.grid_map import *
    +import argparse
    +import time
    +import random
    +
    +
    +
    +[docs] +class MosOOPOMDP(pomdp_py.OOPOMDP): + """ + A MosOOPOMDP is instantiated given a string description + of the search world, sensor descriptions for robots, + and the necessary parameters for the agent's models. + + Note: This is of course a simulation, where you can + generate a world and know where the target objects are + and then construct the Environment object. But in the + real robot scenario, you don't know where the objects + are. In that case, as I have done it in the past, you + could construct an Environment object and give None to + the object poses. + """ + + def __init__( + self, + robot_id, + env=None, + grid_map=None, + sensors=None, + sigma=0.01, + epsilon=1, + belief_rep="histogram", + prior={}, + num_particles=100, + agent_has_map=False, + ): + """ + Args: + robot_id (int or str): the id of the agent that will solve this MosOOPOMDP. + If it is a `str`, it will be interpreted as an integer using `interpret_robot_id` + in env/env.py. + env (MosEnvironment): the environment. + grid_map (str): Search space description. See env/env.py:interpret. An example: + rx... + .x.xT + ..... + Ignored if env is not None + sensors (dict): map from robot character to sensor string. + For example: {'r': 'laser fov=90 min_range=1 max_range=5 + angle_increment=5'} + Ignored if env is not None + agent_has_map (bool): If True, we assume the agent is given the occupancy + grid map of the world. Then, the agent can use this + map to avoid planning invalid actions (bumping into things). + But this map does not help the agent's prior belief directly. + + sigma, epsilon: observation model paramters + belief_rep (str): belief representation. Either histogram or particles. + prior (dict or str): either a dictionary as defined in agent/belief.py + or a string, either "uniform" or "informed". For "uniform", a uniform + prior will be given. For "informed", a perfect prior will be given. + num_particles (int): setting for the particle belief representation + """ + if env is None: + assert grid_map is not None and sensors is not None, ( + "Since env is not provided, you must provide string descriptions" + "of the world and sensors." + ) + worldstr = equip_sensors(grid_map, sensors) + dim, robots, objects, obstacles, sensors = interpret(worldstr) + init_state = MosOOState({**objects, **robots}) + env = MosEnvironment(dim, init_state, sensors, obstacles=obstacles) + + # construct prior + if type(prior) == str: + if prior == "uniform": + prior = {} + elif prior == "informed": + prior = {} + for objid in env.target_objects: + groundtruth_pose = env.state.pose(objid) + prior[objid] = {groundtruth_pose: 1.0} + + # Potential extension: a multi-agent POMDP. For now, the environment + # can keep track of the states of multiple agents, but a POMDP is still + # only defined over a single agent. Perhaps, MultiAgent is just a kind + # of Agent, which will make the implementation of multi-agent POMDP cleaner. + robot_id = robot_id if type(robot_id) == int else interpret_robot_id(robot_id) + grid_map = ( + GridMap( + env.width, + env.length, + {objid: env.state.pose(objid) for objid in env.obstacles}, + ) + if agent_has_map + else None + ) + agent = MosAgent( + robot_id, + env.state.object_states[robot_id], + env.target_objects, + (env.width, env.length), + env.sensors[robot_id], + sigma=sigma, + epsilon=epsilon, + belief_rep=belief_rep, + prior=prior, + num_particles=num_particles, + grid_map=grid_map, + ) + super().__init__( + agent, + env, + name="MOS(%d,%d,%d)" % (env.width, env.length, len(env.target_objects)), + )
    + + + +### Belief Update ### +
    +[docs] +def belief_update(agent, real_action, real_observation, next_robot_state, planner): + """Updates the agent's belief; The belief update may happen + through planner update (e.g. when planner is POMCP).""" + # Updates the planner; In case of POMCP, agent's belief is also updated. + planner.update(agent, real_action, real_observation) + + # Update agent's belief, when planner is not POMCP + if not isinstance(planner, pomdp_py.POMCP): + # Update belief for every object + for objid in agent.cur_belief.object_beliefs: + belief_obj = agent.cur_belief.object_belief(objid) + if isinstance(belief_obj, pomdp_py.Histogram): + if objid == agent.robot_id: + # Assuming the agent can observe its own state: + new_belief = pomdp_py.Histogram({next_robot_state: 1.0}) + else: + # This is doing + # B(si') = normalizer * O(oi|si',sr',a) * sum_s T(si'|s,a)*B(si) + # + # Notes: First, objects are static; Second, + # O(oi|s',a) ~= O(oi|si',sr',a) according to the definition + # of the observation model in models/observation.py. Note + # that the exact belief update rule for this OOPOMDP needs to use + # a model like O(oi|si',sr',a) because it's intractable to + # consider s' (that means all combinations of all object + # states must be iterated). Of course, there could be work + # around (out of scope) - Consider a volumetric observaiton, + # instead of the object-pose observation. That means oi is a + # set of pixels (2D) or voxels (3D). Note the real + # observation, oi, is most likely sampled from O(oi|s',a) + # because real world considers the occlusion between objects + # (due to full state s'). The problem is how to compute the + # probability of this oi given s' and a, where it's + # intractable to obtain s'. To this end, we can make a + # simplifying assumption that an object is contained within + # one pixel (or voxel); The pixel (or voxel) is labeled to + # indicate free space or object. The label of each pixel or + # voxel is certainly a result of considering the full state + # s. The occlusion can be handled nicely with the volumetric + # observation definition. Then that assumption can reduce the + # observation model from O(oi|s',a) to O(label_i|s',a) and + # it becomes easy to define O(label_i=i|s',a) and O(label_i=FREE|s',a). + # These ideas are used in my recent 3D object search work. + new_belief = pomdp_py.update_histogram_belief( + belief_obj, + real_action, + real_observation.for_obj(objid), + agent.observation_model[objid], + agent.transition_model[objid], + # The agent knows the objects are static. + static_transition=objid != agent.robot_id, + oargs={"next_robot_state": next_robot_state}, + ) + else: + raise ValueError( + "Unexpected program state." + "Are you using the appropriate belief representation?" + ) + + agent.cur_belief.set_object_belief(objid, new_belief)
    + + + +### Solve the problem with POUCT/POMCP planner ### +### This is the main online POMDP solver logic ### +
    +[docs] +def solve( + problem, + max_depth=10, # planning horizon + discount_factor=0.99, + planning_time=1.0, # amount of time (s) to plan each step + exploration_const=1000, # exploration constant + visualize=True, + max_time=120, # maximum amount of time allowed to solve the problem + max_steps=500, +): # maximum number of planning steps the agent can take. + """ + This function terminates when: + - maximum time (max_time) reached; This time includes planning and updates + - agent has planned `max_steps` number of steps + - agent has taken n FindAction(s) where n = number of target objects. + + Args: + visualize (bool) if True, show the pygame visualization. + """ + + random_objid = random.sample(sorted(problem.env.target_objects), 1)[0] + random_object_belief = problem.agent.belief.object_beliefs[random_objid] + if isinstance(random_object_belief, pomdp_py.Histogram): + # Use POUCT + planner = pomdp_py.POUCT( + max_depth=max_depth, + discount_factor=discount_factor, + planning_time=planning_time, + exploration_const=exploration_const, + rollout_policy=problem.agent.policy_model, + ) # Random by default + elif isinstance(random_object_belief, pomdp_py.Particles): + # Use POMCP + planner = pomdp_py.POMCP( + max_depth=max_depth, + discount_factor=discount_factor, + planning_time=planning_time, + exploration_const=exploration_const, + rollout_policy=problem.agent.policy_model, + ) # Random by default + else: + raise ValueError( + "Unsupported object belief type %s" % str(type(random_object_belief)) + ) + + robot_id = problem.agent.robot_id + if visualize: + viz = MosViz( + problem.env, controllable=False + ) # controllable=False means no keyboard control. + if viz.on_init() == False: + raise Exception("Environment failed to initialize") + viz.update(robot_id, None, None, None, problem.agent.cur_belief) + viz.on_render() + + _time_used = 0 + _find_actions_count = 0 + _total_reward = 0 # total, undiscounted reward + for i in range(max_steps): + # Plan action + _start = time.time() + real_action = planner.plan(problem.agent) + _time_used += time.time() - _start + if _time_used > max_time: + break # no more time to update. + + # Execute action + reward = problem.env.state_transition( + real_action, execute=True, robot_id=robot_id + ) + + # Receive observation + _start = time.time() + real_observation = problem.env.provide_observation( + problem.agent.observation_model, real_action + ) + + # Updates + problem.agent.clear_history() # truncate history + problem.agent.update_history(real_action, real_observation) + belief_update( + problem.agent, + real_action, + real_observation, + problem.env.state.object_states[robot_id], + planner, + ) + _time_used += time.time() - _start + + # Info and render + _total_reward += reward + if isinstance(real_action, FindAction): + _find_actions_count += 1 + print("==== Step %d ====" % (i + 1)) + print("Action: %s" % str(real_action)) + print("Observation: %s" % str(real_observation)) + print("Reward: %s" % str(reward)) + print("Reward (Cumulative): %s" % str(_total_reward)) + print("Find Actions Count: %d" % _find_actions_count) + if isinstance(planner, pomdp_py.POUCT): + print("__num_sims__: %d" % planner.last_num_sims) + + if visualize: + # This is used to show the sensing range; Not sampled + # according to observation model. + robot_pose = problem.env.state.object_states[robot_id].pose + viz_observation = MosOOObservation({}) + if isinstance(real_action, LookAction) or isinstance( + real_action, FindAction + ): + viz_observation = problem.env.sensors[robot_id].observe( + robot_pose, problem.env.state + ) + viz.update( + robot_id, + real_action, + real_observation, + viz_observation, + problem.agent.cur_belief, + ) + viz.on_loop() + viz.on_render() + + # Termination check + if ( + set(problem.env.state.object_states[robot_id].objects_found) + == problem.env.target_objects + ): + print("Done!") + break + if _find_actions_count >= len(problem.env.target_objects): + print("FindAction limit reached.") + break + if _time_used > max_time: + print("Maximum time reached.") + break
    + + + +# Test +
    +[docs] +def unittest(): + # random world + grid_map, robot_char = random_world(10, 10, 5, 10) + laserstr = make_laser_sensor(90, (1, 4), 0.5, False) + proxstr = make_proximity_sensor(4, False) + problem = MosOOPOMDP( + robot_char, # r is the robot character + sigma=0.05, # observation model parameter + epsilon=0.95, # observation model parameter + grid_map=grid_map, + sensors={robot_char: proxstr}, + prior="uniform", + agent_has_map=True, + ) + solve( + problem, + max_depth=10, + discount_factor=0.99, + planning_time=1.0, + exploration_const=1000, + visualize=True, + max_time=120, + max_steps=500, + )
    + + + +if __name__ == "__main__": + unittest() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/rocksample/rocksample_problem.html b/docs/html/_modules/problems/rocksample/rocksample_problem.html new file mode 100644 index 00000000..793e25ac --- /dev/null +++ b/docs/html/_modules/problems/rocksample/rocksample_problem.html @@ -0,0 +1,810 @@ + + + + + + + problems.rocksample.rocksample_problem — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.rocksample.rocksample_problem

    +"""RockSample(n,k) problem
    +
    +Origin: Heuristic Search Value Iteration for POMDPs (UAI 2004)
    +
    +Description:
    +
    +State space:
    +
    +    Position {(1,1),(1,2),...(n,n)}
    +    :math:`\\times` RockType_1 :math:`\\times` RockType_2, ..., :math:`\\times` RockType_k
    +    where RockType_i = {Good, Bad}
    +    :math:`\\times` TerminalState
    +
    +    (basically, the positions of rocks are known to the robot,
    +     but not represented explicitly in the state space. Check_i
    +     will smartly check the rock i at its location.)
    +
    +Action space:
    +
    +    North, South, East, West, Sample, Check_1, ..., Check_k
    +    The first four moves the agent deterministically
    +    Sample: samples the rock at agent's current location
    +    Check_i: receives a noisy observation about RockType_i
    +    (noise determined by eta (:math:`\eta`). eta=1 -> perfect sensor; eta=0 -> uniform)
    +
    +Observation: observes the property of rock i when taking Check_i.  The
    +     observation may be noisy, depending on an efficiency parameter which
    +     decreases exponentially as the distance increases between the rover and
    +     rock i. 'half_efficiency_dist' influences this parameter (larger, more robust)
    +
    +Reward: +10 for Sample a good rock. -10 for Sampling a bad rock.
    +        Move to exit area +10. Other actions have no cost or reward.
    +
    +Initial belief: every rock has equal probability of being Good or Bad.
    +
    +"""
    +
    +import pomdp_py
    +import random
    +import math
    +import numpy as np
    +import sys
    +import copy
    +
    +EPSILON = 1e-9
    +
    +
    +
    +[docs] +def euclidean_dist(p1, p2): + return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)
    + + + +
    +[docs] +class RockType: + GOOD = "good" + BAD = "bad" + +
    +[docs] + @staticmethod + def invert(rocktype): + if rocktype == "good": + return "bad" + else: + return "good"
    + + # return 1 - rocktype + +
    +[docs] + @staticmethod + def random(p=0.5): + if random.uniform(0, 1) >= p: + return RockType.GOOD + else: + return RockType.BAD
    +
    + + + +
    +[docs] +class State(pomdp_py.State): + def __init__(self, position, rocktypes, terminal=False): + """ + position (tuple): (x,y) position of the rover on the grid. + rocktypes: tuple of size k. Each is either Good or Bad. + terminal (bool): The robot is at the terminal state. + + (It is so true that the agent's state doesn't need to involve the map!) + + x axis is horizontal. y axis is vertical. + """ + self.position = position + if type(rocktypes) != tuple: + rocktypes = tuple(rocktypes) + self.rocktypes = rocktypes + self.terminal = terminal + + def __hash__(self): + return hash((self.position, self.rocktypes, self.terminal)) + + def __eq__(self, other): + if isinstance(other, State): + return ( + self.position == other.position + and self.rocktypes == other.rocktypes + and self.terminal == other.terminal + ) + else: + return False + + def __str__(self): + return self.__repr__() + + def __repr__(self): + return "State(%s | %s | %s)" % ( + str(self.position), + str(self.rocktypes), + str(self.terminal), + )
    + + + +
    +[docs] +class Action(pomdp_py.Action): + def __init__(self, name): + self.name = name + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, Action): + return self.name == other.name + elif type(other) == str: + return self.name == other + + def __str__(self): + return self.name + + def __repr__(self): + return "Action(%s)" % self.name
    + + + +
    +[docs] +class MoveAction(Action): + EAST = (1, 0) # x is horizontal; x+ is right. y is vertical; y+ is up. + WEST = (-1, 0) + NORTH = (0, -1) + SOUTH = (0, 1) + + def __init__(self, motion, name): + if motion not in { + MoveAction.EAST, + MoveAction.WEST, + MoveAction.NORTH, + MoveAction.SOUTH, + }: + raise ValueError("Invalid move motion %s" % motion) + self.motion = motion + super().__init__("move-%s" % str(name))
    + + + +MoveEast = MoveAction(MoveAction.EAST, "EAST") +MoveWest = MoveAction(MoveAction.WEST, "WEST") +MoveNorth = MoveAction(MoveAction.NORTH, "NORTH") +MoveSouth = MoveAction(MoveAction.SOUTH, "SOUTH") + + +
    +[docs] +class SampleAction(Action): + def __init__(self): + super().__init__("sample")
    + + + +
    +[docs] +class CheckAction(Action): + def __init__(self, rock_id): + self.rock_id = rock_id + super().__init__("check-%d" % self.rock_id)
    + + + +
    +[docs] +class Observation(pomdp_py.Observation): + def __init__(self, quality): + self.quality = quality + + def __hash__(self): + return hash(self.quality) + + def __eq__(self, other): + if isinstance(other, Observation): + return self.quality == other.quality + elif type(other) == str: + return self.quality == other + + def __str__(self): + return str(self.quality) + + def __repr__(self): + return "Observation(%s)" % str(self.quality)
    + + + +
    +[docs] +class RSTransitionModel(pomdp_py.TransitionModel): + """The model is deterministic""" + + def __init__(self, n, rock_locs, in_exit_area): + """ + rock_locs: a map from (x,y) location to rock_id + in_exit_area: a function (x,y) -> Bool that returns True if (x,y) is in exit area + """ + self._n = n + self._rock_locs = rock_locs + self._in_exit_area = in_exit_area + + def _move_or_exit(self, position, action): + expected = (position[0] + action.motion[0], position[1] + action.motion[1]) + if self._in_exit_area(expected): + return expected, True + else: + return ( + max(0, min(position[0] + action.motion[0], self._n - 1)), + max(0, min(position[1] + action.motion[1], self._n - 1)), + ), False + +
    +[docs] + def probability(self, next_state, state, action, normalized=False, **kwargs): + if next_state != self.sample(state, action): + return EPSILON + else: + return 1.0 - EPSILON
    + + +
    +[docs] + def sample(self, state, action): + next_position = tuple(state.position) + rocktypes = tuple(state.rocktypes) + next_rocktypes = rocktypes + next_terminal = state.terminal + if state.terminal: + next_terminal = True # already terminated. So no state transition happens + else: + if isinstance(action, MoveAction): + next_position, exiting = self._move_or_exit(state.position, action) + if exiting: + next_terminal = True + elif isinstance(action, SampleAction): + if next_position in self._rock_locs: + rock_id = self._rock_locs[next_position] + _rocktypes = list(rocktypes) + _rocktypes[rock_id] = RockType.BAD + next_rocktypes = tuple(_rocktypes) + return State(next_position, next_rocktypes, next_terminal)
    + + +
    +[docs] + def argmax(self, state, action): + """Returns the most likely next state""" + return self.sample(state, action)
    +
    + + + +
    +[docs] +class RSObservationModel(pomdp_py.ObservationModel): + def __init__(self, rock_locs, half_efficiency_dist=20): + self._half_efficiency_dist = half_efficiency_dist + self._rocks = {rock_locs[pos]: pos for pos in rock_locs} + +
    +[docs] + def probability(self, observation, next_state, action): + if isinstance(action, CheckAction): + # compute efficiency + rock_pos = self._rocks[action.rock_id] + dist = euclidean_dist(rock_pos, next_state.position) + eta = (1 + pow(2, -dist / self._half_efficiency_dist)) * 0.5 + + # compute probability + actual_rocktype = next_state.rocktypes[action.rock_id] + if actual_rocktype == observation: + return eta + else: + return 1.0 - eta + else: + if observation.quality is None: + return 1.0 - EPSILON # expected to receive no observation + else: + return EPSILON
    + + +
    +[docs] + def sample(self, next_state, action, argmax=False): + if not next_state.terminal and isinstance(action, CheckAction): + # compute efficiency + rock_pos = self._rocks[action.rock_id] + dist = euclidean_dist(rock_pos, next_state.position) + eta = (1 + pow(2, -dist / self._half_efficiency_dist)) * 0.5 + + if argmax: + keep = eta > 0.5 + else: + keep = eta > random.uniform(0, 1) + + actual_rocktype = next_state.rocktypes[action.rock_id] + if not keep: + observed_rocktype = RockType.invert(actual_rocktype) + return Observation(observed_rocktype) + else: + return Observation(actual_rocktype) + else: + # Terminated or not a check action. So no observation. + return Observation(None) + + return self._probs[next_state][action][observation]
    + + +
    +[docs] + def argmax(self, next_state, action): + """Returns the most likely observation""" + return self.sample(next_state, action, argmax=True)
    +
    + + + +
    +[docs] +class RSRewardModel(pomdp_py.RewardModel): + def __init__(self, rock_locs, in_exit_area): + self._rock_locs = rock_locs + self._in_exit_area = in_exit_area + +
    +[docs] + def sample(self, state, action, next_state, normalized=False, **kwargs): + # deterministic + if state.terminal: + return 0 # terminated. No reward + if isinstance(action, SampleAction): + # need to check the rocktype in `state` because it has turned bad in `next_state` + if state.position in self._rock_locs: + if state.rocktypes[self._rock_locs[state.position]] == RockType.GOOD: + return 10 + else: + # No rock or bad rock + return -10 + else: + return 0 # problem didn't specify penalty for sampling empty space. + + elif isinstance(action, MoveAction): + if self._in_exit_area(next_state.position): + return 10 + return 0
    + + +
    +[docs] + def argmax(self, state, action, next_state, normalized=False, **kwargs): + raise NotImplementedError
    + + +
    +[docs] + def probability( + self, reward, state, action, next_state, normalized=False, **kwargs + ): + raise NotImplementedError
    +
    + + + +
    +[docs] +class RSPolicyModel(pomdp_py.RolloutPolicy): + """Simple policy model according to problem description.""" + + def __init__(self, n, k): + check_actions = set({CheckAction(rock_id) for rock_id in range(k)}) + self._move_actions = {MoveEast, MoveWest, MoveNorth, MoveSouth} + self._other_actions = {SampleAction()} | check_actions + self._all_actions = self._move_actions | self._other_actions + self._n = n + +
    +[docs] + def sample(self, state, normalized=False, **kwargs): + return random.sample(self.get_all_actions(state=state), 1)[0]
    + + +
    +[docs] + def probability(self, action, state, normalized=False, **kwargs): + raise NotImplementedError
    + + +
    +[docs] + def argmax(self, state, normalized=False, **kwargs): + """Returns the most likely reward""" + raise NotImplementedError
    + + +
    +[docs] + def get_all_actions(self, **kwargs): + state = kwargs.get("state", None) + if state is None: + return list(self._all_actions) + else: + motions = set(self._all_actions) + rover_x, rover_y = state.position + if rover_x == 0: + motions.remove(MoveWest) + if rover_y == 0: + motions.remove(MoveNorth) + if rover_y == self._n - 1: + motions.remove(MoveSouth) + return list(motions | self._other_actions)
    + + +
    +[docs] + def rollout(self, state, history=None): + return random.sample(self.get_all_actions(state=state), 1)[0]
    +
    + + + +
    +[docs] +class RockSampleProblem(pomdp_py.POMDP): +
    +[docs] + @staticmethod + def random_free_location(n, not_free_locs): + """returns a random (x,y) location in nxn grid that is free.""" + while True: + loc = (random.randint(0, n - 1), random.randint(0, n - 1)) + if loc not in not_free_locs: + return loc
    + + +
    +[docs] + def in_exit_area(self, pos): + return pos[0] == self._n
    + + +
    +[docs] + @staticmethod + def generate_instance(n, k): + """Returns init_state and rock locations for an instance of RockSample(n,k)""" + + rover_position = (0, random.randint(0, n - 1)) + rock_locs = {} # map from rock location to rock id + for i in range(k): + loc = RockSampleProblem.random_free_location( + n, set(rock_locs.keys()) | set({rover_position}) + ) + rock_locs[loc] = i + + # random rocktypes + rocktypes = tuple(RockType.random() for i in range(k)) + + # Ground truth state + init_state = State(rover_position, rocktypes, False) + + return init_state, rock_locs
    + + +
    +[docs] + def print_state(self): + string = "\n______ID______\n" + rover_position = self.env.state.position + rocktypes = self.env.state.rocktypes + # Rock id map + for y in range(self._n): + for x in range(self._n + 1): + char = "." + if x == self._n: + char = ">" + if (x, y) in self._rock_locs: + char = str(self._rock_locs[(x, y)]) + if (x, y) == rover_position: + char = "R" + string += char + string += "\n" + string += "_____G/B_____\n" + # Good/bad map + for y in range(self._n): + for x in range(self._n + 1): + char = "." + if x == self._n: + char = ">" + if (x, y) in self._rock_locs: + if rocktypes[self._rock_locs[(x, y)]] == RockType.GOOD: + char = "$" + else: + char = "x" + if (x, y) == rover_position: + char = "R" + string += char + string += "\n" + print(string)
    + + + def __init__( + self, n, k, init_state, rock_locs, init_belief, half_efficiency_dist=20 + ): + self._n, self._k = n, k + agent = pomdp_py.Agent( + init_belief, + RSPolicyModel(n, k), + RSTransitionModel(n, rock_locs, self.in_exit_area), + RSObservationModel(rock_locs, half_efficiency_dist=half_efficiency_dist), + RSRewardModel(rock_locs, self.in_exit_area), + ) + env = pomdp_py.Environment( + init_state, + RSTransitionModel(n, rock_locs, self.in_exit_area), + RSRewardModel(rock_locs, self.in_exit_area), + ) + self._rock_locs = rock_locs + super().__init__(agent, env, name="RockSampleProblem")
    + + + +
    +[docs] +def test_planner(rocksample, planner, nsteps=3, discount=0.95): + gamma = 1.0 + total_reward = 0 + total_discounted_reward = 0 + for i in range(nsteps): + print("==== Step %d ====" % (i + 1)) + action = planner.plan(rocksample.agent) + # pomdp_py.visual.visualize_pouct_search_tree(rocksample.agent.tree, + # max_depth=5, anonymize=False) + + true_state = copy.deepcopy(rocksample.env.state) + env_reward = rocksample.env.state_transition(action, execute=True) + true_next_state = copy.deepcopy(rocksample.env.state) + + real_observation = rocksample.env.provide_observation( + rocksample.agent.observation_model, action + ) + rocksample.agent.update_history(action, real_observation) + planner.update(rocksample.agent, action, real_observation) + total_reward += env_reward + total_discounted_reward += env_reward * gamma + gamma *= discount + print("True state: %s" % true_state) + print("Action: %s" % str(action)) + print("Observation: %s" % str(real_observation)) + print("Reward: %s" % str(env_reward)) + print("Reward (Cumulative): %s" % str(total_reward)) + print("Reward (Cumulative Discounted): %s" % str(total_discounted_reward)) + if isinstance(planner, pomdp_py.POUCT): + print("__num_sims__: %d" % planner.last_num_sims) + print("__plan_time__: %.5f" % planner.last_planning_time) + if isinstance(planner, pomdp_py.PORollout): + print("__best_reward__: %d" % planner.last_best_reward) + print("World:") + rocksample.print_state() + + if rocksample.in_exit_area(rocksample.env.state.position): + break + return total_reward, total_discounted_reward
    + + + +
    +[docs] +def init_particles_belief(k, num_particles, init_state, belief="uniform"): + num_particles = 200 + particles = [] + for _ in range(num_particles): + if belief == "uniform": + rocktypes = [] + for i in range(k): + rocktypes.append(RockType.random()) + rocktypes = tuple(rocktypes) + elif belief == "groundtruth": + rocktypes = copy.deepcopy(init_state.rocktypes) + particles.append(State(init_state.position, rocktypes, False)) + init_belief = pomdp_py.Particles(particles) + return init_belief
    + + + +
    +[docs] +def minimal_instance(**kwargs): + # A particular instance for debugging purpose + n, k = 2, 2 + rover_position = (0, 0) + rock_locs = {} # map from rock location to rock id + rock_locs[(0, 1)] = 0 + rock_locs[(1, 1)] = 1 + rocktypes = ("good", "good") + # Ground truth state + init_state = State(rover_position, rocktypes, False) + belief = "uniform" + init_belief = init_particles_belief(k, 200, init_state, belief=belief) + rocksample = RockSampleProblem(n, k, init_state, rock_locs, init_belief, **kwargs) + return rocksample
    + + + +
    +[docs] +def create_instance(n, k, **kwargs): + init_state, rock_locs = RockSampleProblem.generate_instance(n, k) + + belief = "uniform" + + # init belief (uniform), represented in particles; + # We don't factor the state here; We are also not doing any action prior. + init_belief = init_particles_belief(k, 200, init_state, belief=belief) + + rocksample = RockSampleProblem(n, k, init_state, rock_locs, init_belief, **kwargs) + return rocksample
    + + + +
    +[docs] +def main(): + rocksample = debug_instance() # create_instance(7, 8) + rocksample.print_state() + + print("*** Testing POMCP ***") + pomcp = pomdp_py.POMCP( + max_depth=30, + discount_factor=0.95, + num_sims=10000, + exploration_const=5, + rollout_policy=rocksample.agent.policy_model, + num_visits_init=1, + ) + tt, ttd = test_planner(rocksample, pomcp, nsteps=100, discount=0.95)
    + + + +if __name__ == "__main__": + main() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/agent/agent.html b/docs/html/_modules/problems/tag/agent/agent.html new file mode 100644 index 00000000..036aa1d9 --- /dev/null +++ b/docs/html/_modules/problems/tag/agent/agent.html @@ -0,0 +1,281 @@ + + + + + + + problems.tag.agent.agent — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.agent.agent

    +import pomdp_py
    +import copy
    +import random
    +from pomdp_py.problems.tag.domain.observation import *
    +from pomdp_py.problems.tag.domain.action import *
    +from pomdp_py.problems.tag.domain.state import *
    +from pomdp_py.problems.tag.models.observation_model import *
    +from pomdp_py.problems.tag.models.transition_model import *
    +from pomdp_py.problems.tag.models.reward_model import *
    +from pomdp_py.problems.tag.models.policy_model import *
    +from pomdp_py.problems.tag.models.components.motion_policy import *
    +from pomdp_py.problems.tag.models.components.grid_map import *
    +
    +
    +## initialize belief
    +
    +[docs] +def initialize_belief(grid_map, init_robot_position, prior={}): + """Initialize belief. + + Args: + grid_map (GridMap): Holds information of the map occupancy + prior (dict): A map from (x,y)->[0,1]. If empty, the belief + will be uniform.""" + hist = {} # state -> prob + total_prob = 0.0 + for target_position in prior: + state = TagState(init_robot_position, target_position, False) + hist[state] = prior[target_position] + total_prob += hist[state] + + for x in range(grid_map.width): + for y in range(grid_map.length): + if (x, y) in grid_map.obstacle_poses: + # Skip obstacles + continue + state = TagState(init_robot_position, (x, y), False) + if len(prior) > 0: + if (x, y) not in prior: + hist[state] = 1e-9 + else: + hist[state] = 1.0 + total_prob += hist[state] + # Normalize + for state in hist: + hist[state] /= total_prob + + hist_belief = pomdp_py.Histogram(hist) + return hist_belief
    + + + +
    +[docs] +def initialize_particles_belief( + grid_map, init_robot_position, num_particles=100, prior={} +): + """Initialize belief. + + Args: + grid_map (GridMap): Holds information of the map occupancy + prior (dict): A map from (x,y)->[0,1]. If empty, the belief + will be uniform.""" + particles = [] + if len(prior) > 0: + # prior knowledge provided. Just use the prior knowledge + prior_sum = sum(prior[pose] for pose in prior) + for pose in prior[objid]: + state = TagState(init_robot_position, pose) + amount_to_add = (prior[objid][pose] / prior_sum) * num_particles + for _ in range(amount_to_add): + particles.append(state) + else: + while len(particles) < num_particles: + target_position = ( + random.randint(0, grid_map.width - 1), + random.randint(0, grid_map.length - 1), + ) + if target_position in grid_map.obstacle_poses: + # Skip obstacles + continue + state = TagState(init_robot_position, target_position, False) + particles.append(state) + return pomdp_py.Particles(particles)
    + + + +## belief update +
    +[docs] +def belief_update(agent, real_action, real_observation): + # Update agent belief + current_mpe_state = agent.cur_belief.mpe() + next_robot_position = agent.transition_model.sample( + current_mpe_state, real_action + ).robot_position + + next_state_space = set({}) + for state in agent.cur_belief: + next_state = copy.deepcopy(state) + next_state.robot_position = next_robot_position + next_state_space.add(next_state) + + new_belief = pomdp_py.update_histogram_belief( + agent.cur_belief, + real_action, + real_observation, + agent.observation_model, + agent.transition_model, + next_state_space=next_state_space, + ) + + agent.set_belief(new_belief)
    + + + +
    +[docs] +class TagAgent(pomdp_py.Agent): + def __init__(self, init_belief, grid_map, pr_stay=0.2, small=1, big=10): + self._grid_map = grid_map + target_motion_policy = TagTargetMotionPolicy(grid_map, pr_stay) + transition_model = TagTransitionModel(grid_map, target_motion_policy) + reward_model = TagRewardModel(small=small, big=big) + observation_model = TagObservationModel() + policy_model = TagPolicyModel(grid_map=grid_map) + super().__init__( + init_belief, + policy_model, + transition_model=transition_model, + observation_model=observation_model, + reward_model=reward_model, + ) + +
    +[docs] + def clear_history(self): + """Custum function; clear history""" + self._history = None
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/domain/action.html b/docs/html/_modules/problems/tag/domain/action.html new file mode 100644 index 00000000..1312dc96 --- /dev/null +++ b/docs/html/_modules/problems/tag/domain/action.html @@ -0,0 +1,166 @@ + + + + + + + problems.tag.domain.action — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.domain.action

    +"""The Tag problem. Implemented according to the paper `Anytime Point-Based
    +Approximations for Large POMDPs <https://arxiv.org/pdf/1110.0027.pdf>`_.
    +
    +Action space: The agent can take motion action and a tag action.
    +"""
    +
    +# Reuses the actions in the multi object search domain
    +import pomdp_py
    +from pomdp_py.problems.multi_object_search.domain.action import (
    +    Action,
    +    MotionAction,
    +    MoveEast2D,
    +    MoveWest2D,
    +    MoveSouth2D,
    +    MoveNorth2D,
    +)
    +
    +MOTION_ACTIONS = {MoveEast2D, MoveWest2D, MoveSouth2D, MoveNorth2D}
    +
    +
    +
    +[docs] +class TagAction(Action): + def __init__(self): + super().__init__("tag")
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/domain/observation.html b/docs/html/_modules/problems/tag/domain/observation.html new file mode 100644 index 00000000..a3ef6a3b --- /dev/null +++ b/docs/html/_modules/problems/tag/domain/observation.html @@ -0,0 +1,168 @@ + + + + + + + problems.tag.domain.observation — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.domain.observation

    +"""The Tag problem. Implemented according to the paper `Anytime Point-Based
    +Approximations for Large POMDPs <https://arxiv.org/pdf/1110.0027.pdf>`_.
    +
    +Observation space: the agent observes the target's location when the agent and
    +    the target are in the same cell.
    +"""
    +
    +import pomdp_py
    +
    +
    +
    +[docs] +class TagObservation(pomdp_py.Observation): + def __init__(self, target_position): + self.target_position = target_position + + def __hash__(self): + return hash(self.target_position) + + def __eq__(self, other): + if not isinstance(other, TagObservation): + return False + else: + return self.target_position == other.target_position + + def __str__(self): + return "Observation(%s)" % (str(self.target_position))
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/domain/state.html b/docs/html/_modules/problems/tag/domain/state.html new file mode 100644 index 00000000..b3a9fd8c --- /dev/null +++ b/docs/html/_modules/problems/tag/domain/state.html @@ -0,0 +1,186 @@ + + + + + + + problems.tag.domain.state — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.domain.state

    +"""The Tag problem. Implemented according to the paper `Anytime Point-Based
    +Approximations for Large POMDPs <https://arxiv.org/pdf/1110.0027.pdf>`_.
    +
    +State space: state of the robot (x,y), state of the person (x,y), person found.
    +
    +"""
    +
    +import pomdp_py
    +
    +
    +
    +[docs] +class TagState(pomdp_py.State): + def __init__(self, robot_position, target_position, target_found): + """ + robot_position (tuple): x,y location of the robot. + target_position (tuple): x,y location of the target. + target_found (bool): True if the target is found. + """ + self.robot_position = robot_position + self.target_position = target_position + self.target_found = target_found + + def __hash__(self): + return hash((self.robot_position, self.target_position, self.target_found)) + + def __eq__(self, other): + if not isinstance(other, TagState): + return False + else: + return ( + self.robot_position == other.robot_position + and self.target_position == other.target_position + and self.target_found == other.target_found + ) + + def __str__(self): + return "State(%s, %s | %s)" % ( + str(self.robot_position), + str(self.target_position), + str(self.target_found), + ) + + def __repr__(self): + return str(self)
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/env/env.html b/docs/html/_modules/problems/tag/env/env.html new file mode 100644 index 00000000..254da9f9 --- /dev/null +++ b/docs/html/_modules/problems/tag/env/env.html @@ -0,0 +1,193 @@ + + + + + + + problems.tag.env.env — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.env.env

    +import pomdp_py
    +from pomdp_py.problems.tag.domain.state import *
    +from pomdp_py.problems.tag.models.transition_model import *
    +from pomdp_py.problems.tag.models.reward_model import *
    +from pomdp_py.problems.tag.models.components.motion_policy import *
    +from pomdp_py.problems.tag.models.components.grid_map import *
    +from pomdp_py.problems.multi_object_search.env.env import interpret
    +from pomdp_py.problems.multi_object_search.env.visual import MosViz
    +
    +
    +
    +[docs] +class TagEnvironment(pomdp_py.Environment): + def __init__(self, init_state, grid_map, pr_stay=0.2, small=1, big=10): + self._grid_map = grid_map + target_motion_policy = TagTargetMotionPolicy(grid_map, pr_stay) + transition_model = TagTransitionModel(grid_map, target_motion_policy) + reward_model = TagRewardModel(small=small, big=big) + super().__init__(init_state, transition_model, reward_model) + + @property + def width(self): + return self._grid_map.width + + @property + def length(self): + return self._grid_map.length + + @property + def grid_map(self): + return self._grid_map + +
    +[docs] + @classmethod + def from_str(cls, worldstr, **kwargs): + dim, robots, objects, obstacles, _ = interpret(worldstr) + assert len(robots) == 1, "Does not support multiple robots." + robot_position = robots[list(robots.keys())[0]].pose[:2] + targets = [] + obstacle_poses = set({}) + for objid in objects: + if objid not in obstacles: + targets.append(objid) + else: + obstacle_poses.add(objects[objid].pose) + assert len(targets) == 1, "Does not support multiple objects." + target_position = objects[targets[0]].pose + init_state = TagState(robot_position, target_position, False) + grid_map = GridMap(dim[0], dim[1], obstacle_poses) + return TagEnvironment(init_state, grid_map, **kwargs)
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/env/visual.html b/docs/html/_modules/problems/tag/env/visual.html new file mode 100644 index 00000000..4bc13b6b --- /dev/null +++ b/docs/html/_modules/problems/tag/env/visual.html @@ -0,0 +1,438 @@ + + + + + + + problems.tag.env.visual — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.env.visual

    +"""Largely based on MosViz, except this is not an OO-POMDP"""
    +
    +import pygame
    +import cv2
    +import math
    +import numpy as np
    +import random
    +import pomdp_py.utils as util
    +from pomdp_py.problems.tag.env.env import *
    +from pomdp_py.problems.tag.domain.observation import *
    +from pomdp_py.problems.tag.domain.action import *
    +from pomdp_py.problems.tag.domain.state import *
    +from pomdp_py.problems.tag.example_worlds import *
    +from pomdp_py.problems.tag.models.observation_model import *
    +
    +
    +#### Visualization through pygame ####
    +
    +[docs] +class TagViz: + def __init__(self, env, res=30, fps=30, controllable=False, observation_model=None): + self._env = env + + self._res = res + self._img = self._make_gridworld_image(res) + self._last_observation = None + self._last_action = None + self._last_belief = None + self._observation_model = observation_model + + self._controllable = controllable + self._running = False + self._fps = fps + self._playtime = 0.0 + + self._target_color = (200, 0, 50) + + def _make_gridworld_image(self, r): + # Preparing 2d array + w, l = self._env.width, self._env.length + arr2d = np.full((self._env.width, self._env.length), 0) # free grids + # Creating image + img = np.full((w * r, l * r, 3), 255, dtype=np.int32) + for x in range(w): + for y in range(l): + if (x, y) not in self._env.grid_map.obstacle_poses: + arr2d[x, y] == 0 # free + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (255, 255, 255), -1 + ) + else: + arr2d[x, y] == 1 # obstacle + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (40, 31, 3), -1 + ) + cv2.rectangle( + img, (y * r, x * r), (y * r + r, x * r + r), (0, 0, 0), 1, 8 + ) + return img + + @property + def img_width(self): + return self._img.shape[0] + + @property + def img_height(self): + return self._img.shape[1] + + @property + def last_observation(self): + return self._last_observation + +
    +[docs] + def update(self, action, observation, belief): + """ + Update the visualization after there is new real action and observation + and updated belief. + """ + self._last_action = action + self._last_observation = observation + self._last_belief = belief
    + + +
    +[docs] + @staticmethod + def draw_robot(img, x, y, th, size, color=(255, 12, 12)): + radius = int(round(size / 2)) + cv2.circle(img, (y + radius, x + radius), radius, color, thickness=6)
    + + # endpoint = (y+radius + int(round(radius*math.sin(th))), + # x+radius + int(round(radius*math.cos(th)))) + # cv2.line(img, (y+radius,x+radius), endpoint, color, 2) + +
    +[docs] + @staticmethod + def draw_observation(img, z, rx, ry, rth, r, size, color=(12, 12, 255)): + assert type(z) == TagObservation, "%s != TagObservation" % (str(type(z))) + radius = int(round(r / 2)) + if z.target_position is not None: + lx, ly = z.target_position + cv2.circle( + img, (ly * r + radius, lx * r + radius), size, color, thickness=-1 + )
    + + + # TODO! Deprecated. +
    +[docs] + @staticmethod + def draw_belief(img, belief, r, size, target_color): + """belief (OOBelief)""" + radius = int(round(r / 2)) + + circle_drawn = {} # map from pose to number of times drawn + + hist = belief.get_histogram() + color = target_color + + last_val = -1 + count = 0 + for state in reversed(sorted(hist, key=hist.get)): + if last_val != -1: + color = util.lighter(color, 1 - hist[state] / last_val) + if np.mean(np.array(color) / np.array([255, 255, 255])) < 0.999: + tx, ty = state.target_position + if (tx, ty) not in circle_drawn: + circle_drawn[(tx, ty)] = 0 + circle_drawn[(tx, ty)] += 1 + + cv2.circle( + img, + (ty * r + radius, tx * r + radius), + size // circle_drawn[(tx, ty)], + color, + thickness=-1, + ) + last_val = hist[state] + + count += 1 + if last_val <= 0: + break
    + + + # PyGame interface functions +
    +[docs] + def on_init(self): + """pygame init""" + pygame.init() # calls pygame.font.init() + # init main screen and background + self._display_surf = pygame.display.set_mode( + (self.img_width, self.img_height), pygame.HWSURFACE + ) + self._background = pygame.Surface(self._display_surf.get_size()).convert() + self._clock = pygame.time.Clock() + + # Font + self._myfont = pygame.font.SysFont("Comic Sans MS", 30) + self._running = True
    + + +
    +[docs] + def on_event(self, event): + if event.type == pygame.QUIT: + self._running = False + # TODO! DEPRECATED! + elif event.type == pygame.KEYDOWN: + u = None # control signal according to motion model + action = None # control input by user + + if event.key == pygame.K_LEFT: + action = MoveWest2D + elif event.key == pygame.K_RIGHT: + action = MoveEast2D + elif event.key == pygame.K_DOWN: + action = MoveSouth2D + elif event.key == pygame.K_UP: + action = MoveNorth2D + elif event.key == pygame.K_SPACE: + action = TagAction() + + if action is None: + return + + if self._controllable: + reward = self._env.state_transition(action, execute=True) + robot_pose = self._env.state.robot_position + z = None + if self._observation_model is not None: + z = self._observation_model.sample(self._env.state, action) + self._last_observation = z + print(" state: %s" % str(self._env.state)) + print(" action: %s" % str(action.name)) + print(" observation: %s" % str(z)) + print(" reward: %s" % str(reward)) + print( + " valid motions: %s" + % str( + self._env.grid_map.valid_motions(self._env.state.robot_position) + ) + ) + print("------------") + if self._env.state.target_found: + self._running = False + return action
    + + +
    +[docs] + def on_loop(self): + self._playtime += self._clock.tick(self._fps) / 1000.0
    + + +
    +[docs] + def on_render(self): + # self._display_surf.blit(self._background, (0, 0)) + self.render_env(self._display_surf) + rx, ry = self._env.state.robot_position + fps_text = "FPS: {0:.2f}".format(self._clock.get_fps()) + last_action = self._last_action + last_action_str = "no_action" if last_action is None else str(last_action) + pygame.display.set_caption( + "%s | Robot(%.2f,%.2f,%.2f) | %s | %s" + % (last_action_str, rx, ry, 0, str(self._env.state.target_found), fps_text) + ) + pygame.display.flip()
    + + +
    +[docs] + def on_cleanup(self): + pygame.quit()
    + + +
    +[docs] + def on_execute(self): + if self.on_init() == False: + self._running = False + + while self._running: + for event in pygame.event.get(): + self.on_event(event) + self.on_loop() + self.on_render() + self.on_cleanup()
    + + +
    +[docs] + def render_env(self, display_surf): + img = np.copy(self._img) + r = self._res # Not radius! It's resolution. + + # draw target + tx, ty = self._env.state.target_position + cv2.rectangle( + img, (ty * r, tx * r), (ty * r + r, tx * r + r), (255, 165, 0), -1 + ) + + # draw robot + rx, ry = self._env.state.robot_position + r = self._res # Not radius! + # last_observation = self._last_observation.get(robot_id, None) + # last_viz_observation = self._last_viz_observation.get(robot_id, None) + # last_belief = self._last_belief.get(robot_id, None) + if self._last_belief is not None: + TagViz.draw_belief(img, self._last_belief, r, r // 3, self._target_color) + if self._last_observation is not None: + TagViz.draw_observation( + img, self._last_observation, rx, ry, 0, r, r // 8, color=(20, 20, 180) + ) + + TagViz.draw_robot(img, rx * r, ry * r, 0, r, color=(200, 12, 150)) + pygame.surfarray.blit_array(display_surf, img)
    +
    + + + +# TODO! DEPRECATED! +
    +[docs] +def unittest(): + worldmap, robot = world0 + env = TagEnvironment.from_str(worldmap) + observation_model = TagObservationModel() + viz = TagViz(env, controllable=True, observation_model=observation_model) + viz.on_execute()
    + + + +if __name__ == "__main__": + unittest() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/experiment.html b/docs/html/_modules/problems/tag/experiment.html new file mode 100644 index 00000000..ec228483 --- /dev/null +++ b/docs/html/_modules/problems/tag/experiment.html @@ -0,0 +1,187 @@ + + + + + + + problems.tag.experiment — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.experiment

    +"""Simple experiment to get mean"""
    +
    +from pomdp_py.problems.tag.problem import *
    +import numpy as np
    +
    +
    +
    +[docs] +def trial(worldstr, **kwargs): + grid_map = GridMap.from_str(worldstr) + free_cells = grid_map.free_cells() + init_robot_position = random.sample(free_cells, 1)[0] + init_target_position = random.sample(free_cells, 1)[0] + + problem = TagProblem(init_robot_position, init_target_position, grid_map, **kwargs) + discounted_reward = solve( + problem, + max_depth=15, + discount_factor=0.95, + planning_time=0.7, + exploration_const=10, + visualize=True, + max_time=120, + max_steps=500, + ) + return discounted_reward
    + + + +
    +[docs] +def main(): + all_rewards = [] + try: + for i in range(100): + dr = trial(world0[0], pr_stay=0.5, small=1, big=10, prior="uniform") + all_rewards.append(dr) + finally: + print("All done!") + print("---------") + print("Average discounted reward: %.3f" % (np.mean(all_rewards))) + print("Std.dev discounted reward: %.3f" % (np.std(all_rewards)))
    + + + +if __name__ == "__main__": + main() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/models/components/grid_map.html b/docs/html/_modules/problems/tag/models/components/grid_map.html new file mode 100644 index 00000000..ec1f8045 --- /dev/null +++ b/docs/html/_modules/problems/tag/models/components/grid_map.html @@ -0,0 +1,207 @@ + + + + + + + problems.tag.models.components.grid_map — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.models.components.grid_map

    +from pomdp_py.problems.tag.domain.action import *
    +from pomdp_py.problems.tag.models.transition_model import TagTransitionModel
    +from pomdp_py.problems.multi_object_search.env.env import interpret
    +
    +
    +
    +[docs] +class GridMap: + def __init__(self, width, length, obstacle_poses): + self.width = width + self.length = length + # set of obstacle poses + self.obstacle_poses = obstacle_poses + +
    +[docs] + def valid_pose(self, position): + if not ( + position[0] >= 0 + and position[0] < self.width + and position[1] >= 0 + and position[1] < self.length + ): + return False + if position in self.obstacle_poses: + return False + return True
    + + +
    +[docs] + def valid_motions(self, position, all_motions=MOTION_ACTIONS): + valid_motions = set({}) + for motion_action in all_motions: + if TagTransitionModel.if_move_by(self, position, motion_action) == position: + continue + valid_motions.add(motion_action) + return valid_motions
    + + +
    +[docs] + @classmethod + def from_str(cls, worldstr, **kwargs): + dim, _, objects, obstacles, _ = interpret(worldstr) + obstacle_poses = set({}) + for objid in objects: + if objid in obstacles: + obstacle_poses.add(objects[objid].pose) + grid_map = GridMap(dim[0], dim[1], obstacle_poses) + return grid_map
    + + +
    +[docs] + def free_cells(self): + cells = set( + { + (x, y) + for x in range(self.width) + for y in range(self.length) + if (x, y) not in self.obstacle_poses + } + ) + return cells
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/models/components/motion_policy.html b/docs/html/_modules/problems/tag/models/components/motion_policy.html new file mode 100644 index 00000000..b040c35f --- /dev/null +++ b/docs/html/_modules/problems/tag/models/components/motion_policy.html @@ -0,0 +1,249 @@ + + + + + + + problems.tag.models.components.motion_policy — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.models.components.motion_policy

    +import pomdp_py
    +import random
    +from pomdp_py.utils.math import euclidean_dist
    +import pomdp_py.problems.tag.constants as constants
    +from pomdp_py.problems.tag.models.transition_model import TagTransitionModel
    +
    +
    +
    +[docs] +class TagTargetMotionPolicy(pomdp_py.GenerativeDistribution): + def __init__( + self, grid_map, pr_stay=0.2 + ): # With 1.0 - pr_stay chance, the target moves away + self._grid_map = grid_map + self._pr_stay = pr_stay + + def _compute_candidate_actions( + self, robot_position, target_position, valid_target_motion_actions + ): + candidate_actions = set({}) + cur_dist = euclidean_dist(robot_position, target_position) + for action in valid_target_motion_actions: + next_target_position = TagTransitionModel.if_move_by( + self._grid_map, target_position, action + ) + next_dist = euclidean_dist(robot_position, next_target_position) + if next_dist > cur_dist: + candidate_actions.add(action) + return candidate_actions + +
    +[docs] + def probability( + self, + next_target_position, + target_position, + robot_position, + valid_target_motion_actions, + ): + # If it is impossible to go from target position to the next, + # then it is a zero probability event. + diff_x = abs(next_target_position[0] - target_position[0]) + diff_y = abs(next_target_position[1] - target_position[1]) + if not ( + (diff_x == 1 and diff_y == 0) + or (diff_x == 0 and diff_y == 1) + or (diff_x == 0 and diff_y == 0) + ): + return constants.EPSILON + + candidate_actions = self._compute_candidate_actions( + robot_position, target_position, valid_target_motion_actions + ) + if len(candidate_actions) == 0: + # No action possible, yet next_target_position is a valid + # transition from current. + if next_target_position == target_position: + # That means the target is either + # stuck or staying. Either way, this is the only thing that + # can happen + return 1.0 - constants.EPSILON + else: + return constants.EPSILON + else: + # There are candidate actions + if next_target_position == target_position: + # The object is staying + return self._pr_stay + else: + # The object has taken an adversarial action. + for action in candidate_actions: + if ( + target_position[0] + action.motion[0], + target_position[1] + action.motion[1], + ) == next_target_position: + return (1.0 - self._pr_stay) / len(candidate_actions) + return constants.EPSILON
    + + +
    +[docs] + def random( + self, robot_position, target_position, valid_target_motion_actions, mpe=False + ): + if mpe or random.uniform(0, 1) > self._pr_stay: + # Move away; Pick motion actions that makes the target moves away from the robot + candidate_actions = self._compute_candidate_actions( + robot_position, target_position, valid_target_motion_actions + ) + if len(candidate_actions) == 0: + return target_position + + chosen_action = random.sample(candidate_actions, 1)[0] + return TagTransitionModel.if_move_by( + self._grid_map, target_position, chosen_action + ) + else: + # stay + return target_position
    + + +
    +[docs] + def mpe(self, robot_position, target_position, valid_target_motion_actions): + return self.random( + robot_position, target_position, valid_target_motion_actions, mpe=True + )
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/models/observation_model.html b/docs/html/_modules/problems/tag/models/observation_model.html new file mode 100644 index 00000000..ac6add4f --- /dev/null +++ b/docs/html/_modules/problems/tag/models/observation_model.html @@ -0,0 +1,186 @@ + + + + + + + problems.tag.models.observation_model — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.models.observation_model

    +import pomdp_py
    +from pomdp_py.problems.tag.domain.observation import *
    +import pomdp_py.problems.tag.constants as constants
    +
    +
    +
    +[docs] +class TagObservationModel(pomdp_py.ObservationModel): + """In this observation model, the robot deterministically + observes the target location when it is in the same grid cell + as the target. Ohterwise the robot does not observe anything.""" + +
    +[docs] + def probability(self, observation, next_state, action, **kwargs): + if next_state.robot_position == next_state.target_position: + if observation.target_position is None: + return constants.EPSILON + else: + if observation.target_position == next_state.target_position: + return 1.0 - constants.EPSILON + else: + return constants.EPSILON + else: + if observation.target_position is None: + return 1.0 - constants.EPSILON + else: + return constants.EPSILON
    + + +
    +[docs] + def sample(self, next_state, action): + """There is no stochaisticity in the observation model""" + if next_state.robot_position == next_state.target_position: + return TagObservation(next_state.target_position) + else: + return TagObservation(None)
    + + +
    +[docs] + def argmax(self, next_state, action): + return self.sample(next_state, action)
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/models/policy_model.html b/docs/html/_modules/problems/tag/models/policy_model.html new file mode 100644 index 00000000..2e6ccf42 --- /dev/null +++ b/docs/html/_modules/problems/tag/models/policy_model.html @@ -0,0 +1,176 @@ + + + + + + + problems.tag.models.policy_model — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.models.policy_model

    +import pomdp_py
    +import random
    +from pomdp_py.problems.tag.domain.action import *
    +from pomdp_py.problems.tag.models.transition_model import *
    +
    +
    +
    +[docs] +class TagPolicyModel(pomdp_py.RolloutPolicy): + def __init__(self, grid_map=None): + self._grid_map = grid_map + +
    +[docs] + def sample(self, state, **kwargs): + return random.sample(self.get_all_actions(state, **kwargs), 1)[0]
    + + +
    +[docs] + def get_all_actions(self, state=None, history=None): + if state is not None: + if self._grid_map is not None: + valid_motions = self._grid_map.valid_motions( + state.robot_position, all_motions=MOTION_ACTIONS + ) + return valid_motions | set({TagAction()}) + return MOTION_ACTIONS | set({TagAction()})
    + + +
    +[docs] + def rollout(self, state, history=None): + return random.sample(self.get_all_actions(state=state, history=history), 1)[0]
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/models/reward_model.html b/docs/html/_modules/problems/tag/models/reward_model.html new file mode 100644 index 00000000..447c5c7d --- /dev/null +++ b/docs/html/_modules/problems/tag/models/reward_model.html @@ -0,0 +1,180 @@ + + + + + + + problems.tag.models.reward_model — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.models.reward_model

    +import pomdp_py
    +from pomdp_py.problems.tag.domain.action import *
    +
    +
    +
    +[docs] +class TagRewardModel(pomdp_py.RewardModel): + def __init__(self, small=1, big=10): + self.small = small + self.big = big + +
    +[docs] + def probability( + self, reward, state, action, next_state, normalized=False, **kwargs + ): + if reward == self._reward_func(state, action): + return 1.0 + else: + return 0.0
    + + +
    +[docs] + def sample(self, state, action, next_state): + # deterministic + return self._reward_func(state, action, next_state)
    + + + def _reward_func(self, state, action, next_state): + if isinstance(action, MotionAction): + return -self.small + else: + # Tag action + assert isinstance(action, TagAction) + if next_state.target_position == next_state.robot_position: + if next_state.target_found: + return self.big + return -self.big
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/models/transition_model.html b/docs/html/_modules/problems/tag/models/transition_model.html new file mode 100644 index 00000000..b70de846 --- /dev/null +++ b/docs/html/_modules/problems/tag/models/transition_model.html @@ -0,0 +1,245 @@ + + + + + + + problems.tag.models.transition_model — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.models.transition_model

    +"""The Tag problem. Implemented according to the paper `Anytime Point-Based
    +Approximations for Large POMDPs <https://arxiv.org/pdf/1110.0027.pdf>`_.
    +
    +Transition model: the robot moves deterministically. The target's movement
    +    depends on the robot; With Pr=0.8 the target moves away from the robot,
    +    and with Pr=0.2, the target stays at the same place. The target never
    +    moves closer to the robot.
    +"""
    +
    +import copy
    +import pomdp_py
    +import pomdp_py.problems.tag.constants as constants
    +from pomdp_py.problems.tag.domain.action import *
    +
    +
    +
    +[docs] +class TagTransitionModel(pomdp_py.TransitionModel): + def __init__(self, grid_map, target_motion_policy): + self._grid_map = grid_map + self.target_motion_policy = target_motion_policy + +
    +[docs] + @classmethod + def if_move_by(cls, grid_map, position, action): + if isinstance(action, MotionAction): + dx, dy = action.motion + next_position = (position[0] + dx, position[1] + dy) + if grid_map.valid_pose(next_position): + return next_position + return position
    + + +
    +[docs] + def probability(self, next_state, state, action, **kwargs): + # Robot motion + expected_robot_position = TagTransitionModel.if_move_by( + self._grid_map, state.robot_position, action + ) + if expected_robot_position != next_state.robot_position: + return constants.EPSILON + + if isinstance(action, TagAction): + if next_state.target_position == next_state.robot_position: + if next_state.target_found: + return 1.0 - constants.EPSILON + else: + return constants.EPSILON + else: + if next_state.target_found: + return constants.EPSILON + else: + return 1.0 - constants.EPSILON + + # Target motion + valid_target_motion_actions = self._grid_map.valid_motions( + state.target_position + ) + return self.target_motion_policy.probability( + next_state.target_position, + state.target_position, + state.robot_position, + valid_target_motion_actions, + )
    + + +
    +[docs] + def sample(self, state, action, argmax=False): + # Robot motion + next_state = copy.deepcopy(state) + next_state.robot_position = TagTransitionModel.if_move_by( + self._grid_map, state.robot_position, action + ) + + # If Tag action + if isinstance(action, TagAction): + if not state.target_found: + if state.robot_position == state.target_position: + next_state.target_found = True + return next_state + + # Target motion + valid_target_motion_actions = self._grid_map.valid_motions( + state.target_position + ) + if not argmax: + next_state.target_position = self.target_motion_policy.random( + state.robot_position, state.target_position, valid_target_motion_actions + ) + else: + next_state.target_position = self.target_motion_policy.mpe( + state.robot_position, state.target_position, valid_target_motion_actions + ) + return next_state
    + + +
    +[docs] + def argmax(self, state, action, **kwargs): + return self.sample(state, action, argmax=True)
    +
    + +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tag/problem.html b/docs/html/_modules/problems/tag/problem.html new file mode 100644 index 00000000..dfd2cd1f --- /dev/null +++ b/docs/html/_modules/problems/tag/problem.html @@ -0,0 +1,319 @@ + + + + + + + problems.tag.problem — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tag.problem

    +import pomdp_py
    +import random
    +from pomdp_py.problems.tag.env.env import *
    +from pomdp_py.problems.tag.env.visual import *
    +from pomdp_py.problems.tag.agent.agent import *
    +from pomdp_py.problems.tag.example_worlds import *
    +import time
    +
    +
    +
    +[docs] +class TagProblem(pomdp_py.POMDP): + def __init__( + self, + init_robot_position, + init_target_position, + grid_map, + pr_stay=0.2, + small=1, + big=10, + prior="uniform", + belief_type="hist", + num_particles=6, + ): + init_state = TagState(init_robot_position, init_target_position, False) + env = TagEnvironment(init_state, grid_map, pr_stay=pr_stay, small=1, big=10) + if prior == "uniform": + prior = {} + elif prior == "informed": + prior = {init_target_position: 1.0} + else: + raise ValueError("Unrecognized prior type: %s" % prior) + + if belief_type == "particles": + init_belief = initialize_particles_belief( + grid_map, init_robot_position, prior=prior, num_particles=num_particles + ) + else: + init_belief = initialize_belief(grid_map, init_robot_position, prior=prior) + agent = TagAgent(init_belief, grid_map, pr_stay=pr_stay, small=1, big=10) + super().__init__(agent, env, name="TagProblem")
    + + + +
    +[docs] +def solve( + problem, + planner_type="pouct", + max_depth=10, # planning horizon + discount_factor=0.99, + planning_time=1.0, # amount of time (s) to plan each step + exploration_const=1000, # exploration constant + visualize=True, + max_time=120, # maximum amount of time allowed to solve the problem + max_steps=500, +): # maximum number of planning steps the agent can take. + if planner_type == "pouct": + planner = pomdp_py.POUCT( + max_depth=max_depth, + discount_factor=discount_factor, + planning_time=planning_time, + exploration_const=exploration_const, + rollout_policy=problem.agent.policy_model, + ) + else: + planner = pomdp_py.POMCP( + max_depth=max_depth, + discount_factor=discount_factor, + planning_time=planning_time, + exploration_const=exploration_const, + rollout_policy=problem.agent.policy_model, + ) + if visualize: + viz = TagViz(problem.env, controllable=False) + if viz.on_init() == False: + raise Exception("Environment failed to initialize") + viz.update(None, None, problem.agent.cur_belief) + viz.on_render() + + _discount = 1.0 + _time_used = 0 + _find_actions_count = 0 + _total_reward = 0 # total, undiscounted reward + _total_discounted_reward = 0 + for i in range(max_steps): + # Plan action + _start = time.time() + real_action = planner.plan(problem.agent) + _time_used += time.time() - _start + if _time_used > max_time: + break # no more time to update. + + # Execute action + reward = problem.env.state_transition(real_action, execute=True) + + # Receive observation + _start = time.time() + real_observation = problem.env.provide_observation( + problem.agent.observation_model, real_action + ) + + # Updates + problem.agent.clear_history() # truncate history + problem.agent.update_history(real_action, real_observation) + planner.update(problem.agent, real_action, real_observation) + if planner_type == "pouct": + belief_update(problem.agent, real_action, real_observation) + _time_used += time.time() - _start + + # Info and render + _total_reward += reward + _total_discounted_reward += reward * _discount + _discount = _discount * discount_factor + print("==== Step %d ====" % (i + 1)) + print("Action: %s" % str(real_action)) + print("Observation: %s" % str(real_observation)) + print("Reward: %s" % str(reward)) + print("Reward (Cumulative): %s" % str(_total_reward)) + print("Reward (Discounted): %s" % str(_total_discounted_reward)) + print("Find Actions Count: %d" % _find_actions_count) + if isinstance(planner, pomdp_py.POUCT): + print("__num_sims__: %d" % planner.last_num_sims) + + if visualize: + viz.update(real_action, real_observation, problem.agent.cur_belief) + viz.on_loop() + viz.on_render() + + # Termination check + if problem.env.state.target_found: + print("Done!") + break + if _time_used > max_time: + print("Maximum time reached.") + break + if _discount * 10 < 1e-4: + print("Discount factor already too small") + break + + return _total_discounted_reward
    + + + +
    +[docs] +def main(): + worldstr, robotstr = world0 + grid_map = GridMap.from_str(worldstr) + free_cells = grid_map.free_cells() + init_robot_position = random.sample(free_cells, 1)[0] + init_target_position = random.sample(free_cells, 1)[0] + + problem = TagProblem( + init_robot_position, + init_target_position, + grid_map, + pr_stay=0.2, + small=1, + big=10, + prior="uniform", + belief_type="histogram", + ) + solve( + problem, + max_depth=15, + discount_factor=0.95, + planning_time=0.8, + exploration_const=20, + visualize=True, + max_time=360, + max_steps=251, + planner_type="pouct", + )
    + + + +if __name__ == "__main__": + main() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_modules/problems/tiger/tiger_problem.html b/docs/html/_modules/problems/tiger/tiger_problem.html new file mode 100644 index 00000000..aaae1506 --- /dev/null +++ b/docs/html/_modules/problems/tiger/tiger_problem.html @@ -0,0 +1,589 @@ + + + + + + + problems.tiger.tiger_problem — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +

    Source code for problems.tiger.tiger_problem

    +"""The classic Tiger problem.
    +
    +This is a POMDP problem; Namely, it specifies both
    +the POMDP (i.e. state, action, observation space)
    +and the T/O/R for the agent as well as the environment.
    +
    +The description of the tiger problem is as follows: (Quote from
    +`POMDP: Introduction to Partially Observable Markov Decision Processes
    +<https://cran.r-project.org/web/packages/pomdp/vignettes/POMDP.pdf>`_ by
    +Kamalzadeh and Hahsler )
    +
    +A tiger is put with equal probability behind one
    +of two doors, while treasure is put behind the other one.
    +You are standing in front of the two closed doors and
    +need to decide which one to open. If you open the door
    +with the tiger, you will get hurt (negative reward).
    +But if you open the door with treasure, you receive
    +a positive reward. Instead of opening a door right away,
    +you also have the option to wait and listen for tiger noises. But
    +listening is neither free nor entirely accurate. You might hear the
    +tiger behind the left door while it is actually behind the right
    +door and vice versa.
    +
    +States: tiger-left, tiger-right
    +Actions: open-left, open-right, listen
    +Rewards:
    +    +10 for opening treasure door. -100 for opening tiger door.
    +    -1 for listening.
    +Observations: You can hear either "tiger-left", or "tiger-right".
    +
    +Note that in this example, the TigerProblem is a POMDP that
    +also contains the agent and the environment as its fields. In
    +general this doesn't need to be the case. (Refer to more
    +complicated examples.)
    +"""
    +
    +import pomdp_py
    +from pomdp_py.utils import TreeDebugger
    +import random
    +import numpy as np
    +import sys
    +import copy
    +
    +
    +
    +[docs] +class TigerState(pomdp_py.State): + def __init__(self, name): + self.name = name + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, TigerState): + return self.name == other.name + return False + + def __str__(self): + return self.name + + def __repr__(self): + return "TigerState(%s)" % self.name + +
    +[docs] + def other(self): + if self.name.endswith("left"): + return TigerState("tiger-right") + else: + return TigerState("tiger-left")
    +
    + + + +
    +[docs] +class TigerAction(pomdp_py.Action): + def __init__(self, name): + self.name = name + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, TigerAction): + return self.name == other.name + return False + + def __str__(self): + return self.name + + def __repr__(self): + return "TigerAction(%s)" % self.name
    + + + +
    +[docs] +class TigerObservation(pomdp_py.Observation): + def __init__(self, name): + self.name = name + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, TigerObservation): + return self.name == other.name + return False + + def __str__(self): + return self.name + + def __repr__(self): + return "TigerObservation(%s)" % self.name
    + + + +# Observation model +
    +[docs] +class ObservationModel(pomdp_py.ObservationModel): + def __init__(self, noise=0.15): + self.noise = noise + +
    +[docs] + def probability(self, observation, next_state, action): + if action.name == "listen": + # heard the correct growl + if observation.name == next_state.name: + return 1.0 - self.noise + else: + return self.noise + else: + return 0.5
    + + +
    +[docs] + def sample(self, next_state, action): + if action.name == "listen": + thresh = 1.0 - self.noise + else: + thresh = 0.5 + + if random.uniform(0, 1) < thresh: + return TigerObservation(next_state.name) + else: + return TigerObservation(next_state.other().name)
    + + +
    +[docs] + def get_all_observations(self): + """Only need to implement this if you're using + a solver that needs to enumerate over the observation space + (e.g. value iteration)""" + return [TigerObservation(s) for s in {"tiger-left", "tiger-right"}]
    +
    + + + +# Transition Model +
    +[docs] +class TransitionModel(pomdp_py.TransitionModel): +
    +[docs] + def probability(self, next_state, state, action): + """According to problem spec, the world resets once + action is open-left/open-right. Otherwise, stays the same""" + if action.name.startswith("open"): + return 0.5 + else: + if next_state.name == state.name: + return 1.0 - 1e-9 + else: + return 1e-9
    + + +
    +[docs] + def sample(self, state, action): + if action.name.startswith("open"): + return random.choice(self.get_all_states()) + else: + return TigerState(state.name)
    + + +
    +[docs] + def get_all_states(self): + """Only need to implement this if you're using + a solver that needs to enumerate over the observation space (e.g. value iteration) + """ + return [TigerState(s) for s in {"tiger-left", "tiger-right"}]
    +
    + + + +# Reward Model +
    +[docs] +class RewardModel(pomdp_py.RewardModel): + def _reward_func(self, state, action): + if action.name == "open-left": + if state.name == "tiger-right": + return 10 + else: + return -100 + elif action.name == "open-right": + if state.name == "tiger-left": + return 10 + else: + return -100 + else: # listen + return -1 + +
    +[docs] + def sample(self, state, action, next_state): + # deterministic + return self._reward_func(state, action)
    +
    + + + +# Policy Model +
    +[docs] +class PolicyModel(pomdp_py.RolloutPolicy): + """A simple policy model with uniform prior over a + small, finite action space""" + + ACTIONS = [TigerAction(s) for s in {"open-left", "open-right", "listen"}] + +
    +[docs] + def sample(self, state): + return random.sample(self.get_all_actions(), 1)[0]
    + + +
    +[docs] + def rollout(self, state, history=None): + """Treating this PolicyModel as a rollout policy""" + return self.sample(state)
    + + +
    +[docs] + def get_all_actions(self, state=None, history=None): + return PolicyModel.ACTIONS
    +
    + + + +
    +[docs] +class TigerProblem(pomdp_py.POMDP): + """ + In fact, creating a TigerProblem class is entirely optional + to simulate and solve POMDPs. But this is just an example + of how such a class can be created. + """ + + def __init__(self, obs_noise, init_true_state, init_belief): + """init_belief is a Distribution.""" + agent = pomdp_py.Agent( + init_belief, + PolicyModel(), + TransitionModel(), + ObservationModel(obs_noise), + RewardModel(), + ) + env = pomdp_py.Environment(init_true_state, TransitionModel(), RewardModel()) + super().__init__(agent, env, name="TigerProblem") + +
    +[docs] + @staticmethod + def create(state="tiger-left", belief=0.5, obs_noise=0.15): + """ + Args: + state (str): could be 'tiger-left' or 'tiger-right'; + True state of the environment + belief (float): Initial belief that the target is + on the left; Between 0-1. + obs_noise (float): Noise for the observation + model (default 0.15) + """ + init_true_state = TigerState(state) + init_belief = pomdp_py.Histogram( + {TigerState("tiger-left"): belief, TigerState("tiger-right"): 1.0 - belief} + ) + tiger_problem = TigerProblem(obs_noise, init_true_state, init_belief) + tiger_problem.agent.set_belief(init_belief, prior=True) + return tiger_problem
    +
    + + + +
    +[docs] +def test_planner(tiger_problem, planner, nsteps=3, debug_tree=False): + """ + Runs the action-feedback loop of Tiger problem POMDP + + Args: + tiger_problem (TigerProblem): a problem instance + planner (Planner): a planner + nsteps (int): Maximum number of steps to run this loop. + debug_tree (bool): True if get into the pdb with a + TreeDebugger created as 'dd' variable. + """ + for i in range(nsteps): + action = planner.plan(tiger_problem.agent) + if debug_tree: + from pomdp_py.utils import TreeDebugger + + print("==== Step %d ====" % (i + 1)) + print(f"True state: {tiger_problem.env.state}") + print(f"Belief: {tiger_problem.agent.cur_belief}") + print(f"Action: {action}") + # There is no state transition for the tiger domain. + # In general, the ennvironment state can be transitioned + # using + # + # reward = tiger_problem.env.state_transition(action, execute=True) + # + # Or, it is possible that you don't have control + # over the environment change (e.g. robot acting + # in real world); In that case, you could skip + # the state transition and re-estimate the state + # (e.g. through the perception stack on the robot). + reward = tiger_problem.env.reward_model.sample( + tiger_problem.env.state, action, None + ) + print("Reward:", reward) + + # Let's create some simulated real observation; + # Here, we use observation based on true state for sanity + # checking solver behavior. In general, this observation + # should be sampled from agent's observation model, as + # + # real_observation = tiger_problem.agent.observation_model.sample(tiger_problem.env.state, action) + # + # or coming from an external source (e.g. robot sensor + # reading). Note that tiger_problem.env.state stores the + # environment state after action execution. + real_observation = TigerObservation(tiger_problem.env.state.name) + print(">> Observation:", real_observation) + tiger_problem.agent.update_history(action, real_observation) + + # Update the belief. If the planner is POMCP, planner.update + # also automatically updates agent belief. + planner.update(tiger_problem.agent, action, real_observation) + if isinstance(planner, pomdp_py.POUCT): + print("Num sims:", planner.last_num_sims) + print("Plan time: %.5f" % planner.last_planning_time) + + if isinstance(tiger_problem.agent.cur_belief, pomdp_py.Histogram): + new_belief = pomdp_py.update_histogram_belief( + tiger_problem.agent.cur_belief, + action, + real_observation, + tiger_problem.agent.observation_model, + tiger_problem.agent.transition_model, + ) + tiger_problem.agent.set_belief(new_belief) + + if action.name.startswith("open"): + # Make it clearer to see what actions are taken + # until every time door is opened. + print("\n")
    + + + +
    +[docs] +def make_tiger(noise=0.15, init_state="tiger-left", init_belief=[0.5, 0.5]): + """Convenient function to quickly build a tiger domain. + Useful for testing""" + tiger = TigerProblem( + noise, + TigerState(init_state), + pomdp_py.Histogram( + { + TigerState("tiger-left"): init_belief[0], + TigerState("tiger-right"): init_belief[1], + } + ), + ) + return tiger
    + + + +
    +[docs] +def main(): + init_true_state = random.choice(["tiger-left", "tiger-right"]) + init_belief = pomdp_py.Histogram( + {TigerState("tiger-left"): 0.5, TigerState("tiger-right"): 0.5} + ) + tiger = make_tiger(init_state=init_true_state) + init_belief = tiger.agent.belief + + print("** Testing value iteration **") + vi = pomdp_py.ValueIteration(horizon=3, discount_factor=0.95) + test_planner(tiger, vi, nsteps=3) + + print("\n** Testing POUCT **") + pouct = pomdp_py.POUCT( + max_depth=3, + discount_factor=0.95, + num_sims=4096, + exploration_const=50, + rollout_policy=tiger.agent.policy_model, + show_progress=True, + ) + test_planner(tiger, pouct, nsteps=10) + TreeDebugger(tiger.agent.tree).pp + + # Reset agent belief + tiger.agent.set_belief(init_belief, prior=True) + tiger.agent.tree = None + + print("** Testing POMCP **") + tiger.agent.set_belief( + pomdp_py.Particles.from_histogram(init_belief, num_particles=100), prior=True + ) + pomcp = pomdp_py.POMCP( + max_depth=3, + discount_factor=0.95, + num_sims=1000, + exploration_const=50, + rollout_policy=tiger.agent.policy_model, + show_progress=True, + pbar_update_interval=500, + ) + test_planner(tiger, pomcp, nsteps=10) + TreeDebugger(tiger.agent.tree).pp
    + + + +if __name__ == "__main__": + main() +
    + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/_sources/api/modules.rst.txt b/docs/html/_sources/api/modules.rst.txt index a7d235a8..7d2b9ddd 100644 --- a/docs/html/_sources/api/modules.rst.txt +++ b/docs/html/_sources/api/modules.rst.txt @@ -5,3 +5,4 @@ pomdp_py :maxdepth: 4 pomdp_py + pomdp_py.problems diff --git a/docs/html/_sources/api/pomdp_py.problems.light_dark.rst.txt b/docs/html/_sources/api/pomdp_py.problems.light_dark.rst.txt index 3dc382ef..e11f5d4a 100644 --- a/docs/html/_sources/api/pomdp_py.problems.light_dark.rst.txt +++ b/docs/html/_sources/api/pomdp_py.problems.light_dark.rst.txt @@ -1,6 +1,8 @@ pomdp\_py.problems.light\_dark package ====================================== +.. include:: ../../../pomdp_py/problems/light_dark/README.rst + Subpackages ----------- diff --git a/docs/html/_sources/api/pomdp_py.problems.load_unload.rst.txt b/docs/html/_sources/api/pomdp_py.problems.load_unload.rst.txt index 0c600479..bf357ffa 100644 --- a/docs/html/_sources/api/pomdp_py.problems.load_unload.rst.txt +++ b/docs/html/_sources/api/pomdp_py.problems.load_unload.rst.txt @@ -1,6 +1,8 @@ pomdp\_py.problems.load\_unload package ======================================= +.. include:: ../../../pomdp_py/problems/load_unload/README.rst + Submodules ---------- diff --git a/docs/html/_sources/api/pomdp_py.problems.maze.rst.txt b/docs/html/_sources/api/pomdp_py.problems.maze.rst.txt index b30ee522..f780b7f6 100644 --- a/docs/html/_sources/api/pomdp_py.problems.maze.rst.txt +++ b/docs/html/_sources/api/pomdp_py.problems.maze.rst.txt @@ -1,6 +1,8 @@ pomdp\_py.problems.maze package =============================== +.. include:: ../../../pomdp_py/problems/maze/README.rst + Subpackages ----------- diff --git a/docs/html/_sources/api/pomdp_py.problems.multi_object_search.rst.txt b/docs/html/_sources/api/pomdp_py.problems.multi_object_search.rst.txt index 229f9e56..2d03418d 100644 --- a/docs/html/_sources/api/pomdp_py.problems.multi_object_search.rst.txt +++ b/docs/html/_sources/api/pomdp_py.problems.multi_object_search.rst.txt @@ -1,6 +1,8 @@ pomdp\_py.problems.multi\_object\_search package ================================================ +.. include:: ../../../pomdp_py/problems/multi_object_search/README.rst + Subpackages ----------- diff --git a/docs/html/_sources/api/pomdp_py.problems.rocksample.rst.txt b/docs/html/_sources/api/pomdp_py.problems.rocksample.rst.txt index 81374a6d..00764146 100644 --- a/docs/html/_sources/api/pomdp_py.problems.rocksample.rst.txt +++ b/docs/html/_sources/api/pomdp_py.problems.rocksample.rst.txt @@ -1,6 +1,8 @@ pomdp\_py.problems.rocksample package ===================================== +.. include:: ../../../pomdp_py/problems/rocksample/README.rst + Subpackages ----------- diff --git a/docs/html/_sources/api/pomdp_py.problems.tiger.rst.txt b/docs/html/_sources/api/pomdp_py.problems.tiger.rst.txt index ada2838a..c2e06ded 100644 --- a/docs/html/_sources/api/pomdp_py.problems.tiger.rst.txt +++ b/docs/html/_sources/api/pomdp_py.problems.tiger.rst.txt @@ -1,6 +1,8 @@ pomdp\_py.problems.tiger package ================================ +.. include:: ../../../pomdp_py/problems/tiger/README.rst + Subpackages ----------- diff --git a/docs/html/_sources/building_docs.rst.txt b/docs/html/_sources/building_docs.rst.txt index 9367fd1c..5efe5c8e 100644 --- a/docs/html/_sources/building_docs.rst.txt +++ b/docs/html/_sources/building_docs.rst.txt @@ -44,7 +44,7 @@ Building docs for `pomdp_py.problems` 2. Building docs for `pomdp_py`. Run :code:`sphinx-apidoc`:: - sphinx-apidoc -o problems/ ../../pomdp_py.problems + sphinx-apidoc -o problems/ ../../pomdp_py/problems 3. Generate web pages:: @@ -54,13 +54,13 @@ Building docs for `pomdp_py.problems` Note that when creating the documentation for a problem under :code:`pomdp_py.problems`, you may want to re-use the README file on github for the documentation. To do that, -first create a read-me file at :code:`pomdp_py.problems//README.rst` with desirable +first create a read-me file at :code:`pomdp_py/problems//README.rst` with desirable content that describes the problem. Then, include this read-me file at the top of the generated :code:`pomdp_py.problems..rst`, like so: .. code-block:: - .. include:: ../../../pomdp_py.problems//README.rst + .. include:: ../../../pomdp_py/problems//README.rst Note on Changelog diff --git a/docs/html/_sources/changelog.rst.txt b/docs/html/_sources/changelog.rst.txt index 694f23d1..b81c31ec 100644 --- a/docs/html/_sources/changelog.rst.txt +++ b/docs/html/_sources/changelog.rst.txt @@ -3,6 +3,32 @@ Changelog Best viewed on `the website `_. +Version 1.3.5 (03/12/2024) +-------------------------- +* Refactored :code:`_search` in :py:mod:`~pomdp_py.algorithms.po_uct.POUCT` to be more modular +* More fields made accessible for :py:mod:`~pomdp_py.algorithms.po_uct.POUCT` +* Allows initializing :py:mod:`~pomdp_py.framework.basics.Agent` and :py:mod:`~pomdp_py.framework.basics.Environment` without all models ready, and provide those models later (or update them) by :code:`set_models` +* Minor function renaming for :py:mod:`~pomdp_py.framework.basics.Option` +* Added :py:mod:`~pomdp_py.framework.oopomdp.DictState` +* Improved modularity and documentation for the RockSample example +* :py:mod:`~pomdp_py.representations.distribution.particles.WeightedParticles` now hashable if frozen. +* Changed :code:`det_dict_hash` to not use sorting +* Added a GHA workflow for automatically building, releasing wheels and uploading them to PyPI +* Repo convention: default branch renamed from :code:`master` to :code:`main`, and :code:`dev-latest` is the development branch. + + +WeightedParticles now hashable if frozen +Refactor _search in POUCT for more modularity +added a workflow that builds wheel +* + +Modernize repo without introducing new features. +* Migrate to :code:`pyproject.toml` to specify dependencies, with minimal :code:`setup.py` to build Cython extensions. +* Separate core and optional dependencies. Optional dependencies are needed only for `pomdp_py.problems`. +* Added CI testing to repo. +* Added pre-commit checks to repo. + + Version 1.3.4 (01/26/2024) -------------------------- * Modernize repo without introducing new features. diff --git a/docs/html/_sources/index.rst.txt b/docs/html/_sources/index.rst.txt index 8601b6b1..b2979662 100644 --- a/docs/html/_sources/index.rst.txt +++ b/docs/html/_sources/index.rst.txt @@ -40,7 +40,6 @@ Further * :doc:`extensions` * :doc:`other_libraries` * :doc:`building_docs` -* :doc:`simple_rl_integration` .. toctree:: :maxdepth: 2 @@ -76,7 +75,6 @@ API References :caption: API References api/modules - problems/modules Tools ----- diff --git a/docs/html/_sources/problems/modules.rst.txt b/docs/html/_sources/problems/modules.rst.txt new file mode 100644 index 00000000..614ddc7a --- /dev/null +++ b/docs/html/_sources/problems/modules.rst.txt @@ -0,0 +1,7 @@ +problems +======== + +.. toctree:: + :maxdepth: 4 + + problems diff --git a/docs/html/_sources/problems/problems.lasertag.rst.txt b/docs/html/_sources/problems/problems.lasertag.rst.txt new file mode 100644 index 00000000..31b8b460 --- /dev/null +++ b/docs/html/_sources/problems/problems.lasertag.rst.txt @@ -0,0 +1,10 @@ +problems.lasertag package +========================= + +Module contents +--------------- + +.. automodule:: problems.lasertag + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.light_dark.agent.rst.txt b/docs/html/_sources/problems/problems.light_dark.agent.rst.txt new file mode 100644 index 00000000..9b1be80f --- /dev/null +++ b/docs/html/_sources/problems/problems.light_dark.agent.rst.txt @@ -0,0 +1,21 @@ +problems.light\_dark.agent package +================================== + +Submodules +---------- + +problems.light\_dark.agent.belief module +---------------------------------------- + +.. automodule:: problems.light_dark.agent.belief + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.light_dark.agent + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.light_dark.domain.rst.txt b/docs/html/_sources/problems/problems.light_dark.domain.rst.txt new file mode 100644 index 00000000..58431bcb --- /dev/null +++ b/docs/html/_sources/problems/problems.light_dark.domain.rst.txt @@ -0,0 +1,37 @@ +problems.light\_dark.domain package +=================================== + +Submodules +---------- + +problems.light\_dark.domain.action module +----------------------------------------- + +.. automodule:: problems.light_dark.domain.action + :members: + :undoc-members: + :show-inheritance: + +problems.light\_dark.domain.observation module +---------------------------------------------- + +.. automodule:: problems.light_dark.domain.observation + :members: + :undoc-members: + :show-inheritance: + +problems.light\_dark.domain.state module +---------------------------------------- + +.. automodule:: problems.light_dark.domain.state + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.light_dark.domain + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.light_dark.env.rst.txt b/docs/html/_sources/problems/problems.light_dark.env.rst.txt new file mode 100644 index 00000000..7c2896ea --- /dev/null +++ b/docs/html/_sources/problems/problems.light_dark.env.rst.txt @@ -0,0 +1,37 @@ +problems.light\_dark.env package +================================ + +Submodules +---------- + +problems.light\_dark.env.env module +----------------------------------- + +.. automodule:: problems.light_dark.env.env + :members: + :undoc-members: + :show-inheritance: + +problems.light\_dark.env.plotting module +---------------------------------------- + +.. automodule:: problems.light_dark.env.plotting + :members: + :undoc-members: + :show-inheritance: + +problems.light\_dark.env.visual module +-------------------------------------- + +.. automodule:: problems.light_dark.env.visual + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.light_dark.env + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.light_dark.models.rst.txt b/docs/html/_sources/problems/problems.light_dark.models.rst.txt new file mode 100644 index 00000000..8a7ecf3e --- /dev/null +++ b/docs/html/_sources/problems/problems.light_dark.models.rst.txt @@ -0,0 +1,29 @@ +problems.light\_dark.models package +=================================== + +Submodules +---------- + +problems.light\_dark.models.observation\_model module +----------------------------------------------------- + +.. automodule:: problems.light_dark.models.observation_model + :members: + :undoc-members: + :show-inheritance: + +problems.light\_dark.models.transition\_model module +---------------------------------------------------- + +.. automodule:: problems.light_dark.models.transition_model + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.light_dark.models + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.light_dark.rst.txt b/docs/html/_sources/problems/problems.light_dark.rst.txt new file mode 100644 index 00000000..d50a4c3b --- /dev/null +++ b/docs/html/_sources/problems/problems.light_dark.rst.txt @@ -0,0 +1,40 @@ +problems.light\_dark package +============================ + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + problems.light_dark.agent + problems.light_dark.domain + problems.light_dark.env + problems.light_dark.models + +Submodules +---------- + +problems.light\_dark.problem\_discrete module +--------------------------------------------- + +.. automodule:: problems.light_dark.problem_discrete + :members: + :undoc-members: + :show-inheritance: + +problems.light\_dark.test module +-------------------------------- + +.. automodule:: problems.light_dark.test + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.light_dark + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.load_unload.rst.txt b/docs/html/_sources/problems/problems.load_unload.rst.txt new file mode 100644 index 00000000..9a147284 --- /dev/null +++ b/docs/html/_sources/problems/problems.load_unload.rst.txt @@ -0,0 +1,21 @@ +problems.load\_unload package +============================= + +Submodules +---------- + +problems.load\_unload.load\_unload module +----------------------------------------- + +.. automodule:: problems.load_unload.load_unload + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.load_unload + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.maze.domain.rst.txt b/docs/html/_sources/problems/problems.maze.domain.rst.txt new file mode 100644 index 00000000..7553acea --- /dev/null +++ b/docs/html/_sources/problems/problems.maze.domain.rst.txt @@ -0,0 +1,37 @@ +problems.maze.domain package +============================ + +Submodules +---------- + +problems.maze.domain.action module +---------------------------------- + +.. automodule:: problems.maze.domain.action + :members: + :undoc-members: + :show-inheritance: + +problems.maze.domain.observation module +--------------------------------------- + +.. automodule:: problems.maze.domain.observation + :members: + :undoc-members: + :show-inheritance: + +problems.maze.domain.state module +--------------------------------- + +.. automodule:: problems.maze.domain.state + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.maze.domain + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.maze.env.rst.txt b/docs/html/_sources/problems/problems.maze.env.rst.txt new file mode 100644 index 00000000..2792fb15 --- /dev/null +++ b/docs/html/_sources/problems/problems.maze.env.rst.txt @@ -0,0 +1,21 @@ +problems.maze.env package +========================= + +Submodules +---------- + +problems.maze.env.env module +---------------------------- + +.. automodule:: problems.maze.env.env + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.maze.env + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.maze.models.components.rst.txt b/docs/html/_sources/problems/problems.maze.models.components.rst.txt new file mode 100644 index 00000000..ed312810 --- /dev/null +++ b/docs/html/_sources/problems/problems.maze.models.components.rst.txt @@ -0,0 +1,21 @@ +problems.maze.models.components package +======================================= + +Submodules +---------- + +problems.maze.models.components.map module +------------------------------------------ + +.. automodule:: problems.maze.models.components.map + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.maze.models.components + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.maze.models.rst.txt b/docs/html/_sources/problems/problems.maze.models.rst.txt new file mode 100644 index 00000000..d94f3aab --- /dev/null +++ b/docs/html/_sources/problems/problems.maze.models.rst.txt @@ -0,0 +1,18 @@ +problems.maze.models package +============================ + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + problems.maze.models.components + +Module contents +--------------- + +.. automodule:: problems.maze.models + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.maze.rst.txt b/docs/html/_sources/problems/problems.maze.rst.txt new file mode 100644 index 00000000..87955e36 --- /dev/null +++ b/docs/html/_sources/problems/problems.maze.rst.txt @@ -0,0 +1,20 @@ +problems.maze package +===================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + problems.maze.domain + problems.maze.env + problems.maze.models + +Module contents +--------------- + +.. automodule:: problems.maze + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.multi_object_search.agent.rst.txt b/docs/html/_sources/problems/problems.multi_object_search.agent.rst.txt new file mode 100644 index 00000000..eb404257 --- /dev/null +++ b/docs/html/_sources/problems/problems.multi_object_search.agent.rst.txt @@ -0,0 +1,29 @@ +problems.multi\_object\_search.agent package +============================================ + +Submodules +---------- + +problems.multi\_object\_search.agent.agent module +------------------------------------------------- + +.. automodule:: problems.multi_object_search.agent.agent + :members: + :undoc-members: + :show-inheritance: + +problems.multi\_object\_search.agent.belief module +-------------------------------------------------- + +.. automodule:: problems.multi_object_search.agent.belief + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.multi_object_search.agent + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.multi_object_search.domain.rst.txt b/docs/html/_sources/problems/problems.multi_object_search.domain.rst.txt new file mode 100644 index 00000000..51956231 --- /dev/null +++ b/docs/html/_sources/problems/problems.multi_object_search.domain.rst.txt @@ -0,0 +1,37 @@ +problems.multi\_object\_search.domain package +============================================= + +Submodules +---------- + +problems.multi\_object\_search.domain.action module +--------------------------------------------------- + +.. automodule:: problems.multi_object_search.domain.action + :members: + :undoc-members: + :show-inheritance: + +problems.multi\_object\_search.domain.observation module +-------------------------------------------------------- + +.. automodule:: problems.multi_object_search.domain.observation + :members: + :undoc-members: + :show-inheritance: + +problems.multi\_object\_search.domain.state module +-------------------------------------------------- + +.. automodule:: problems.multi_object_search.domain.state + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.multi_object_search.domain + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.multi_object_search.env.rst.txt b/docs/html/_sources/problems/problems.multi_object_search.env.rst.txt new file mode 100644 index 00000000..89927bdd --- /dev/null +++ b/docs/html/_sources/problems/problems.multi_object_search.env.rst.txt @@ -0,0 +1,29 @@ +problems.multi\_object\_search.env package +========================================== + +Submodules +---------- + +problems.multi\_object\_search.env.env module +--------------------------------------------- + +.. automodule:: problems.multi_object_search.env.env + :members: + :undoc-members: + :show-inheritance: + +problems.multi\_object\_search.env.visual module +------------------------------------------------ + +.. automodule:: problems.multi_object_search.env.visual + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.multi_object_search.env + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.multi_object_search.models.components.rst.txt b/docs/html/_sources/problems/problems.multi_object_search.models.components.rst.txt new file mode 100644 index 00000000..e83608c7 --- /dev/null +++ b/docs/html/_sources/problems/problems.multi_object_search.models.components.rst.txt @@ -0,0 +1,29 @@ +problems.multi\_object\_search.models.components package +======================================================== + +Submodules +---------- + +problems.multi\_object\_search.models.components.grid\_map module +----------------------------------------------------------------- + +.. automodule:: problems.multi_object_search.models.components.grid_map + :members: + :undoc-members: + :show-inheritance: + +problems.multi\_object\_search.models.components.sensor module +-------------------------------------------------------------- + +.. automodule:: problems.multi_object_search.models.components.sensor + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.multi_object_search.models.components + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.multi_object_search.models.rst.txt b/docs/html/_sources/problems/problems.multi_object_search.models.rst.txt new file mode 100644 index 00000000..e42c033f --- /dev/null +++ b/docs/html/_sources/problems/problems.multi_object_search.models.rst.txt @@ -0,0 +1,53 @@ +problems.multi\_object\_search.models package +============================================= + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + problems.multi_object_search.models.components + +Submodules +---------- + +problems.multi\_object\_search.models.observation\_model module +--------------------------------------------------------------- + +.. automodule:: problems.multi_object_search.models.observation_model + :members: + :undoc-members: + :show-inheritance: + +problems.multi\_object\_search.models.policy\_model module +---------------------------------------------------------- + +.. automodule:: problems.multi_object_search.models.policy_model + :members: + :undoc-members: + :show-inheritance: + +problems.multi\_object\_search.models.reward\_model module +---------------------------------------------------------- + +.. automodule:: problems.multi_object_search.models.reward_model + :members: + :undoc-members: + :show-inheritance: + +problems.multi\_object\_search.models.transition\_model module +-------------------------------------------------------------- + +.. automodule:: problems.multi_object_search.models.transition_model + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.multi_object_search.models + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.multi_object_search.rst.txt b/docs/html/_sources/problems/problems.multi_object_search.rst.txt new file mode 100644 index 00000000..4cf63841 --- /dev/null +++ b/docs/html/_sources/problems/problems.multi_object_search.rst.txt @@ -0,0 +1,40 @@ +problems.multi\_object\_search package +====================================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + problems.multi_object_search.agent + problems.multi_object_search.domain + problems.multi_object_search.env + problems.multi_object_search.models + +Submodules +---------- + +problems.multi\_object\_search.example\_worlds module +----------------------------------------------------- + +.. automodule:: problems.multi_object_search.example_worlds + :members: + :undoc-members: + :show-inheritance: + +problems.multi\_object\_search.problem module +--------------------------------------------- + +.. automodule:: problems.multi_object_search.problem + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.multi_object_search + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.rocksample.cythonize.rst.txt b/docs/html/_sources/problems/problems.rocksample.cythonize.rst.txt new file mode 100644 index 00000000..8cef3c24 --- /dev/null +++ b/docs/html/_sources/problems/problems.rocksample.cythonize.rst.txt @@ -0,0 +1,37 @@ +problems.rocksample.cythonize package +===================================== + +Submodules +---------- + +problems.rocksample.cythonize.rocksample\_problem module +-------------------------------------------------------- + +.. automodule:: problems.rocksample.cythonize.rocksample_problem + :members: + :undoc-members: + :show-inheritance: + +problems.rocksample.cythonize.rocksample\_problem module +-------------------------------------------------------- + +.. automodule:: problems.rocksample.cythonize.rocksample_problem + :members: + :undoc-members: + :show-inheritance: + +problems.rocksample.cythonize.run\_rocksample module +---------------------------------------------------- + +.. automodule:: problems.rocksample.cythonize.run_rocksample + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.rocksample.cythonize + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.rocksample.rst.txt b/docs/html/_sources/problems/problems.rocksample.rst.txt new file mode 100644 index 00000000..27865be9 --- /dev/null +++ b/docs/html/_sources/problems/problems.rocksample.rst.txt @@ -0,0 +1,29 @@ +problems.rocksample package +=========================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + problems.rocksample.cythonize + +Submodules +---------- + +problems.rocksample.rocksample\_problem module +---------------------------------------------- + +.. automodule:: problems.rocksample.rocksample_problem + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.rocksample + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.rst.txt b/docs/html/_sources/problems/problems.rst.txt new file mode 100644 index 00000000..ce9625b6 --- /dev/null +++ b/docs/html/_sources/problems/problems.rst.txt @@ -0,0 +1,25 @@ +problems package +================ + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + problems.lasertag + problems.light_dark + problems.load_unload + problems.maze + problems.multi_object_search + problems.rocksample + problems.tag + problems.tiger + +Module contents +--------------- + +.. automodule:: problems + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.tag.agent.rst.txt b/docs/html/_sources/problems/problems.tag.agent.rst.txt new file mode 100644 index 00000000..8c577e71 --- /dev/null +++ b/docs/html/_sources/problems/problems.tag.agent.rst.txt @@ -0,0 +1,21 @@ +problems.tag.agent package +========================== + +Submodules +---------- + +problems.tag.agent.agent module +------------------------------- + +.. automodule:: problems.tag.agent.agent + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.tag.agent + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.tag.domain.rst.txt b/docs/html/_sources/problems/problems.tag.domain.rst.txt new file mode 100644 index 00000000..58c4b03a --- /dev/null +++ b/docs/html/_sources/problems/problems.tag.domain.rst.txt @@ -0,0 +1,37 @@ +problems.tag.domain package +=========================== + +Submodules +---------- + +problems.tag.domain.action module +--------------------------------- + +.. automodule:: problems.tag.domain.action + :members: + :undoc-members: + :show-inheritance: + +problems.tag.domain.observation module +-------------------------------------- + +.. automodule:: problems.tag.domain.observation + :members: + :undoc-members: + :show-inheritance: + +problems.tag.domain.state module +-------------------------------- + +.. automodule:: problems.tag.domain.state + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.tag.domain + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.tag.env.rst.txt b/docs/html/_sources/problems/problems.tag.env.rst.txt new file mode 100644 index 00000000..82d6cf6b --- /dev/null +++ b/docs/html/_sources/problems/problems.tag.env.rst.txt @@ -0,0 +1,29 @@ +problems.tag.env package +======================== + +Submodules +---------- + +problems.tag.env.env module +--------------------------- + +.. automodule:: problems.tag.env.env + :members: + :undoc-members: + :show-inheritance: + +problems.tag.env.visual module +------------------------------ + +.. automodule:: problems.tag.env.visual + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.tag.env + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.tag.models.components.rst.txt b/docs/html/_sources/problems/problems.tag.models.components.rst.txt new file mode 100644 index 00000000..5722a155 --- /dev/null +++ b/docs/html/_sources/problems/problems.tag.models.components.rst.txt @@ -0,0 +1,29 @@ +problems.tag.models.components package +====================================== + +Submodules +---------- + +problems.tag.models.components.grid\_map module +----------------------------------------------- + +.. automodule:: problems.tag.models.components.grid_map + :members: + :undoc-members: + :show-inheritance: + +problems.tag.models.components.motion\_policy module +---------------------------------------------------- + +.. automodule:: problems.tag.models.components.motion_policy + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.tag.models.components + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.tag.models.rst.txt b/docs/html/_sources/problems/problems.tag.models.rst.txt new file mode 100644 index 00000000..15997dc6 --- /dev/null +++ b/docs/html/_sources/problems/problems.tag.models.rst.txt @@ -0,0 +1,53 @@ +problems.tag.models package +=========================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + problems.tag.models.components + +Submodules +---------- + +problems.tag.models.observation\_model module +--------------------------------------------- + +.. automodule:: problems.tag.models.observation_model + :members: + :undoc-members: + :show-inheritance: + +problems.tag.models.policy\_model module +---------------------------------------- + +.. automodule:: problems.tag.models.policy_model + :members: + :undoc-members: + :show-inheritance: + +problems.tag.models.reward\_model module +---------------------------------------- + +.. automodule:: problems.tag.models.reward_model + :members: + :undoc-members: + :show-inheritance: + +problems.tag.models.transition\_model module +-------------------------------------------- + +.. automodule:: problems.tag.models.transition_model + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.tag.models + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.tag.rst.txt b/docs/html/_sources/problems/problems.tag.rst.txt new file mode 100644 index 00000000..d709fc20 --- /dev/null +++ b/docs/html/_sources/problems/problems.tag.rst.txt @@ -0,0 +1,56 @@ +problems.tag package +==================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + problems.tag.agent + problems.tag.domain + problems.tag.env + problems.tag.models + +Submodules +---------- + +problems.tag.constants module +----------------------------- + +.. automodule:: problems.tag.constants + :members: + :undoc-members: + :show-inheritance: + +problems.tag.example\_worlds module +----------------------------------- + +.. automodule:: problems.tag.example_worlds + :members: + :undoc-members: + :show-inheritance: + +problems.tag.experiment module +------------------------------ + +.. automodule:: problems.tag.experiment + :members: + :undoc-members: + :show-inheritance: + +problems.tag.problem module +--------------------------- + +.. automodule:: problems.tag.problem + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.tag + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.tiger.cythonize.rst.txt b/docs/html/_sources/problems/problems.tiger.cythonize.rst.txt new file mode 100644 index 00000000..e1fb2f32 --- /dev/null +++ b/docs/html/_sources/problems/problems.tiger.cythonize.rst.txt @@ -0,0 +1,37 @@ +problems.tiger.cythonize package +================================ + +Submodules +---------- + +problems.tiger.cythonize.run\_tiger module +------------------------------------------ + +.. automodule:: problems.tiger.cythonize.run_tiger + :members: + :undoc-members: + :show-inheritance: + +problems.tiger.cythonize.tiger\_problem module +---------------------------------------------- + +.. automodule:: problems.tiger.cythonize.tiger_problem + :members: + :undoc-members: + :show-inheritance: + +problems.tiger.cythonize.tiger\_problem module +---------------------------------------------- + +.. automodule:: problems.tiger.cythonize.tiger_problem + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.tiger.cythonize + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_sources/problems/problems.tiger.rst.txt b/docs/html/_sources/problems/problems.tiger.rst.txt new file mode 100644 index 00000000..b1f0ab3e --- /dev/null +++ b/docs/html/_sources/problems/problems.tiger.rst.txt @@ -0,0 +1,29 @@ +problems.tiger package +====================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + problems.tiger.cythonize + +Submodules +---------- + +problems.tiger.tiger\_problem module +------------------------------------ + +.. automodule:: problems.tiger.tiger_problem + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: problems.tiger + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/html/_static/documentation_options.js b/docs/html/_static/documentation_options.js index 14a4c29c..ea843502 100644 --- a/docs/html/_static/documentation_options.js +++ b/docs/html/_static/documentation_options.js @@ -1,5 +1,5 @@ const DOCUMENTATION_OPTIONS = { - VERSION: '1.3.4', + VERSION: '1.3.5', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/html/_static/pygments.css b/docs/html/_static/pygments.css index 04a41742..07454c6b 100644 --- a/docs/html/_static/pygments.css +++ b/docs/html/_static/pygments.css @@ -22,7 +22,6 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ .highlight .gd { color: #a40000 } /* Generic.Deleted */ .highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ -.highlight .ges { color: #000000 } /* Generic.EmphStrong */ .highlight .gr { color: #ef2929 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ diff --git a/docs/html/api/modules.html b/docs/html/api/modules.html index a66adeca..f8411dab 100644 --- a/docs/html/api/modules.html +++ b/docs/html/api/modules.html @@ -5,17 +5,17 @@ - pomdp_py — pomdp_py 1.3.4 documentation - + pomdp_py — pomdp_py 1.3.5 documentation + - + - + @@ -37,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -58,11 +58,13 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    @@ -80,7 +82,7 @@

    Navigation

    Related Topics

    @@ -178,6 +180,7 @@

    pomdp_py
  • pomdp_py.framework.oopomdp module
  • +
  • pomdp_py.problems package +
  • diff --git a/docs/html/api/pomdp_py.algorithms.bsp.html b/docs/html/api/pomdp_py.algorithms.bsp.html index 4d7b7ba8..9cd34384 100644 --- a/docs/html/api/pomdp_py.algorithms.bsp.html +++ b/docs/html/api/pomdp_py.algorithms.bsp.html @@ -5,10 +5,10 @@ - pomdp_py.algorithms.bsp package — pomdp_py 1.3.4 documentation - + pomdp_py.algorithms.bsp package — pomdp_py 1.3.5 documentation + - + @@ -36,7 +36,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -79,10 +79,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/api/pomdp_py.algorithms.html b/docs/html/api/pomdp_py.algorithms.html index c4b5ba74..25d2ac13 100644 --- a/docs/html/api/pomdp_py.algorithms.html +++ b/docs/html/api/pomdp_py.algorithms.html @@ -5,10 +5,10 @@ - pomdp_py.algorithms package — pomdp_py 1.3.4 documentation - + pomdp_py.algorithms package — pomdp_py 1.3.5 documentation + - + @@ -38,7 +38,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -75,13 +75,19 @@

    Table of Contents

  • POUCT
  • QNode
  • @@ -172,6 +178,7 @@

    Table of Contents

  • pomdp_py.utils package
  • +
  • pomdp_py.problems package
  • @@ -410,11 +417,21 @@

    pomdp_py.algorithms package +
    +action_prior
    +
    +
    clear_agent()
    +
    +
    +discount_factor
    +
    +
    last_num_sims
    @@ -427,6 +444,16 @@

    pomdp_py.algorithms package +
    +max_depth
    +

    + +
    +
    +num_visits_init
    +
    +
    plan(self, Agent agent)
    @@ -434,6 +461,11 @@

    pomdp_py.algorithms package +
    +rollout_policy
    +

    +
    set_rollout_policy(self, RolloutPolicy rollout_policy)
    @@ -452,6 +484,11 @@

    pomdp_py.algorithms packageupdates_agent_belief

    +
    +
    +value_init
    +
    +
    @@ -631,7 +668,7 @@

    pomdp_py.algorithms package

    pomdp_py.algorithms.value_iteration module

    Implementation of the basic policy tree based value iteration as explained in section 4.1 of Planning and acting in partially observable stochastic -domains [1]

    +domains [1]

    Warning: No pruning - the number of policy trees explodes very fast.

    diff --git a/docs/html/api/pomdp_py.algorithms.visual.html b/docs/html/api/pomdp_py.algorithms.visual.html index 8a063983..4f40daa6 100644 --- a/docs/html/api/pomdp_py.algorithms.visual.html +++ b/docs/html/api/pomdp_py.algorithms.visual.html @@ -5,10 +5,10 @@ - pomdp_py.algorithms.visual package — pomdp_py 1.3.4 documentation - + pomdp_py.algorithms.visual package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    diff --git a/docs/html/api/pomdp_py.framework.html b/docs/html/api/pomdp_py.framework.html index 8b8174a7..b166fa94 100644 --- a/docs/html/api/pomdp_py.framework.html +++ b/docs/html/api/pomdp_py.framework.html @@ -5,10 +5,10 @@ - pomdp_py.framework package — pomdp_py 1.3.4 documentation - + pomdp_py.framework package — pomdp_py 1.3.5 documentation + - + @@ -38,7 +38,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -69,6 +69,7 @@

    Table of Contents

  • Agent.init_belief
  • Agent.sample_belief()
  • Agent.set_belief()
  • +
  • Agent.set_models()
  • Agent.update()
  • Agent.update_history()
  • @@ -89,6 +90,7 @@

    Table of Contents

  • Environment.cur_state
  • Environment.provide_observation()
  • Environment.reward_model
  • +
  • Environment.set_models()
  • Environment.state
  • Environment.state_transition()
  • Environment.transition_model
  • @@ -110,10 +112,10 @@

    Table of Contents

  • Option
  • POMDP
  • @@ -147,6 +149,7 @@

    Table of Contents

  • pomdp_py.framework.oopomdp module @@ -423,6 +428,12 @@

    pomdp_py.framework packageset_belief(self, belief, prior=False)

  • +
    +
    +set_models(transition_model=None, observation_model=None, reward_model=None, blackbox_model=None, policy_model=None)
    +

    Re-assign the models to be the ones given.

    +
    +
    update(self, real_action, real_observation)
    @@ -451,7 +462,7 @@

    pomdp_py.framework package
    sample(self, state, action)
    -

    Sample (s’,o,r) ~ G(s’,o,r)

    +

    Sample (s’,o,r) ~ G(s,a)

    @@ -542,6 +553,12 @@

    pomdp_py.framework packageRewardModel underlying the environment

    +
    +
    +set_models(transition_model=None, reward_model=None, blackbox_model=None)
    +

    Re-assign the models to be the ones given.

    +
    +
    state
    @@ -691,9 +708,10 @@

    pomdp_py.framework package -
    -initiation(self, state)
    -

    Returns True if the given parameters satisfy the initiation set

    +
    +initiate(state)
    +

    initiation(self, state) +Returns True if the given parameters satisfy the initiation set

    @@ -711,9 +729,10 @@

    pomdp_py.framework package -
    -termination(self, state)
    -

    Returns a boolean of whether state satisfies the termination +

    +terminate(state)
    +

    termination(self, state) +Returns a boolean of whether state satisfies the termination condition; Technically returning a float between 0 and 1 is also allowed.

    @@ -984,6 +1003,14 @@

    pomdp_py.framework package[1].

    +
    +
    +class pomdp_py.framework.oopomdp.DictState
    +

    Bases: ObjectState

    +

    This is synonymous as ObjectState, but does not convey ‘objectness’ +of the information being described.

    +
    +
    class pomdp_py.framework.oopomdp.OOBelief
    diff --git a/docs/html/api/pomdp_py.html b/docs/html/api/pomdp_py.html index 67eaefe7..c3d1b9dc 100644 --- a/docs/html/api/pomdp_py.html +++ b/docs/html/api/pomdp_py.html @@ -5,10 +5,10 @@ - pomdp_py package — pomdp_py 1.3.4 documentation - + pomdp_py package — pomdp_py 1.3.5 documentation + - + @@ -37,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -70,6 +70,7 @@

    Navigation

  • pomdp_py.utils package
  • +
  • pomdp_py.problems package
  • @@ -151,13 +152,19 @@

    pomdp_py packagePOUCT
  • QNode
  • @@ -240,6 +247,7 @@

    pomdp_py packageAgent.init_belief
  • Agent.sample_belief()
  • Agent.set_belief()
  • +
  • Agent.set_models()
  • Agent.update()
  • Agent.update_history()
  • @@ -260,6 +268,7 @@

    pomdp_py packageEnvironment.cur_state
  • Environment.provide_observation()
  • Environment.reward_model
  • +
  • Environment.set_models()
  • Environment.state
  • Environment.state_transition()
  • Environment.transition_model
  • @@ -281,10 +290,10 @@

    pomdp_py packageOption
  • POMDP
  • @@ -318,6 +327,7 @@

    pomdp_py packagepomdp_py.framework.oopomdp module

    @@ -130,11 +142,8 @@

    pomdp_py.problems package

    diff --git a/docs/html/api/pomdp_py.problems.light_dark.domain.html b/docs/html/api/pomdp_py.problems.light_dark.domain.html index df4b6a32..dc3c2f4e 100644 --- a/docs/html/api/pomdp_py.problems.light_dark.domain.html +++ b/docs/html/api/pomdp_py.problems.light_dark.domain.html @@ -5,15 +5,17 @@ - pomdp_py.problems.light_dark.domain package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.light_dark.domain package — pomdp_py 1.3.5 documentation + - + + + @@ -35,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -73,8 +75,16 @@

    Table of Contents

  • What's New?
  • API References

    -
    diff --git a/docs/html/api/pomdp_py.problems.light_dark.env.html b/docs/html/api/pomdp_py.problems.light_dark.env.html index 4c0bb0d7..7b3bd54c 100644 --- a/docs/html/api/pomdp_py.problems.light_dark.env.html +++ b/docs/html/api/pomdp_py.problems.light_dark.env.html @@ -5,15 +5,17 @@ - pomdp_py.problems.light_dark.env package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.light_dark.env package — pomdp_py 1.3.5 documentation + - + + + @@ -35,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -63,7 +65,13 @@

    Table of Contents

    -
  • pomdp_py.problems.light_dark.env.plotting module
  • +
  • pomdp_py.problems.light_dark.env.plotting module +
  • pomdp_py.problems.light_dark.env.visual module
  • Module contents
  • @@ -80,8 +88,16 @@

    Table of Contents

  • What's New?
  • API References

    -
    @@ -160,8 +184,34 @@

    Submodules -

    pomdp_py.problems.light_dark.env.plotting module

    +
    +

    pomdp_py.problems.light_dark.env.plotting module

    +

    Plotting utilties

    +
    +
    +pomdp_py.problems.light_dark.env.plotting.plot_points(xvals, yvals, color=None, size=1.5, label=None, connected=True, style='--', linewidth=1.5, xlabel='x', ylabel='f(x)', loc='lower right')[source]
    +
    + +
    +
    +pomdp_py.problems.light_dark.env.plotting.plot_polygons(verts, colors, ax=None, edgecolor=None)[source]
    +

    verts is a sequence of ( verts0, verts1, …) where verts_i is a sequence of +xy tuples of vertices, or an equivalent numpy array of shape (nv, 2).

    +

    c is a sequence of (color0, color1, …) where color_i is a color, +represented by a hex string (7 characters #xxxxxx).

    +

    Creates a PolygonCollection object in the axis ax.

    +
    + +
    +
    +pomdp_py.problems.light_dark.env.plotting.plot_line(ax, p1, p2, linewidth=1, color='black', zorder=0, alpha=1.0, linestyle='-')[source]
    +
    + +
    +
    +pomdp_py.problems.light_dark.env.plotting.plot_circle(ax, center, radius, color='blue', fill=False, zorder=0, linewidth=0, edgecolor=None, label_text=None, alpha=1.0, text_color='white')[source]
    +
    +

    pomdp_py.problems.light_dark.env.visual module

    diff --git a/docs/html/api/pomdp_py.problems.light_dark.html b/docs/html/api/pomdp_py.problems.light_dark.html index 2dd03a63..59ffbfb0 100644 --- a/docs/html/api/pomdp_py.problems.light_dark.html +++ b/docs/html/api/pomdp_py.problems.light_dark.html @@ -5,15 +5,16 @@ - pomdp_py.problems.light_dark package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.light_dark package — pomdp_py 1.3.5 documentation + - + + @@ -35,7 +36,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -53,7 +54,8 @@ @@ -129,6 +144,24 @@

    Donate/support

    pomdp_py.problems.light_dark package

    +
    +
    +

    Light-Dark

    +

    A simple continuous domain.

    +

    Reference: Belief space planning assuming maximum likelihood observations.

    +

    Quoting from the original paper on problem description:

    +
    +

    In the light-dark domain, a robot must localize its position in the plane before approaching the goal. The robot’s ability to localize itself depends upon the amount of light present at its actual position. Light varies as a quadratic function of the horizontal coordinate. Depending upon the goal position, the initial robot position, and the configuration of the light, the robot may need to move away from its ultimate goal in order to localize itself. Figure 1 illustrates the configuration of the light-dark domain used in our experiments. The goal position is at the origin, marked by an X in the figure. The intensity in the figure illustrates the magnitude of the light over the plane. The robot’s initial position is unknown.

    +
    +
    +Figure from the paper +
    +

    Light-Dark domain

    +
    +
    +

    Note that a variant of this domain appears in Online algorithms for POMDPs with continuous state, action, and observation spaces where the state and action spaces are discrete and the observation space is kept continuous. Here we do not implement this variant; You can implement it and create a pull request!

    +

    There is an implementation of a variant of LightDarkDomain in the JuliaPOMDP suite (repo).

    +

    BLQR planning implementation not complete yet.

    Subpackages

    @@ -157,7 +190,13 @@

    Subpackagespomdp_py.problems.light_dark.env.plotting module +
  • pomdp_py.problems.light_dark.env.plotting module +
  • pomdp_py.problems.light_dark.env.visual module
  • Module contents
  • diff --git a/docs/html/api/pomdp_py.problems.light_dark.models.html b/docs/html/api/pomdp_py.problems.light_dark.models.html index 6319ce86..7707e266 100644 --- a/docs/html/api/pomdp_py.problems.light_dark.models.html +++ b/docs/html/api/pomdp_py.problems.light_dark.models.html @@ -5,15 +5,17 @@ - pomdp_py.problems.light_dark.models package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.light_dark.models package — pomdp_py 1.3.5 documentation + - + + + @@ -35,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -72,8 +74,16 @@

    Table of Contents

  • What's New?
  • API References

    -
    diff --git a/docs/html/api/pomdp_py.problems.load_unload.html b/docs/html/api/pomdp_py.problems.load_unload.html index baea5d00..743db933 100644 --- a/docs/html/api/pomdp_py.problems.load_unload.html +++ b/docs/html/api/pomdp_py.problems.load_unload.html @@ -5,15 +5,18 @@ - pomdp_py.problems.load_unload package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.load_unload package — pomdp_py 1.3.5 documentation + - + + + + @@ -35,7 +38,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -53,9 +56,45 @@

    Table of Contents

    @@ -127,11 +180,313 @@

    Donate/support

    pomdp_py.problems.load_unload package

    +
    +
    +

    Load/Unload

    +

    Problem originally introduced in Solving POMDPs by Searching the Space of Finite Policies

    +

    Quoting from the original paper on problem description:

    +
    +

    The load/unload problem with 8 locations: the agent starts in the “Unload” location (U) and receives a reward each time it returns to this place after passing through the “Load” location (L). The problem is partially observable because the agent cannot distinguish the different locations in between Load and Unload, and because it cannot perceive if it is loaded or not (\(|S| = 14\), \(|O| = 3\) and \(|A| = 2\)).

    +
    +

    Figure from the paper:

    +
    +Load/Unload Problem. +
    +

    Load/Unload problem

    +
    +
    +
    python -m pomdp_py -r load_unload
    +
    +

    Submodules

    -
    -

    pomdp_py.problems.load_unload.load_unload module

    +
    +

    pomdp_py.problems.load_unload.load_unload module

    +

    The load unload problem. An agent is placed on a one dimensional grid world +and is tasked with loading itself up on the right side of the world and +unloading on the left. The agent can observe whether or not it is in the load or +unload block but can not tell its exact location of whether it is loaded or +unloaded. Therefore the agent must maintain belief about it’s location and load +status.

    +

    States are defined by the location of the agent and whether or not it is loaded +Actions: “move-left”, “move-right” +Rewards:

    +
    +

    +100 for moving into the unload block while loaded +-1 otherwise

    +
    +
    +
    +class pomdp_py.problems.load_unload.load_unload.LUState(x, loaded)[source]
    +

    Bases: State

    +
    + +
    +
    +class pomdp_py.problems.load_unload.load_unload.LUAction(name)[source]
    +

    Bases: Action

    +
    + +
    +
    +class pomdp_py.problems.load_unload.load_unload.LUObservation(obs)[source]
    +

    Bases: Observation

    +
    + +
    +
    +class pomdp_py.problems.load_unload.load_unload.LUObservationModel[source]
    +

    Bases: ObservationModel

    +

    This problem is small enough for the probabilities to be directly given +externally

    +
    +
    +probability(self, observation, next_state, action)[source]
    +

    Returns the probability of \(\Pr(o|s',a)\).

    +
    +
    Parameters:
    +
      +
    • observation (Observation) – the observation \(o\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(o|s',a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, next_state, action)[source]
    +

    Returns observation randomly sampled according to the +distribution of this observation model.

    +
    +
    Parameters:
    +
      +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the observation \(o\)

    +
    +
    Return type:
    +

    Observation

    +
    +
    +
    + +
    +
    +argmax(next_state, action, normalized=False, **kwargs)[source]
    +

    Returns the most likely observation

    +
    + +
    + +
    +
    +class pomdp_py.problems.load_unload.load_unload.LUTransitionModel[source]
    +

    Bases: TransitionModel

    +

    This problem is small enough for the probabilities to be directly given +externally

    +
    +
    +probability(self, next_state, state, action)[source]
    +

    Returns the probability of \(\Pr(s'|s,a)\).

    +
    +
    Parameters:
    +
      +
    • state (State) – the state \(s\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(s'|s,a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, state, action)[source]
    +

    Returns next state randomly sampled according to the +distribution of this transition model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the next state \(s'\)

    +
    +
    Return type:
    +

    State

    +
    +
    +
    + +
    +
    +argmax(state, action, normalized=False, **kwargs)[source]
    +

    Returns the most likely next state

    +
    + +
    + +
    +
    +class pomdp_py.problems.load_unload.load_unload.LURewardModel[source]
    +

    Bases: RewardModel

    +
    +
    +probability(self, reward, state, action, next_state)[source]
    +

    Returns the probability of \(\Pr(r|s,a,s')\).

    +
    +
    Parameters:
    +
      +
    • reward (float) – the reward \(r\)

    • +
    • state (State) – the state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(r|s,a,s')\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, state, action, next_state)[source]
    +

    Returns reward randomly sampled according to the +distribution of this reward model. This is required, +i.e. assumed to be implemented for a reward model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the reward \(r\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +argmax(state, action, next_state, normalized=False, **kwargs)[source]
    +

    Returns the most likely reward

    +
    + +
    + +
    +
    +class pomdp_py.problems.load_unload.load_unload.LUPolicyModel[source]
    +

    Bases: RandomRollout

    +

    This is an extremely dumb policy model; To keep consistent +with the framework.

    +
    +
    +probability(self, action, state)[source]
    +

    Returns the probability of \(\pi(a|s)\).

    +
    +
    Parameters:
    +
      +
    • action (Action) – the action \(a\)

    • +
    • state (State) – the state \(s\)

    • +
    +
    +
    Returns:
    +

    the probability \(\pi(a|s)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, state)[source]
    +

    Returns action randomly sampled according to the +distribution of this policy model.

    +
    +
    Parameters:
    +

    state (State) – the next state \(s\)

    +
    +
    Returns:
    +

    the action \(a\)

    +
    +
    Return type:
    +

    Action

    +
    +
    +
    + +
    +
    +argmax(state, normalized=False, **kwargs)[source]
    +

    Returns the most likely reward

    +
    + +
    +
    +get_all_actions(self, *args)[source]
    +

    Returns a set of all possible actions, if feasible.

    +
    + +
    + +
    +
    +class pomdp_py.problems.load_unload.load_unload.LoadUnloadProblem(init_state, init_belief)[source]
    +

    Bases: POMDP

    +
    + +
    +
    +pomdp_py.problems.load_unload.load_unload.generate_random_state()[source]
    +
    + +
    +
    +pomdp_py.problems.load_unload.load_unload.generate_init_belief(num_particles)[source]
    +
    + +
    +
    +pomdp_py.problems.load_unload.load_unload.test_planner(load_unload_problem, planner, nsteps=3, discount=0.95)[source]
    +
    + +
    +
    +pomdp_py.problems.load_unload.load_unload.main()[source]
    +
    +

    Module contents

    diff --git a/docs/html/api/pomdp_py.problems.maze.domain.html b/docs/html/api/pomdp_py.problems.maze.domain.html index 744253c5..4fbf0dc5 100644 --- a/docs/html/api/pomdp_py.problems.maze.domain.html +++ b/docs/html/api/pomdp_py.problems.maze.domain.html @@ -5,10 +5,10 @@ - pomdp_py.problems.maze.domain package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.maze.domain package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -76,10 +76,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/api/pomdp_py.problems.maze.env.html b/docs/html/api/pomdp_py.problems.maze.env.html index 7cad0380..263901e3 100644 --- a/docs/html/api/pomdp_py.problems.maze.env.html +++ b/docs/html/api/pomdp_py.problems.maze.env.html @@ -5,10 +5,10 @@ - pomdp_py.problems.maze.env package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.maze.env package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -71,10 +71,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/api/pomdp_py.problems.maze.html b/docs/html/api/pomdp_py.problems.maze.html index 3e004320..2f942352 100644 --- a/docs/html/api/pomdp_py.problems.maze.html +++ b/docs/html/api/pomdp_py.problems.maze.html @@ -5,15 +5,17 @@ - pomdp_py.problems.maze package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.maze package — pomdp_py 1.3.5 documentation + - + + + @@ -35,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -53,10 +55,11 @@ @@ -128,6 +146,21 @@

    Donate/support

    pomdp_py.problems.maze package

    +
    +
    +

    Maze

    +

    Problem originally introduced in Solving POMDPs by Searching the Space of Finite Policies

    +

    Quoting from the original paper on problem description:

    +
    +

    A partially observable stochastic maze: the agent must go from the starting state marked with an “S” to the goal marked with an “G”. The problem is partially observable because the agent cannot perceive its true location, but only its orientation and the presence or the absence of a wall on each side of the square defining its current state. The problem is stochastic because there is a non-zero probability of slipping, so that the agent does not always know if its last attempt to make a move had any consequence on its actual position in the maze.

    +
    +
    +Figure from the paper +
    +

    Maze POMDP

    +
    +
    +

    TODO

    Subpackages

    @@ -173,17 +206,17 @@

    Subpackages

    Module contents

    -
    -

    Maze

    +
    +

    Maze

    Problem originally introduced in Solving POMDPs by Searching the Space of Finite Policies

    Quoting from the original paper on problem description:

    A partially observable stochastic maze: the agent must go from the starting state marked with an “S” to the goal marked with an “G”. The problem is partially observable because the agent cannot perceive its true location, but only its orientation and the presence or the absence of a wall on each side of the square defining its current state. The problem is stochastic because there is a non-zero probability of slipping, so that the agent does not always know if its last attempt to make a move had any consequence on its actual position in the maze.

    -
    +
    Figure from the paper
    -

    Maze POMDP

    +

    Maze POMDP

    Not yet implemented

    diff --git a/docs/html/api/pomdp_py.problems.maze.models.components.html b/docs/html/api/pomdp_py.problems.maze.models.components.html index 34352876..bce559b3 100644 --- a/docs/html/api/pomdp_py.problems.maze.models.components.html +++ b/docs/html/api/pomdp_py.problems.maze.models.components.html @@ -5,15 +5,17 @@ - pomdp_py.problems.maze.models.components package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.maze.models.components package — pomdp_py 1.3.5 documentation + - + + + @@ -35,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -71,8 +73,16 @@

    Table of Contents

  • What's New?
  • API References

    -

    diff --git a/docs/html/api/pomdp_py.problems.maze.models.html b/docs/html/api/pomdp_py.problems.maze.models.html index ce19be16..653095c8 100644 --- a/docs/html/api/pomdp_py.problems.maze.models.html +++ b/docs/html/api/pomdp_py.problems.maze.models.html @@ -5,15 +5,17 @@ - pomdp_py.problems.maze.models package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.maze.models package — pomdp_py 1.3.5 documentation + - + + + @@ -35,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -70,8 +72,16 @@

    Table of Contents

  • What's New?
  • API References

    -

    diff --git a/docs/html/api/pomdp_py.problems.multi_object_search.agent.html b/docs/html/api/pomdp_py.problems.multi_object_search.agent.html index 8f2c2124..9f711dad 100644 --- a/docs/html/api/pomdp_py.problems.multi_object_search.agent.html +++ b/docs/html/api/pomdp_py.problems.multi_object_search.agent.html @@ -5,10 +5,10 @@ - pomdp_py.problems.multi_object_search.agent package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.agent package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -83,10 +83,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/api/pomdp_py.problems.multi_object_search.domain.html b/docs/html/api/pomdp_py.problems.multi_object_search.domain.html index 39dc05d0..d9d2ad4b 100644 --- a/docs/html/api/pomdp_py.problems.multi_object_search.domain.html +++ b/docs/html/api/pomdp_py.problems.multi_object_search.domain.html @@ -5,10 +5,10 @@ - pomdp_py.problems.multi_object_search.domain package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.domain package — pomdp_py 1.3.5 documentation + - + @@ -36,7 +36,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -126,10 +126,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/api/pomdp_py.problems.multi_object_search.env.html b/docs/html/api/pomdp_py.problems.multi_object_search.env.html index abb0bbe9..18b1647c 100644 --- a/docs/html/api/pomdp_py.problems.multi_object_search.env.html +++ b/docs/html/api/pomdp_py.problems.multi_object_search.env.html @@ -5,10 +5,10 @@ - pomdp_py.problems.multi_object_search.env package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search.env package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -68,7 +68,28 @@

    Table of Contents

  • make_proximity_sensor()
  • -
  • pomdp_py.problems.multi_object_search.env.visual module
  • +
  • pomdp_py.problems.multi_object_search.env.visual module +
  • Module contents
  • @@ -86,6 +107,7 @@

    Table of Contents

    API References

    @@ -288,8 +310,107 @@

    Submodules -

    pomdp_py.problems.multi_object_search.env.visual module

    +
    +

    pomdp_py.problems.multi_object_search.env.visual module

    +
    +
    +pomdp_py.problems.multi_object_search.env.visual.object_color(objid, count)[source]
    +
    + +
    +
    +class pomdp_py.problems.multi_object_search.env.visual.MosViz(env, res=30, fps=30, controllable=False)[source]
    +

    Bases: object

    +
    +
    +property img_width
    +
    + +
    +
    +property img_height
    +
    + +
    +
    +property last_observation
    +
    + +
    +
    +update(robot_id, action, observation, viz_observation, belief)[source]
    +

    Update the visualization after there is new real action and observation +and updated belief.

    +
    +
    Parameters:
    +
    +
    +
    +
    + +
    +
    +static draw_robot(img, x, y, th, size, color=(255, 12, 12))[source]
    +
    + +
    +
    +static draw_observation(img, z, rx, ry, rth, r, size, color=(12, 12, 255))[source]
    +
    + +
    +
    +static draw_belief(img, belief, r, size, target_colors)[source]
    +

    belief (OOBelief)

    +
    + +
    +
    +on_init()[source]
    +

    pygame init

    +
    + +
    +
    +on_event(event)[source]
    +
    + +
    +
    +on_loop()[source]
    +
    + +
    +
    +on_render()[source]
    +
    + +
    +
    +on_cleanup()[source]
    +
    + +
    +
    +on_execute()[source]
    +
    + +
    +
    +render_env(display_surf)[source]
    +
    + +
    + +
    +
    +pomdp_py.problems.multi_object_search.env.visual.unittest()[source]
    +
    +

    Module contents

    diff --git a/docs/html/api/pomdp_py.problems.multi_object_search.html b/docs/html/api/pomdp_py.problems.multi_object_search.html index b95a3d01..fdb0c05c 100644 --- a/docs/html/api/pomdp_py.problems.multi_object_search.html +++ b/docs/html/api/pomdp_py.problems.multi_object_search.html @@ -5,15 +5,17 @@ - pomdp_py.problems.multi_object_search package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.multi_object_search package — pomdp_py 1.3.5 documentation + - + + + @@ -35,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -53,14 +55,21 @@

    Table of Contents

    @@ -132,6 +155,15 @@

    Donate/support

    pomdp_py.problems.multi_object_search package

    +
    +
    +

    Multi-Object Search (MOS) Task

    +

    This task is based on the Multi-Object Search (MOS) task described in the +following paper

    +

    Multi-Object Search using Object-Oriented POMDPs (ICRA 2019)

    +

    In this implementation, we consider a different (simpler) motion action scheme, +instead of based on topological graph and room connectivity.

    +

    Refer to examples.mos for more details.

    Subpackages

    @@ -235,7 +267,28 @@

    Subpackagesmake_proximity_sensor() -
  • pomdp_py.problems.multi_object_search.env.visual module
  • +
  • pomdp_py.problems.multi_object_search.env.visual module +
  • Module contents
  • @@ -327,8 +380,54 @@

    Submodules -

    pomdp_py.problems.multi_object_search.problem module

    +
    +

    pomdp_py.problems.multi_object_search.problem module

    +

    2D Multi-Object Search (MOS) Task. +Uses the domain, models, and agent/environment +to actually define the POMDP problem for multi-object search. +Then, solve it using POUCT or POMCP.

    +
    +
    +class pomdp_py.problems.multi_object_search.problem.MosOOPOMDP(robot_id, env=None, grid_map=None, sensors=None, sigma=0.01, epsilon=1, belief_rep='histogram', prior={}, num_particles=100, agent_has_map=False)[source]
    +

    Bases: OOPOMDP

    +

    A MosOOPOMDP is instantiated given a string description +of the search world, sensor descriptions for robots, +and the necessary parameters for the agent’s models.

    +

    Note: This is of course a simulation, where you can +generate a world and know where the target objects are +and then construct the Environment object. But in the +real robot scenario, you don’t know where the objects +are. In that case, as I have done it in the past, you +could construct an Environment object and give None to +the object poses.

    +
    + +
    +
    +pomdp_py.problems.multi_object_search.problem.belief_update(agent, real_action, real_observation, next_robot_state, planner)[source]
    +

    Updates the agent’s belief; The belief update may happen +through planner update (e.g. when planner is POMCP).

    +
    + +
    +
    +pomdp_py.problems.multi_object_search.problem.solve(problem, max_depth=10, discount_factor=0.99, planning_time=1.0, exploration_const=1000, visualize=True, max_time=120, max_steps=500)[source]
    +

    This function terminates when: +- maximum time (max_time) reached; This time includes planning and updates +- agent has planned max_steps number of steps +- agent has taken n FindAction(s) where n = number of target objects.

    +
    +
    Parameters:
    +

    visualize (bool) –

    +
    +
    +
    + +
    +
    +pomdp_py.problems.multi_object_search.problem.unittest()[source]
    +
    +

    diff --git a/docs/html/api/pomdp_py.problems.rocksample.html b/docs/html/api/pomdp_py.problems.rocksample.html index 0dca7711..3a425e9e 100644 --- a/docs/html/api/pomdp_py.problems.rocksample.html +++ b/docs/html/api/pomdp_py.problems.rocksample.html @@ -5,16 +5,18 @@ - pomdp_py.problems.rocksample package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.rocksample package — pomdp_py 1.3.5 documentation + - + + + @@ -36,7 +38,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -54,7 +56,9 @@ @@ -188,6 +208,17 @@

    Donate/support

    pomdp_py.problems.rocksample package

    +
    +
    +

    RockSample

    +

    Classic POMDP domain.

    +

    Reference:

    + +
    +

    pomdp_problems.rocksample.rocksample_problem module

    +

    Subpackages

    -

    Observation: observes the property of rock i when taking Check_i.

    +
    Observation: observes the property of rock i when taking Check_i. The

    observation may be noisy, depending on an efficiency parameter which +decreases exponentially as the distance increases between the rover and +rock i. ‘half_efficiency_dist’ influences this parameter (larger, more robust)

    +
    Reward: +10 for Sample a good rock. -10 for Sampling a bad rock.

    Move to exit area +10. Other actions have no cost or reward.

    @@ -839,7 +873,7 @@

    Submodules
    -class pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem(n, k, init_state, rock_locs, init_belief)[source]
    +class pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem(n, k, init_state, rock_locs, init_belief, half_efficiency_dist=20)[source]

    Bases: POMDP

    @@ -875,6 +909,16 @@

    Submodulespomdp_py.problems.rocksample.rocksample_problem.init_particles_belief(k, num_particles, init_state, belief='uniform')[source]

    +
    +
    +pomdp_py.problems.rocksample.rocksample_problem.minimal_instance(**kwargs)[source]
    +
    + +
    +
    +pomdp_py.problems.rocksample.rocksample_problem.create_instance(n, k, **kwargs)[source]
    +
    +
    pomdp_py.problems.rocksample.rocksample_problem.main()[source]
    diff --git a/docs/html/api/pomdp_py.problems.tag.agent.html b/docs/html/api/pomdp_py.problems.tag.agent.html index 2325870f..b390fede 100644 --- a/docs/html/api/pomdp_py.problems.tag.agent.html +++ b/docs/html/api/pomdp_py.problems.tag.agent.html @@ -5,10 +5,10 @@ - pomdp_py.problems.tag.agent package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.agent package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -77,10 +77,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/api/pomdp_py.problems.tag.domain.html b/docs/html/api/pomdp_py.problems.tag.domain.html index d901fdf8..4c1adea2 100644 --- a/docs/html/api/pomdp_py.problems.tag.domain.html +++ b/docs/html/api/pomdp_py.problems.tag.domain.html @@ -5,10 +5,10 @@ - pomdp_py.problems.tag.domain package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.domain package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -79,10 +79,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/api/pomdp_py.problems.tag.env.html b/docs/html/api/pomdp_py.problems.tag.env.html index eba0e942..aa965965 100644 --- a/docs/html/api/pomdp_py.problems.tag.env.html +++ b/docs/html/api/pomdp_py.problems.tag.env.html @@ -5,10 +5,10 @@ - pomdp_py.problems.tag.env package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.env package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -55,8 +55,37 @@

    Table of Contents

    -
    -

    pomdp_py.problems.tag.env.env module

    +
    +

    pomdp_py.problems.tag.env.env module

    +
    +
    +class pomdp_py.problems.tag.env.env.TagEnvironment(init_state, grid_map, pr_stay=0.2, small=1, big=10)[source]
    +

    Bases: Environment

    +
    +
    +property width
    +
    + +
    +
    +property length
    +
    + +
    +
    +property grid_map
    +
    + +
    +
    +classmethod from_str(worldstr, **kwargs)[source]
    +
    + +
    +
    -
    -

    pomdp_py.problems.tag.env.visual module

    +
    +

    pomdp_py.problems.tag.env.visual module

    +

    Largely based on MosViz, except this is not an OO-POMDP

    +
    +
    +class pomdp_py.problems.tag.env.visual.TagViz(env, res=30, fps=30, controllable=False, observation_model=None)[source]
    +

    Bases: object

    +
    +
    +property img_width
    +
    + +
    +
    +property img_height
    +
    + +
    +
    +property last_observation
    +
    + +
    +
    +update(action, observation, belief)[source]
    +

    Update the visualization after there is new real action and observation +and updated belief.

    +
    + +
    +
    +static draw_robot(img, x, y, th, size, color=(255, 12, 12))[source]
    +
    + +
    +
    +static draw_observation(img, z, rx, ry, rth, r, size, color=(12, 12, 255))[source]
    +
    + +
    +
    +static draw_belief(img, belief, r, size, target_color)[source]
    +

    belief (OOBelief)

    +
    + +
    +
    +on_init()[source]
    +

    pygame init

    +
    + +
    +
    +on_event(event)[source]
    +
    + +
    +
    +on_loop()[source]
    +
    + +
    +
    +on_render()[source]
    +
    + +
    +
    +on_cleanup()[source]
    +
    + +
    +
    +on_execute()[source]
    +
    + +
    +
    +render_env(display_surf)[source]
    +
    + +
    + +
    +
    +pomdp_py.problems.tag.env.visual.unittest()[source]
    +
    +

    Module contents

    diff --git a/docs/html/api/pomdp_py.problems.tag.html b/docs/html/api/pomdp_py.problems.tag.html index 9900e2b7..a14e95a5 100644 --- a/docs/html/api/pomdp_py.problems.tag.html +++ b/docs/html/api/pomdp_py.problems.tag.html @@ -5,10 +5,10 @@ - pomdp_py.problems.tag package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -58,8 +58,17 @@

    Table of Contents

  • Submodules
  • pomdp_py.problems.tag.constants module
  • pomdp_py.problems.tag.example_worlds module
  • -
  • pomdp_py.problems.tag.experiment module
  • -
  • pomdp_py.problems.tag.problem module
  • +
  • pomdp_py.problems.tag.experiment module +
  • +
  • pomdp_py.problems.tag.problem module +
  • Module contents
  • @@ -77,6 +86,7 @@

    Table of Contents

    API References

    @@ -169,8 +179,37 @@

    Subpackagespomdp_py.problems.tag.env package @@ -237,11 +276,38 @@

    Submodules

    pomdp_py.problems.tag.example_worlds module

    -
    -

    pomdp_py.problems.tag.experiment module

    +
    +

    pomdp_py.problems.tag.experiment module

    +

    Simple experiment to get mean

    +
    +
    +pomdp_py.problems.tag.experiment.trial(worldstr, **kwargs)[source]
    +
    + +
    +
    +pomdp_py.problems.tag.experiment.main()[source]
    +
    +
    -
    -

    pomdp_py.problems.tag.problem module

    +
    +

    pomdp_py.problems.tag.problem module

    +
    +
    +class pomdp_py.problems.tag.problem.TagProblem(init_robot_position, init_target_position, grid_map, pr_stay=0.2, small=1, big=10, prior='uniform', belief_type='hist', num_particles=6)[source]
    +

    Bases: POMDP

    +
    + +
    +
    +pomdp_py.problems.tag.problem.solve(problem, planner_type='pouct', max_depth=10, discount_factor=0.99, planning_time=1.0, exploration_const=1000, visualize=True, max_time=120, max_steps=500)[source]
    +
    + +
    +
    +pomdp_py.problems.tag.problem.main()[source]
    +
    +

    Module contents

    diff --git a/docs/html/api/pomdp_py.problems.tag.models.components.html b/docs/html/api/pomdp_py.problems.tag.models.components.html index 8f0f82e4..b2e639be 100644 --- a/docs/html/api/pomdp_py.problems.tag.models.components.html +++ b/docs/html/api/pomdp_py.problems.tag.models.components.html @@ -5,10 +5,10 @@ - pomdp_py.problems.tag.models.components package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.models.components package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -86,10 +86,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/api/pomdp_py.problems.tag.models.html b/docs/html/api/pomdp_py.problems.tag.models.html index 64cc448e..b41b4813 100644 --- a/docs/html/api/pomdp_py.problems.tag.models.html +++ b/docs/html/api/pomdp_py.problems.tag.models.html @@ -5,10 +5,10 @@ - pomdp_py.problems.tag.models package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tag.models package — pomdp_py 1.3.5 documentation + - + @@ -36,7 +36,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -105,10 +105,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/api/pomdp_py.problems.tiger.cythonize.html b/docs/html/api/pomdp_py.problems.tiger.cythonize.html index aed43ea0..ab58e664 100644 --- a/docs/html/api/pomdp_py.problems.tiger.cythonize.html +++ b/docs/html/api/pomdp_py.problems.tiger.cythonize.html @@ -5,16 +5,17 @@ - pomdp_py.problems.tiger.cythonize package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tiger.cythonize package — pomdp_py 1.3.5 documentation + - + + @@ -36,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -288,8 +289,16 @@

    Table of Contents

  • What's New?
  • API References

    -

    @@ -531,7 +547,7 @@

    pomdp_py.problems.tiger.cythonize.run_tiger module

    Bases: POMDP

    -ACTIONS = [TigerAction(listen), TigerAction(open-left), TigerAction(open-right)]
    +ACTIONS = [TigerAction(open-right), TigerAction(listen), TigerAction(open-left)]
    @@ -910,7 +926,7 @@

    pomdp_py.problems.tiger.cythonize.tiger_problem module

    Bases: POMDP

    -ACTIONS = [TigerAction(listen), TigerAction(open-left), TigerAction(open-right)]
    +ACTIONS = [TigerAction(open-right), TigerAction(listen), TigerAction(open-left)]
    @@ -1289,7 +1305,7 @@

    pomdp_py.problems.tiger.cythonize.tiger_problem module

    Bases: POMDP

    -ACTIONS = [TigerAction(listen), TigerAction(open-left), TigerAction(open-right)]
    +ACTIONS = [TigerAction(open-right), TigerAction(listen), TigerAction(open-left)]
    @@ -1668,7 +1684,7 @@

    pomdp_py.problems.tiger.cythonize.tiger_problem module

    Bases: POMDP

    -ACTIONS = [TigerAction(listen), TigerAction(open-left), TigerAction(open-right)]
    +ACTIONS = [TigerAction(open-right), TigerAction(listen), TigerAction(open-left)]
    diff --git a/docs/html/api/pomdp_py.problems.tiger.html b/docs/html/api/pomdp_py.problems.tiger.html index 5f7671c9..88676056 100644 --- a/docs/html/api/pomdp_py.problems.tiger.html +++ b/docs/html/api/pomdp_py.problems.tiger.html @@ -5,16 +5,18 @@ - pomdp_py.problems.tiger package — pomdp_py 1.3.4 documentation - + pomdp_py.problems.tiger package — pomdp_py 1.3.5 documentation + - + + + @@ -36,7 +38,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -54,7 +56,8 @@ @@ -168,6 +185,12 @@

    Donate/support

    pomdp_py.problems.tiger package

    +
    +
    +

    Tiger

    +

    Classic problem from Planning and acting in partially observable stochastic +domains

    +

    Refer to examples.tiger for more details.

    Subpackages

    @@ -592,7 +615,7 @@

    Submodules
    -ACTIONS = [TigerAction(open-right), TigerAction(open-left), TigerAction(listen)]
    +ACTIONS = [TigerAction(open-right), TigerAction(listen), TigerAction(open-left)]

    diff --git a/docs/html/api/pomdp_py.representations.belief.html b/docs/html/api/pomdp_py.representations.belief.html index f7f3654f..4e2f223e 100644 --- a/docs/html/api/pomdp_py.representations.belief.html +++ b/docs/html/api/pomdp_py.representations.belief.html @@ -5,10 +5,10 @@ - pomdp_py.representations.belief package — pomdp_py 1.3.4 documentation - + pomdp_py.representations.belief package — pomdp_py 1.3.5 documentation + - + @@ -38,7 +38,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -79,6 +79,7 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    +
  • problems
  • diff --git a/docs/html/api/pomdp_py.representations.distribution.html b/docs/html/api/pomdp_py.representations.distribution.html index 21f060a1..89ba2820 100644 --- a/docs/html/api/pomdp_py.representations.distribution.html +++ b/docs/html/api/pomdp_py.representations.distribution.html @@ -5,10 +5,10 @@ - pomdp_py.representations.distribution package — pomdp_py 1.3.4 documentation - + pomdp_py.representations.distribution package — pomdp_py 1.3.5 documentation + - + @@ -38,7 +38,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -86,6 +86,7 @@

    Table of Contents

  • WeightedParticles.add()
  • WeightedParticles.condense()
  • WeightedParticles.from_histogram()
  • +
  • WeightedParticles.frozen
  • WeightedParticles.get_histogram()
  • WeightedParticles.mpe()
  • WeightedParticles.particles
  • @@ -121,6 +122,7 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    +
  • problems
  • @@ -330,6 +333,8 @@

    pomdp_py.representations.distribution package
    -classmethod from_histogram(histogram)
    +classmethod from_histogram(histogram, frozen=False)

    Given a pomdp_py.Histogram return a particle representation of it, which is an approximation

    +
    +
    +frozen
    +
    +
    get_histogram(self)
    diff --git a/docs/html/api/pomdp_py.representations.html b/docs/html/api/pomdp_py.representations.html index 86acc920..c2f5b368 100644 --- a/docs/html/api/pomdp_py.representations.html +++ b/docs/html/api/pomdp_py.representations.html @@ -5,10 +5,10 @@ - pomdp_py.representations package — pomdp_py 1.3.4 documentation - + pomdp_py.representations package — pomdp_py 1.3.5 documentation + - + @@ -37,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -58,6 +58,7 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

      @@ -71,6 +72,7 @@

      Navigation

    +
  • problems
  • @@ -177,6 +179,7 @@

    pomdp_py.representations packageWeightedParticles.add()
  • WeightedParticles.condense()
  • WeightedParticles.from_histogram()
  • +
  • WeightedParticles.frozen
  • WeightedParticles.get_histogram()
  • WeightedParticles.mpe()
  • WeightedParticles.particles
  • diff --git a/docs/html/api/pomdp_py.utils.debugging.html b/docs/html/api/pomdp_py.utils.debugging.html index f9badc1d..5944ea6c 100644 --- a/docs/html/api/pomdp_py.utils.debugging.html +++ b/docs/html/api/pomdp_py.utils.debugging.html @@ -5,10 +5,10 @@ - pomdp_py.utils.debugging module — pomdp_py 1.3.4 documentation - + pomdp_py.utils.debugging module — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -105,10 +105,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/api/pomdp_py.utils.html b/docs/html/api/pomdp_py.utils.html index db7cd7d1..c05252f5 100644 --- a/docs/html/api/pomdp_py.utils.html +++ b/docs/html/api/pomdp_py.utils.html @@ -5,10 +5,10 @@ - pomdp_py.utils package — pomdp_py 1.3.4 documentation - + pomdp_py.utils package — pomdp_py 1.3.5 documentation + - + @@ -38,7 +38,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -262,6 +262,7 @@

    Table of Contents

  • pomdp_py.utils package
  • +
  • pomdp_py.problems package
  • @@ -420,7 +421,7 @@

    pomdp_py.utils.cython_utils.cpython-37m-x86_64-linux-gnu module
    pomdp_py.utils.cython_utils.det_dict_hash(dct, keep=9)
    -

    deterministic hash of a dictionary.

    +

    Deterministic hash of a dictionary without sorting.

    diff --git a/docs/html/api/pomdp_py.utils.interfaces.html b/docs/html/api/pomdp_py.utils.interfaces.html index 8c21c46d..03a153fc 100644 --- a/docs/html/api/pomdp_py.utils.interfaces.html +++ b/docs/html/api/pomdp_py.utils.interfaces.html @@ -5,15 +5,16 @@ - pomdp_py.utils.interfaces package — pomdp_py 1.3.4 documentation - + pomdp_py.utils.interfaces package — pomdp_py 1.3.5 documentation + - + + @@ -36,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -79,6 +80,7 @@

    Table of Contents

  • pomdp_py.utils package
  • +
  • pomdp_py.problems package
  • @@ -100,6 +102,7 @@

    Related Topics

  • pomdp_py package
  • diff --git a/docs/html/api/pomdp_py.visual.html b/docs/html/api/pomdp_py.visual.html index 1cac4a07..ade180ad 100644 --- a/docs/html/api/pomdp_py.visual.html +++ b/docs/html/api/pomdp_py.visual.html @@ -5,10 +5,10 @@ - pomdp_py.visual package — pomdp_py 1.3.4 documentation - + pomdp_py.visual package — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    diff --git a/docs/html/building_docs.html b/docs/html/building_docs.html index 146044d9..35b1c6b7 100644 --- a/docs/html/building_docs.html +++ b/docs/html/building_docs.html @@ -5,10 +5,10 @@ - Building Documentations — pomdp_py 1.3.4 documentation - + Building Documentations — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -68,6 +68,7 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    API References

    @@ -207,7 +209,7 @@

    Multi-Object Search (MOS)state.py or transition_model.py are self-evident in their role. The problem.py file is where the -MosOOPOMDP class is defined, and +MosOOPOMDP class is defined, and where the logic of action-feedback loop is implemented (see Tiger for more detail).

    @@ -217,7 +219,7 @@

    Multi-Object Search (MOS)
    $ python -m pomdp_py.problems.multi_object_search.problem
     

    -

    A gridworld with randomly placed obstacles, targets and robot initial pose is generated; The robot is equipped with either a disk-shape sensor or a laser sensor [source]. A command-line interface is not yet provided; Check interpret, +

    A gridworld with randomly placed obstacles, targets and robot initial pose is generated; The robot is equipped with either a disk-shape sensor or a laser sensor [source]. A command-line interface is not yet provided; Check interpret, equip_sensors, make_laser_sensor, make_proximity_sensor diff --git a/docs/html/examples.tiger.html b/docs/html/examples.tiger.html index d733dc68..c8a306ae 100644 --- a/docs/html/examples.tiger.html +++ b/docs/html/examples.tiger.html @@ -5,10 +5,10 @@ - Tiger — pomdp_py 1.3.4 documentation - + Tiger — pomdp_py 1.3.5 documentation + - + @@ -38,7 +38,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -78,10 +78,12 @@

    Table of Contents

  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/existing_domains.html b/docs/html/existing_domains.html index cfd3592d..4b3021f3 100644 --- a/docs/html/existing_domains.html +++ b/docs/html/existing_domains.html @@ -5,10 +5,10 @@ - Existing POMDP Domains — pomdp_py 1.3.4 documentation - + Existing POMDP Domains — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -56,10 +56,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    @@ -117,16 +119,19 @@

    Existing POMDP DomainsSeveral domains have been implemented:

    - + + + + - + - + - + diff --git a/docs/html/existing_solvers.html b/docs/html/existing_solvers.html index c8d34471..caf0f92b 100644 --- a/docs/html/existing_solvers.html +++ b/docs/html/existing_solvers.html @@ -5,17 +5,17 @@ - Existing POMDP Solvers — pomdp_py 1.3.4 documentation - + Existing POMDP Solvers — pomdp_py 1.3.5 documentation + - + - + @@ -38,7 +38,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -59,10 +59,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    @@ -79,7 +81,7 @@

    Related Topics

    @@ -123,7 +125,7 @@

    Existing POMDP Solvers

    - + diff --git a/docs/html/extensions.html b/docs/html/extensions.html index 92ff1b69..b7711f1d 100644 --- a/docs/html/extensions.html +++ b/docs/html/extensions.html @@ -5,10 +5,10 @@ - Use Case Extensions — pomdp_py 1.3.4 documentation - + Use Case Extensions — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -56,10 +56,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/genindex.html b/docs/html/genindex.html index 65f348e5..1c97d4f3 100644 --- a/docs/html/genindex.html +++ b/docs/html/genindex.html @@ -4,10 +4,10 @@ - Index — pomdp_py 1.3.4 documentation - + Index — pomdp_py 1.3.5 documentation + - + @@ -34,7 +34,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -199,6 +199,8 @@

    A

  • (class in pomdp_py.problems.rocksample.rocksample_problem)
  • +
  • action_prior (pomdp_py.algorithms.po_uct.POUCT attribute) +
  • ActionPrior (class in pomdp_py.algorithms.po_uct)
  • ACTIONS (pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem attribute), [1], [2], [3] @@ -247,6 +249,14 @@

    A

  • (pomdp_py.framework.oopomdp.OOObservationModel method)
  • (pomdp_py.framework.oopomdp.OOTransitionModel method) +
  • +
  • (pomdp_py.problems.load_unload.load_unload.LUObservationModel method) +
  • +
  • (pomdp_py.problems.load_unload.load_unload.LUPolicyModel method) +
  • +
  • (pomdp_py.problems.load_unload.load_unload.LURewardModel method) +
  • +
  • (pomdp_py.problems.load_unload.load_unload.LUTransitionModel method)
  • (pomdp_py.problems.multi_object_search.models.observation_model.ObjectObservationModel method)
  • @@ -321,8 +331,12 @@

    B

  • (pomdp_py.framework.basics.Agent attribute)
  • -
  • belief_update() (in module pomdp_py.problems.tag.agent.agent) +
  • belief_update() (in module pomdp_py.problems.multi_object_search.problem) + +
  • bestseq (pomdp_py.utils.debugging.TreeDebugger property), [1]
  • bestseqd() (pomdp_py.utils.debugging.TreeDebugger method), [1] @@ -410,6 +424,8 @@

    C

  • covariance (pomdp_py.representations.distribution.gaussian.Gaussian attribute)
  • create() (pomdp_py.problems.tiger.tiger_problem.TigerProblem static method) +
  • +
  • create_instance() (in module pomdp_py.problems.rocksample.rocksample_problem)
  • create_plan() (pomdp_py.algorithms.bsp.blqr.BLQR method), [1]
  • @@ -433,18 +449,40 @@

    D

  • DetObservationModel (class in pomdp_py.utils.templates)
  • - - +

    pomdp_py.problems.tiger.tiger_problem

    pomdp_py.problems.multi_object_search.problem

    2D Multi-Object Search (MOS) Task.

    pomdp_py.problems.tiger.tiger_problem

    The classic Tiger problem.

    pomdp_py.problems.rocksample.rocksample_problem

    pomdp_py.problems.rocksample.rocksample_problem

    RockSample(n,k) problem

    pomdp_py.problems.tag

    pomdp_py.problems.tag

    pomdp_py.problems.load_unload

    pomdp_py.problems.load_unload

    po_rollout

    PO-rollout: Baseline algorithm in the POMCP paper [2].

    PO-rollout: Baseline algorithm in the POMCP paper [2].

    po_uct

    This algorithm is PO-UCT (Partially Observable UCT).

    @@ -501,24 +539,30 @@

    F

  • FORWARD (pomdp_py.problems.multi_object_search.domain.action.MotionAction attribute)
  • - - + @@ -526,6 +570,8 @@

    G

    + - - +
    +
  • generate_random_state() (in module pomdp_py.problems.load_unload.load_unload) +
  • GenerativeDistribution (class in pomdp_py.framework.basics)
  • get_abstraction() (pomdp_py.representations.distribution.particles.Particles method) @@ -540,6 +588,8 @@

    G

  • get_all_actions() (pomdp_py.framework.basics.PolicyModel method)
  • +
    @@ -789,10 +877,16 @@

    M

  • magenta() (in module pomdp_py.utils.typ)
  • -
  • main() (in module pomdp_py.problems.rocksample.cythonize.rocksample_problem), [1], [2], [3] +
  • main() (in module pomdp_py.problems.load_unload.load_unload)
  • +
  • minimal_instance() (in module pomdp_py.problems.rocksample.rocksample_problem) +
  • module @@ -848,14 +946,16 @@

    M

  • pomdp_py.framework.planner
  • pomdp_py.problems -
  • -
  • pomdp_py.problems.lasertag
  • pomdp_py.problems.light_dark.env
  • pomdp_py.problems.light_dark.env.env +
  • +
  • pomdp_py.problems.light_dark.env.plotting
  • pomdp_py.problems.load_unload +
  • +
  • pomdp_py.problems.load_unload.load_unload
  • pomdp_py.problems.maze
  • @@ -894,6 +994,8 @@

    M

  • pomdp_py.problems.multi_object_search.env
  • pomdp_py.problems.multi_object_search.env.env +
  • +
  • pomdp_py.problems.multi_object_search.env.visual
  • pomdp_py.problems.multi_object_search.example_worlds
  • @@ -912,6 +1014,8 @@

    M

  • pomdp_py.problems.multi_object_search.models.reward_model
  • pomdp_py.problems.multi_object_search.models.transition_model +
  • +
  • pomdp_py.problems.multi_object_search.problem
  • pomdp_py.problems.rocksample
  • @@ -938,8 +1042,14 @@

    M

  • pomdp_py.problems.tag.domain.state
  • pomdp_py.problems.tag.env +
  • +
  • pomdp_py.problems.tag.env.env +
  • +
  • pomdp_py.problems.tag.env.visual
  • pomdp_py.problems.tag.example_worlds +
  • +
  • pomdp_py.problems.tag.experiment
  • pomdp_py.problems.tag.models
  • @@ -956,6 +1066,8 @@

    M

  • pomdp_py.problems.tag.models.reward_model
  • pomdp_py.problems.tag.models.transition_model +
  • +
  • pomdp_py.problems.tag.problem
  • pomdp_py.problems.tiger
  • @@ -1005,12 +1117,16 @@

    M

  • MosOOBelief (class in pomdp_py.problems.multi_object_search.agent.belief)
  • MosOOObservation (class in pomdp_py.problems.multi_object_search.domain.observation) +
  • +
  • MosOOPOMDP (class in pomdp_py.problems.multi_object_search.problem)
  • MosOOState (class in pomdp_py.problems.multi_object_search.domain.state)
  • MosRewardModel (class in pomdp_py.problems.multi_object_search.models.reward_model)
  • MosTransitionModel (class in pomdp_py.problems.multi_object_search.models.transition_model) +
  • +
  • MosViz (class in pomdp_py.problems.multi_object_search.env.visual)
  • motion (pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction attribute), [1], [2], [3]
  • @@ -1062,10 +1178,10 @@

    N

  • (pomdp_py.problems.rocksample.rocksample_problem.MoveAction attribute)
  • - - + - - +
  • Planner (class in pomdp_py.framework.planner) +
  • +
  • plot_circle() (in module pomdp_py.problems.light_dark.env.plotting) +
  • +
  • plot_line() (in module pomdp_py.problems.light_dark.env.plotting) +
  • +
  • plot_points() (in module pomdp_py.problems.light_dark.env.plotting) +
  • +
  • plot_polygons() (in module pomdp_py.problems.light_dark.env.plotting)
  • pm (pomdp_py.utils.debugging.TreeDebugger property), [1]
  • @@ -1279,24 +1443,24 @@

    P

  • - pomdp_py.problems.lasertag + pomdp_py.problems.light_dark.env
  • - pomdp_py.problems.light_dark.env + pomdp_py.problems.light_dark.env.env
  • - pomdp_py.problems.light_dark.env.env + pomdp_py.problems.light_dark.env.plotting
  • @@ -1304,6 +1468,13 @@

    P

  • +
  • + pomdp_py.problems.load_unload.load_unload + +
  • @@ -1437,6 +1608,13 @@

    P

  • +
  • + pomdp_py.problems.multi_object_search.env.visual + +
  • @@ -1500,6 +1678,13 @@

    P

  • +
  • + pomdp_py.problems.multi_object_search.problem + +
  • @@ -1537,8 +1722,6 @@

    P

  • module
  • - -
    • pomdp_py.problems.tag.agent @@ -1546,6 +1729,8 @@

      P

    • module
    + + +
  • rollout_policy (pomdp_py.algorithms.po_uct.POUCT attribute) +
  • RolloutPolicy (class in pomdp_py.algorithms.po_uct)
  • root (pomdp_py.utils.debugging.TreeDebugger property), [1] @@ -2086,6 +2315,14 @@

    S

  • (pomdp_py.framework.oopomdp.OOObservationModel method)
  • (pomdp_py.framework.oopomdp.OOTransitionModel method) +
  • +
  • (pomdp_py.problems.load_unload.load_unload.LUObservationModel method) +
  • +
  • (pomdp_py.problems.load_unload.load_unload.LUPolicyModel method) +
  • +
  • (pomdp_py.problems.load_unload.load_unload.LURewardModel method) +
  • +
  • (pomdp_py.problems.load_unload.load_unload.LUTransitionModel method)
  • (pomdp_py.problems.multi_object_search.models.observation_model.MosObservationModel method)
  • @@ -2192,6 +2429,12 @@

    S

  • set_belief() (pomdp_py.framework.basics.Agent method)
  • +
  • set_models() (pomdp_py.framework.basics.Agent method) + +
  • set_object_belief() (pomdp_py.framework.oopomdp.OOBelief method)
  • set_object_state() (pomdp_py.framework.oopomdp.OOState method) @@ -2220,6 +2463,12 @@

    S

  • situation (pomdp_py.framework.oopomdp.OOState attribute)
  • +
  • solve() (in module pomdp_py.problems.multi_object_search.problem) + +
  • sorted_by_str() (in module pomdp_py.utils.debugging), [1]
  • SOUTH (pomdp_py.problems.multi_object_search.domain.action.MotionAction attribute) @@ -2277,12 +2526,16 @@

    T

  • TagAction (class in pomdp_py.problems.tag.domain.action)
  • TagAgent (class in pomdp_py.problems.tag.agent.agent) +
  • +
  • TagEnvironment (class in pomdp_py.problems.tag.env.env)
  • TagObservation (class in pomdp_py.problems.tag.domain.observation)
  • TagObservationModel (class in pomdp_py.problems.tag.models.observation_model)
  • TagPolicyModel (class in pomdp_py.problems.tag.models.policy_model) +
  • +
  • TagProblem (class in pomdp_py.problems.tag.problem)
  • TagRewardModel (class in pomdp_py.problems.tag.models.reward_model)
  • @@ -2291,14 +2544,18 @@

    T

  • TagTargetMotionPolicy (class in pomdp_py.problems.tag.models.components.motion_policy)
  • TagTransitionModel (class in pomdp_py.problems.tag.models.transition_model) +
  • +
  • TagViz (class in pomdp_py.problems.tag.env.visual)
  • terminal (pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState attribute), [1], [2], [3]
  • -
  • termination() (pomdp_py.framework.basics.Option method) +
  • terminate() (pomdp_py.framework.basics.Option method)
  • -
  • test_planner() (in module pomdp_py.problems.rocksample.cythonize.rocksample_problem), [1], [2], [3] +
  • test_planner() (in module pomdp_py.problems.load_unload.load_unload)
  • + + - @@ -2378,8 +2637,16 @@

    U

    +
  • value() (pomdp_py.utils.interfaces.conversion.AlphaVectorPolicy method) +
  • @@ -201,6 +200,11 @@

    API Referencespomdp_py.utils package +
  • pomdp_py.problems package +
  • diff --git a/docs/html/installation.html b/docs/html/installation.html index 053aa07c..6a929526 100644 --- a/docs/html/installation.html +++ b/docs/html/installation.html @@ -5,10 +5,10 @@ - Installation — pomdp_py 1.3.4 documentation - + Installation — pomdp_py 1.3.5 documentation + - + @@ -37,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -77,10 +77,12 @@

    Table of Contents

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/modules.html b/docs/html/modules.html index 24ddc07d..739a22e9 100644 --- a/docs/html/modules.html +++ b/docs/html/modules.html @@ -5,10 +5,10 @@ - docs — pomdp_py 1.3.4 documentation - + docs — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -56,10 +56,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/objects.inv b/docs/html/objects.inv index 9fc6e5739615022104c4f443a5997976c3c0861c..807ff44a75b4ac88fb1b45b2b1c2b4901dfb45a8 100644 GIT binary patch delta 7033 zcmV-<8;0c3GPF04cz;`WoVb>L_phk6W*%l9!X(b6<9>5ucRFkA*vEE~(@!iF$W`h9 zB7*WIzy3%F3aW~WE?YpqbjOtVz7J_@>%NuJI86QY*+bEaGLo<3%v)yZB7Ocnrr{>S zibr4xeFeaGMxL_&(uji zmBMl82QIItt)Ihr zr$zm|W`r^b+uwuqR=h~L!@0+dai4&SUow!47fjbzUq9YK$u7V=DUoX~GX$vEN_1#P zP$P#V3+RSh+&%vS7t#w4lWbx?BXQ;kUig-TBr88BF@J{Vh|!ZD;xu2wLyL@gAQ{Os zpClxQCjfK1HRPeIg_Z2co!10_ZhRj!bLGEFmIoAVFu1Aw>kADrls~*dNl0VBe$fG_ z*X+?jlwgT_y)`xv$xToPl4<@8wAd;@@19Zal#&t~R;{-t8E!1@q1B3ui+kLjZQ6&za+c8yq0cz-+t%Hl&{Zv^qcPF|2W$sKn&Q}(2C z%+PkG38E72;d~Q(vNJ>W!OFpX=jZQ1 z4q#Q|U?3{xcP}rf4fH9=sun7R@4-pD}Ea}sw$O0JGvjaKU7q)m~2kmz^9BpkPtUpLQb40Du!_M2f$RI0s0wRxCa?}N)5|f7NdlJx z*H@Qk*DysS*K7b?MgtJmTQq?yM=`it!ivFxduUR?dxj=Ds2w+fLC3K-MOPEh{C^sN zu;$kUc4Qn)3V7paqJtX8ZPnklFTJ~M=NHf<_CR6HVjsNnO!b_iBN7Mpw@(9agZm7i zc34g{;-{25tLFG}yTuj&eYG7K)Wb77d`gRlKx+^sns>&t0HR`6cvn{+wll4OaFDZL zE!dee>?JrNz~J%#lP>?p0n{XUKYu#J`pE$UEA~Qx3m4N*j|JjV#dIn4^RaX!;C| zxvITkZENm0WJbHg-%kHS;)4s$Tni@oX4?vZxe(a#StqWW8sugi*p2VRy??qHL3QKr zFGqnkNrnA`df*z-i4E<*XD;C(9DQ+C2s5COWr^lp*QgdHwud&bo6igrW~QtvD@ z#Qe<^Gw#;M<1W&<h{bEP4Zsck$cCk}x(~;yvO@2KZA6>WUU+vyJ%3)I_K&&YcvR<$ zoH34QL`Ks;?&wD|CjOtV#XqlQQs;$SF2T##5RC!&a5oo-SFTFd^R}*uV?>fMcye3? zn32;vP<%1^g%x`7BAG(>y-3FMzswXBP?=f}y9{&Wlw$uF#|S*0*3jdCa+s@L&2aTK z1%s#9gz0>N+Kg6}RDV^q`dpbIvUkb<(3%?CCF)^loY7H`E>o+jFH;9JPHBS6=@AW@ z`b8DSO_Y=Ef*VFGSgX(-zGcSc)$z>q8Ie5rYtB0dcJGpA{fF6ARoKy&@#O}O%(_z3 zSTC5OEF`_ijlm6lZgZe1p?~Y!h&qP0n>m&u&&fpO7uM<3f`4gI?^AWYY-pR>JuasL zJk@F7AsMFpe~=`cTEhjUKc?1jNyY!>q{91f`tkq2pWdAH?t&Os()sD_-OS`1&nbWY zxVo8HiCvukF{cvya&>d}=iKzn%7kt{fBJJyC3gGq&-2Uk+u14dzkQ#drhor6M@_S; zakp1r=ci{@9)IBb`K%gQA!oAu(VVq()K_oLX%=HRy@^eSnQ|a!@X*dwvM3X8%}&?A zIizt^$<4U)F{%SS-j}Zz7ZbSvnyIwh&?TL?Y-$N*-G9mad%8)&d1T9sO2}j4pZ)}b z6xUJP-!yD;G}doj@CyH_x47Gv9DR5fUqcOS?gnw>G${!{fWts76jfH^i zb%m3X`;}Epp&~{fhuI4m zdK^5HH-C~0r69c{X(=k`lqyKP^4D1T5SvpSk0g{A+)XE=xXW+PK&Dee6JKnLNjB+} zCc;(Vhu&)+$IG@SKs&B`Lf~18|?~K!GY4_ ztr!XY7^Sln=6&M-xRe6*yWt)BAccvWy~Go$dTMhdo%N_~R^=*Xc^6`cdwh1g6*-Ht zZ4>8_#J?vv3VnL-KM?#lw<6w?EBoPi<|@TQaq&09D-n$;BfrdNUq{otrc@l!L-EWr zSATk>e}K?OlCOF7;+=xk{0#QGngE-plbW+C@8b0K{KkAa-?_f)o2!3+zWjXm*NipJ z)sdI-nzQ6HbKC!@Hs+t;3h^f3Eeb|S5vbpI+~!VTGv{U|EvH;sIJvNcaLf~qhYz$A z+iJAqIt|Hlqf0#&#R&Qi_R-BJ>)NHMhkr1cPNH6{lj(HM$q=n)HLdi>+tViZYfTxR zR`@cfIpP_`HXBcpe&Dn5v`y>_I(0D`MRb$TO4D@yX#bAiiRyn-hWCl0NGsf&(_9ff znc1qD&?)t)nz-)wNt>>!wcY4EQFYswA~H!kMxXNxYEdN7E_ojkB5z*3dFui#vuEr#y=4*Y(;`m(~Jezmzv{QlL!gEubX* z1;l=B?*O$yTKaE*y3`jC`!&4>)C5%VY`wbHI$5ujDRx3sPI0V zo&mHyuiwL{`E+#!BIg7~4oMy`vmUU#c?qLN`F5RtHFn-y)-RCR!Z&t~+~9;zzZ^TS zU0kM_B9@aN!kNwmME$Dl+_m!6m;EB_{Id4FnEhe~{jcr%p4PHr%l8`84yC17$aO> zx8SX2SK(-FXHfx_n9r61iZGrP1=L_a`)MUcdzRCh&1g2$o`2P7*3zEVWOmY?)npdZ znALc;(VS6x0o|A?;QndPU+T<^8S~mroEp=DOpqG0n@oh7lksnjQ8a$h+RU`}kmhKm zFoVidDNLP;RA^O&sUJox((2%jf$rU*)#*ywbyqels@GXraVTF`Wy7L) z9hD7*;&oFt6w2308Ix#T7iG+%d>xcNgH})mRe0UIl+;HW_=)=n5~~lGbz#*fUbg5; zusI{L?SF>ARlcsNPOO*_Cf6~wzGup(bKQ~~V)g5kdiZUKy3=Ql7t>dk0}l=r4m^nV6+9qcCn?ADd(w^mKx$y-|$S08TAZ@!%ZNO@-~<@WCM?%Yy@ zvHR4UOXy&K55R8kvrZsXz%{X5Vc<0dfq1R1Q1F^sY~5B@0C)u%s(U!Qh+kU~+kbb~ zyW+YlDA1oE>XPslNP=};?TX-TAf@VL6uW&h8%e)GN`mqs@1aBi`H>SSJ=VVDm5F;@ zZb%e1JEX%iLS6K)jOq8smF60bjWuLA&q=bfqknBqzpbt2>?RIXeRi>n)x?KtA5`mP z?{k}G6ML!?h`V28I)gMcw>m&$H-9x_OK##qZ8L9F z+m_0$T^NiC%^4hji@|z>34_7Hf(ec0{EY=gd1Bvbv1pCzj0rrNuhlm48}XP8&+J%C zhdq|8BeZ~);{;7M&HkV^`VZ`H*Nok881^j>Sr|?k&Tx{;UR8Nc-YZVyuYVZo=}~sQ z+10ZgV)D?E51wVa?b8Qbh6JcYbbVo;3_X5%Vy0$QI81L#zCF0_Je#*nhuOR%!ugkO z|K&4Gk_WP)Y}(b#obEkeQL0`HdDjo7ObA{ z^M;G$IQIQ+m+o3ZHnoI+K7aHMf}FD>Myg0X6N!j1N~WamJM!U{dgu&=TlS2sVl-OD z8+0B3oL$|J|Jmes?(SN6$9H(`BC_d4h!M-KJxn5FN5Z(3prL|fenMGX1Z@hZ%Z$<7 zU>o_Ej?kcc4d96C-sW|a-?<}d;q_1$j-1sE^5Qt~$d$iMM=@(skAHfm6*7bT*r^ty zIKws-lQ;tJdl3)^hf`I}1OD;*3jJcT`G}doc^!%fXcFQi!_zC7)}6NM`Gu1Se8{1c zNgeB;_XFTj?GN6_1D-B3j&_DC{z>*qY>n zSXl$g3yZCj0r%l3Tbs)Z@p7|TmHXQ)v~6*`JBIOD@s}*s){dg0s2wnG*%!Xh3=suC zy8WveB+l{-|Adz+aYJCa0l3g2G&wkG2#<)<{_vYds1b1aM1SbHZ$pL|CPw$*A08tH zU6ll+pCVaG(73!VZE){(M8?=DH0Ck|FRmnlhfLrh;r(c`iT$EdWlo?I8uo26GQ)iU zmkMp74r-}@0fPv9hF(tn+4i2=aw*@;73FGDPof$@PA zdk@4<*(NzWGpLUqSKTV}i5UUm-S|tKKVqDiJLwYV$r|C=8sV2E!ky*&DCNDJC!Y@> z`$NquK&jukr~t-Q{cQ;$CZ179Q2%jT1)v8USRjxrur+%Q;r*S_#Lv(@wv*y9Tn5Uw zzz{P0jDI_RTQM1lNrad!N{R!*Jy5Vlrn9sMINt5o54Rt0K40JUuFvSAE@__AIKub2 z16Wqw^#hCxiy6|#1Qc)`kpzPx77byB1K1A-FLeP3j7XD}BNMHm;muTFI}z+gYEDxp zYB?^vU`L3skl7mXk-YT&V4yCF$w?7$P*^~D>38QfstC_~sXaJ=X_f@1?_tm;v5b4YMI(>;!@3Vlli z&OlfOJusCB40?$D;R#f+?$C0>hc@7DrUO?qMvg5TsKIrSKv`Xh59#0zA)(bmdyRHj z<$s70mNYKx#g&u#nvi?SVwEUK=8)=viYzz=BNJI*Tjut2YTKE6PQ7KlSJk9=Y6S1Y z#n*G29%>Wn>f#It>f>LhUx1*_znpypg8FoGehww;^7PaBm%CFSw3~CNod5pk=Q}8a z`0M=Q;_5pPSV%Iow5oSosLTqaTz)m1wtp=UXcXEZ1kWh3L%@vL>>dyhD`vG6B_K$0 zPwfz5v=V0o>_8HlTNWw9mL-~Pf&gck9SHA|B?CcD6+qU+HaDIzZ+#y%FvM@N!OIp| z9{wKEVDUn}Qa&!yE~@vBnqd2HY)N)rS)?fV!Hs3-RS!ig%1FMBvrd#c$u3~?-G2dW zZ<(bk_&ixBM}aZKBd;k}p(-yl?_?{HS_$tNit!_5KRSuFDfS5JH(P% zu-o@~QRN{OKSVvkThexLHPKXQy~0^(kr!_aODK_*g@m+-1gE1!zM>$d#8%dVlLsv! zJiUSnfvPN_ydqvlMdL!cg$nk77JrIDf0Ky+DX6Fuck(yz`k7<&3lCF@R9##J!Z3-l z%{3DDQL5Qlky6RRs+7H)!&X%!Q?;i?;$B)M8)|~pmr(18*t@)Xq0BNMZ4>3hr^~-_ zkoy@%ELbb(I((^9R13bgB319)`KpFGC4b%ao^mDXd{;-MS`}+~QLVAU(E~+D7_wIp(B16BZ z9Ib{mR5!3L+TR~!Q1x2dq&;j(UP+`=^+I*pK2{|!BN8fkl`>%;;jq`JuN+n*?Dq-{ zG*w!yTHpHGuo(4PEn_+l>wnmWT3&SCB|OZdQ-j+s4p}JNJKUyXFXBWe`F>=IUCwUz3pu^;iH6RZ&wp&zzB3DrW- zK#?<1ZA|s?fdQ(eCTAAcmqhw{M-&p4wI2p;-`!x0ZI2} zFb{r|xpP)LUR-Yyn8W&#OvT^vajC+1%)QHH}s zxg+ITBsuCl+R}>Ndj4hcRUFUcV&!j(Tlw2jv#?vyDkE52ieBi8tD+aWxRqnM|GB)n z{okYA5@|(gv_Qpu82laXdZby4Lf_-w{jJJp`BYjSxBcR`8h@xYOLl*21*&r*$4R!| z!qiWzY{ZL?yo8FJls_Et&KXHU{IqMQ)l>Q2XYtRYI#~(dNU@y|->KF7l`I#l@*#fM z#V>zAb>OA)$qSM6#ZmM3UCO=pxVHL_eVt7ch)6 z?57b*a=kcP&=3Y1KRx=(G?eghM4{11lHoa%;4>T%{OEH$k8zT@;9)7lna_WwPSU9q zjzd47Jo6uyNsti=K$B9R(I}$J49pZONN;+3SAknuWD}?tL>Mt2%|WuXkwHk#gz<=f z7=A%4lr$*I7=M{9GYrZEV>OM?To`8g)K6(df|Vnpq9i*7FLJvq&rrFs3_z`4z8Q+C1b}6I7nHjyxD)ti6fHqrGN`c?wt(0?Mz3H-R)D5VbUXZY*7=)s0HlCS+c-!8+gJik zR2erHQ-6Sr+F*gz!xbW2ExC*7qK=dt8xJ-`EF+@X#(|P}AJ{v9cwi?lNt~pPyOhZb zu}?D0&}PU0q7d%jdVk8_U+Xkh$i167cpEsY13U$SzpfOKbi7 z9mpQ6b$1B}%0r>(EDD2aPdO9ND602BTMgC_nt#qXX3xkOKF?&A0~%SO02`pHG%5{X zNkWur5(8+C;xxiFa4@rzJzNK{eKoc*q+iQC0O-#V3Z7>4^+wbi5sZ)6g6wUyT0j>@ z0R(+1k~KG1Ft=Mr^n8DgGf@r2zVAS=fak#QSIIMBG>O5gjvAnc(llE68AFNa&~;8g z7=KgDN>lOUwPnNjqdG^hWQE^%1D`VbOhR0*x*Q}_F(ctJnH(lj4(-;EDsbpD`ht_Z z9r}#noli41tT%4qkdq2|B{dfj+)~9Ul>5KkE@So?Py+<4TX#`mGjtDKW@S_3*%eo~ zQx0742(LOrGZK+(<%$BdVRD-S8fA`^H-FR#WPMWNRx?B}4zh%GkeptISxgehG??Dr zTux!Ksh9%+bQ?85SdUQ$UOS84X=Ez~2QH#c0q-5^=%AKd2L|nK-sLSqK=Z2s!kS+l z*pYG6Dd3Hxjt*)Z_v<#deeOMM8o+=iu>%Tg7Q5hU&s2@kIU;djf4emBHn__GYJZ32 zz#V=~g|o_v9#ozKo3)1k=<`kQpz5O8;ZvGF1RB#X(Y)K+&zq4(iz2iO2RXRZfX$s@ z&%hA@I)rpf*%dt8Ku_lz+?Ngbo&%I=Lc%=&V*~5RJ_pG&km0KnFBkL1WG< zZ&=xyJB}iu-QjPB>>=^N1#{PeNw(b7LSQZgwm;R1>!t*`>9@7xJ8`dWdOYp;yHiM@ zRZ?#MpdPqFbYeqW@Z2Rlgrm>*Y+we|6D-lZX@zQ$V>@U)tJ%yjVMZ34QGfS$Xy|iD z2NB`8WBJ`WM0@^hLWr!uEJJezuys%sR5D*=eu#vAoII;wZ$;2%I2?<2EgxNqCo0QD zI+?8~MM+P1PAp=kB41Vqa)zGy2BR-f^J43us;brfqam_)BYtSP z!)>AthN|(XBE1N$s=f>z&^V=ukgZEoMO0y2Mj6?3-7sRoLWOQWmKm2`G0oz6;q zlwPRWYqQ9;4dR<9+*neLav1P#)xWRQQW2 zfZT9Y=K-7~K~2JXU2RJFAhz43hbv7Mx|cL;+NdmCIiLoaL4PD1GH2>y)>$)@mODD5 z1LsX8p)5Pxf27MK97nQ@D2F^I|MUkCq&Sb-9MiDM(U`w=!7Kfz-sEnV3S0Uz>q%%{ zrNC)XKa0baApCPlQt>e1lyT$P8VdoN6Z{7y_t#c2go+qFVLx9SS7yXuB1Fhn5|eB- zgpk)_XW|QGQGdt}y0&4Px|~EUei^5L=GUvQQ)!KC`0+-oSX6MJ^mubdLO(|7XoY!S z#2+_>K>ez%MIWRvd8Vg)LVJ#xIJC~n%Zw^t3t8T^bjc@|_ZyL;$lE4yq9XGj364Ua zKKjoDzl<%5cjOksLU`mVrM!BtZe(uz zA63Wv6I>x)2BJp6D9Mi$GVZsz6If5Vkx9#_kQNRuZ0{h70sF&yTJmWi)uTm}<+;(- zyFL4m`hWK3eaDk@&C+^z=#N06(kA~A=p2(FE)$Yv*uHKs(^H)EI=Ek}%TPKs^)M-- zb>8X#l9W$s9YEW_zMxfC?}dZ|Xd2ER?Oqx%Q2DRR@V-zKsT^Hk9+>xN@Adaw{bjTZ1ap{sdHjC`iIwHd)i9eI;V^MLA#^J{V z_7oMfqU&|3js!6pJk@fcyJ1uXR%i&-0tYLRxe58D$+3xM$X0vkmjNLJoY)BPE*3aY zK7Wg#T?+}%&Y*PUugjUS{<+02O~-HFT8X+5)jdSo9KSsV(xGu6LARh2C_x$<+`AQ> zLMhVNaNDiu9h4&V4X)jS-a`p0R@*^H`d}sL?jELieY8}ewG**h$|pD}-p?gkx0`J9 z=?qSmV(Yk5&+%JeJ?hQjZe7RFy7bz=-GAavpv5USc)N9-TI$l8>*<#A4o(V`NxcV@ zq(9fwt?dJ#Hb_hV2&hYauBThmCqPX=1<%&2YfWi%N;!E8Ck3eBog4#70yOTE6F^-s zhIC@8+3&T1+ftBNx_grG1Bs@b&V4q;8zzRv? z<5wbDoD3staqob|rHmxKH$^FGdk?Iw+@|};F!m!FAjJ*z-6B6&i+ot6ww3hhM-Ua> z=krT|y65y0jG8aEw;*!PVC0bG8GkeD4$Hf@Flv+!?(SA&=go`q1u|Or&d!k=Z06{e zW9PNyx#oU~SVn>fbDguzyH(k_>-AyhmLlx@vRqK@*KYi>6w~W}ZRhv2rWG5$*PwJL zO~pda8yXWD&cy-nna#OD5Sz`dK`@)mp+PVk&6ODwn@;=~6I#xs0P-4jY=0s7jeD?= zB22of7W}3&9Wa!K&T_Ds3m^?cSe*4t1Q7Ru4c&BR0fzF>h7K}Q0K|XbjJ6rQg`+)m zhJ%g90%|yH##@c9!qM7}q5>*0A1wtGVLU1dsKI{p(@Ko?D5o`>(P*YUtI?>XJ*~;; zq&=(2D5No~@o1wtqxJ;4F@Kfa0H!f5$UvnryUBp0F`3Q4V+X0)RrYGP*vn9=H`i{$ z>fjy%-FrZD#d~jeSoGkv@3l2zD@ugFOvBO@^qP$kjoC%0wp2z1Uzs$ZdE-y%fME6V zp?qg+6<7;d{Z3Xpg4~W3>#|*@UJAVnt4u$nep!$B8m(bl?N3s@fPcsIV~Q&u#Ahg0 z`syE`c9lXIQc<+_;pgfFO!;K-DzFx^-pS#O@l5%2P6l^FtbX!$2fq!mmv;aI97SBQ z%5)<_bVYf_29%(C!ns==iuXhTi739>FAhCAcv;wDmmc>4u{q9)>mH{YO$R9+3R=84 z9V%;D1nG@y9#EL_aDRY}CX+)yO{=Q?GXb~TIf|p}yYw);>ci`f_>JulQiSpVyEeb( z0gR?LwsrKJ_(HAOXseIfVKbNw2BlY@hy|r}XF!@K_?a5e)|qPJy28Y9$=H%Y-F0z`{oyxWTzy?-_RgDU})*)X`6gakQ6@LlP7Eb0^agQT*0e*4xE+qR;3($Y08XcunLa{Pfn8SZ}35>BBcXgJFjDeu6ftebSTwlud8_8wH2oaxN%MQtfUo2U<9qBOmHi=K~QdemKh ziFh0p3WKgui=1N!IUt65b^;;A)<(~a{jTyFw>IW?mdxJy z#lzRzZ}(PJ-`RUx6}O-7ukQXl2axi?R?7Xu`NNf^2xIrD*Y9m%{{+Bp@3YPzRKQiS zZAUh03Ig$3ZO1lhYO!@&ZHF}~$WWbNZX-UmBDQa=w|||%sGvZ9Fr!VvdmstcWwq_J zMFT18Mn=9Af!j#>2q_85hkSw(1>{H0p!8V#l4BG1I$M$`tT#yeS8lb@9~;x}_AAXb zoEU51ILk;fx1&Ebr{9!Tb9NJls=Ro%mDR+DYOkVgW$$vEW&?Yw1BlySWIBS>H@4bC zV>dKoOMhcaw)f7QN~>3AOyJRMftj-pG3%b$v6yyyELjgw16uYIG}$!UgWBj% z*x$?UY>U~}vg~8>&`flmi+bCq&$!&L zv=-6!geMKT=we!EL|ErAa$A)wEl zoqr(b?1+)|0TTm>h%rirr0?3E;Fh{?y}w&_PUbN>Si&1L9srzORgwQu=XdVz8h8)y z@R~*N;YG+E%eFlXB4bO!VGBV`1>t@|S)A`E4~I*PgSo*b@lL% zN7TUUp)fpfQrF1yt*Zwv{7pLYQIo3IGk>g*5v0dfu{ek`Y*I0ZBk+D;GGAmk9I9yU z@gKge&@G0KN6Y}uYhOe_lMp8y53gicce<}Y75NEjV)y~#VlLFAfn)@-M^YaVxDpQ6JBb88v@G>z=h_A z6@sIN@Q66g7T~B6aQ;MS)wK%341W`&NAM4i5rZyD64FmmkxS6HqAV?O=Xu@6*eNvT zECtW5B!Y)b;347tXtIp`yijo`&f@7c^=NpO)~YQ*>Y+ zF=IIFUkGc24_`ksN;7a!=+EZjNrdw<+I=RY8G44Hi&Z9%u#~F>0aAh_qJNtu3@fwk z9958q+UgN(BMqY}$gVY!E2Mcf2MKBtk4 zX-iU^<;<4B_JVMCd~y}wfvECv94A}_!54Y~nQmeDxEkC_8lCZ``9;KE{t^d$iWTtpB-AK)7>O`%;g%|7y5f+j!km$)5-X9FqMK(FfA^{2u zxJ*Ieo-G}8hDBFnvwzFfydAZ{@h)+ue1L?awkAxq?W#5eeVbD?uvNC)o5A&-)?^4< zo-8g~j^NmU39Gt4+Z++AsyU4B(z#+uh9&ve2jx7jSG8m<)pqRr z&<-J3p~MaWGk<2YdO$+VnblO3gdoWywL^&WtDTV@NJ2BqEM?d-NBJ@cFz0q4qDhwY zoGhvUvLLppvBIMEebK;>?}`eKPk0vo7SdqyrifBL&cjaD@sH|YyD>H-TTvz{3Z8_q zY(@1@G^dPYiv4Oqy%|qc@I|mzjvS+p=YN@SIh(0KRfKG3E0G!r9~p}A z3uRBOM4J#h1XavN;PpXSt+<<$w6PV@E zu&tyOnksE^@x2y#9;07EiL5N7xO!YmN$s}si3+x|7J0$Bj*#^==aXJkWeMe_A zSENl;uz!2BP!#&hME<9sq6*x~U&HHWj?pjNPbovSapeg8B+52d3*1GiW@mXwB@0`J z?BwjXsyvvgJ=Fqt(kj_d9jv+*Sx>~yb;=WEmL6%#C?h_d{f&dn=NPeIp`dF&Qmd#2 zd~HRl-nliZhB_sG-4su`5VgkDQK?qM8X~HdxPRt|Isz5SV?!+E;@KKkN26NdZKu*I z%PKJX;?+w!qrp=-BG)Un3frcrhNeneyF*k*!1fIT6Get@QA%ywj%ICti&jQf^je#s z9c)ToNrqGPLRHu#;>RN~*d zqe)f8-Vq=ZHT*_J#ZeAz)YbUZWcP@XRA-;~>(`$WeajkoX#30BotE6pCbuRPAlj-L1(SMq) z9(ki6k8@T2+648=1Iq=<;b!t( z?gtfOi+7Xz;@wd_vm4RYMliXNtK69rl>aZ)IEUu(f-;mgzXNEE?_6iHWa)-OtvDrWbKv}u^w*ngVTkpAx| zzbD0y$c!OIwgd0HDk9zH_o@^beZ78lB(D;9Citb_@2xMhS;si4eM8U3P4iaG_BYms zST+&sBPeCDn#vl1=WES;7WuOJnX|o&Yz(l@(JICZ$re@Eqr51n - Other POMDP Libraries — pomdp_py 1.3.4 documentation - + Other POMDP Libraries — pomdp_py 1.3.5 documentation + - + @@ -35,7 +35,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -56,10 +56,12 @@

    Navigation

  • Examples
  • Design Principles
  • Existing POMDP Solvers
  • +
  • What's New?
  • API References

    diff --git a/docs/html/problems/modules.html b/docs/html/problems/modules.html new file mode 100644 index 00000000..63d3079a --- /dev/null +++ b/docs/html/problems/modules.html @@ -0,0 +1,217 @@ + + + + + + + + problems — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.html b/docs/html/problems/problems.html new file mode 100644 index 00000000..b7bd6b8b --- /dev/null +++ b/docs/html/problems/problems.html @@ -0,0 +1,526 @@ + + + + + + + + problems package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems package

    +
    +

    Subpackages

    +
    + +
    +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.lasertag.html b/docs/html/problems/problems.lasertag.html new file mode 100644 index 00000000..7091c4b7 --- /dev/null +++ b/docs/html/problems/problems.lasertag.html @@ -0,0 +1,172 @@ + + + + + + + + problems.lasertag package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.lasertag package

    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.light_dark.agent.html b/docs/html/problems/problems.light_dark.agent.html new file mode 100644 index 00000000..b7177cd4 --- /dev/null +++ b/docs/html/problems/problems.light_dark.agent.html @@ -0,0 +1,182 @@ + + + + + + + + problems.light_dark.agent package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.light_dark.agent package

    +
    +

    Submodules

    +
    +
    +

    problems.light_dark.agent.belief module

    +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.light_dark.domain.html b/docs/html/problems/problems.light_dark.domain.html new file mode 100644 index 00000000..d73c5ae5 --- /dev/null +++ b/docs/html/problems/problems.light_dark.domain.html @@ -0,0 +1,190 @@ + + + + + + + + problems.light_dark.domain package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.light_dark.domain package

    +
    +

    Submodules

    +
    +
    +

    problems.light_dark.domain.action module

    +
    +
    +

    problems.light_dark.domain.observation module

    +
    +
    +

    problems.light_dark.domain.state module

    +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.light_dark.env.html b/docs/html/problems/problems.light_dark.env.html new file mode 100644 index 00000000..0e9ec74c --- /dev/null +++ b/docs/html/problems/problems.light_dark.env.html @@ -0,0 +1,190 @@ + + + + + + + + problems.light_dark.env package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.light_dark.env package

    +
    +

    Submodules

    +
    +
    +

    problems.light_dark.env.env module

    +
    +
    +

    problems.light_dark.env.plotting module

    +
    +
    +

    problems.light_dark.env.visual module

    +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.light_dark.html b/docs/html/problems/problems.light_dark.html new file mode 100644 index 00000000..c89e2ec7 --- /dev/null +++ b/docs/html/problems/problems.light_dark.html @@ -0,0 +1,221 @@ + + + + + + + + problems.light_dark package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.light_dark.models.html b/docs/html/problems/problems.light_dark.models.html new file mode 100644 index 00000000..cd2a1694 --- /dev/null +++ b/docs/html/problems/problems.light_dark.models.html @@ -0,0 +1,186 @@ + + + + + + + + problems.light_dark.models package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.light_dark.models package

    +
    +

    Submodules

    +
    +
    +

    problems.light_dark.models.observation_model module

    +
    +
    +

    problems.light_dark.models.transition_model module

    +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.load_unload.html b/docs/html/problems/problems.load_unload.html new file mode 100644 index 00000000..d1c1f117 --- /dev/null +++ b/docs/html/problems/problems.load_unload.html @@ -0,0 +1,500 @@ + + + + + + + + problems.load_unload package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.load_unload package

    +
    +

    Submodules

    +
    +
    +

    problems.load_unload.load_unload module

    +

    The load unload problem. An agent is placed on a one dimensional grid world +and is tasked with loading itself up on the right side of the world and +unloading on the left. The agent can observe whether or not it is in the load or +unload block but can not tell its exact location of whether it is loaded or +unloaded. Therefore the agent must maintain belief about it’s location and load +status.

    +

    States are defined by the location of the agent and whether or not it is loaded +Actions: “move-left”, “move-right” +Rewards:

    +
    +

    +100 for moving into the unload block while loaded +-1 otherwise

    +
    +
    +
    +class problems.load_unload.load_unload.LUState(x, loaded)[source]
    +

    Bases: State

    +
    + +
    +
    +class problems.load_unload.load_unload.LUAction(name)[source]
    +

    Bases: Action

    +
    + +
    +
    +class problems.load_unload.load_unload.LUObservation(obs)[source]
    +

    Bases: Observation

    +
    + +
    +
    +class problems.load_unload.load_unload.LUObservationModel[source]
    +

    Bases: ObservationModel

    +

    This problem is small enough for the probabilities to be directly given +externally

    +
    +
    +probability(self, observation, next_state, action)[source]
    +

    Returns the probability of \(\Pr(o|s',a)\).

    +
    +
    Parameters:
    +
      +
    • observation (Observation) – the observation \(o\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(o|s',a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, next_state, action)[source]
    +

    Returns observation randomly sampled according to the +distribution of this observation model.

    +
    +
    Parameters:
    +
      +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the observation \(o\)

    +
    +
    Return type:
    +

    Observation

    +
    +
    +
    + +
    +
    +argmax(next_state, action, normalized=False, **kwargs)[source]
    +

    Returns the most likely observation

    +
    + +
    + +
    +
    +class problems.load_unload.load_unload.LUTransitionModel[source]
    +

    Bases: TransitionModel

    +

    This problem is small enough for the probabilities to be directly given +externally

    +
    +
    +probability(self, next_state, state, action)[source]
    +

    Returns the probability of \(\Pr(s'|s,a)\).

    +
    +
    Parameters:
    +
      +
    • state (State) – the state \(s\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(s'|s,a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, state, action)[source]
    +

    Returns next state randomly sampled according to the +distribution of this transition model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the next state \(s'\)

    +
    +
    Return type:
    +

    State

    +
    +
    +
    + +
    +
    +argmax(state, action, normalized=False, **kwargs)[source]
    +

    Returns the most likely next state

    +
    + +
    + +
    +
    +class problems.load_unload.load_unload.LURewardModel[source]
    +

    Bases: RewardModel

    +
    +
    +probability(self, reward, state, action, next_state)[source]
    +

    Returns the probability of \(\Pr(r|s,a,s')\).

    +
    +
    Parameters:
    +
      +
    • reward (float) – the reward \(r\)

    • +
    • state (State) – the state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(r|s,a,s')\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, state, action, next_state)[source]
    +

    Returns reward randomly sampled according to the +distribution of this reward model. This is required, +i.e. assumed to be implemented for a reward model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the reward \(r\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +argmax(state, action, next_state, normalized=False, **kwargs)[source]
    +

    Returns the most likely reward

    +
    + +
    + +
    +
    +class problems.load_unload.load_unload.LUPolicyModel[source]
    +

    Bases: RandomRollout

    +

    This is an extremely dumb policy model; To keep consistent +with the framework.

    +
    +
    +probability(self, action, state)[source]
    +

    Returns the probability of \(\pi(a|s)\).

    +
    +
    Parameters:
    +
      +
    • action (Action) – the action \(a\)

    • +
    • state (State) – the state \(s\)

    • +
    +
    +
    Returns:
    +

    the probability \(\pi(a|s)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, state)[source]
    +

    Returns action randomly sampled according to the +distribution of this policy model.

    +
    +
    Parameters:
    +

    state (State) – the next state \(s\)

    +
    +
    Returns:
    +

    the action \(a\)

    +
    +
    Return type:
    +

    Action

    +
    +
    +
    + +
    +
    +argmax(state, normalized=False, **kwargs)[source]
    +

    Returns the most likely reward

    +
    + +
    +
    +get_all_actions(self, *args)[source]
    +

    Returns a set of all possible actions, if feasible.

    +
    + +
    + +
    +
    +class problems.load_unload.load_unload.LoadUnloadProblem(init_state, init_belief)[source]
    +

    Bases: POMDP

    +
    + +
    +
    +problems.load_unload.load_unload.generate_random_state()[source]
    +
    + +
    +
    +problems.load_unload.load_unload.generate_init_belief(num_particles)[source]
    +
    + +
    +
    +problems.load_unload.load_unload.test_planner(load_unload_problem, planner, nsteps=3, discount=0.95)[source]
    +
    + +
    +
    +problems.load_unload.load_unload.main()[source]
    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.maze.domain.html b/docs/html/problems/problems.maze.domain.html new file mode 100644 index 00000000..406f3b20 --- /dev/null +++ b/docs/html/problems/problems.maze.domain.html @@ -0,0 +1,211 @@ + + + + + + + + problems.maze.domain package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.maze.domain package

    +
    +

    Submodules

    +
    +
    +

    problems.maze.domain.action module

    +

    The agent can take motion action and a look action.

    +
    +
    +

    problems.maze.domain.observation module

    +
    +
    +class problems.maze.domain.observation.Observation(walls, orientation)[source]
    +

    Bases: Observation

    +
    + +
    +
    +

    problems.maze.domain.state module

    +

    Defines the State for the maze domain, which is the position of the robot and its orientation.

    +
    +
    +class problems.maze.domain.state.State(positition, orientation)[source]
    +

    Bases: State

    +

    The state of the problem is just the robot position

    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.maze.env.html b/docs/html/problems/problems.maze.env.html new file mode 100644 index 00000000..4e7db673 --- /dev/null +++ b/docs/html/problems/problems.maze.env.html @@ -0,0 +1,191 @@ + + + + + + + + problems.maze.env package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.maze.env package

    +
    +

    Submodules

    +
    +
    +

    problems.maze.env.env module

    +
    +
    +class problems.maze.env.env.MazeEnvironment(init_state)[source]
    +

    Bases: Environment

    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.maze.html b/docs/html/problems/problems.maze.html new file mode 100644 index 00000000..272d9975 --- /dev/null +++ b/docs/html/problems/problems.maze.html @@ -0,0 +1,234 @@ + + + + + + + + problems.maze package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.maze package

    +
    +

    Subpackages

    + +
    +
    +

    Module contents

    +
    +

    Maze

    +

    Problem originally introduced in Solving POMDPs by Searching the Space of Finite Policies

    +

    Quoting from the original paper on problem description:

    +
    +

    A partially observable stochastic maze: the agent must go from the starting state marked with an “S” to the goal marked with an “G”. The problem is partially observable because the agent cannot perceive its true location, but only its orientation and the presence or the absence of a wall on each side of the square defining its current state. The problem is stochastic because there is a non-zero probability of slipping, so that the agent does not always know if its last attempt to make a move had any consequence on its actual position in the maze.

    +
    +
    +Figure from the paper +
    +

    Maze POMDP

    +
    +
    +

    Not yet implemented

    +
    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.maze.models.components.html b/docs/html/problems/problems.maze.models.components.html new file mode 100644 index 00000000..e13d0d52 --- /dev/null +++ b/docs/html/problems/problems.maze.models.components.html @@ -0,0 +1,184 @@ + + + + + + + + problems.maze.models.components package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.maze.models.components package

    +
    +

    Submodules

    +
    +
    +

    problems.maze.models.components.map module

    +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.maze.models.html b/docs/html/problems/problems.maze.models.html new file mode 100644 index 00000000..a55b9698 --- /dev/null +++ b/docs/html/problems/problems.maze.models.html @@ -0,0 +1,188 @@ + + + + + + + + problems.maze.models package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.maze.models package

    +
    +

    Subpackages

    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.multi_object_search.agent.html b/docs/html/problems/problems.multi_object_search.agent.html new file mode 100644 index 00000000..00c2653f --- /dev/null +++ b/docs/html/problems/problems.multi_object_search.agent.html @@ -0,0 +1,265 @@ + + + + + + + + problems.multi_object_search.agent package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.multi_object_search.agent package

    +
    +

    Submodules

    +
    +
    +

    problems.multi_object_search.agent.agent module

    +
    +
    +class problems.multi_object_search.agent.agent.MosAgent(robot_id, init_robot_state, object_ids, dim, sensor, sigma=0.01, epsilon=1, belief_rep='histogram', prior={}, num_particles=100, grid_map=None)[source]
    +

    Bases: Agent

    +

    One agent is one robot.

    +
    +
    +clear_history()[source]
    +

    Custum function; clear history

    +
    + +
    + +
    +
    +

    problems.multi_object_search.agent.belief module

    +
    +
    +class problems.multi_object_search.agent.belief.MosOOBelief(robot_id, object_beliefs)[source]
    +

    Bases: OOBelief

    +

    This is needed to make sure the belief is sampling the right +type of State for this problem.

    +
    +
    +mpe(self, return_oostate=False, **kwargs)[source]
    +

    Returns most likely state.

    +
    + +
    +
    +random(self, return_oostate=False, **kwargs)[source]
    +

    Returns a random state

    +
    + +
    + +
    +
    +problems.multi_object_search.agent.belief.initialize_belief(dim, robot_id, object_ids, prior={}, representation='histogram', robot_orientations={}, num_particles=100)[source]
    +

    Returns a GenerativeDistribution that is the belief representation for +the multi-object search problem.

    +
    +
    Parameters:
    +
      +
    • dim (tuple) – a tuple (width, length) of the search space gridworld.

    • +
    • robot_id (int) – robot id that this belief is initialized for.

    • +
    • object_ids (dict) – a set of object ids that we want to model the belief distribution +over; They are assumed to be the target objects, not obstacles, +because the robot doesn’t really care about obstacle locations and +modeling them just adds computation cost.

    • +
    • prior (dict) – A mapping {(objid|robot_id) -> {(x,y) -> [0,1]}}. If used, then +all locations not included in the prior will be treated to have 0 probability. +If unspecified for an object, then the belief over that object is assumed +to be a uniform distribution.

    • +
    • robot_orientations (dict) – Mapping from robot id to their initial orientation (radian). +Assumed to be 0 if robot id not in this dictionary.

    • +
    • num_particles (int) – Maximum number of particles used to represent the belief

    • +
    +
    +
    Returns:
    +

    the initial belief representation.

    +
    +
    Return type:
    +

    GenerativeDistribution

    +
    +
    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.multi_object_search.domain.html b/docs/html/problems/problems.multi_object_search.domain.html new file mode 100644 index 00000000..8ba83391 --- /dev/null +++ b/docs/html/problems/problems.multi_object_search.domain.html @@ -0,0 +1,485 @@ + + + + + + + + problems.multi_object_search.domain package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.multi_object_search.domain package

    +
    +

    Submodules

    +
    +
    +

    problems.multi_object_search.domain.action module

    +

    Defines the Action for the 2D Multi-Object Search domain;

    +

    Action space:

    +
    +

    Motion \(\cup\) Look \(\cup\) Find

    +
    +
      +
    • Motion Actions scheme 1: South, East, West, North.

    • +
    • Motion Actions scheme 2: Left 45deg, Right 45deg, Forward

    • +
    • Look: Interprets sensor input as observation

    • +
    • Find: Marks objects observed in the last Look action as +(differs from original paper; reduces action space)

    • +
    +

    It is possible to force “Look” after every N/S/E/W action; +then the Look action could be dropped. This is optional behavior.

    +
    +
    +class problems.multi_object_search.domain.action.Action(name)[source]
    +

    Bases: Action

    +

    Mos action; Simple named action.

    +
    + +
    +
    +class problems.multi_object_search.domain.action.MotionAction(motion, scheme='xy', distance_cost=1, motion_name=None)[source]
    +

    Bases: Action

    +
    +
    +SCHEME_XYTH = 'xyth'
    +
    + +
    +
    +EAST = (1, 0, 0)
    +
    + +
    +
    +WEST = (-1, 0, 3.141592653589793)
    +
    + +
    +
    +NORTH = (0, -1, 4.71238898038469)
    +
    + +
    +
    +SOUTH = (0, 1, 1.5707963267948966)
    +
    + +
    +
    +SCHEME_VW = 'vw'
    +
    + +
    +
    +FORWARD = (1, 0)
    +
    + +
    +
    +BACKWARD = (-1, 0)
    +
    + +
    +
    +LEFT = (0, -0.7853981633974483)
    +
    + +
    +
    +RIGHT = (0, 0.7853981633974483)
    +
    + +
    +
    +SCHEME_XY = 'xy'
    +
    + +
    +
    +EAST2D = (1, 0)
    +
    + +
    +
    +WEST2D = (-1, 0)
    +
    + +
    +
    +NORTH2D = (0, -1)
    +
    + +
    +
    +SOUTH2D = (0, 1)
    +
    + +
    +
    +SCHEMES = {'vw', 'xy', 'xyth'}
    +
    + +
    + +
    +
    +class problems.multi_object_search.domain.action.LookAction[source]
    +

    Bases: Action

    +
    + +
    +
    +class problems.multi_object_search.domain.action.FindAction[source]
    +

    Bases: Action

    +
    + +
    +
    +

    problems.multi_object_search.domain.observation module

    +

    Defines the Observation for the 2D Multi-Object Search domain;

    +

    Origin: Multi-Object Search using Object-Oriented POMDPs (ICRA 2019) +(extensions: action space changes, different sensor model, gridworld instead of topological graph)

    +

    Observation:

    +
    +

    {objid : pose(x,y) or NULL}. +The sensor model could vary; +it could be a fan-shaped model as the original paper, or +it could be something else. But the resulting observation +should be a map from object id to observed pose or NULL (not observed).

    +
    +
    +
    +class problems.multi_object_search.domain.observation.ObjectObservation(objid, pose)[source]
    +

    Bases: Observation

    +

    The xy pose of the object is observed; or NULL if not observed

    +
    +
    +NULL = None
    +
    + +
    + +
    +
    +class problems.multi_object_search.domain.observation.MosOOObservation(objposes)[source]
    +

    Bases: OOObservation

    +

    Observation for Mos that can be factored by objects; +thus this is an OOObservation.

    +
    +
    +for_obj(objid)[source]
    +
    + +
    +
    +factor(next_state, *params, **kwargs)[source]
    +

    Factor this OO-observation by objects

    +
    + +
    +
    +classmethod merge(object_observations, next_state, *params, **kwargs)[source]
    +

    Merge object_observations into a single OOObservation object;

    +

    object_observation (dict): Maps from objid to ObjectObservation

    +
    + +
    + +
    +
    +

    problems.multi_object_search.domain.state module

    +

    Defines the State for the 2D Multi-Object Search domain;

    +

    Origin: Multi-Object Search using Object-Oriented POMDPs (ICRA 2019) +(extensions: action space changes, different sensor model, gridworld instead of +topological graph)

    +

    Description: Multi-Object Search in a 2D grid world.

    +

    State space:

    +
    +

    \(S_1 \times S_2 \times ... S_n \times S_r\) +where \(S_i (1\leq i\leq n)\) is the object state, with attribute +“pose” \((x,y)\) and Sr is the state of the robot, with attribute +“pose” \((x,y)\) and “objects_found” (set).

    +
    +
    +
    +class problems.multi_object_search.domain.state.ObjectState(objid, objclass, pose)[source]
    +

    Bases: ObjectState

    +
    +
    +property pose
    +
    + +
    +
    +property objid
    +
    + +
    + +
    +
    +class problems.multi_object_search.domain.state.RobotState(robot_id, pose, objects_found, camera_direction)[source]
    +

    Bases: ObjectState

    +
    +
    +property pose
    +
    + +
    +
    +property robot_pose
    +
    + +
    +
    +property objects_found
    +
    + +
    + +
    +
    +class problems.multi_object_search.domain.state.MosOOState(object_states)[source]
    +

    Bases: OOState

    +
    +
    +object_pose(objid)[source]
    +
    + +
    +
    +pose(objid)[source]
    +
    + +
    +
    +property object_poses
    +
    + +
    + +
    +
    +

    Module contents

    +

    Defines state, action and observation

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.multi_object_search.env.html b/docs/html/problems/problems.multi_object_search.env.html new file mode 100644 index 00000000..7220e3a6 --- /dev/null +++ b/docs/html/problems/problems.multi_object_search.env.html @@ -0,0 +1,460 @@ + + + + + + + + problems.multi_object_search.env package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.multi_object_search.env package

    +
    +

    Submodules

    +
    +
    +

    problems.multi_object_search.env.env module

    +

    The Environment

    +
    +
    +class problems.multi_object_search.env.env.MosEnvironment(dim, init_state, sensors, obstacles={})[source]
    +

    Bases: Environment

    +
    +
    +property robot_ids
    +
    + +
    +
    +state_transition(self, action, execute=True, **kwargs)[source]
    +

    Overriding parent class function. +Simulates a state transition given action. If execute is set to True, +then the resulting state will be the new current state of the environment.

    +
    +
    Parameters:
    +
      +
    • action (Action) – action that triggers the state transition

    • +
    • execute (bool) – If True, the resulting state of the transition will +become the current state.

    • +
    +
    +
    Returns:
    +

    reward as a result of action and state +transition, if execute is True (next_state, reward) if execute +is False.

    +
    +
    Return type:
    +

    float or tuple

    +
    +
    +
    + +
    + +
    +
    +problems.multi_object_search.env.env.interpret(worldstr)[source]
    +

    Interprets a problem instance description in worldstr +and returns the corresponding MosEnvironment.

    +

    For example: This string

    +
    rx...
    +.x.xT
    +.....
    +***
    +r: laser fov=90 min_range=1 max_range=10
    +
    +
    +

    describes a 3 by 5 world where x indicates obsticles and T indicates +the “target object”. T could be replaced by any upper-case letter A-Z +which will serve as the object’s id. Lower-case letters a-z (except for x) +serve as id for robot(s).

    +

    After the world, the *** signals description of the sensor for each robot. +For example “r laser 90 1 10” means that robot r will have a Laser2Dsensor +with fov 90, min_range 1.0, and max_range of 10.0.

    +
    +
    Parameters:
    +

    worldstr (str) – a string that describes the initial state of the world.

    +
    +
    Returns:
    +

    the corresponding environment for the world description.

    +
    +
    Return type:
    +

    MosEnvironment

    +
    +
    +
    + +
    +
    +problems.multi_object_search.env.env.interpret_robot_id(robot_name)[source]
    +
    + +
    +
    +problems.multi_object_search.env.env.equip_sensors(worldmap, sensors)[source]
    +
    +
    Parameters:
    +
      +
    • worldmap (str) – a string that describes the initial state of the world.

    • +
    • sensors (dict) a map from robot character representation (e.g. 'r') –

    • +
    +
    +
    +

    string that describes its sensor (e.g. ‘laser fov=90 min_range=1 max_range=5 +angle_increment=5’)

    +
    +
    Returns:
    +

    A string that can be used as input to the interpret function

    +
    +
    Return type:
    +

    str

    +
    +
    +
    + +
    +
    +problems.multi_object_search.env.env.make_laser_sensor(fov, dist_range, angle_increment, occlusion)[source]
    +

    Returns string representation of the laser scanner configuration. +For example: “laser fov=90 min_range=1 max_range=10”

    +
    +
    Parameters:
    +
      +
    • fov (int or float) – angle between the start and end beams of one scan (degree).

    • +
    • dist_range (tuple) – (min_range, max_range)

    • +
    • angle_increment (int or float) – angular distance between measurements (rad).

    • +
    • occlusion (bool) – True if consider occlusion

    • +
    +
    +
    Returns:
    +

    String representation of the laser scanner configuration.

    +
    +
    Return type:
    +

    str

    +
    +
    +
    + +
    +
    +problems.multi_object_search.env.env.make_proximity_sensor(radius, occlusion)[source]
    +

    Returns string representation of the proximity sensor configuration. +For example: “proximity radius=5 occlusion_enabled=False”

    +
    +
    Parameters:
    +
      +
    • radius (int or float) –

    • +
    • occlusion (bool) – True if consider occlusion

    • +
    +
    +
    Returns:
    +

    String representation of the proximity sensor configuration.

    +
    +
    Return type:
    +

    str

    +
    +
    +
    + +
    +
    +

    problems.multi_object_search.env.visual module

    +
    +
    +problems.multi_object_search.env.visual.object_color(objid, count)[source]
    +
    + +
    +
    +class problems.multi_object_search.env.visual.MosViz(env, res=30, fps=30, controllable=False)[source]
    +

    Bases: object

    +
    +
    +property img_width
    +
    + +
    +
    +property img_height
    +
    + +
    +
    +property last_observation
    +
    + +
    +
    +update(robot_id, action, observation, viz_observation, belief)[source]
    +

    Update the visualization after there is new real action and observation +and updated belief.

    +
    +
    Parameters:
    +
    +
    +
    +
    + +
    +
    +static draw_robot(img, x, y, th, size, color=(255, 12, 12))[source]
    +
    + +
    +
    +static draw_observation(img, z, rx, ry, rth, r, size, color=(12, 12, 255))[source]
    +
    + +
    +
    +static draw_belief(img, belief, r, size, target_colors)[source]
    +

    belief (OOBelief)

    +
    + +
    +
    +on_init()[source]
    +

    pygame init

    +
    + +
    +
    +on_event(event)[source]
    +
    + +
    +
    +on_loop()[source]
    +
    + +
    +
    +on_render()[source]
    +
    + +
    +
    +on_cleanup()[source]
    +
    + +
    +
    +on_execute()[source]
    +
    + +
    +
    +render_env(display_surf)[source]
    +
    + +
    + +
    +
    +problems.multi_object_search.env.visual.unittest()[source]
    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.multi_object_search.html b/docs/html/problems/problems.multi_object_search.html new file mode 100644 index 00000000..349da32b --- /dev/null +++ b/docs/html/problems/problems.multi_object_search.html @@ -0,0 +1,450 @@ + + + + + + + + problems.multi_object_search package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.multi_object_search package

    +
    +

    Subpackages

    +
    + +
    +
    +
    +

    Submodules

    +
    +
    +

    problems.multi_object_search.example_worlds module

    +

    This file has some examples of world string.

    +
    +
    +problems.multi_object_search.example_worlds.random_world(width, length, num_obj, num_obstacles, robot_char='r')[source]
    +
    + +
    +
    +

    problems.multi_object_search.problem module

    +

    2D Multi-Object Search (MOS) Task. +Uses the domain, models, and agent/environment +to actually define the POMDP problem for multi-object search. +Then, solve it using POUCT or POMCP.

    +
    +
    +class problems.multi_object_search.problem.MosOOPOMDP(robot_id, env=None, grid_map=None, sensors=None, sigma=0.01, epsilon=1, belief_rep='histogram', prior={}, num_particles=100, agent_has_map=False)[source]
    +

    Bases: OOPOMDP

    +

    A MosOOPOMDP is instantiated given a string description +of the search world, sensor descriptions for robots, +and the necessary parameters for the agent’s models.

    +

    Note: This is of course a simulation, where you can +generate a world and know where the target objects are +and then construct the Environment object. But in the +real robot scenario, you don’t know where the objects +are. In that case, as I have done it in the past, you +could construct an Environment object and give None to +the object poses.

    +
    + +
    +
    +problems.multi_object_search.problem.belief_update(agent, real_action, real_observation, next_robot_state, planner)[source]
    +

    Updates the agent’s belief; The belief update may happen +through planner update (e.g. when planner is POMCP).

    +
    + +
    +
    +problems.multi_object_search.problem.solve(problem, max_depth=10, discount_factor=0.99, planning_time=1.0, exploration_const=1000, visualize=True, max_time=120, max_steps=500)[source]
    +

    This function terminates when: +- maximum time (max_time) reached; This time includes planning and updates +- agent has planned max_steps number of steps +- agent has taken n FindAction(s) where n = number of target objects.

    +
    +
    Parameters:
    +

    visualize (bool) –

    +
    +
    +
    + +
    +
    +problems.multi_object_search.problem.unittest()[source]
    +
    + +
    + +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.multi_object_search.models.components.html b/docs/html/problems/problems.multi_object_search.models.components.html new file mode 100644 index 00000000..9b53f50b --- /dev/null +++ b/docs/html/problems/problems.multi_object_search.models.components.html @@ -0,0 +1,349 @@ + + + + + + + + problems.multi_object_search.models.components package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.multi_object_search.models.components package

    +
    +

    Submodules

    +
    +
    +

    problems.multi_object_search.models.components.grid_map module

    +

    Optional grid map to assist collision avoidance during planning.

    +
    +
    +class problems.multi_object_search.models.components.grid_map.GridMap(width, length, obstacles)[source]
    +

    Bases: object

    +

    This map assists the agent to avoid planning invalid +actions that will run into obstacles. Used if we assume +the agent has a map. This map does not contain information +about the object locations.

    +
    +
    +valid_motions(robot_id, robot_pose, all_motion_actions)[source]
    +

    Returns a set of MotionAction(s) that are valid to +be executed from robot pose (i.e. they will not bump +into obstacles). The validity is determined under +the assumption that the robot dynamics is deterministic.

    +
    + +
    + +
    +
    +

    problems.multi_object_search.models.components.sensor module

    +

    Sensor model (for example, laser scanner)

    +
    +
    +problems.multi_object_search.models.components.sensor.euclidean_dist(p1, p2)[source]
    +
    + +
    +
    +problems.multi_object_search.models.components.sensor.to_rad(deg)[source]
    +
    + +
    +
    +problems.multi_object_search.models.components.sensor.in_range(val, rang)[source]
    +
    + +
    +
    +class problems.multi_object_search.models.components.sensor.Sensor[source]
    +

    Bases: object

    +
    +
    +LASER = 'laser'
    +
    + +
    +
    +PROXIMITY = 'proximity'
    +
    + +
    +
    +observe(robot_pose, env_state)[source]
    +

    Returns an Observation with this sensor model.

    +
    + +
    +
    +within_range(robot_pose, point)[source]
    +

    Returns true if the point is within range of the sensor; but the point might not +actually be visible due to occlusion or “gap” between beams

    +
    + +
    +
    +property sensing_region_size
    +
    + +
    +
    +property robot_id
    +
    + +
    + +
    +
    +class problems.multi_object_search.models.components.sensor.Laser2DSensor(robot_id, fov=90, min_range=1, max_range=5, angle_increment=5, occlusion_enabled=False)[source]
    +

    Bases: object

    +

    Fan shaped 2D laser sensor

    +
    +
    +in_field_of_view(view_angles)[source]
    +

    Determines if the beame at angle th is in a field of view of size view_angles. +For example, the view_angles=180, means the range scanner scans 180 degrees +in front of the robot. By our angle convention, 180 degrees maps to [0,90] and [270, 360].

    +
    + +
    +
    +within_range(robot_pose, point)[source]
    +

    Returns true if the point is within range of the sensor; but the point might not +actually be visible due to occlusion or “gap” between beams

    +
    + +
    +
    +shoot_beam(robot_pose, point)[source]
    +

    Shoots a beam from robot_pose at point. Returns the distance and bearing +of the beame (i.e. the length and orientation of the beame)

    +
    + +
    +
    +valid_beam(dist, bearing)[source]
    +

    Returns true beam length (i.e. dist) is within range and its angle +bearing is valid, that is, it is within the fov range and in +accordance with the angle increment.

    +
    + +
    +
    +observe(robot_pose, env_state)[source]
    +

    Returns a MosObservation with this sensor model.

    +
    + +
    +
    +property sensing_region_size
    +
    + +
    + +
    +
    +class problems.multi_object_search.models.components.sensor.ProximitySensor(robot_id, radius=5, occlusion_enabled=False)[source]
    +

    Bases: Laser2DSensor

    +

    This is a simple sensor; Observes a region centered +at the robot.

    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.multi_object_search.models.html b/docs/html/problems/problems.multi_object_search.models.html new file mode 100644 index 00000000..c4988545 --- /dev/null +++ b/docs/html/problems/problems.multi_object_search.models.html @@ -0,0 +1,621 @@ + + + + + + + + problems.multi_object_search.models package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.multi_object_search.models package

    +
    +

    Subpackages

    + +
    +
    +

    Submodules

    +
    +
    +

    problems.multi_object_search.models.observation_model module

    +

    Defines the ObservationModel for the 2D Multi-Object Search domain.

    +

    Origin: Multi-Object Search using Object-Oriented POMDPs (ICRA 2019) +(extensions: action space changes, different sensor model, gridworld instead of +topological graph)

    +
    +
    Observation: {objidpose(x,y) or NULL}. The sensor model could vary;

    it could be a fan-shaped model as the original paper, or +it could be something else. But the resulting observation +should be a map from object id to observed pose or NULL (not observed).

    +
    +
    +

    Observation Model

    +
    +

    The agent can observe its own state, as well as object poses +that are within its sensor range. We only need to model object +observation.

    +
    +
    +
    +class problems.multi_object_search.models.observation_model.MosObservationModel(dim, sensor, object_ids, sigma=0.01, epsilon=1)[source]
    +

    Bases: OOObservationModel

    +

    Object-oriented transition model

    +
    +
    +sample(self, next_state, action, argmax=False, **kwargs)[source]
    +

    Returns random observation

    +
    + +
    + +
    +
    +class problems.multi_object_search.models.observation_model.ObjectObservationModel(objid, sensor, dim, sigma=0, epsilon=1)[source]
    +

    Bases: ObservationModel

    +
    +
    +probability(observation, next_state, action, **kwargs)[source]
    +

    Returns the probability of Pr (observation | next_state, action).

    +
    +
    Parameters:
    +
    +
    +
    +
    + +
    +
    +sample(next_state, action, **kwargs)[source]
    +

    Returns observation

    +
    + +
    +
    +argmax(self, next_state, action)[source]
    +

    Returns the most likely observation

    +
    + +
    + +
    +
    +problems.multi_object_search.models.observation_model.unittest()[source]
    +
    + +
    +
    +

    problems.multi_object_search.models.policy_model module

    +

    Policy model for 2D Multi-Object Search domain. +It is optional for the agent to be equipped with an occupancy +grid map of the environment.

    +
    +
    +class problems.multi_object_search.models.policy_model.PolicyModel(robot_id, grid_map=None)[source]
    +

    Bases: RolloutPolicy

    +

    Simple policy model. All actions are possible at any state.

    +
    +
    +sample(self, state)[source]
    +

    Returns action randomly sampled according to the +distribution of this policy model.

    +
    +
    Parameters:
    +

    state (State) – the next state \(s\)

    +
    +
    Returns:
    +

    the action \(a\)

    +
    +
    Return type:
    +

    Action

    +
    +
    +
    + +
    +
    +probability(self, action, state)[source]
    +

    Returns the probability of \(\pi(a|s)\).

    +
    +
    Parameters:
    +
      +
    • action (Action) – the action \(a\)

    • +
    • state (State) – the state \(s\)

    • +
    +
    +
    Returns:
    +

    the probability \(\pi(a|s)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +argmax(state, **kwargs)[source]
    +

    Returns the most likely action

    +
    + +
    +
    +get_all_actions(state=None, history=None)[source]
    +

    note: find can only happen after look.

    +
    + +
    +
    +rollout(self, State state, tuple history=None)[source]
    +
    + +
    + +
    +
    +

    problems.multi_object_search.models.reward_model module

    +

    Reward model for 2D Multi-object Search domain

    +
    +
    +class problems.multi_object_search.models.reward_model.MosRewardModel(target_objects, big=1000, small=1, robot_id=None)[source]
    +

    Bases: RewardModel

    +
    +
    +probability(self, reward, state, action, next_state)[source]
    +

    Returns the probability of \(\Pr(r|s,a,s')\).

    +
    +
    Parameters:
    +
      +
    • reward (float) – the reward \(r\)

    • +
    • state (State) – the state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(r|s,a,s')\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, state, action, next_state)[source]
    +

    Returns reward randomly sampled according to the +distribution of this reward model. This is required, +i.e. assumed to be implemented for a reward model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the reward \(r\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +argmax(state, action, next_state, normalized=False, robot_id=None)[source]
    +

    Returns the most likely reward

    +
    + +
    + +
    +
    +class problems.multi_object_search.models.reward_model.GoalRewardModel(target_objects, big=1000, small=1, robot_id=None)[source]
    +

    Bases: MosRewardModel

    +

    This is a reward where the agent gets reward only for detect-related actions.

    +
    + +
    +
    +

    problems.multi_object_search.models.transition_model module

    +

    Defines the TransitionModel for the 2D Multi-Object Search domain.

    +

    Origin: Multi-Object Search using Object-Oriented POMDPs (ICRA 2019) +(extensions: action space changes, different sensor model, gridworld instead of +topological graph)

    +

    Description: Multi-Object Search in a 2D grid world.

    +

    Transition: deterministic

    +
    +
    +class problems.multi_object_search.models.transition_model.MosTransitionModel(dim, sensors, object_ids, epsilon=1e-09)[source]
    +

    Bases: OOTransitionModel

    +

    Object-oriented transition model; The transition model supports the +multi-robot case, where each robot is equipped with a sensor; The +multi-robot transition model should be used by the Environment, but +not necessarily by each robot for planning.

    +
    +
    +sample(self, state, action, argmax=False, **kwargs)[source]
    +

    Returns random next_state

    +
    + +
    +
    +argmax(self, state, action, **kwargs)[source]
    +

    Returns the most likely next state

    +
    + +
    + +
    +
    +class problems.multi_object_search.models.transition_model.StaticObjectTransitionModel(objid, epsilon=1e-09)[source]
    +

    Bases: TransitionModel

    +

    This model assumes the object is static.

    +
    +
    +probability(self, next_state, state, action)[source]
    +

    Returns the probability of \(\Pr(s'|s,a)\).

    +
    +
    Parameters:
    +
      +
    • state (State) – the state \(s\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(s'|s,a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(state, action)[source]
    +

    Returns next_object_state

    +
    + +
    +
    +argmax(state, action)[source]
    +

    Returns the most likely next object_state

    +
    + +
    + +
    +
    +class problems.multi_object_search.models.transition_model.RobotTransitionModel(sensor, dim, epsilon=1e-09)[source]
    +

    Bases: TransitionModel

    +

    We assume that the robot control is perfect and transitions are deterministic.

    +
    +
    +classmethod if_move_by(robot_id, state, action, dim, check_collision=True)[source]
    +

    Defines the dynamics of robot motion; +dim (tuple): the width, length of the search world.

    +
    + +
    +
    +probability(self, next_state, state, action)[source]
    +

    Returns the probability of \(\Pr(s'|s,a)\).

    +
    +
    Parameters:
    +
      +
    • state (State) – the state \(s\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(s'|s,a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +argmax(state, action)[source]
    +

    Returns the most likely next robot_state

    +
    + +
    +
    +sample(state, action)[source]
    +

    Returns next_robot_state

    +
    + +
    + +
    +
    +problems.multi_object_search.models.transition_model.valid_pose(pose, width, length, state=None, check_collision=True, pose_objid=None)[source]
    +

    Returns True if the given pose (x,y) is a valid pose; +If check_collision is True, then the pose is only valid +if it is not overlapping with any object pose in the environment state.

    +
    + +
    +
    +problems.multi_object_search.models.transition_model.in_boundary(pose, width, length)[source]
    +
    + +
    +
    +

    Module contents

    +

    Defines models, including transition, observation, reward, policy; Also +includes additional components such as the sensor model and grid map.

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.rocksample.cythonize.html b/docs/html/problems/problems.rocksample.cythonize.html new file mode 100644 index 00000000..6f1d0e0a --- /dev/null +++ b/docs/html/problems/problems.rocksample.cythonize.html @@ -0,0 +1,249 @@ + + + + + + + + problems.rocksample.cythonize package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.rocksample.cythonize package

    +
    +

    Submodules

    +
    +
    +

    problems.rocksample.cythonize.rocksample_problem module

    +

    RockSample(n,k) problem

    +

    Origin: Heuristic Search Value Iteration for POMDPs (UAI 2004)

    +

    Description:

    +

    State space:

    +
    +

    Position {(1,1),(1,2),…(n,n)} +\(\times\) RockType_1 \(\times\) RockType_2, …, \(\times\) RockType_k +where RockType_i = {Good, Bad} +\(\times\) TerminalState

    +
    +
    (basically, the positions of rocks are known to the robot,

    but not represented explicitly in the state space. Check_i +will smartly check the rock i at its location.)

    +
    +
    +
    +

    Action space:

    +
    +

    North, South, East, West, Sample, Check_1, …, Check_k +The first four moves the agent deterministically +Sample: samples the rock at agent’s current location +Check_i: receives a noisy observation about RockType_i +(noise determined by eta (\(\eta\)). eta=1 -> perfect sensor; eta=0 -> uniform)

    +
    +

    Observation: observes the property of rock i when taking Check_i.

    +
    +
    Reward: +10 for Sample a good rock. -10 for Sampling a bad rock.

    Move to exit area +10. Other actions have no cost or reward.

    +
    +
    +

    Initial belief: every rock has equal probability of being Good or Bad.

    +
    +
    +

    problems.rocksample.cythonize.rocksample_problem module

    +

    RockSample(n,k) problem

    +

    Origin: Heuristic Search Value Iteration for POMDPs (UAI 2004)

    +

    Description:

    +

    State space:

    +
    +

    Position {(1,1),(1,2),…(n,n)} +\(\times\) RockType_1 \(\times\) RockType_2, …, \(\times\) RockType_k +where RockType_i = {Good, Bad} +\(\times\) TerminalState

    +
    +
    (basically, the positions of rocks are known to the robot,

    but not represented explicitly in the state space. Check_i +will smartly check the rock i at its location.)

    +
    +
    +
    +

    Action space:

    +
    +

    North, South, East, West, Sample, Check_1, …, Check_k +The first four moves the agent deterministically +Sample: samples the rock at agent’s current location +Check_i: receives a noisy observation about RockType_i +(noise determined by eta (\(\eta\)). eta=1 -> perfect sensor; eta=0 -> uniform)

    +
    +

    Observation: observes the property of rock i when taking Check_i.

    +
    +
    Reward: +10 for Sample a good rock. -10 for Sampling a bad rock.

    Move to exit area +10. Other actions have no cost or reward.

    +
    +
    +

    Initial belief: every rock has equal probability of being Good or Bad.

    +
    +
    +

    problems.rocksample.cythonize.run_rocksample module

    +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.rocksample.html b/docs/html/problems/problems.rocksample.html new file mode 100644 index 00000000..7a4bcdec --- /dev/null +++ b/docs/html/problems/problems.rocksample.html @@ -0,0 +1,657 @@ + + + + + + + + problems.rocksample package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.rocksample package

    +
    +

    Subpackages

    + +
    +
    +

    Submodules

    +
    +
    +

    problems.rocksample.rocksample_problem module

    +

    RockSample(n,k) problem

    +

    Origin: Heuristic Search Value Iteration for POMDPs (UAI 2004)

    +

    Description:

    +

    State space:

    +
    +

    Position {(1,1),(1,2),…(n,n)} +\(\times\) RockType_1 \(\times\) RockType_2, …, \(\times\) RockType_k +where RockType_i = {Good, Bad} +\(\times\) TerminalState

    +
    +
    (basically, the positions of rocks are known to the robot,

    but not represented explicitly in the state space. Check_i +will smartly check the rock i at its location.)

    +
    +
    +
    +

    Action space:

    +
    +

    North, South, East, West, Sample, Check_1, …, Check_k +The first four moves the agent deterministically +Sample: samples the rock at agent’s current location +Check_i: receives a noisy observation about RockType_i +(noise determined by eta (\(\eta\)). eta=1 -> perfect sensor; eta=0 -> uniform)

    +
    +
    +
    Observation: observes the property of rock i when taking Check_i. The

    observation may be noisy, depending on an efficiency parameter which +decreases exponentially as the distance increases between the rover and +rock i. ‘half_efficiency_dist’ influences this parameter (larger, more robust)

    +
    +
    Reward: +10 for Sample a good rock. -10 for Sampling a bad rock.

    Move to exit area +10. Other actions have no cost or reward.

    +
    +
    +

    Initial belief: every rock has equal probability of being Good or Bad.

    +
    +
    +problems.rocksample.rocksample_problem.euclidean_dist(p1, p2)[source]
    +
    + +
    +
    +class problems.rocksample.rocksample_problem.RockType[source]
    +

    Bases: object

    +
    +
    +GOOD = 'good'
    +
    + +
    +
    +BAD = 'bad'
    +
    + +
    +
    +static invert(rocktype)[source]
    +
    + +
    +
    +static random(p=0.5)[source]
    +
    + +
    + +
    +
    +class problems.rocksample.rocksample_problem.State(position, rocktypes, terminal=False)[source]
    +

    Bases: State

    +
    + +
    +
    +class problems.rocksample.rocksample_problem.Action(name)[source]
    +

    Bases: Action

    +
    + +
    +
    +class problems.rocksample.rocksample_problem.MoveAction(motion, name)[source]
    +

    Bases: Action

    +
    +
    +EAST = (1, 0)
    +
    + +
    +
    +WEST = (-1, 0)
    +
    + +
    +
    +NORTH = (0, -1)
    +
    + +
    +
    +SOUTH = (0, 1)
    +
    + +
    + +
    +
    +class problems.rocksample.rocksample_problem.SampleAction[source]
    +

    Bases: Action

    +
    + +
    +
    +class problems.rocksample.rocksample_problem.CheckAction(rock_id)[source]
    +

    Bases: Action

    +
    + +
    +
    +class problems.rocksample.rocksample_problem.Observation(quality)[source]
    +

    Bases: Observation

    +
    + +
    +
    +class problems.rocksample.rocksample_problem.RSTransitionModel(n, rock_locs, in_exit_area)[source]
    +

    Bases: TransitionModel

    +

    The model is deterministic

    +
    +
    +probability(self, next_state, state, action)[source]
    +

    Returns the probability of \(\Pr(s'|s,a)\).

    +
    +
    Parameters:
    +
      +
    • state (State) – the state \(s\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(s'|s,a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, state, action)[source]
    +

    Returns next state randomly sampled according to the +distribution of this transition model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the next state \(s'\)

    +
    +
    Return type:
    +

    State

    +
    +
    +
    + +
    +
    +argmax(state, action)[source]
    +

    Returns the most likely next state

    +
    + +
    + +
    +
    +class problems.rocksample.rocksample_problem.RSObservationModel(rock_locs, half_efficiency_dist=20)[source]
    +

    Bases: ObservationModel

    +
    +
    +probability(self, observation, next_state, action)[source]
    +

    Returns the probability of \(\Pr(o|s',a)\).

    +
    +
    Parameters:
    +
      +
    • observation (Observation) – the observation \(o\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(o|s',a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, next_state, action)[source]
    +

    Returns observation randomly sampled according to the +distribution of this observation model.

    +
    +
    Parameters:
    +
      +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the observation \(o\)

    +
    +
    Return type:
    +

    Observation

    +
    +
    +
    + +
    +
    +argmax(next_state, action)[source]
    +

    Returns the most likely observation

    +
    + +
    + +
    +
    +class problems.rocksample.rocksample_problem.RSRewardModel(rock_locs, in_exit_area)[source]
    +

    Bases: RewardModel

    +
    +
    +sample(self, state, action, next_state)[source]
    +

    Returns reward randomly sampled according to the +distribution of this reward model. This is required, +i.e. assumed to be implemented for a reward model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the reward \(r\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +argmax(self, state, action, next_state)[source]
    +

    Returns the most likely reward. This is optional.

    +
    + +
    +
    +probability(self, reward, state, action, next_state)[source]
    +

    Returns the probability of \(\Pr(r|s,a,s')\).

    +
    +
    Parameters:
    +
      +
    • reward (float) – the reward \(r\)

    • +
    • state (State) – the state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(r|s,a,s')\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    + +
    +
    +class problems.rocksample.rocksample_problem.RSPolicyModel(n, k)[source]
    +

    Bases: RolloutPolicy

    +

    Simple policy model according to problem description.

    +
    +
    +sample(self, state)[source]
    +

    Returns action randomly sampled according to the +distribution of this policy model.

    +
    +
    Parameters:
    +

    state (State) – the next state \(s\)

    +
    +
    Returns:
    +

    the action \(a\)

    +
    +
    Return type:
    +

    Action

    +
    +
    +
    + +
    +
    +probability(self, action, state)[source]
    +

    Returns the probability of \(\pi(a|s)\).

    +
    +
    Parameters:
    +
      +
    • action (Action) – the action \(a\)

    • +
    • state (State) – the state \(s\)

    • +
    +
    +
    Returns:
    +

    the probability \(\pi(a|s)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +argmax(state, normalized=False, **kwargs)[source]
    +

    Returns the most likely reward

    +
    + +
    +
    +get_all_actions(self, *args)[source]
    +

    Returns a set of all possible actions, if feasible.

    +
    + +
    +
    +rollout(self, State state, tuple history=None)[source]
    +
    + +
    + +
    +
    +class problems.rocksample.rocksample_problem.RockSampleProblem(n, k, init_state, rock_locs, init_belief, half_efficiency_dist=20)[source]
    +

    Bases: POMDP

    +
    +
    +static random_free_location(n, not_free_locs)[source]
    +

    returns a random (x,y) location in nxn grid that is free.

    +
    + +
    +
    +in_exit_area(pos)[source]
    +
    + +
    +
    +static generate_instance(n, k)[source]
    +

    Returns init_state and rock locations for an instance of RockSample(n,k)

    +
    + +
    +
    +print_state()[source]
    +
    + +
    + +
    +
    +problems.rocksample.rocksample_problem.test_planner(rocksample, planner, nsteps=3, discount=0.95)[source]
    +
    + +
    +
    +problems.rocksample.rocksample_problem.init_particles_belief(k, num_particles, init_state, belief='uniform')[source]
    +
    + +
    +
    +problems.rocksample.rocksample_problem.minimal_instance(**kwargs)[source]
    +
    + +
    +
    +problems.rocksample.rocksample_problem.create_instance(n, k, **kwargs)[source]
    +
    + +
    +
    +problems.rocksample.rocksample_problem.main()[source]
    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.tag.agent.html b/docs/html/problems/problems.tag.agent.html new file mode 100644 index 00000000..cf4b3b05 --- /dev/null +++ b/docs/html/problems/problems.tag.agent.html @@ -0,0 +1,238 @@ + + + + + + + + problems.tag.agent package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.tag.agent package

    +
    +

    Submodules

    +
    +
    +

    problems.tag.agent.agent module

    +
    +
    +problems.tag.agent.agent.initialize_belief(grid_map, init_robot_position, prior={})[source]
    +

    Initialize belief.

    +
    +
    Parameters:
    +
      +
    • grid_map (GridMap) – Holds information of the map occupancy

    • +
    • prior (dict) – A map from (x,y)->[0,1]. If empty, the belief +will be uniform.

    • +
    +
    +
    +
    + +
    +
    +problems.tag.agent.agent.initialize_particles_belief(grid_map, init_robot_position, num_particles=100, prior={})[source]
    +

    Initialize belief.

    +
    +
    Parameters:
    +
      +
    • grid_map (GridMap) – Holds information of the map occupancy

    • +
    • prior (dict) – A map from (x,y)->[0,1]. If empty, the belief +will be uniform.

    • +
    +
    +
    +
    + +
    +
    +problems.tag.agent.agent.belief_update(agent, real_action, real_observation)[source]
    +
    + +
    +
    +class problems.tag.agent.agent.TagAgent(init_belief, grid_map, pr_stay=0.2, small=1, big=10)[source]
    +

    Bases: Agent

    +
    +
    +clear_history()[source]
    +

    Custum function; clear history

    +
    + +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.tag.domain.html b/docs/html/problems/problems.tag.domain.html new file mode 100644 index 00000000..6670d154 --- /dev/null +++ b/docs/html/problems/problems.tag.domain.html @@ -0,0 +1,229 @@ + + + + + + + + problems.tag.domain package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.tag.domain package

    +
    +

    Submodules

    +
    +
    +

    problems.tag.domain.action module

    +

    The Tag problem. Implemented according to the paper Anytime Point-Based +Approximations for Large POMDPs.

    +

    Action space: The agent can take motion action and a tag action.

    +
    +
    +class problems.tag.domain.action.TagAction[source]
    +

    Bases: Action

    +
    + +
    +
    +

    problems.tag.domain.observation module

    +

    The Tag problem. Implemented according to the paper Anytime Point-Based +Approximations for Large POMDPs.

    +
    +
    Observation space: the agent observes the target’s location when the agent and

    the target are in the same cell.

    +
    +
    +
    +
    +class problems.tag.domain.observation.TagObservation(target_position)[source]
    +

    Bases: Observation

    +
    + +
    +
    +

    problems.tag.domain.state module

    +

    The Tag problem. Implemented according to the paper Anytime Point-Based +Approximations for Large POMDPs.

    +

    State space: state of the robot (x,y), state of the person (x,y), person found.

    +
    +
    +class problems.tag.domain.state.TagState(robot_position, target_position, target_found)[source]
    +

    Bases: State

    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.tag.env.html b/docs/html/problems/problems.tag.env.html new file mode 100644 index 00000000..08dcafa9 --- /dev/null +++ b/docs/html/problems/problems.tag.env.html @@ -0,0 +1,327 @@ + + + + + + + + problems.tag.env package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.tag.env package

    +
    +

    Submodules

    +
    +
    +

    problems.tag.env.env module

    +
    +
    +class problems.tag.env.env.TagEnvironment(init_state, grid_map, pr_stay=0.2, small=1, big=10)[source]
    +

    Bases: Environment

    +
    +
    +property width
    +
    + +
    +
    +property length
    +
    + +
    +
    +property grid_map
    +
    + +
    +
    +classmethod from_str(worldstr, **kwargs)[source]
    +
    + +
    + +
    +
    +

    problems.tag.env.visual module

    +

    Largely based on MosViz, except this is not an OO-POMDP

    +
    +
    +class problems.tag.env.visual.TagViz(env, res=30, fps=30, controllable=False, observation_model=None)[source]
    +

    Bases: object

    +
    +
    +property img_width
    +
    + +
    +
    +property img_height
    +
    + +
    +
    +property last_observation
    +
    + +
    +
    +update(action, observation, belief)[source]
    +

    Update the visualization after there is new real action and observation +and updated belief.

    +
    + +
    +
    +static draw_robot(img, x, y, th, size, color=(255, 12, 12))[source]
    +
    + +
    +
    +static draw_observation(img, z, rx, ry, rth, r, size, color=(12, 12, 255))[source]
    +
    + +
    +
    +static draw_belief(img, belief, r, size, target_color)[source]
    +

    belief (OOBelief)

    +
    + +
    +
    +on_init()[source]
    +

    pygame init

    +
    + +
    +
    +on_event(event)[source]
    +
    + +
    +
    +on_loop()[source]
    +
    + +
    +
    +on_render()[source]
    +
    + +
    +
    +on_cleanup()[source]
    +
    + +
    +
    +on_execute()[source]
    +
    + +
    +
    +render_env(display_surf)[source]
    +
    + +
    + +
    +
    +problems.tag.env.visual.unittest()[source]
    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.tag.html b/docs/html/problems/problems.tag.html new file mode 100644 index 00000000..6e83ca07 --- /dev/null +++ b/docs/html/problems/problems.tag.html @@ -0,0 +1,355 @@ + + + + + + + + problems.tag package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.tag package

    +
    +

    Subpackages

    +
    + +
    +
    +
    +

    Submodules

    +
    +
    +

    problems.tag.constants module

    +
    +
    +

    problems.tag.example_worlds module

    +
    +
    +

    problems.tag.experiment module

    +

    Simple experiment to get mean

    +
    +
    +problems.tag.experiment.trial(worldstr, **kwargs)[source]
    +
    + +
    +
    +problems.tag.experiment.main()[source]
    +
    + +
    +
    +

    problems.tag.problem module

    +
    +
    +class problems.tag.problem.TagProblem(init_robot_position, init_target_position, grid_map, pr_stay=0.2, small=1, big=10, prior='uniform', belief_type='hist', num_particles=6)[source]
    +

    Bases: POMDP

    +
    + +
    +
    +problems.tag.problem.solve(problem, planner_type='pouct', max_depth=10, discount_factor=0.99, planning_time=1.0, exploration_const=1000, visualize=True, max_time=120, max_steps=500)[source]
    +
    + +
    +
    +problems.tag.problem.main()[source]
    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.tag.models.components.html b/docs/html/problems/problems.tag.models.components.html new file mode 100644 index 00000000..1e8ba826 --- /dev/null +++ b/docs/html/problems/problems.tag.models.components.html @@ -0,0 +1,253 @@ + + + + + + + + problems.tag.models.components package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.tag.models.components package

    +
    +

    Submodules

    +
    +
    +

    problems.tag.models.components.grid_map module

    +
    +
    +class problems.tag.models.components.grid_map.GridMap(width, length, obstacle_poses)[source]
    +

    Bases: object

    +
    +
    +valid_pose(position)[source]
    +
    + +
    +
    +valid_motions(position, all_motions={Action(move - xy - East2D), Action(move - xy - North2D), Action(move - xy - South2D), Action(move - xy - West2D)})[source]
    +
    + +
    +
    +classmethod from_str(worldstr, **kwargs)[source]
    +
    + +
    +
    +free_cells()[source]
    +
    + +
    + +
    +
    +

    problems.tag.models.components.motion_policy module

    +
    +
    +class problems.tag.models.components.motion_policy.TagTargetMotionPolicy(grid_map, pr_stay=0.2)[source]
    +

    Bases: GenerativeDistribution

    +
    +
    +probability(next_target_position, target_position, robot_position, valid_target_motion_actions)[source]
    +
    + +
    +
    +random(robot_position, target_position, valid_target_motion_actions, mpe=False)[source]
    +
    + +
    +
    +mpe(self)[source]
    +

    Returns the value of the variable that has the highest probability.

    +
    + +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.tag.models.html b/docs/html/problems/problems.tag.models.html new file mode 100644 index 00000000..d54775d3 --- /dev/null +++ b/docs/html/problems/problems.tag.models.html @@ -0,0 +1,454 @@ + + + + + + + + problems.tag.models package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.tag.models package

    +
    +

    Subpackages

    + +
    +
    +

    Submodules

    +
    +
    +

    problems.tag.models.observation_model module

    +
    +
    +class problems.tag.models.observation_model.TagObservationModel[source]
    +

    Bases: ObservationModel

    +

    In this observation model, the robot deterministically +observes the target location when it is in the same grid cell +as the target. Ohterwise the robot does not observe anything.

    +
    +
    +probability(self, observation, next_state, action)[source]
    +

    Returns the probability of \(\Pr(o|s',a)\).

    +
    +
    Parameters:
    +
      +
    • observation (Observation) – the observation \(o\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(o|s',a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(next_state, action)[source]
    +

    There is no stochaisticity in the observation model

    +
    + +
    +
    +argmax(self, next_state, action)[source]
    +

    Returns the most likely observation

    +
    + +
    + +
    +
    +

    problems.tag.models.policy_model module

    +
    +
    +class problems.tag.models.policy_model.TagPolicyModel(grid_map=None)[source]
    +

    Bases: RolloutPolicy

    +
    +
    +sample(self, state)[source]
    +

    Returns action randomly sampled according to the +distribution of this policy model.

    +
    +
    Parameters:
    +

    state (State) – the next state \(s\)

    +
    +
    Returns:
    +

    the action \(a\)

    +
    +
    Return type:
    +

    Action

    +
    +
    +
    + +
    +
    +get_all_actions(self, *args)[source]
    +

    Returns a set of all possible actions, if feasible.

    +
    + +
    +
    +rollout(self, State state, tuple history=None)[source]
    +
    + +
    + +
    +
    +

    problems.tag.models.reward_model module

    +
    +
    +class problems.tag.models.reward_model.TagRewardModel(small=1, big=10)[source]
    +

    Bases: RewardModel

    +
    +
    +probability(self, reward, state, action, next_state)[source]
    +

    Returns the probability of \(\Pr(r|s,a,s')\).

    +
    +
    Parameters:
    +
      +
    • reward (float) – the reward \(r\)

    • +
    • state (State) – the state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(r|s,a,s')\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, state, action, next_state)[source]
    +

    Returns reward randomly sampled according to the +distribution of this reward model. This is required, +i.e. assumed to be implemented for a reward model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the reward \(r\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    + +
    +
    +

    problems.tag.models.transition_model module

    +

    The Tag problem. Implemented according to the paper Anytime Point-Based +Approximations for Large POMDPs.

    +
    +
    Transition model: the robot moves deterministically. The target’s movement

    depends on the robot; With Pr=0.8 the target moves away from the robot, +and with Pr=0.2, the target stays at the same place. The target never +moves closer to the robot.

    +
    +
    +
    +
    +class problems.tag.models.transition_model.TagTransitionModel(grid_map, target_motion_policy)[source]
    +

    Bases: TransitionModel

    +
    +
    +classmethod if_move_by(grid_map, position, action)[source]
    +
    + +
    +
    +probability(self, next_state, state, action)[source]
    +

    Returns the probability of \(\Pr(s'|s,a)\).

    +
    +
    Parameters:
    +
      +
    • state (State) – the state \(s\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(s'|s,a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, state, action)[source]
    +

    Returns next state randomly sampled according to the +distribution of this transition model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the next state \(s'\)

    +
    +
    Return type:
    +

    State

    +
    +
    +
    + +
    +
    +argmax(self, state, action)[source]
    +

    Returns the most likely next state

    +
    + +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.tiger.cythonize.html b/docs/html/problems/problems.tiger.cythonize.html new file mode 100644 index 00000000..25ca7867 --- /dev/null +++ b/docs/html/problems/problems.tiger.cythonize.html @@ -0,0 +1,248 @@ + + + + + + + + problems.tiger.cythonize package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.tiger.cythonize package

    +
    +

    Submodules

    +
    +
    +

    problems.tiger.cythonize.run_tiger module

    +
    +
    +

    problems.tiger.cythonize.tiger_problem module

    +

    The classic Tiger problem.

    +

    This is a POMDP problem; Namely, it specifies both +the POMDP (i.e. state, action, observation space) +and the T/O/R for the agent as well as the environment.

    +

    The description of the tiger problem is as follows: (Quote from POMDP: +Introduction to Partially Observable Markov Decision Processes by +Kamalzadeh and Hahsler )

    +

    A tiger is put with equal probability behind one +of two doors, while treasure is put behind the other one. +You are standing in front of the two closed doors and +need to decide which one to open. If you open the door +with the tiger, you will get hurt (negative reward). +But if you open the door with treasure, you receive +a positive reward. Instead of opening a door right away, +you also have the option to wait and listen for tiger noises. But +listening is neither free nor entirely accurate. You might hear the +tiger behind the left door while it is actually behind the right +door and vice versa.

    +

    States: tiger-left, tiger-right +Actions: open-left, open-right, listen +Rewards:

    +
    +

    +10 for opening treasure door. -100 for opening tiger door. +-1 for listening.

    +
    +

    Observations: You can hear either “tiger-left”, or “tiger-right”.

    +

    Note that in this example, the TigerProblem is a POMDP that +also contains the agent and the environment as its fields. In +general this doesn’t need to be the case. (Refer to more complicated +examples.)

    +
    +
    +

    problems.tiger.cythonize.tiger_problem module

    +

    The classic Tiger problem.

    +

    This is a POMDP problem; Namely, it specifies both +the POMDP (i.e. state, action, observation space) +and the T/O/R for the agent as well as the environment.

    +

    The description of the tiger problem is as follows: (Quote from POMDP: +Introduction to Partially Observable Markov Decision Processes by +Kamalzadeh and Hahsler )

    +

    A tiger is put with equal probability behind one +of two doors, while treasure is put behind the other one. +You are standing in front of the two closed doors and +need to decide which one to open. If you open the door +with the tiger, you will get hurt (negative reward). +But if you open the door with treasure, you receive +a positive reward. Instead of opening a door right away, +you also have the option to wait and listen for tiger noises. But +listening is neither free nor entirely accurate. You might hear the +tiger behind the left door while it is actually behind the right +door and vice versa.

    +

    States: tiger-left, tiger-right +Actions: open-left, open-right, listen +Rewards:

    +
    +

    +10 for opening treasure door. -100 for opening tiger door. +-1 for listening.

    +
    +

    Observations: You can hear either “tiger-left”, or “tiger-right”.

    +

    Note that in this example, the TigerProblem is a POMDP that +also contains the agent and the environment as its fields. In +general this doesn’t need to be the case. (Refer to more complicated +examples.)

    +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/problems/problems.tiger.html b/docs/html/problems/problems.tiger.html new file mode 100644 index 00000000..1f8fd3cb --- /dev/null +++ b/docs/html/problems/problems.tiger.html @@ -0,0 +1,512 @@ + + + + + + + + problems.tiger package — pomdp_py 1.3.5 documentation + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + +
    +

    problems.tiger package

    +
    +

    Subpackages

    + +
    +
    +

    Submodules

    +
    +
    +

    problems.tiger.tiger_problem module

    +

    The classic Tiger problem.

    +

    This is a POMDP problem; Namely, it specifies both +the POMDP (i.e. state, action, observation space) +and the T/O/R for the agent as well as the environment.

    +

    The description of the tiger problem is as follows: (Quote from +POMDP: Introduction to Partially Observable Markov Decision Processes by +Kamalzadeh and Hahsler )

    +

    A tiger is put with equal probability behind one +of two doors, while treasure is put behind the other one. +You are standing in front of the two closed doors and +need to decide which one to open. If you open the door +with the tiger, you will get hurt (negative reward). +But if you open the door with treasure, you receive +a positive reward. Instead of opening a door right away, +you also have the option to wait and listen for tiger noises. But +listening is neither free nor entirely accurate. You might hear the +tiger behind the left door while it is actually behind the right +door and vice versa.

    +

    States: tiger-left, tiger-right +Actions: open-left, open-right, listen +Rewards:

    +
    +

    +10 for opening treasure door. -100 for opening tiger door. +-1 for listening.

    +
    +

    Observations: You can hear either “tiger-left”, or “tiger-right”.

    +

    Note that in this example, the TigerProblem is a POMDP that +also contains the agent and the environment as its fields. In +general this doesn’t need to be the case. (Refer to more +complicated examples.)

    +
    +
    +class problems.tiger.tiger_problem.TigerState(name)[source]
    +

    Bases: State

    +
    +
    +other()[source]
    +
    + +
    + +
    +
    +class problems.tiger.tiger_problem.TigerAction(name)[source]
    +

    Bases: Action

    +
    + +
    +
    +class problems.tiger.tiger_problem.TigerObservation(name)[source]
    +

    Bases: Observation

    +
    + +
    +
    +class problems.tiger.tiger_problem.ObservationModel(noise=0.15)[source]
    +

    Bases: ObservationModel

    +
    +
    +probability(self, observation, next_state, action)[source]
    +

    Returns the probability of \(\Pr(o|s',a)\).

    +
    +
    Parameters:
    +
      +
    • observation (Observation) – the observation \(o\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the probability \(\Pr(o|s',a)\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    +
    +sample(self, next_state, action)[source]
    +

    Returns observation randomly sampled according to the +distribution of this observation model.

    +
    +
    Parameters:
    +
      +
    • next_state (State) – the next state \(s'\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the observation \(o\)

    +
    +
    Return type:
    +

    Observation

    +
    +
    +
    + +
    +
    +get_all_observations()[source]
    +

    Only need to implement this if you’re using +a solver that needs to enumerate over the observation space +(e.g. value iteration)

    +
    + +
    + +
    +
    +class problems.tiger.tiger_problem.TransitionModel[source]
    +

    Bases: TransitionModel

    +
    +
    +probability(next_state, state, action)[source]
    +

    According to problem spec, the world resets once +action is open-left/open-right. Otherwise, stays the same

    +
    + +
    +
    +sample(self, state, action)[source]
    +

    Returns next state randomly sampled according to the +distribution of this transition model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    +
    +
    Returns:
    +

    the next state \(s'\)

    +
    +
    Return type:
    +

    State

    +
    +
    +
    + +
    +
    +get_all_states()[source]
    +

    Only need to implement this if you’re using +a solver that needs to enumerate over the observation space (e.g. value iteration)

    +
    + +
    + +
    +
    +class problems.tiger.tiger_problem.RewardModel[source]
    +

    Bases: RewardModel

    +
    +
    +sample(self, state, action, next_state)[source]
    +

    Returns reward randomly sampled according to the +distribution of this reward model. This is required, +i.e. assumed to be implemented for a reward model.

    +
    +
    Parameters:
    +
      +
    • state (State) – the next state \(s\)

    • +
    • action (Action) – the action \(a\)

    • +
    • next_state (State) – the next state \(s'\)

    • +
    +
    +
    Returns:
    +

    the reward \(r\)

    +
    +
    Return type:
    +

    float

    +
    +
    +
    + +
    + +
    +
    +class problems.tiger.tiger_problem.PolicyModel[source]
    +

    Bases: RolloutPolicy

    +

    A simple policy model with uniform prior over a +small, finite action space

    +
    +
    +ACTIONS = [TigerAction(listen), TigerAction(open-left), TigerAction(open-right)]
    +
    + +
    +
    +sample(self, state)[source]
    +

    Returns action randomly sampled according to the +distribution of this policy model.

    +
    +
    Parameters:
    +

    state (State) – the next state \(s\)

    +
    +
    Returns:
    +

    the action \(a\)

    +
    +
    Return type:
    +

    Action

    +
    +
    +
    + +
    +
    +rollout(state, history=None)[source]
    +

    Treating this PolicyModel as a rollout policy

    +
    + +
    +
    +get_all_actions(self, *args)[source]
    +

    Returns a set of all possible actions, if feasible.

    +
    + +
    + +
    +
    +class problems.tiger.tiger_problem.TigerProblem(obs_noise, init_true_state, init_belief)[source]
    +

    Bases: POMDP

    +

    In fact, creating a TigerProblem class is entirely optional +to simulate and solve POMDPs. But this is just an example +of how such a class can be created.

    +
    +
    +static create(state='tiger-left', belief=0.5, obs_noise=0.15)[source]
    +
    +
    Parameters:
    +
      +
    • state (str) – could be ‘tiger-left’ or ‘tiger-right’; +True state of the environment

    • +
    • belief (float) – Initial belief that the target is +on the left; Between 0-1.

    • +
    • obs_noise (float) – Noise for the observation +model (default 0.15)

    • +
    +
    +
    +
    + +
    + +
    +
    +problems.tiger.tiger_problem.test_planner(tiger_problem, planner, nsteps=3, debug_tree=False)[source]
    +

    Runs the action-feedback loop of Tiger problem POMDP

    +
    +
    Parameters:
    +
      +
    • tiger_problem (TigerProblem) – a problem instance

    • +
    • planner (Planner) – a planner

    • +
    • nsteps (int) – Maximum number of steps to run this loop.

    • +
    • debug_tree (bool) – True if get into the pdb with a +TreeDebugger created as ‘dd’ variable.

    • +
    +
    +
    +
    + +
    +
    +problems.tiger.tiger_problem.make_tiger(noise=0.15, init_state='tiger-left', init_belief=[0.5, 0.5])[source]
    +

    Convenient function to quickly build a tiger domain. +Useful for testing

    +
    + +
    +
    +problems.tiger.tiger_problem.main()[source]
    +
    + +
    +
    +

    Module contents

    +
    +
    + + +
    + +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/html/py-modindex.html b/docs/html/py-modindex.html index bcd2ea46..be282323 100644 --- a/docs/html/py-modindex.html +++ b/docs/html/py-modindex.html @@ -4,10 +4,10 @@ - Python Module Index — pomdp_py 1.3.4 documentation - + Python Module Index — pomdp_py 1.3.5 documentation + - + @@ -37,7 +37,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    @@ -185,23 +185,28 @@

    Python Module Index

        - pomdp_py.problems.lasertag + pomdp_py.problems.light_dark.env     - pomdp_py.problems.light_dark.env + pomdp_py.problems.light_dark.env.env     - pomdp_py.problems.light_dark.env.env + pomdp_py.problems.light_dark.env.plotting     pomdp_py.problems.load_unload + + +     + pomdp_py.problems.load_unload.load_unload +     @@ -297,6 +302,11 @@

    Python Module Index

        pomdp_py.problems.multi_object_search.env.env + + +     + pomdp_py.problems.multi_object_search.env.visual +     @@ -342,6 +352,11 @@

    Python Module Index

        pomdp_py.problems.multi_object_search.models.transition_model + + +     + pomdp_py.problems.multi_object_search.problem +     @@ -407,11 +422,26 @@

    Python Module Index

        pomdp_py.problems.tag.env + + +     + pomdp_py.problems.tag.env.env + + + +     + pomdp_py.problems.tag.env.visual +     pomdp_py.problems.tag.example_worlds + + +     + pomdp_py.problems.tag.experiment +     @@ -452,6 +482,11 @@

    Python Module Index

        pomdp_py.problems.tag.models.transition_model + + +     + pomdp_py.problems.tag.problem +     diff --git a/docs/html/search.html b/docs/html/search.html index 0cbb4c06..8ab5b211 100644 --- a/docs/html/search.html +++ b/docs/html/search.html @@ -4,11 +4,11 @@ - Search — pomdp_py 1.3.4 documentation - + Search — pomdp_py 1.3.5 documentation + - + @@ -40,7 +40,7 @@ -

    A framework to build and solve POMDP problems (v1.3.4).

    +

    A framework to build and solve POMDP problems (v1.3.5).

    diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js index 76c3d911..202e3563 100644 --- a/docs/html/searchindex.js +++ b/docs/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["api/modules", "api/pomdp_py", "api/pomdp_py.algorithms", "api/pomdp_py.algorithms.bsp", "api/pomdp_py.algorithms.visual", "api/pomdp_py.framework", "api/pomdp_py.problems", "api/pomdp_py.problems.lasertag", "api/pomdp_py.problems.light_dark", "api/pomdp_py.problems.light_dark.agent", "api/pomdp_py.problems.light_dark.domain", "api/pomdp_py.problems.light_dark.env", "api/pomdp_py.problems.light_dark.models", "api/pomdp_py.problems.load_unload", "api/pomdp_py.problems.maze", "api/pomdp_py.problems.maze.domain", "api/pomdp_py.problems.maze.env", "api/pomdp_py.problems.maze.models", "api/pomdp_py.problems.maze.models.components", "api/pomdp_py.problems.multi_object_search", "api/pomdp_py.problems.multi_object_search.agent", "api/pomdp_py.problems.multi_object_search.domain", "api/pomdp_py.problems.multi_object_search.env", "api/pomdp_py.problems.multi_object_search.models", "api/pomdp_py.problems.multi_object_search.models.components", "api/pomdp_py.problems.rocksample", "api/pomdp_py.problems.rocksample.cythonize", "api/pomdp_py.problems.tag", "api/pomdp_py.problems.tag.agent", "api/pomdp_py.problems.tag.domain", "api/pomdp_py.problems.tag.env", "api/pomdp_py.problems.tag.models", "api/pomdp_py.problems.tag.models.components", "api/pomdp_py.problems.tiger", "api/pomdp_py.problems.tiger.cythonize", "api/pomdp_py.representations", "api/pomdp_py.representations.belief", "api/pomdp_py.representations.distribution", "api/pomdp_py.utils", "api/pomdp_py.utils.debugging", "api/pomdp_py.utils.interfaces", "api/pomdp_py.visual", "building_docs", "changelog", "design_principles", "examples", "examples.action_prior", "examples.external_solvers", "examples.mos", "examples.tiger", "existing_domains", "existing_solvers", "extensions", "index", "installation", "modules", "other_libraries", "simple_rl_integration"], "filenames": ["api/modules.rst", "api/pomdp_py.rst", "api/pomdp_py.algorithms.rst", "api/pomdp_py.algorithms.bsp.rst", "api/pomdp_py.algorithms.visual.rst", "api/pomdp_py.framework.rst", "api/pomdp_py.problems.rst", "api/pomdp_py.problems.lasertag.rst", "api/pomdp_py.problems.light_dark.rst", "api/pomdp_py.problems.light_dark.agent.rst", "api/pomdp_py.problems.light_dark.domain.rst", "api/pomdp_py.problems.light_dark.env.rst", "api/pomdp_py.problems.light_dark.models.rst", "api/pomdp_py.problems.load_unload.rst", "api/pomdp_py.problems.maze.rst", "api/pomdp_py.problems.maze.domain.rst", "api/pomdp_py.problems.maze.env.rst", "api/pomdp_py.problems.maze.models.rst", "api/pomdp_py.problems.maze.models.components.rst", "api/pomdp_py.problems.multi_object_search.rst", "api/pomdp_py.problems.multi_object_search.agent.rst", "api/pomdp_py.problems.multi_object_search.domain.rst", "api/pomdp_py.problems.multi_object_search.env.rst", "api/pomdp_py.problems.multi_object_search.models.rst", "api/pomdp_py.problems.multi_object_search.models.components.rst", "api/pomdp_py.problems.rocksample.rst", "api/pomdp_py.problems.rocksample.cythonize.rst", "api/pomdp_py.problems.tag.rst", "api/pomdp_py.problems.tag.agent.rst", "api/pomdp_py.problems.tag.domain.rst", "api/pomdp_py.problems.tag.env.rst", "api/pomdp_py.problems.tag.models.rst", "api/pomdp_py.problems.tag.models.components.rst", "api/pomdp_py.problems.tiger.rst", "api/pomdp_py.problems.tiger.cythonize.rst", "api/pomdp_py.representations.rst", "api/pomdp_py.representations.belief.rst", "api/pomdp_py.representations.distribution.rst", "api/pomdp_py.utils.rst", "api/pomdp_py.utils.debugging.rst", "api/pomdp_py.utils.interfaces.rst", "api/pomdp_py.visual.rst", "building_docs.rst", "changelog.rst", "design_principles.rst", "examples.rst", "examples.action_prior.rst", "examples.external_solvers.rst", "examples.mos.rst", "examples.tiger.rst", "existing_domains.rst", "existing_solvers.rst", "extensions.rst", "index.rst", "installation.rst", "modules.rst", "other_libraries.rst", "simple_rl_integration.rst"], "titles": ["pomdp_py", "pomdp_py package", "pomdp_py.algorithms package", "pomdp_py.algorithms.bsp package", "pomdp_py.algorithms.visual package", "pomdp_py.framework package", "pomdp_py.problems package", "pomdp_py.problems.lasertag package", "pomdp_py.problems.light_dark package", "pomdp_py.problems.light_dark.agent package", "pomdp_py.problems.light_dark.domain package", "pomdp_py.problems.light_dark.env package", "pomdp_py.problems.light_dark.models package", "pomdp_py.problems.load_unload package", "pomdp_py.problems.maze package", "pomdp_py.problems.maze.domain package", "pomdp_py.problems.maze.env package", "pomdp_py.problems.maze.models package", "pomdp_py.problems.maze.models.components package", "pomdp_py.problems.multi_object_search package", "pomdp_py.problems.multi_object_search.agent package", "pomdp_py.problems.multi_object_search.domain package", "pomdp_py.problems.multi_object_search.env package", "pomdp_py.problems.multi_object_search.models package", "pomdp_py.problems.multi_object_search.models.components package", "pomdp_py.problems.rocksample package", "pomdp_py.problems.rocksample.cythonize package", "pomdp_py.problems.tag package", "pomdp_py.problems.tag.agent package", "pomdp_py.problems.tag.domain package", "pomdp_py.problems.tag.env package", "pomdp_py.problems.tag.models package", "pomdp_py.problems.tag.models.components package", "pomdp_py.problems.tiger package", "pomdp_py.problems.tiger.cythonize package", "pomdp_py.representations package", "pomdp_py.representations.belief package", "pomdp_py.representations.distribution package", "pomdp_py.utils package", "pomdp_py.utils.debugging module", "pomdp_py.utils.interfaces package", "pomdp_py.visual package", "Building Documentations", "Changelog", "Design Principles", "Examples", "Preference-based Action Prior", "Using External Solvers", "Multi-Object Search (MOS)", "Tiger", "Existing POMDP Domains", "Existing POMDP Solvers", "Use Case Extensions", "pomdp_py Documentation", "Installation", "docs", "Other POMDP Libraries", "Integration with simple_rl"], "terms": {"packag": [0, 42, 48, 53, 54], "algorithm": [0, 1, 5, 43, 47, 52, 53, 56], "po_rollout": [0, 1], "modul": [0, 1, 35, 42, 43, 48, 49, 53], "porollout": [0, 1, 2], "po_uct": [0, 1], "actionprior": [0, 1, 2, 43, 46, 49], "pouct": [0, 1, 2, 38, 39, 43, 46, 48, 49, 51, 52], "qnode": [0, 1, 2, 38, 39], "randomrollout": [0, 1, 2, 34], "rolloutpolici": [0, 1, 2, 23, 25, 26, 31, 33, 38, 46, 49], "rootvnod": [0, 1, 2], "treenod": [0, 1, 2], "vnode": [0, 1, 2, 38, 39, 43], "pomcp": [0, 1, 36, 38, 39, 43, 46, 49, 51, 52, 54, 56], "rootvnodeparticl": [0, 1, 2], "vnodeparticl": [0, 1, 2], "value_iter": [0, 1], "valueiter": [0, 1, 2, 43, 49, 51], "bsp": [0, 1], "blqr": [0, 1, 43], "visual": [0, 1, 6, 8, 19, 27, 48], "framework": [0, 1, 34, 43, 44, 48, 49, 53], "basic": [0, 1, 2, 25, 26, 36, 44, 47, 49, 51], "action": [0, 1, 2, 5, 6, 8, 14, 19, 22, 23, 24, 25, 26, 27, 31, 32, 33, 34, 36, 38, 39, 43, 44, 47, 48, 49, 51, 54], "agent": [0, 1, 2, 5, 6, 8, 14, 15, 19, 23, 24, 25, 26, 27, 29, 33, 34, 36, 38, 39, 44, 48, 49, 50, 51, 52, 53, 54], "blackboxmodel": [0, 1, 5, 36, 43, 49], "distribut": [0, 1, 2, 5, 20, 23, 25, 26, 31, 33, 34, 35, 36, 38, 44, 46, 49], "environ": [0, 1, 5, 11, 16, 22, 23, 33, 34, 43, 44, 48, 49], "generativedistribut": [0, 1, 5, 20, 32, 37], "observ": [0, 1, 2, 3, 5, 6, 8, 11, 14, 19, 23, 24, 25, 26, 27, 31, 33, 34, 36, 38, 39, 43, 44, 47, 48, 49, 51, 53, 54], "observationmodel": [0, 1, 5, 6, 23, 25, 26, 31, 33, 34, 36, 38, 44, 49, 52], "option": [0, 1, 2, 5, 21, 23, 24, 25, 26, 33, 34, 38, 39, 43, 47, 49, 54], "pomdp": [0, 1, 2, 5, 14, 21, 23, 25, 26, 29, 31, 33, 34, 38, 39, 42, 43, 44, 45, 46, 52, 53], "policymodel": [0, 1, 2, 5, 6, 19, 23, 33, 43, 46, 49, 52], "rewardmodel": [0, 1, 5, 6, 23, 25, 26, 31, 33, 34, 38, 43, 44, 49], "state": [0, 1, 2, 3, 5, 6, 8, 14, 19, 20, 22, 23, 25, 26, 27, 31, 33, 34, 36, 37, 38, 43, 44, 46, 47, 48, 49, 51, 54, 56], "transitionmodel": [0, 1, 5, 6, 23, 25, 26, 31, 33, 34, 36, 38, 44, 49, 52], "sample_explict_model": [0, 1, 5], "sample_generative_model": [0, 1, 5], "oopomdp": [0, 1, 43, 48, 52], "oobelief": [0, 1, 5, 20, 43], "ooobserv": [0, 1, 5, 21], "ooobservationmodel": [0, 1, 5, 23], "oostat": [0, 1, 5, 21, 43], "ootransitionmodel": [0, 1, 5, 23], "objectst": [0, 1, 5, 19, 21], "planner": [0, 1, 2, 3, 25, 26, 33, 34, 47, 49], "represent": [0, 1, 2, 5, 20, 22, 43, 53], "belief": [0, 1, 2, 3, 5, 6, 8, 11, 19, 25, 26, 28, 33, 35, 37, 43, 47, 48, 49, 54], "histogram": [0, 1, 20, 34, 35, 43, 47, 49], "particl": [0, 1, 2, 20, 35, 43, 54], "gaussian": [0, 1, 2, 3, 35], "util": [0, 1, 43, 47, 53], "subpackag": [0, 1], "interfac": [0, 1, 5, 38, 43, 44, 47, 48, 49, 50, 51, 52, 53, 56], "submodul": [0, 1, 6, 14, 17], "color": [0, 1, 39], "lighter": [0, 1, 38], "rgb_to_hex": [0, 1, 38], "hex_to_rgb": [0, 1, 38], "inverse_color_rgb": [0, 1, 38], "inverse_color_hex": [0, 1, 38], "random_unique_color": [0, 1, 38], "cython_util": [0, 1], "cpython": [0, 1], "37m": [0, 1], "x86_64": [0, 1], "linux": [0, 1, 54], "gnu": [0, 1], "det_dict_hash": [0, 1, 38], "debug": [0, 1, 43, 53], "treedebugg": [0, 1, 33, 43], "sorted_by_str": [0, 1, 38, 39], "interpret_color": [0, 1, 38, 39], "math": [0, 1, 2, 5, 43], "vec": [0, 1, 38], "proj": [0, 1, 38], "r_x": [0, 1, 38], "r_y": [0, 1, 38], "r_z": [0, 1, 38], "t": [0, 1, 2, 3, 5, 20, 22, 33, 34, 36, 37, 38, 44, 47, 49, 51, 56], "to_radian": [0, 1, 38], "r_between": [0, 1, 38], "approx_equ": [0, 1, 38], "euclidean_dist": [0, 1, 6, 23, 24, 25, 26, 38], "misc": [0, 1], "remap": [0, 1, 38], "json_saf": [0, 1, 38], "safe_slic": [0, 1, 38], "similar": [0, 1, 38, 47, 49], "special_char": [0, 1, 38], "plot": [0, 1, 6, 8, 54], "templat": [0, 1, 43], "simplest": [0, 1, 38], "simpleact": [0, 1, 38], "simpleobserv": [0, 1, 38], "dettransitionmodel": [0, 1, 38], "detobservationmodel": [0, 1, 38], "detrewardmodel": [0, 1, 38], "uniformpolicymodel": [0, 1, 38], "tabulartransitionmodel": [0, 1, 38, 43], "tabularobservationmodel": [0, 1, 38, 43], "tabularrewardmodel": [0, 1, 38, 43], "test_util": [0, 1], "typ": [0, 1], "bcolor": [0, 1, 38], "info": [0, 1, 38], "note": [0, 1, 2, 5, 23, 33, 34, 36, 37, 38, 39, 46, 47, 49, 53, 54], "error": [0, 1, 38, 43], "warn": [0, 1, 2, 38, 39, 47], "success": [0, 1, 2, 38], "bold": [0, 1, 38], "cyan": [0, 1, 38], "magenta": [0, 1, 38], "blue": [0, 1, 38, 39], "green": [0, 1, 38, 54], "yellow": [0, 1, 38], "red": [0, 1, 38, 48], "white": [0, 1, 38], "content": [0, 1, 42, 53], "clear_ag": [1, 2], "last_best_reward": [1, 2], "plan": [1, 2, 3, 5, 11, 23, 24, 38, 39, 43, 46, 47, 49, 52, 53, 56], "set_rollout_polici": [1, 2], "updat": [1, 2, 3, 5, 36, 38, 39, 43, 47, 48, 49], "update_agent_belief": [1, 2, 5], "get_preferred_act": [1, 2, 46], "last_num_sim": [1, 2, 49], "last_planning_tim": [1, 2], "updates_agent_belief": [1, 2, 5], "rollout": [1, 2, 6, 19, 23, 25, 26, 27, 31, 33, 38, 43, 46, 49], "from_vnod": [1, 2], "histori": [1, 2, 5, 20, 23, 25, 26, 28, 31, 33, 38, 39, 46, 49], "children": [1, 2, 38, 39, 43], "num_visit": [1, 2], "valu": [1, 2, 5, 25, 26, 32, 33, 35, 37, 38, 39, 43, 46, 47, 49, 54, 56], "argmax": [1, 2, 5, 6, 19, 23, 25, 26, 27, 31, 33, 34, 38, 43, 49], "print_children_valu": [1, 2], "ekf_update_mlo": [1, 2, 3], "integrate_belief_seg": [1, 2, 3], "segmented_cost_funct": [1, 2, 3], "create_plan": [1, 2, 3], "interpret_sqp_plan": [1, 2, 3], "add_attr": [1, 5], "all_act": [1, 5], "all_observ": [1, 5], "all_stat": [1, 5], "init_belief": [1, 5, 25, 28, 33, 34, 49], "sample_belief": [1, 5], "set_belief": [1, 5, 47, 49], "update_histori": [1, 5, 49], "sampl": [1, 2, 5, 6, 19, 20, 23, 25, 26, 27, 31, 33, 34, 37, 38, 43, 46, 47, 49, 54], "__getitem__": [1, 5, 35, 37, 38, 39], "__setitem__": [1, 5, 35, 37], "apply_transit": [1, 5], "blackbox_model": [1, 5, 36], "cur_stat": [1, 5], "provide_observ": [1, 5], "reward_model": [1, 5, 6, 11, 19, 27, 48, 49], "state_transit": [1, 5, 19, 22, 47, 49], "transition_model": [1, 5, 6, 8, 19, 27, 36, 47, 48, 49], "get_histogram": [1, 5, 35, 37], "mpe": [1, 5, 19, 20, 31, 32, 35, 37, 43], "get_all_observ": [1, 5, 6, 33, 34, 38, 49], "get_distribut": [1, 5, 33, 34], "probabl": [1, 5, 6, 14, 19, 20, 23, 25, 26, 27, 31, 32, 33, 34, 37, 38, 43, 44, 47, 49, 51], "initi": [1, 5, 20, 22, 25, 26, 28, 33, 43, 46, 47, 48, 49], "polici": [1, 2, 5, 14, 23, 25, 26, 31, 33, 34, 38, 43, 46, 47, 49], "termin": [1, 2, 5, 25, 26, 38, 39, 47, 49], "get_all_act": [1, 5, 6, 19, 23, 25, 26, 27, 31, 33, 34, 38, 46, 49], "get_all_st": [1, 5, 6, 33, 34, 38, 49], "b": [1, 2, 3, 5, 36, 38, 39, 47], "object_belief": [1, 5, 20], "random": [1, 2, 5, 6, 19, 20, 23, 25, 26, 31, 32, 35, 37, 38, 43, 46, 49], "set_object_belief": [1, 5], "factor": [1, 5, 19, 21, 47], "merg": [1, 5, 19, 21], "observation_model": [1, 5, 6, 8, 19, 27, 36, 47, 48, 49], "copi": [1, 5, 54], "get_object_attribut": [1, 5], "get_object_class": [1, 5], "get_object_st": [1, 5], "": [1, 2, 3, 5, 14, 21, 22, 23, 24, 25, 26, 29, 31, 33, 34, 36, 38, 39, 42, 43, 44, 47, 49, 51, 53], "set_object_st": [1, 5], "situat": [1, 5, 48], "abstraction_over_histogram": [1, 35, 36], "update_histogram_belief": [1, 35, 36, 47, 49], "abstraction_over_particl": [1, 35, 36], "particle_reinvigor": [1, 35, 36], "update_particles_belief": [1, 35, 36], "is_norm": [1, 35, 37], "add": [1, 2, 20, 35, 37, 43], "from_histogram": [1, 35, 37], "get_abstract": [1, 35, 37], "weightedparticl": [1, 35, 37, 43], "condens": [1, 35, 37], "weight": [1, 2, 35, 37, 38], "cov": [1, 35, 37], "covari": [1, 2, 3, 35, 37], "mean": [1, 2, 22, 24, 35, 36, 37, 47], "sigma": [1, 20, 23, 35, 37], "simple_rl": [1, 38, 53, 56], "num_nod": [1, 38, 39], "depth": [1, 2, 38, 39], "d": [1, 2, 3, 38, 39, 49, 53], "num_lay": [1, 38, 39], "nl": [1, 38, 39], "nn": [1, 38, 39], "nq": [1, 38, 39], "nv": [1, 38, 39], "l": [1, 2, 3, 38, 39, 48, 49, 53], "layer": [1, 38, 39], "leaf": [1, 38, 39], "step": [1, 2, 33, 34, 38, 39, 42, 43, 47, 49, 54], "back": [1, 38, 39], "root": [1, 38, 39, 42, 54], "r": [1, 2, 3, 5, 19, 22, 23, 25, 26, 31, 33, 34, 38, 39, 43, 44, 47, 49, 51, 53, 54], "c": [1, 2, 38, 39, 56], "p": [1, 25, 26, 38, 39, 53], "pp": [1, 38, 39], "mbp": [1, 38, 39], "pm": [1, 38, 39], "mark_sequ": [1, 38, 39], "mark": [1, 14, 21, 38, 39, 48], "mark_path": [1, 38, 39], "markp": [1, 38, 39], "clear": [1, 2, 20, 28, 38, 39, 48], "bestseq": [1, 38, 39], "bestseqd": [1, 38, 39], "single_node_str": [1, 38, 39], "preferred_act": [1, 38, 39], "path": [1, 38, 39, 42, 47], "path_to": [1, 38, 39], "tree_stat": [1, 38, 39], "left": [1, 19, 21, 33, 34, 38, 39, 47, 49, 54], "up": [1, 5, 38, 39], "right": [1, 19, 20, 21, 33, 34, 38, 39, 47, 49, 54], "down": [1, 38, 49], "longleft": [1, 38], "longright": [1, 38], "hline": [1, 38], "vline": [1, 38], "bottomleft": [1, 38], "longbottomleft": [1, 38], "topleft": [1, 38], "longtopleft": [1, 38], "topright": [1, 38], "longtopright": [1, 38], "bottomright": [1, 38], "longbottomright": [1, 38], "intersect": [1, 38], "topt": [1, 38], "leftt": [1, 38], "rightt": [1, 38], "bottomt": [1, 38], "shadebar": [1, 38], "subscript": [1, 38], "reward_func": [1, 38], "endc": [1, 38], "disabl": [1, 38], "exist": [2, 38, 39, 45, 47, 49, 52, 53], "solver": [2, 33, 43, 45, 48, 49, 53], "under": [2, 24, 42, 47, 49, 56], "develop": [2, 5, 47, 51, 53, 54, 56], "contribut": [2, 50, 53, 54], "want": [2, 20, 42, 48], "po": [2, 25, 26, 53], "baselin": 2, "paper": [2, 3, 14, 21, 23, 29, 31, 46, 48, 49, 53], "2": [2, 21, 25, 26, 28, 31, 32, 38, 39, 46, 47, 49, 53, 54, 56], "quot": [2, 14, 33, 34, 49], "from": [2, 5, 14, 20, 21, 22, 23, 24, 28, 31, 33, 34, 37, 38, 39, 42, 43, 46, 47, 48, 49, 54], "To": [2, 34, 38, 39, 42, 46, 48, 49], "provid": [2, 47, 48, 49, 52, 53, 56], "perform": [2, 3, 5, 47, 49, 56], "benchmark": 2, "case": [2, 22, 23, 33, 34, 36, 47, 49, 50, 53, 56], "we": [2, 20, 23, 24, 42, 45, 47, 48, 49, 50, 53, 54, 56], "evalu": [2, 37], "simpl": [2, 21, 23, 24, 25, 26, 33, 45, 48, 49, 53], "mont": [2, 49], "carlo": [2, 49], "simul": [2, 5, 22, 33, 43, 47, 49], "without": [2, 43, 47, 48, 49], "ani": [2, 14, 22, 23, 37, 47], "tree": [2, 38, 39, 43, 48, 49], "The": [2, 3, 5, 14, 15, 21, 22, 23, 24, 25, 26, 29, 31, 33, 34, 37, 38, 39, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 56], "us": [2, 3, 5, 20, 21, 22, 23, 24, 33, 36, 37, 38, 39, 42, 43, 44, 45, 46, 48, 49, 50, 51, 53, 54, 56], "describ": [2, 3, 5, 22, 42, 44, 45, 46, 48, 49, 53], "section": [2, 48, 49], "3": [2, 21, 22, 25, 26, 33, 34, 38, 39, 47, 49, 54, 56], "It": [2, 3, 5, 21, 23, 37, 38, 39, 43, 46, 47, 48, 49, 53, 56], "n": [2, 21, 25, 26, 36, 37, 38, 39, 47, 48], "A": [2, 3, 5, 14, 20, 22, 28, 33, 34, 38, 39, 43, 44, 47, 48, 49, 51, 53, 56], "each": [2, 3, 5, 14, 22, 23, 37, 38, 39, 47], "legal": 2, "select": 2, "highest": [2, 5, 32, 37, 38, 39], "averag": [2, 37], "return": [2, 3, 5, 20, 22, 23, 24, 25, 26, 31, 32, 33, 34, 36, 37, 38, 39, 43, 46, 47, 49], "don": [2, 5, 36, 49], "requir": [2, 5, 23, 25, 26, 31, 33, 34, 36, 38, 43, 44, 54], "an": [2, 3, 5, 14, 20, 21, 23, 24, 25, 26, 33, 34, 37, 38, 43, 44, 46, 47, 48, 49, 51, 53, 56], "But": [2, 5, 21, 23, 33, 34, 36, 42, 43, 49], "do": [2, 5, 42, 48, 49], "class": [2, 3, 5, 11, 15, 16, 20, 21, 22, 23, 24, 25, 26, 28, 29, 31, 32, 33, 34, 37, 38, 39, 43, 44, 46, 47, 48, 49, 52], "base": [2, 3, 5, 11, 15, 16, 20, 21, 22, 23, 24, 25, 26, 28, 29, 31, 32, 33, 34, 36, 37, 38, 39, 42, 47, 48, 49, 52, 53, 56], "self": [2, 5, 20, 22, 23, 25, 26, 31, 32, 33, 34, 37, 38, 39, 46, 48, 49], "carri": [2, 5], "inform": [2, 3, 5, 24, 28, 42, 44, 49], "bt": [2, 3, 5], "ht": [2, 5], "o": [2, 5, 25, 26, 31, 33, 34, 36, 38, 42, 44, 47, 49, 51, 53], "g": [2, 3, 5, 14, 22, 33, 43, 49, 50], "pi": [2, 5, 23, 25, 26, 34, 44, 49], "necessari": [2, 5, 48], "rollout_polici": [2, 38, 39, 49], "given": [2, 5, 22, 23, 34, 36, 37, 38, 39, 44, 46, 47, 49], "one": [2, 5, 20, 22, 33, 34, 38, 39, 45, 49, 53, 56], "real_act": [2, 5, 28, 36], "real_observ": [2, 5, 28, 36, 49], "real": [2, 5, 36, 47, 49], "accordingli": [2, 5], "If": [2, 3, 5, 20, 22, 23, 28, 33, 34, 36, 37, 38, 39, 47, 49, 53], "i": [2, 3, 5, 14, 15, 20, 21, 22, 23, 24, 25, 26, 31, 33, 34, 36, 37, 38, 39, 42, 43, 44, 46, 47, 48, 49, 50, 53, 54, 56], "also": [2, 5, 23, 33, 34, 38, 39, 48, 49, 51, 53, 56], "here": [2, 5, 38, 39, 42, 46, 47, 49, 50, 54], "attribut": [2, 5, 21], "should": [2, 3, 5, 21, 23, 36, 42, 43, 44, 47, 48, 49, 52, 54], "set": [2, 5, 20, 21, 22, 24, 25, 26, 31, 33, 34, 36, 37, 38, 43, 46, 47, 48, 49, 56], "true": [2, 5, 14, 22, 23, 24, 33, 36, 37, 38, 39, 43, 47, 49, 54], "By": [2, 5, 24, 47], "default": [2, 5, 33, 36, 43, 47], "doe": [2, 5, 14, 24, 31, 37, 38, 39, 43, 44, 47, 49, 56], "noth": [2, 5], "function": [2, 3, 5, 20, 22, 28, 33, 36, 37, 38, 39, 43, 46, 47, 49, 51], "thi": [2, 3, 5, 19, 20, 21, 22, 23, 24, 25, 26, 31, 33, 34, 36, 37, 38, 39, 42, 43, 44, 45, 46, 47, 49, 53, 54, 56], "uct": 2, "partial": [2, 14, 33, 34, 49, 53], "present": [2, 37], "extens": [2, 21, 23, 43, 49, 50, 53, 56], "combin": [2, 38], "mct": 2, "ucb1": [2, 43], "In": [2, 31, 33, 34, 45, 46, 47, 48, 49, 50], "other": [2, 6, 25, 26, 33, 34, 49, 53], "word": 2, "just": [2, 15, 20, 33, 34, 37, 38, 47, 49, 54], "arbitrari": 2, "strategi": 2, "mai": [2, 5, 36, 42, 44, 45, 48, 53, 54], "refer": [2, 3, 33, 34, 42, 43, 46], "spars": 2, "poss": 2, "introduc": [2, 14, 43, 48, 49], "recent": 2, "5": [2, 3, 22, 24, 25, 26, 33, 38, 39, 47, 49, 54], "mdp": [2, 5, 53, 56], "6": [2, 38, 39, 47, 49, 54], "propos": 2, "call": [2, 5, 36, 47, 49], "powss": 2, "howev": [2, 49], "line": [2, 47, 48], "work": [2, 38, 39, 43, 47, 49, 53, 54, 56], "sole": 2, "still": [2, 36, 49], "compar": [2, 37], "exactli": 2, "while": [2, 33, 34, 43, 49], "depend": [2, 3, 5, 31, 38, 43, 54], "explor": [2, 38, 39], "constant": [2, 6, 38], "7": [2, 38, 39, 43, 47], "reflect": 2, "prior": [2, 5, 20, 28, 33, 43, 49], "knowledg": [2, 49], "regard": [2, 5, 43, 49], "amount": 2, "thei": [2, 20, 24, 36, 47], "follow": [2, 3, 5, 33, 34, 38, 39, 46, 47, 48, 49, 53, 54], "wa": [2, 43, 48], "r_": 2, "hi": 2, "lo": 2, "where": [2, 3, 5, 21, 22, 23, 25, 26, 36, 48, 49, 54], "rhi": 2, "achiev": 2, "dure": [2, 24, 38, 39, 43, 46, 47, 49], "run": [2, 24, 33, 34, 42, 43, 47, 48, 49, 54], "0": [2, 5, 20, 21, 22, 23, 24, 25, 26, 28, 31, 32, 33, 37, 38, 39, 46, 47, 49, 54], "rlo": 2, "lowest": 2, "inde": [2, 49], "differ": [2, 21, 23, 42, 43, 44, 48, 56], "between": [2, 5, 22, 24, 33, 38, 43, 44, 48, 56], "certainli": 2, "onli": [2, 5, 14, 23, 33, 38, 39, 43, 44, 49], "wai": [2, 47, 49, 56], "obtainx1": 2, "object": [2, 5, 20, 21, 22, 23, 24, 25, 26, 32, 38, 39, 43, 46, 49, 52, 53, 54], "problem": [2, 3, 5, 36, 43, 45, 47, 49, 50, 53, 54, 56], "specif": [2, 5, 37, 38, 39, 43, 49, 56], "cl": [2, 5], "kwarg": [2, 5, 20, 21, 22, 23, 25, 26, 32, 34, 37, 38, 39, 43], "intend": 2, "classmethod": [2, 5, 21, 23, 31, 32, 37, 47], "mimic": 2, "behavior": [2, 21, 43, 49], "generateleg": 2, "generatepref": 2, "david": [2, 49], "silver": [2, 49], "code": [2, 5, 38, 43, 46, 47, 48, 49, 53, 56], "tupl": [2, 3, 5, 20, 22, 23, 25, 26, 31, 37, 38], "form": [2, 36], "num_visits_init": 2, "value_init": 2, "repres": [2, 3, 5, 20, 25, 26, 36, 37, 38, 39, 45, 47, 48], "prefer": [2, 38, 39, 43, 49], "act": [2, 5, 49, 53, 54], "despot": [2, 56], "For": [2, 5, 22, 24, 37, 43, 49, 54], "exampl": [2, 5, 19, 22, 24, 33, 34, 38, 39, 43, 46, 48, 49, 50, 51, 53], "certain": [2, 5], "possibl": [2, 5, 21, 23, 25, 26, 31, 33, 34, 38, 49, 56], "subset": [2, 38, 39], "all": [2, 5, 20, 23, 25, 26, 31, 33, 34, 37, 38, 39, 43, 49, 56], "when": [2, 5, 25, 26, 29, 31, 37, 38, 39, 42, 43, 45, 46, 47, 48, 49, 53, 54, 56], "domain": [2, 6, 8, 11, 14, 19, 23, 27, 33, 43, 45, 48, 53], "can": [2, 5, 15, 21, 22, 23, 29, 33, 34, 38, 39, 43, 47, 48, 49, 51, 54, 56], "heurist": [2, 25, 26, 49], "space": [2, 3, 5, 11, 14, 20, 21, 23, 25, 26, 29, 33, 34, 36, 43, 47, 48, 49, 51], "enumer": [2, 33, 38, 39, 43, 44, 47, 49, 51], "__init__": [2, 5, 37, 42, 43, 46, 48, 49], "max_depth": [2, 38, 39, 49], "planning_tim": [2, 43, 49], "1": [2, 3, 5, 20, 21, 22, 23, 24, 25, 26, 28, 31, 33, 34, 37, 38, 39, 46, 47, 48, 49, 53, 54], "num_sim": [2, 38, 39, 43], "discount_factor": [2, 5, 38, 39, 47, 49], "9": [2, 38, 43, 47, 49, 54], "exploration_const": [2, 38, 39, 49], "sqrt": 2, "action_prior": [2, 46], "none": [2, 3, 5, 11, 20, 21, 23, 25, 26, 31, 33, 36, 37, 38, 39, 46, 47, 49, 54], "show_progress": 2, "fals": [2, 5, 20, 22, 23, 24, 25, 26, 32, 33, 34, 36, 38, 47, 54], "pbar_update_interv": 2, "paramet": [2, 3, 5, 20, 22, 23, 25, 26, 28, 31, 33, 34, 36, 37, 38, 39, 43, 47, 49], "int": [2, 20, 22, 33, 34, 38, 39, 47], "float": [2, 5, 22, 23, 25, 26, 31, 33, 34, 37, 38, 47], "time": [2, 21, 25, 26, 36, 47, 48], "second": [2, 36, 38, 39, 42, 47, 48], "neg": [2, 33, 34, 43, 49], "number": [2, 5, 20, 33, 34, 36, 37, 38, 39, 43, 47, 56], "reach": [2, 5, 47, 49], "both": [2, 33, 34, 38, 39, 47, 48], "ar": [2, 5, 20, 23, 24, 25, 26, 29, 33, 34, 36, 37, 38, 39, 42, 43, 44, 47, 48, 49, 50, 54, 56], "over": [2, 20, 33, 36, 37, 44, 45, 46, 49], "bool": [2, 5, 22, 33, 36, 38, 39, 47], "print": [2, 38, 39, 43, 47, 49], "progress": [2, 43], "bar": [2, 43], "after": [2, 5, 21, 22, 23, 43, 47, 49], "you": [2, 5, 33, 34, 36, 38, 39, 42, 43, 46, 47, 48, 49, 53, 54], "even": [2, 50], "your": [2, 43, 48, 53], "stop": 2, "criteria": 2, "ran": 2, "last": [2, 14, 21], "assum": [2, 3, 5, 11, 20, 23, 24, 25, 26, 31, 33, 34, 37, 38, 43, 47, 54], "ha": [2, 5, 19, 24, 25, 26, 32, 37, 42, 47, 48, 52, 56], "been": [2, 49, 50], "take": [2, 5, 15, 25, 26, 29, 37, 43, 46, 47, 48, 49], "receiv": [2, 5, 25, 26, 33, 34, 48, 49], "choos": [2, 46, 49], "uniformli": [2, 49], "child": 2, "implement": [2, 3, 5, 14, 23, 25, 26, 29, 31, 33, 34, 37, 38, 43, 45, 46, 49, 50, 51, 52, 53, 56], "origin": [2, 11, 14, 21, 23, 25, 26, 46, 48, 49, 53], "larg": [2, 5, 29, 31, 49], "http": [2, 3, 47, 53, 54], "nip": 2, "cc": 2, "4031": 2, "One": [2, 20, 49], "thing": 2, "happen": [2, 23], "new": [2, 5, 22, 36, 37, 43, 53], "store": [2, 5, 38, 47, 49], "level": [2, 48], "execut": [2, 5, 22, 24, 38, 39, 47, 49], "next": [2, 5, 23, 25, 26, 31, 33, 34, 38, 49], "These": 2, "reinvigor": [2, 36, 54], "enough": [2, 34, 50], "separ": [2, 42, 43, 48], "complet": [2, 38, 47], "node": [2, 38, 39, 43, 47], "longer": 2, "keep": [2, 34, 36, 38], "track": [2, 36], "reinvogr": 2, "onc": [2, 5, 33, 49], "have": [2, 3, 5, 20, 22, 25, 26, 33, 34, 36, 37, 38, 39, 43, 44, 47, 48, 49, 50, 56], "previous": [2, 43, 48], "version": [2, 47, 54], "basicpomcp": 2, "jl": [2, 47, 56], "github": [2, 42, 43, 47, 53, 54], "com": [2, 47, 54], "juliapomdp": 2, "two": [2, 33, 34, 37, 38, 42, 45, 47, 49, 56], "equival": [2, 49], "gener": [2, 5, 33, 34, 37, 42, 44, 46, 47, 48, 49, 50, 53], "doesn": [2, 20, 33, 34, 56], "hurt": [2, 33, 34, 49], "featur": [2, 38, 39, 43, 53, 56], "state_transform_func": [2, 36], "artifici": [2, 49, 53], "transform": 2, "signatur": [2, 43], "s_transform": 2, "maintain": [2, 5, 36, 47], "iter": [2, 25, 26, 33, 36, 43, 47, 49, 54, 56], "explain": [2, 42], "4": [2, 3, 21, 38, 39, 47, 49, 54], "stochast": [2, 14, 49, 53], "No": [2, 47], "prune": [2, 47], "explod": 2, "veri": [2, 5, 49], "fast": 2, "feasibl": [2, 5, 25, 26, 31, 33, 34, 38], "small": [2, 23, 28, 31, 33, 34, 43, 49], "explicitli": [2, 25, 26, 36, 44, 46, 47, 49, 51], "horizon": [2, 43, 47, 49], "inf": [2, 47], "epsilon": [2, 20, 23, 37, 38], "1e": [2, 23, 37, 38, 49], "lqr": [2, 3], "maximum": [2, 3, 11, 20, 33, 34, 43, 47], "likelihood": [2, 3, 11, 37], "func_sysd": [2, 3], "func_ob": [2, 3], "jac_sysd": [2, 3], "jac_ob": [2, 3], "jac_sysd_u": [2, 3], "noise_ob": [2, 3], "noise_sysd": [2, 3], "qlarg": [2, 3], "q": [2, 3, 38, 39, 43], "planning_horizon": [2, 3], "15": [2, 3, 33, 38, 39, 47, 49], "sourc": [2, 3, 11, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 31, 32, 33, 36, 38, 39, 42, 47, 48, 49, 54], "ut": [2, 3], "ekf": [2, 3], "equat": [2, 3, 36], "12": [2, 3, 38, 47, 54], "13": [2, 3, 43], "f": [2, 3], "point": [2, 3, 24, 29, 31, 47], "mt": [2, 3], "cov_t": [2, 3], "np": [2, 3], "arrai": [2, 3, 37], "shape": [2, 3, 21, 23, 24, 48], "cost": [2, 3, 20, 25, 26, 36], "need": [2, 3, 20, 23, 33, 34, 36, 43, 46, 47, 49, 54], "turn": [2, 3], "long": [2, 3], "vector": [2, 3, 37, 38, 47], "consist": [2, 3, 34], "column": [2, 3], "stich": [2, 3], "togeth": [2, 3], "control": [2, 3, 23, 49], "noise_t": [2, 3], "nois": [2, 3, 25, 26, 33, 34, 49], "possibli": [2, 3], "matrix": [2, 3], "wt": [2, 3], "term": [2, 3], "e": [2, 3, 5, 21, 22, 23, 24, 25, 26, 31, 33, 34, 38, 39, 43, 48, 49, 50, 54], "ad": [2, 3, 5, 43], "system": [2, 3, 47, 49, 56], "dynam": [2, 3, 23, 24], "v": [2, 3, 38, 39, 43, 47], "eq": [2, 3], "sam": [2, 3], "dimension": [2, 3], "noise_obs_cov": [2, 3], "correspond": [2, 3, 22, 46, 47], "b_i": [2, 3], "u_i": [2, 3], "num_seg": [2, 3], "18": [2, 3, 38, 39, 47], "phi": [2, 3], "sum": [2, 3], "b_": [2, 3, 36, 49], "b_t": [2, 3, 49], "seg": [2, 3], "essenti": [2, 3, 44], "bu_traj": [2, 3], "b_de": [2, 3], "u_d": [2, 3], "17": [2, 3], "desir": [2, 3, 42], "covt": [2, 3], "comput": [2, 3, 20, 36, 43, 47], "list": [2, 3, 37, 38, 39, 43, 47], "begin": [2, 3, 38, 49], "segment": [2, 3], "avail": [2, 3, 5, 43, 53], "pass": [2, 3, 5, 47, 49], "empti": [2, 3, 28], "b_0": [2, 3], "u_init": [2, 3], "control_bound": [2, 3], "opt_opt": [2, 3], "opt_callback": [2, 3], "solv": [2, 3, 14, 33, 43, 45, 48, 51, 53, 54], "sqp": [2, 3], "direct": [2, 3, 52], "transcript": [2, 3], "produc": [2, 3], "doc": [2, 3, 43], "scipi": [2, 3], "org": [2, 3, 43, 47, 53, 54], "tutori": [2, 3, 43, 46], "optim": [2, 3, 49], "html": [2, 3, 42, 47, 54], "opt_r": [2, 3], "lesli": [2, 49, 53], "pack": [2, 49, 53], "kaelbl": [2, 49, 53], "michael": [2, 48, 49, 53], "littman": [2, 49, 53], "anthoni": [2, 47, 49, 51, 53], "cassandra": [2, 47, 49, 51, 53], "intellig": [2, 49, 53], "101": [2, 49, 53], "99": [2, 47, 49, 53], "134": [2, 49, 53], "1998": [2, 49, 53], "joel": [2, 49], "veness": [2, 49], "advanc": [2, 49, 56], "neural": [2, 49], "process": [2, 33, 34, 49], "2164": [2, 49], "2172": [2, 49], "2010": [2, 49], "levent": 2, "kocsi": 2, "csaba": 2, "szepesv": 2, "\u00e1": 2, "ri": 2, "bandit": 2, "european": 2, "confer": [2, 48, 49, 53], "machin": [2, 47], "learn": [2, 5, 44, 49, 50, 52, 53, 56], "282": 2, "293": 2, "springer": 2, "2006": 2, "platt": 2, "tedrak": 2, "lozano": 2, "perez": 2, "proceed": [2, 49], "robot": [2, 15, 20, 21, 22, 23, 24, 25, 26, 29, 31, 48, 49, 53, 56], "scienc": 2, "zaragoza": 2, "spain": 2, "june": 2, "doi": 2, "10": [2, 22, 25, 26, 28, 31, 33, 34, 38, 39, 43, 47, 49, 53], "15607": 2, "rss": 2, "vi": [2, 49], "037": 2, "h": [2, 49], "lim": 2, "clair": 2, "j": 2, "tomlin": 2, "zachari": 2, "sunberg": 2, "search": [2, 14, 20, 21, 23, 25, 26, 38, 39, 43, 49, 53, 54], "guarante": 2, "continu": [2, 43, 49], "arxiv": [2, 53], "preprint": 2, "1910": 2, "04332": 2, "2019": [2, 21, 23, 48, 49], "kearn": 2, "yishai": 2, "mansour": 2, "andrew": 2, "y": [2, 20, 21, 23, 25, 26, 28, 29], "ng": 2, "markov": [2, 33, 34, 49], "decis": [2, 33, 34, 49], "49": [2, 38], "193": 2, "208": 2, "2002": 2, "ant": 2, "\u00f3": 2, "nio": 2, "gusmao": 2, "tapani": 2, "raiko": 2, "toward": 2, "beyond": [2, 53], "game": 2, "go": [2, 14, 42, 45, 54], "ecai": 2, "384": 2, "389": 2, "2012": 2, "import": [5, 38, 39, 44, 46, 47, 49, 54], "must": [5, 14, 47, 49], "hashabl": [5, 38], "oper": 5, "its": [5, 14, 15, 22, 23, 24, 25, 26, 33, 34, 43, 44, 47, 49, 51, 52, 56], "job": [5, 44, 49], "taken": [5, 37], "care": [5, 20], "suppli": [5, 46], "OR": 5, "policy_model": [5, 6, 19, 27, 38, 39, 48, 49], "attr_nam": 5, "attr_valu": 5, "allow": [5, 43, 48, 49, 53], "sometim": [5, 49], "model": [5, 6, 8, 14, 19, 20, 21, 25, 26, 27, 33, 34, 38, 43, 47, 48, 51, 52, 53], "transit": [5, 22, 23, 25, 26, 31, 33, 34, 36, 38, 47, 48, 49], "current": [5, 14, 22, 25, 26, 36, 38, 39, 47, 51], "which": [5, 15, 22, 33, 34, 36, 37, 38, 39, 43, 46, 47, 49, 56], "most": [5, 20, 23, 25, 26, 31, 34, 37, 38], "like": [5, 20, 23, 25, 26, 31, 34, 37, 38, 39, 42, 43, 44, 48, 49, 54], "map": [5, 14, 17, 20, 21, 22, 23, 24, 28, 37, 38, 47], "variabl": [5, 32, 33, 37, 47], "pr": [5, 23, 25, 26, 31, 33, 34, 36, 37, 38], "x": [5, 20, 21, 22, 23, 25, 26, 28, 29, 37, 54], "varval": 5, "evaul": 5, "world": [5, 19, 21, 22, 23, 33, 49, 54], "2d": [5, 21, 23, 24, 43], "gridworld": [5, 20, 21, 23, 48], "render": 5, "pygam": [5, 54], "Or": [5, 37, 49, 54], "could": [5, 21, 22, 23, 33, 37, 45, 46, 49, 53, 56], "3d": 5, "opengl": 5, "therefor": [5, 36], "mind": 5, "how": [5, 33, 45, 48, 53], "so": [5, 14, 38, 39, 42, 43, 49, 54, 56], "passiv": 5, "never": [5, 31], "nor": [5, 33, 34, 49], "init_st": [5, 11, 16, 22, 25, 26, 33, 47], "next_stat": [5, 21, 22, 23, 25, 26, 31, 33, 34, 38, 49], "appli": [5, 43], "assign": [5, 37], "underli": [5, 34, 37], "accord": [5, 23, 24, 25, 26, 29, 31, 33, 34, 38, 48, 49], "type": [5, 20, 22, 23, 25, 26, 31, 33, 34, 36, 37, 38, 43, 46, 47], "synonym": 5, "result": [5, 21, 22, 23, 36, 49], "trigger": [5, 22], "becom": [5, 22, 49], "discount": [5, 25, 26, 47, 54], "until": [5, 47], "condit": [5, 49], "reward": [5, 22, 23, 25, 26, 31, 33, 34, 38, 47, 48, 49, 54], "addition": [5, 54], "exhibit": 5, "properti": [5, 11, 21, 22, 24, 25, 26, 38, 39, 43], "That": [5, 47], "support": [5, 23, 37, 44, 46, 52, 53, 56], "dictionari": [5, 20, 37, 38, 49], "randomli": [5, 23, 25, 26, 31, 33, 34, 37, 38, 48], "tempor": 5, "abstract": [5, 37], "defin": [5, 11, 14, 15, 21, 23, 37, 38, 43, 45, 46, 47, 48, 51, 52], "semi": 5, "reinforc": [5, 52, 56], "satisfi": 5, "conveni": [5, 33, 38, 43], "overriden": 5, "feel": [5, 56], "write": [5, 47], "boolean": 5, "whether": [5, 44, 47], "technic": 5, "instanc": [5, 22, 25, 26, 33, 34, 47, 48], "env": [5, 6, 8, 14, 19, 27, 47, 48, 49], "name": [5, 21, 25, 33, 34, 38, 47, 49], "treat": [5, 20, 33, 49], "h_t": [5, 49], "reason": 5, "accommod": 5, "vari": [5, 21, 23], "probabilti": 5, "arg": [5, 25, 26, 31, 33, 34, 38, 39, 43, 49], "pair": 5, "mathbb": 5, "denot": 5, "sim": [5, 49], "black": 5, "box": 5, "creat": [5, 6, 33, 38, 39, 42, 47, 48, 49], "n_step": 5, "compon": [5, 14, 17, 19, 23, 27, 31, 47, 48, 49], "oo": [5, 21, 43, 48, 52], "As": [5, 46, 48], "main": [5, 6, 25, 26, 33, 34, 47, 49], "benefit": 5, "reduc": [5, 21, 36], "scale": 5, "exponenti": 5, "linear": 5, "increas": 5, "see": [5, 37, 43, 44, 47, 48, 49, 50, 51, 53, 54], "alwai": [5, 14, 50], "objid": [5, 19, 20, 21, 23], "alia": [5, 38, 39], "return_oost": [5, 20, 43], "z": [5, 22, 36], "mapsto": 5, "z_1": 5, "cdot": [5, 47], "z_n": 5, "id": [5, 20, 21, 22, 23], "dict": [5, 20, 21, 22, 28, 36, 37, 43], "object_observ": [5, 21], "singl": [5, 21, 38, 39, 48], "prod_i": 5, "z_i": 5, "param": [5, 21], "again": 5, "chang": [5, 21, 23, 37, 43, 44, 49, 54], "directli": [5, 34, 36, 49, 51], "object_st": [5, 21, 23], "becaus": [5, 14, 20, 42, 44, 47, 49], "caus": 5, "hashcod": 5, "incorrect": [5, 38], "kei": [5, 38, 39], "attr": 5, "request": 5, "frozenset": 5, "identifi": 5, "sinc": [5, 36, 49], "hash": [5, 38, 43], "s_i": [5, 21], "made": [5, 36, 54], "str": [5, 22, 33, 37, 47], "onlin": [5, 49], "pure": 5, "underneath": 5, "hood": 5, "Its": 5, "output": [5, 42, 47, 54], "expect": [5, 47, 54], "same": [5, 29, 31, 33, 36, 37, 43, 47, 49], "lasertag": 6, "light_dark": [6, 50], "problem_discret": 6, "test": [6, 33, 36, 43, 47], "load_unload": 6, "maze": [6, 50], "multi_object_search": [6, 48, 54], "example_world": [6, 48], "random_world": [6, 19], "rocksampl": [6, 43, 54], "cython": [6, 38, 43, 53, 54, 56], "rocksample_problem": 6, "run_rocksampl": [6, 25], "rocktyp": [6, 25, 26], "good": [6, 25, 26, 48, 54], "bad": [6, 25, 26, 54], "invert": [6, 25, 26], "moveact": [6, 25, 26], "east": [6, 19, 21, 25, 26], "west": [6, 19, 21, 25, 26], "north": [6, 19, 21, 25, 26, 54], "south": [6, 19, 21, 25, 26], "sampleact": [6, 25, 26], "checkact": [6, 25, 26], "rstransitionmodel": [6, 25, 26], "rsobservationmodel": [6, 25, 26], "rsrewardmodel": [6, 25, 26], "rspolicymodel": [6, 25, 26], "rocksampleproblem": [6, 25, 26], "random_free_loc": [6, 25, 26], "in_exit_area": [6, 25, 26], "generate_inst": [6, 25, 26], "print_stat": [6, 25, 26], "test_plann": [6, 25, 26, 33, 34, 49], "init_particles_belief": [6, 25, 26], "tag": [6, 43], "experi": 6, "tiger": [6, 38, 39, 43, 46, 47, 48, 53, 54], "run_tig": [6, 33], "tiger_problem": [6, 38, 39, 43, 47, 49], "tigerst": [6, 33, 34, 47], "tigeract": [6, 33, 34], "tigerobserv": [6, 33, 34], "tigerproblem": [6, 33, 34, 38, 39, 47, 49], "make_tig": [6, 33], "lightdarkenviron": [8, 11], "light": [8, 11, 43], "const": [8, 11], "dark": [11, 43], "mazeenviron": [14, 16], "finit": [14, 33, 47, 49], "descript": [14, 21, 22, 23, 25, 26, 33, 34, 49], "start": [14, 22, 38, 39, 49, 54], "goal": [14, 49], "cannot": [14, 42], "perceiv": 14, "locat": [14, 20, 24, 25, 26, 29, 31, 54], "orient": [14, 15, 20, 21, 23, 24, 48, 52], "presenc": 14, "absenc": 14, "wall": [14, 15], "side": [14, 49], "squar": 14, "non": 14, "zero": [14, 43], "slip": 14, "know": [14, 36], "attempt": [14, 43], "make": [14, 20, 38, 39, 42, 43, 44, 48, 53, 54, 56], "move": [14, 25, 26, 31, 32, 38, 39, 48, 54], "had": 14, "consequ": 14, "actual": [14, 24, 33, 34, 49], "posit": [14, 15, 25, 26, 31, 32, 33, 34, 49], "Not": [14, 37], "yet": [14, 43, 48], "motion": [15, 21, 23, 25, 26, 29, 48], "look": [15, 21, 23, 48, 54], "positit": 15, "mosag": [19, 20], "clear_histori": [19, 20, 27, 28], "mosoobelief": [19, 20], "initialize_belief": [19, 20, 27, 28], "motionact": [19, 21, 24], "scheme_xyth": [19, 21], "scheme_vw": [19, 21], "forward": [19, 21], "backward": [19, 21, 43], "scheme_xi": [19, 21], "east2d": [19, 21, 32], "west2d": [19, 21, 32], "north2d": [19, 21, 32], "south2d": [19, 21, 32], "scheme": [19, 21], "lookact": [19, 21], "findact": [19, 21], "objectobserv": [19, 21, 23], "null": [19, 21, 23], "mosooobserv": [19, 21, 54], "for_obj": [19, 21], "pose": [19, 21, 23, 24, 48], "robotst": [19, 21], "robot_pos": [19, 21, 24], "objects_found": [19, 21], "mosoost": [19, 21], "object_pos": [19, 21], "mosenviron": [19, 22], "robot_id": [19, 20, 21, 22, 23, 24], "interpret": [19, 21, 22, 37, 48], "interpret_robot_id": [19, 22], "equip_sensor": [19, 22, 48], "make_laser_sensor": [19, 22, 48], "make_proximity_sensor": [19, 22, 48], "grid_map": [19, 20, 23, 27, 28, 31, 48], "sensor": [19, 20, 21, 22, 23, 25, 26, 48, 49], "mosobservationmodel": [19, 23], "objectobservationmodel": [19, 23], "unittest": [19, 23], "mosrewardmodel": [19, 23], "goalrewardmodel": [19, 23], "mostransitionmodel": [19, 23], "staticobjecttransitionmodel": [19, 23], "robottransitionmodel": [19, 23], "if_move_bi": [19, 23, 27, 31], "valid_pos": [19, 23, 31, 32], "in_boundari": [19, 23], "file": [19, 42, 43, 48, 49, 54, 56], "some": [19, 38, 43, 45, 47, 49, 50, 54, 56], "string": [19, 22, 34, 38, 39, 47], "width": [19, 20, 23, 24, 32], "length": [19, 20, 23, 24, 32], "num_obj": 19, "num_obstacl": 19, "robot_char": 19, "init_robot_st": 20, "object_id": [20, 23], "dim": [20, 22, 23], "01": [20, 23, 47], "belief_rep": 20, "num_particl": [20, 25, 26, 28, 36, 37], "100": [20, 28, 33, 34, 47, 49], "custum": [20, 28], "sure": [20, 49], "robot_orient": 20, "multi": [20, 21, 23, 43, 50, 52, 53, 54], "target": [20, 22, 29, 31, 33, 47, 48, 49], "obstacl": [20, 22, 24, 48], "realli": [20, 49], "about": [20, 24, 25, 26, 38, 39, 43, 48], "them": [20, 38, 45, 49, 54, 56], "includ": [20, 23, 42, 43, 44], "unspecifi": 20, "uniform": [20, 25, 26, 28, 33, 49], "radian": 20, "cup": [21, 49], "find": [21, 23, 43, 48, 53, 54], "45deg": 21, "input": [21, 22, 47, 51], "forc": 21, "everi": [21, 25, 26], "w": [21, 48], "drop": 21, "mo": [21, 43, 53, 54], "xy": [21, 32], "distance_cost": 21, "motion_nam": 21, "xyth": [21, 54], "141592653589793": 21, "71238898038469": 21, "5707963267948966": 21, "vw": 21, "7853981633974483": 21, "icra": [21, 23, 48], "instead": [21, 23, 33, 34, 43, 44, 49], "topolog": [21, 23, 48], "graph": [21, 23, 47, 48], "fan": [21, 23, 24, 48], "someth": [21, 23, 54], "els": [21, 23, 46, 47, 49], "objpos": 21, "thu": [21, 36, 48], "grid": [21, 23, 24, 25, 26, 31, 48], "s_1": 21, "s_2": 21, "s_n": 21, "s_r": 21, "leq": 21, "sr": 21, "objclass": 21, "camera_direct": 21, "overrid": 22, "parent": [22, 38, 39], "worldstr": [22, 32], "rx": 22, "xt": 22, "laser": [22, 23, 24, 48], "fov": [22, 24], "90": [22, 24], "min_rang": [22, 24], "max_rang": [22, 24], "indic": [22, 36], "obsticl": 22, "replac": 22, "upper": 22, "letter": 22, "serv": 22, "lower": 22, "except": [22, 38, 39], "signal": 22, "laser2dsensor": [22, 23, 24], "robot_nam": 22, "worldmap": 22, "charact": 22, "angle_incr": [22, 24], "dist_rang": 22, "occlus": [22, 24, 48], "scanner": [22, 24, 48], "configur": 22, "angl": [22, 24, 48], "end": [22, 38], "beam": [22, 24, 48], "scan": [22, 24, 48], "degre": [22, 24, 48], "angular": 22, "distanc": [22, 24], "measur": 22, "rad": 22, "consid": [22, 36, 48], "radiu": [22, 24], "proxim": [22, 23, 24], "occlusion_en": [22, 24], "gridmap": [23, 24, 28, 31, 32], "valid_mot": [23, 24, 31, 32], "to_rad": [23, 24], "in_rang": [23, 24], "within_rang": [23, 24], "sensing_region_s": [23, 24], "in_field_of_view": [23, 24], "shoot_beam": [23, 24], "valid_beam": [23, 24], "proximitysensor": [23, 24], "own": [23, 43, 44], "well": [23, 33, 34, 48, 49], "within": [23, 24, 48], "rang": [23, 24, 47, 48, 49], "equip": [23, 48], "occup": [23, 28], "target_object": 23, "big": [23, 28, 31], "1000": [23, 37], "normal": [23, 25, 26, 34, 36, 37], "get": [23, 33, 34, 49, 54], "detect": 23, "relat": [23, 53], "determinist": [23, 24, 25, 26, 31, 36, 38, 49], "09": [23, 37], "necessarili": 23, "static": [23, 25, 26, 33, 38, 39], "next_object_st": 23, "perfect": [23, 25, 26, 48], "check_collis": 23, "robot_st": 23, "next_robot_st": 23, "pose_objid": 23, "valid": [23, 24, 44], "overlap": 23, "addit": [23, 36, 47, 50, 53, 54], "assist": 24, "collis": 24, "avoid": [24, 36, 43, 44], "invalid": [24, 49], "contain": [24, 33, 34, 36, 38, 39, 42, 43, 47, 49, 51, 56], "all_motion_act": 24, "bump": [24, 43], "determin": [24, 25, 26, 49], "assumpt": 24, "p1": [24, 25, 26, 38], "p2": [24, 25, 26, 38], "deg": 24, "val": 24, "env_stat": 24, "might": [24, 33, 34, 48, 49], "visibl": [24, 43], "due": [24, 43, 48], "gap": 24, "view_angl": 24, "th": [24, 38], "field": [24, 33, 34, 43], "view": [24, 43], "size": [24, 43, 47], "180": 24, "front": [24, 33, 34, 49], "our": [24, 48, 49, 56], "convent": [24, 45, 53], "270": 24, "360": [24, 48], "shoot": 24, "bear": 24, "dist": 24, "increment": 24, "mosobserv": 24, "region": [24, 48], "center": 24, "rock_id": [25, 26], "rsaction": [25, 26], "rsobserv": [25, 26], "qualiti": [25, 26], "rsstate": [25, 26], "k": [25, 26], "uai": [25, 26], "2004": [25, 26, 53], "rocktype_1": [25, 26], "rocktype_2": [25, 26], "rocktype_k": [25, 26], "rocktype_i": [25, 26], "terminalst": [25, 26], "rock": [25, 26], "known": [25, 26, 56], "check_i": [25, 26], "smartli": [25, 26], "check": [25, 26, 43, 47, 48, 49, 56], "check_1": [25, 26], "check_k": [25, 26], "first": [25, 26, 38, 39, 42, 47, 48, 49, 54], "four": [25, 26], "noisi": [25, 26], "eta": [25, 26], "exit": [25, 26], "area": [25, 26], "equal": [25, 26, 33, 34, 38, 39, 49], "being": [25, 26], "rock_loc": 25, "half_efficiency_dist": 25, "20": [25, 38, 39, 43, 47], "not_free_loc": [25, 26], "nxn": [25, 26], "free": [25, 26, 33, 34, 48, 49, 52, 53, 56], "nstep": [25, 26, 33, 34, 49], "95": [25, 26, 38, 39, 47, 49], "initialize_particles_belief": [27, 28], "belief_upd": [27, 28], "tagag": [27, 28], "tagact": [27, 29], "tagobserv": [27, 29], "tagstat": [27, 29], "motion_polici": [27, 31], "tagobservationmodel": [27, 31], "tagpolicymodel": [27, 31], "tagrewardmodel": [27, 31], "tagtransitionmodel": [27, 31], "init_robot_posit": 28, "hold": [28, 44], "pr_stai": [28, 32], "anytim": [29, 31, 47], "approxim": [29, 31, 37, 56], "cell": [29, 31, 48], "target_posit": [29, 32], "person": 29, "found": [29, 47, 48, 54], "robot_posit": [29, 32], "target_found": 29, "from_str": [31, 32], "free_cel": [31, 32], "tagtargetmotionpolici": [31, 32], "ohterwis": 31, "anyth": 31, "There": [31, 42, 47, 49, 50, 56], "stochaist": 31, "movement": 31, "With": [31, 49], "8": [31, 38, 39, 43, 47, 54], "awai": [31, 33, 34, 49], "stai": [31, 33, 43, 49], "place": [31, 48, 49], "closer": 31, "target_motion_polici": 31, "obstacle_pos": 32, "all_mot": 32, "next_target_posit": 32, "valid_target_motion_act": 32, "tigerobservationmodel": [33, 34], "tigerpolicymodel": [33, 34], "tigerrewardmodel": [33, 34], "tigertransitionmodel": [33, 34], "build_act": [33, 34], "build_observ": [33, 34], "build_set": [33, 34], "build_stat": [33, 34], "classic": [33, 34, 49], "specifi": [33, 34, 38, 42, 43, 46, 47, 49], "introduct": [33, 34, 49], "kamalzadeh": [33, 34, 49], "hahsler": [33, 34, 49], "put": [33, 34, 49], "behind": [33, 34, 49], "door": [33, 34, 49], "treasur": [33, 34, 49], "stand": [33, 34, 38, 39, 49, 53], "close": [33, 34, 49], "decid": [33, 34, 49], "open": [33, 34, 38, 39, 47, 49], "wait": [33, 34, 49], "listen": [33, 34, 38, 39, 43, 47, 49, 54], "neither": [33, 34, 49], "entir": [33, 34, 38, 39, 49], "accur": [33, 34, 49], "hear": [33, 34, 49], "vice": [33, 34, 49], "versa": [33, 34, 49], "either": [33, 34, 36, 43, 47, 48, 49], "more": [33, 34, 36, 38, 39, 42, 45, 46, 47, 48, 49, 50, 52, 53, 56], "complic": [33, 34, 45, 48, 49, 53], "re": [33, 42, 49], "spec": [33, 47, 49], "reset": [33, 49], "otherwis": [33, 49], "obs_nois": [33, 49], "init_true_st": [33, 34, 49], "fact": 33, "debug_tre": 33, "feedback": [33, 34, 48, 49], "loop": [33, 34, 48, 49], "pdb": [33, 38, 39], "dd": [33, 38, 39], "quickli": [33, 45, 53], "build": [33, 43, 44, 47, 48, 53, 54], "extern": [34, 43, 49, 51, 53, 54], "extrem": 34, "dumb": 34, "obs_prob": 34, "trans_prob": 34, "current_histogram": 36, "state_mapp": [36, 37], "oarg": 36, "targ": 36, "static_transit": 36, "next_state_spac": 36, "sum_": 36, "help": [36, 38, 39, 47, 48, 53], "nest": 36, "alreadi": [36, 52], "prohibit": 36, "effici": 36, "part": [36, 47], "simpli": [36, 49], "At": 36, "least": 36, "ok": 36, "current_particl": 36, "todo": [36, 43], "prob": 37, "unweight": 37, "inherit": [37, 43, 49], "feed": 37, "through": [37, 38, 39, 46, 49], "multipl": [37, 52], "those": [37, 49, 54], "approx_method": 37, "distance_func": 37, "drawn": 37, "nearest": 37, "queri": 37, "match": [37, 43], "closest": 37, "exact": [37, 43, 49], "uniqu": 37, "aggreg": 37, "numer": [37, 47, 56], "densiti": 37, "multivari": 37, "isn": 37, "arbitrarili": 37, "deal": 38, "percent": 38, "rgb": 38, "255": 38, "hx": 38, "len": [38, 46], "ctype": 38, "dct": 38, "easier": [38, 39, 43], "core": [38, 39, 43, 44], "incorpor": [38, 39], "design": [38, 39, 53], "eas": [38, 39], "ipdb": [38, 39], "session": [38, 39], "minim": [38, 39, 43], "usag": [38, 39], "pomdp_problem": [38, 39, 43], "suppos": [38, 39], "too": [38, 39], "4096": [38, 39], "200": [38, 39], "set_trac": [38, 39], "program": [38, 39, 47, 51], "enter": [38, 39], "debugg": [38, 39], "_vnodepp": [38, 39], "4095": [38, 39], "19": [38, 39, 47], "529": [38, 39], "\u2080listen": [38, 39], "_qnodepp": [38, 39], "4059": [38, 39], "\u2080tiger": [38, 39], "2013": [38, 39], "16": [38, 39], "586": [38, 39], "1883": [38, 39], "1441": [38, 39], "300": [38, 39], "out": [38, 39, 47, 48, 56], "\u2081open": [38, 39], "139": [38, 39], "847": [38, 39], "\u2082open": [38, 39], "112": [38, 39, 47], "57": [38, 39], "191": [38, 39], "text": [38, 39, 47], "retriev": [38, 39], "subtre": [38, 39], "index": [38, 39, 47, 53], "2044": [38, 39], "160": [38, 39], "148": [38, 39], "634": [38, 39], "237": [38, 39], "500": [38, 39], "obtain": [38, 39], "sequenc": [38, 39, 43, 49], "\u2081tiger": [38, 39], "1955": [38, 39], "947": [38, 39], "768": [38, 39], "022": [38, 39], "462": [38, 39], "395": [38, 39], "000": [38, 39], "247": [38, 39], "best": [38, 39, 43], "brows": [38, 39], "method": [38, 39, 43], "document": [38, 39, 43, 45, 47, 56], "futur": [38, 39], "organ": [38, 39, 48, 49], "kind": [38, 39], "total": [38, 39, 47], "largest": [38, 39], "edg": [38, 39, 47], "as_debugg": [38, 39], "Will": [38, 39], "high": [38, 39, 48, 56], "huge": [38, 39], "interact": [38, 39, 44], "along": [38, 39], "preset": [38, 39], "seq": [38, 39], "understand": [38, 39, 44], "_nodepp": [38, 39], "dest": [38, 39], "Such": [38, 39], "parent_edg": [38, 39], "indent": [38, 39], "include_children": [38, 39], "df": [38, 39], "gether": [38, 39], "statist": [38, 39], "colorstr": [38, 39], "assort": 38, "vec1": 38, "vec2": 38, "scalar": 38, "dx": 38, "dy": 38, "dz": 38, "v1": 38, "v2": 38, "06": [38, 47], "python": [38, 43, 47, 48, 49, 53, 54, 56], "oldvalu": 38, "oldmin": 38, "oldmax": 38, "newmin": 38, "newmax": 38, "obj": 38, "arr": 38, "48": 38, "8320": 38, "8321": 38, "50": [38, 47], "8322": 38, "51": [38, 47], "8323": 38, "52": [38, 47], "8324": 38, "53": 38, "8325": 38, "54": 38, "8326": 38, "55": 38, "8327": 38, "56": 38, "8328": 38, "8329": 38, "particular": 38, "data": 38, "piec": 38, "correct": [38, 44, 49], "typic": [38, 49], "tabular": [38, 43], "built": [38, 42, 43, 44], "nextstat": 38, "emit": 38, "utilti": 38, "typographi": 38, "purpos": [38, 48, 53], "displai": 38, "x1b": 38, "97m": 38, "96m": 38, "95m": 38, "94m": 38, "92m": 38, "93m": 38, "91m": 38, "1m": 38, "0m": 38, "shown": [38, 48], "sphinx": [42, 43], "web": 42, "page": [42, 53, 54], "Their": 42, "directori": [42, 54], "cd": 42, "py": [42, 43, 48, 49], "_sphinx_src": 42, "apidoc": 42, "api": 42, "rst": 42, "argument": [42, 43, 46], "readm": 42, "read": [42, 49], "me": 42, "Then": [42, 49], "top": [42, 43], "repositori": [42, 54], "websit": [42, 43, 54], "construct": [42, 47, 49], "symbol": 42, "link": [42, 43, 47, 48, 53], "ln": 42, "access": [42, 49, 53], "remov": [42, 43, 47], "site": 42, "deploi": 42, "fundament": 44, "block": [44, 48], "formal": 44, "encapsul": 44, "few": 44, "pomdp_pi": [43, 44, 45, 46, 48, 49, 50, 51, 52, 54, 56], "around": [44, 56], "convei": 44, "idea": [44, 49], "abov": [44, 47, 48, 49, 51, 54], "gist": [43, 44], "captur": 44, "versu": 44, "much": [43, 44], "sens": [44, 48], "verifi": [43, 44, 54], "diagram": 44, "langl": 44, "omega": [44, 47, 51], "rangl": 44, "discuss": 45, "simpler": [43, 45, 56], "interest": 45, "former": 45, "latter": 45, "structur": [45, 48, 53], "project": [45, 48, 52, 53, 56], "below": [46, 48, 50, 54], "minimum": [43, 46], "def": [46, 49], "rais": [46, 49], "notimplementederror": 46, "notion": 46, "narrow": 46, "express": 46, "detail": [46, 47, 48, 49, 51], "paragraph": 46, "visit": [43, 46], "count": [46, 54], "account": 46, "nu": [47, 51], "hope": [47, 50], "u": 47, "mani": [47, 56], "librari": [43, 47, 51, 53, 54], "written": [47, 49, 53, 56], "format": [43, 47, 49, 56], "pomdpx": [43, 47, 56], "pomdpconvert": 47, "toolkit": 47, "to_pomdp_fil": [43, 47], "to_pomdpx_fil": 47, "convers": [43, 47], "output_path": 47, "float_precis": [43, 47], "www": [47, 54], "independ": 47, "blank": 47, "decim": 47, "order": [47, 49], "pomdpconvert_path": 47, "adacompnu": 47, "instruct": [47, 54], "download": [47, 54], "ubuntu": 47, "04": 47, "gcc": 47, "bigbird": 47, "comp": 47, "edu": 47, "sg": 47, "pmwiki": 47, "farm": 47, "appl": [47, 56], "php": 47, "pomdpxdocument": 47, "binari": [47, 51], "let": [47, 49], "filenam": [47, 48], "test_tig": 47, "softwar": [47, 54, 56], "src": 47, "vi_prun": 47, "pomdp_solve_path": 47, "pomdp_nam": 47, "temp": 47, "remove_generated_fil": 47, "return_policy_graph": 47, "definit": [47, 49], "pomdp_solv": [43, 47], "compil": 47, "command": [47, 48, 54], "stop_criteria": 47, "weak": 47, "time_limit": 47, "alpha": 47, "pg": 47, "instal": [43, 47, 53], "appear": [47, 56], "recommend": [47, 48, 54], "isinst": [47, 49], "cur_belief": [47, 49], "new_belief": [47, 49], "pid": 47, "8239": 47, "mcgs_prune_freq": 47, "verbos": 47, "context": 47, "done": [47, 49, 56], "epoch": 47, "00": 47, "sec": 47, "err": 47, "39": 47, "96": 47, "97": 47, "98": 47, "40": 47, "solut": 47, "user": [47, 49], "hr": 47, "min": 47, "lp_solv": 47, "report": 47, "lp": 47, "instabl": 47, "85": 47, "9697986575573173": 47, "03020134244268276": 47, "pomdpsol_path": 47, "timeout": 47, "30": 47, "memori": 47, "precis": 47, "logfil": 47, "pomdpsol": 47, "limit": 47, "mb": 47, "regret": 47, "less": 47, "than": [47, 56], "finish": 47, "log": [43, 47], "stdout": 47, "stderr": 47, "_": 47, "000001": 47, "load": [43, 47], "trial": 47, "backup": 47, "lbound": 47, "ubound": 47, "92": 47, "8205": 47, "821": 47, "2981": 47, "63": 47, "7547": 47, "70": 47, "0528": 47, "103": 47, "35722": 47, "3746": 47, "0174": 47, "155": 47, "44093": 47, "45": 47, "1431": 47, "38": 47, "7021": 47, "205": 47, "1184": 47, "36": 47, "4409": 47, "24": 47, "3225": 47, "1255": 47, "3714": 47, "13808e": 47, "21": 47, "41": 47, "1300": 47, "76277e": 47, "42": 47, "1350": 47, "75044e": 47, "43": 47, "1393": 47, "22729e": 47, "07": 47, "11": [47, 54], "extend": [43, 47, 48, 49, 50], "encod": 47, "alpha_path": 47, "pg_path": 47, "parse_pomdp_solve_output": 47, "pointer": 47, "incom": 47, "offlin": 47, "collect": 47, "associ": 47, "dot": 47, "product": 47, "lead": [47, 48], "domin": 47, "activ": [47, 56], "max_": 47, "gamma": 47, "policy_path": 47, "parse_appl_policy_fil": 47, "involv": 48, "whose": 48, "better": 48, "mainten": 48, "readabl": 48, "task": [48, 52, 53, 56], "rel": 48, "share": [48, 53], "wandzel": 48, "et": 48, "al": 48, "slightli": 48, "room": 48, "formul": 48, "three": [48, 49], "categori": 48, "adjust": 48, "disk": 48, "artifact": 48, "discret": 48, "figur": 48, "screenshot": 48, "frame": 48, "imag": [43, 48], "circl": [48, 54], "third": 48, "show": [43, 48, 53], "later": 48, "summari": 48, "procedur": [48, 49], "instanti": 48, "squeez": 48, "everyth": 48, "giant": 48, "reus": 48, "whatev": 48, "save": 48, "evid": 48, "role": 48, "mosoopomdp": 48, "logic": 48, "m": [43, 48, 53, 54], "custom": 48, "arthur": 48, "yoonseon": 48, "oh": 48, "fishman": 48, "nishanth": 48, "kumar": 48, "stefani": [48, 49, 53], "tellex": [48, 49, 53], "intern": [48, 49], "autom": [48, 49], "7194": 48, "7200": 48, "ieee": 48, "encourag": 49, "valueerror": 49, "__hash__": 49, "__eq__": 49, "boil": 49, "heard": 49, "growl": 49, "thresh": 49, "similarli": 49, "startswith": 49, "choic": 49, "easili": 49, "tabl": 49, "flexibl": 49, "intract": 49, "sever": [49, 50], "would": [43, 49, 56], "usual": 49, "human": 49, "engin": 49, "sort": 49, "guid": 49, "guidanc": 49, "caution": 49, "sai": 49, "inject": 49, "final": 49, "straightforward": 49, "commonli": 49, "_reward_func": 49, "elif": 49, "abl": [43, 49], "mostli": 49, "super": 49, "notic": 49, "constructor": 49, "now": [43, 49], "standard": 49, "a_t": 49, "s_t": 49, "rightarrow": 49, "s_": 49, "r_t": 49, "o_t": 49, "h_": 49, "unless": 49, "repeat": 49, "110": 49, "ennviron": 49, "skip": [43, 49], "estim": 49, "percept": 49, "stack": 49, "saniti": 49, "come": 49, "automat": 49, "num": 49, "short": 49, "abel": 49, "elli": 49, "hershkowitz": 49, "gabriel": 49, "barth": 49, "maron": 49, "stephen": 49, "brawner": 49, "kevin": 49, "farrel": 49, "jame": 49, "macglashan": 49, "twenti": 49, "fifth": 49, "schedul": 49, "2015": 49, "yuchen": 49, "xiao": 49, "sammi": 49, "katt": 49, "andrea": 49, "ten": 49, "pa": 49, "shengjian": 49, "chen": 49, "christoph": 49, "amato": 49, "clutter": 49, "welcom": [50, 53], "sarsop": [43, 51, 54, 56], "rl": 52, "transfer": [52, 53], "research": [52, 53, 56], "baslin": 52, "comprehens": 53, "why": 53, "clean": 53, "intuit": 53, "peopl": 53, "commun": [53, 54, 56], "artial": 53, "bservabl": 53, "arkov": 53, "ecis": 53, "rocess": 53, "major": 53, "languag": 53, "what": 53, "changelog": 53, "principl": 53, "integr": [43, 53], "pleas": 53, "cite": 53, "inproceed": 53, "zheng2020pomdp_pi": 53, "titl": 53, "_py": 53, "author": 53, "zheng": 53, "kaiyu": 53, "booktitl": 53, "icap": 53, "2020": 53, "workshop": 53, "planrob": 53, "year": 53, "url": 53, "icaps20subpag": 53, "wp": 53, "upload": 53, "14": [53, 54], "planrob_2020_paper_3": 53, "pdf": 53, "10099": 53, "virtualenv": 54, "pip": [43, 54], "manag": 54, "offici": 54, "maco": 54, "On": 54, "window": [43, 54], "wiki": 54, "latest": 54, "releas": [43, 54], "clone": 54, "git": 54, "h2r": 54, "setup": [43, 54], "pyx": [43, 54], "pyd": 54, "rebuild": 54, "messi": [], "66": 54, "cumul": 54, "__num_sims__": 54, "1217": 54, "______id______": 54, "210": 54, "_____g": 54, "b_____": 54, "hello": 54, "542": 54, "506": 54, "test_al": 54, "via": [54, 56], "hub": 54, "credit": 54, "romain": 54, "egel": 54, "think": 56, "peer": 56, "easi": 56, "ro": 56, "acceler": 56, "pomdpi": 56, "suffici": 56, "convolut": 56, "potenti": [43, 56], "connect": 56, "clearer": 56, "pars": 56, "art": 56, "great": 56, "julia": 56, "suit": 56, "analysi": 56, "besid": 56, "librai": 56, "port": 56, "ai": 56, "toolbox": 56, "bind": 56, "focus": 56, "lear": 56, "beliefmdp": 56, "modern": 43, "repo": 43, "migrat": 43, "pyproject": 43, "toml": 43, "ci": 43, "pre": 43, "commit": 43, "eol": 43, "fix": 43, "cpdef": 43, "cdef": 43, "failur": 43, "29": 43, "comment": 43, "sp": 43, "wheel": 43, "properli": 43, "tame": 43, "minor": 43, "bug": 43, "__str__": 43, "confus": 43, "improv": 43, "clarifi": 43, "gave": 43, "cryingbabi": 43, "pygraphviz": 43, "inspect": 43, "refactor": 43, "cli": 43, "simplifi": 43, "__ne__": 43, "reorgan": 43, "break": 43, "unnecessari": 43, "compat": 43, "pickl": 43, "edit": 43, "cimport": 43, "ed": 43, "pypi": 43, "value_funct": 43, "18fc58e0": 43, "cfc88e8d8": 43, "719c2edf5": 43, "docker": 43, "issu": 43, "citat": 43, "resolv": 43, "max": 43, "among": 43, "infin": 43, "thank": 43, "jason": 43, "clarif": 43, "convert": 43, "were": 43, "calcul": 43, "divid": 43, "thrown": 43, "infinit": 43, "anoth": 43, "differenti": 43, "unload": 43, "per": 43, "faster": 43, "readi": 43, "changeabl": 43, "rewritten": 43, "cleaner": 43}, "objects": {"pomdp_py.algorithms": [[3, 0, 0, "-", "bsp"], [2, 0, 0, "-", "po_rollout"], [2, 0, 0, "-", "po_uct"], [2, 0, 0, "-", "pomcp"], [2, 0, 0, "-", "value_iteration"]], "pomdp_py.algorithms.bsp": [[2, 0, 0, "-", "blqr"]], "pomdp_py.algorithms.bsp.blqr": [[2, 1, 1, "", "BLQR"]], "pomdp_py.algorithms.bsp.blqr.BLQR": [[2, 2, 1, "", "create_plan"], [2, 2, 1, "", "ekf_update_mlo"], [2, 2, 1, "", "integrate_belief_segment"], [2, 2, 1, "", "interpret_sqp_plan"], [2, 2, 1, "", "segmented_cost_function"]], "pomdp_py.algorithms.po_rollout": [[2, 1, 1, "", "PORollout"]], "pomdp_py.algorithms.po_rollout.PORollout": [[2, 2, 1, "", "clear_agent"], [2, 3, 1, "", "last_best_reward"], [2, 2, 1, "", "plan"], [2, 2, 1, "", "set_rollout_policy"], [2, 2, 1, "", "update"], [2, 3, 1, "", "update_agent_belief"]], "pomdp_py.algorithms.po_uct": [[2, 1, 1, "", "ActionPrior"], [2, 1, 1, "", "POUCT"], [2, 1, 1, "", "QNode"], [2, 1, 1, "", "RandomRollout"], [2, 1, 1, "", "RolloutPolicy"], [2, 1, 1, "", "RootVNode"], [2, 1, 1, "", "TreeNode"], [2, 1, 1, "", "VNode"]], "pomdp_py.algorithms.po_uct.ActionPrior": [[2, 2, 1, "", "get_preferred_actions"]], "pomdp_py.algorithms.po_uct.POUCT": [[2, 2, 1, "", "clear_agent"], [2, 3, 1, "", "last_num_sims"], [2, 3, 1, "", "last_planning_time"], [2, 2, 1, "", "plan"], [2, 2, 1, "", "set_rollout_policy"], [2, 2, 1, "", "update"], [2, 3, 1, "", "updates_agent_belief"]], "pomdp_py.algorithms.po_uct.RandomRollout": [[2, 2, 1, "", "rollout"]], "pomdp_py.algorithms.po_uct.RolloutPolicy": [[2, 2, 1, "", "rollout"]], "pomdp_py.algorithms.po_uct.RootVNode": [[2, 2, 1, "", "from_vnode"], [2, 3, 1, "", "history"]], "pomdp_py.algorithms.po_uct.TreeNode": [[2, 3, 1, "", "children"], [2, 3, 1, "", "num_visits"], [2, 3, 1, "", "value"]], "pomdp_py.algorithms.po_uct.VNode": [[2, 2, 1, "", "argmax"], [2, 2, 1, "", "print_children_value"], [2, 3, 1, "", "value"]], "pomdp_py.algorithms.pomcp": [[2, 1, 1, "", "POMCP"], [2, 1, 1, "", "RootVNodeParticles"], [2, 1, 1, "", "VNodeParticles"]], "pomdp_py.algorithms.pomcp.POMCP": [[2, 2, 1, "", "plan"], [2, 2, 1, "", "update"], [2, 3, 1, "", "update_agent_belief"]], "pomdp_py.algorithms.pomcp.RootVNodeParticles": [[2, 3, 1, "", "belief"], [2, 2, 1, "", "from_vnode"]], "pomdp_py.algorithms.pomcp.VNodeParticles": [[2, 3, 1, "", "belief"]], "pomdp_py.algorithms.value_iteration": [[2, 1, 1, "", "ValueIteration"]], "pomdp_py.algorithms.value_iteration.ValueIteration": [[2, 2, 1, "", "plan"]], "pomdp_py.framework": [[5, 0, 0, "-", "basics"], [5, 0, 0, "-", "oopomdp"], [5, 0, 0, "-", "planner"]], "pomdp_py.framework.basics": [[5, 1, 1, "", "Action"], [5, 1, 1, "", "Agent"], [5, 1, 1, "", "BlackboxModel"], [5, 1, 1, "", "Distribution"], [5, 1, 1, "", "Environment"], [5, 1, 1, "", "GenerativeDistribution"], [5, 1, 1, "", "Observation"], [5, 1, 1, "", "ObservationModel"], [5, 1, 1, "", "Option"], [5, 1, 1, "", "POMDP"], [5, 1, 1, "", "PolicyModel"], [5, 1, 1, "", "RewardModel"], [5, 1, 1, "", "State"], [5, 1, 1, "", "TransitionModel"], [5, 4, 1, "", "sample_explict_models"], [5, 4, 1, "", "sample_generative_model"]], "pomdp_py.framework.basics.Agent": [[5, 2, 1, "", "add_attr"], [5, 3, 1, "", "all_actions"], [5, 3, 1, "", "all_observations"], [5, 3, 1, "", "all_states"], [5, 3, 1, "", "belief"], [5, 3, 1, "", "history"], [5, 3, 1, "", "init_belief"], [5, 2, 1, "", "sample_belief"], [5, 2, 1, "", "set_belief"], [5, 2, 1, "", "update"], [5, 2, 1, "", "update_history"]], "pomdp_py.framework.basics.BlackboxModel": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "sample"]], "pomdp_py.framework.basics.Distribution": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "__setitem__"]], "pomdp_py.framework.basics.Environment": [[5, 2, 1, "", "apply_transition"], [5, 3, 1, "", "blackbox_model"], [5, 3, 1, "", "cur_state"], [5, 2, 1, "", "provide_observation"], [5, 3, 1, "", "reward_model"], [5, 3, 1, "", "state"], [5, 2, 1, "", "state_transition"], [5, 3, 1, "", "transition_model"]], "pomdp_py.framework.basics.GenerativeDistribution": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "get_histogram"], [5, 2, 1, "", "mpe"]], "pomdp_py.framework.basics.ObservationModel": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "get_all_observations"], [5, 2, 1, "", "get_distribution"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"]], "pomdp_py.framework.basics.Option": [[5, 2, 1, "", "initiation"], [5, 3, 1, "", "policy"], [5, 2, 1, "", "sample"], [5, 2, 1, "", "termination"]], "pomdp_py.framework.basics.PolicyModel": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "get_all_actions"], [5, 2, 1, "", "get_distribution"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"], [5, 2, 1, "", "update"]], "pomdp_py.framework.basics.RewardModel": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "get_distribution"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"]], "pomdp_py.framework.basics.TransitionModel": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "get_all_states"], [5, 2, 1, "", "get_distribution"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"]], "pomdp_py.framework.oopomdp": [[5, 1, 1, "", "OOBelief"], [5, 1, 1, "", "OOObservation"], [5, 1, 1, "", "OOObservationModel"], [5, 1, 1, "", "OOPOMDP"], [5, 1, 1, "", "OOState"], [5, 1, 1, "", "OOTransitionModel"], [5, 1, 1, "", "ObjectState"]], "pomdp_py.framework.oopomdp.OOBelief": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "__setitem__"], [5, 2, 1, "", "b"], [5, 2, 1, "", "mpe"], [5, 2, 1, "", "object_belief"], [5, 3, 1, "", "object_beliefs"], [5, 2, 1, "", "random"], [5, 2, 1, "", "set_object_belief"]], "pomdp_py.framework.oopomdp.OOObservation": [[5, 2, 1, "", "factor"], [5, 2, 1, "", "merge"]], "pomdp_py.framework.oopomdp.OOObservationModel": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "argmax"], [5, 3, 1, "", "observation_models"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"]], "pomdp_py.framework.oopomdp.OOState": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "copy"], [5, 2, 1, "", "get_object_attribute"], [5, 2, 1, "", "get_object_class"], [5, 2, 1, "", "get_object_state"], [5, 2, 1, "", "s"], [5, 2, 1, "", "set_object_state"], [5, 3, 1, "", "situation"]], "pomdp_py.framework.oopomdp.OOTransitionModel": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "argmax"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"], [5, 3, 1, "", "transition_models"]], "pomdp_py.framework.oopomdp.ObjectState": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "__setitem__"], [5, 2, 1, "", "copy"]], "pomdp_py.framework.planner": [[5, 1, 1, "", "Planner"]], "pomdp_py.framework.planner.Planner": [[5, 2, 1, "", "plan"], [5, 2, 1, "", "update"], [5, 2, 1, "", "updates_agent_belief"]], "pomdp_py": [[6, 0, 0, "-", "problems"], [38, 0, 0, "-", "utils"]], "pomdp_py.problems": [[7, 0, 0, "-", "lasertag"], [13, 0, 0, "-", "load_unload"], [14, 0, 0, "-", "maze"], [19, 0, 0, "-", "multi_object_search"], [25, 0, 0, "-", "rocksample"], [27, 0, 0, "-", "tag"], [33, 0, 0, "-", "tiger"]], "pomdp_py.problems.light_dark": [[11, 0, 0, "-", "env"]], "pomdp_py.problems.light_dark.env": [[11, 0, 0, "-", "env"]], "pomdp_py.problems.light_dark.env.env": [[11, 1, 1, "", "LightDarkEnvironment"]], "pomdp_py.problems.light_dark.env.env.LightDarkEnvironment": [[11, 5, 1, "", "const"], [11, 5, 1, "", "light"]], "pomdp_py.problems.maze": [[15, 0, 0, "-", "domain"], [16, 0, 0, "-", "env"], [17, 0, 0, "-", "models"]], "pomdp_py.problems.maze.domain": [[15, 0, 0, "-", "action"], [15, 0, 0, "-", "observation"], [15, 0, 0, "-", "state"]], "pomdp_py.problems.maze.domain.observation": [[15, 1, 1, "", "Observation"]], "pomdp_py.problems.maze.domain.state": [[15, 1, 1, "", "State"]], "pomdp_py.problems.maze.env": [[16, 0, 0, "-", "env"]], "pomdp_py.problems.maze.env.env": [[16, 1, 1, "", "MazeEnvironment"]], "pomdp_py.problems.maze.models": [[18, 0, 0, "-", "components"]], "pomdp_py.problems.multi_object_search": [[20, 0, 0, "-", "agent"], [21, 0, 0, "-", "domain"], [22, 0, 0, "-", "env"], [19, 0, 0, "-", "example_worlds"], [23, 0, 0, "-", "models"]], "pomdp_py.problems.multi_object_search.agent": [[20, 0, 0, "-", "agent"], [20, 0, 0, "-", "belief"]], "pomdp_py.problems.multi_object_search.agent.agent": [[20, 1, 1, "", "MosAgent"]], "pomdp_py.problems.multi_object_search.agent.agent.MosAgent": [[20, 2, 1, "", "clear_history"]], "pomdp_py.problems.multi_object_search.agent.belief": [[20, 1, 1, "", "MosOOBelief"], [20, 4, 1, "", "initialize_belief"]], "pomdp_py.problems.multi_object_search.agent.belief.MosOOBelief": [[20, 2, 1, "", "mpe"], [20, 2, 1, "", "random"]], "pomdp_py.problems.multi_object_search.domain": [[21, 0, 0, "-", "action"], [21, 0, 0, "-", "observation"], [21, 0, 0, "-", "state"]], "pomdp_py.problems.multi_object_search.domain.action": [[21, 1, 1, "", "Action"], [21, 1, 1, "", "FindAction"], [21, 1, 1, "", "LookAction"], [21, 1, 1, "", "MotionAction"]], "pomdp_py.problems.multi_object_search.domain.action.MotionAction": [[21, 3, 1, "", "BACKWARD"], [21, 3, 1, "", "EAST"], [21, 3, 1, "", "EAST2D"], [21, 3, 1, "", "FORWARD"], [21, 3, 1, "", "LEFT"], [21, 3, 1, "", "NORTH"], [21, 3, 1, "", "NORTH2D"], [21, 3, 1, "", "RIGHT"], [21, 3, 1, "", "SCHEMES"], [21, 3, 1, "", "SCHEME_VW"], [21, 3, 1, "", "SCHEME_XY"], [21, 3, 1, "", "SCHEME_XYTH"], [21, 3, 1, "", "SOUTH"], [21, 3, 1, "", "SOUTH2D"], [21, 3, 1, "", "WEST"], [21, 3, 1, "", "WEST2D"]], "pomdp_py.problems.multi_object_search.domain.observation": [[21, 1, 1, "", "MosOOObservation"], [21, 1, 1, "", "ObjectObservation"]], "pomdp_py.problems.multi_object_search.domain.observation.MosOOObservation": [[21, 2, 1, "", "factor"], [21, 2, 1, "", "for_obj"], [21, 2, 1, "", "merge"]], "pomdp_py.problems.multi_object_search.domain.observation.ObjectObservation": [[21, 3, 1, "", "NULL"]], "pomdp_py.problems.multi_object_search.domain.state": [[21, 1, 1, "", "MosOOState"], [21, 1, 1, "", "ObjectState"], [21, 1, 1, "", "RobotState"]], "pomdp_py.problems.multi_object_search.domain.state.MosOOState": [[21, 2, 1, "", "object_pose"], [21, 5, 1, "", "object_poses"], [21, 2, 1, "", "pose"]], "pomdp_py.problems.multi_object_search.domain.state.ObjectState": [[21, 5, 1, "", "objid"], [21, 5, 1, "", "pose"]], "pomdp_py.problems.multi_object_search.domain.state.RobotState": [[21, 5, 1, "", "objects_found"], [21, 5, 1, "", "pose"], [21, 5, 1, "", "robot_pose"]], "pomdp_py.problems.multi_object_search.env": [[22, 0, 0, "-", "env"]], "pomdp_py.problems.multi_object_search.env.env": [[22, 1, 1, "", "MosEnvironment"], [22, 4, 1, "", "equip_sensors"], [22, 4, 1, "", "interpret"], [22, 4, 1, "", "interpret_robot_id"], [22, 4, 1, "", "make_laser_sensor"], [22, 4, 1, "", "make_proximity_sensor"]], "pomdp_py.problems.multi_object_search.env.env.MosEnvironment": [[22, 5, 1, "", "robot_ids"], [22, 2, 1, "", "state_transition"]], "pomdp_py.problems.multi_object_search.example_worlds": [[19, 4, 1, "", "random_world"]], "pomdp_py.problems.multi_object_search.models": [[24, 0, 0, "-", "components"], [23, 0, 0, "-", "observation_model"], [23, 0, 0, "-", "policy_model"], [23, 0, 0, "-", "reward_model"], [23, 0, 0, "-", "transition_model"]], "pomdp_py.problems.multi_object_search.models.components": [[24, 0, 0, "-", "grid_map"], [24, 0, 0, "-", "sensor"]], "pomdp_py.problems.multi_object_search.models.components.grid_map": [[24, 1, 1, "", "GridMap"]], "pomdp_py.problems.multi_object_search.models.components.grid_map.GridMap": [[24, 2, 1, "", "valid_motions"]], "pomdp_py.problems.multi_object_search.models.components.sensor": [[24, 1, 1, "", "Laser2DSensor"], [24, 1, 1, "", "ProximitySensor"], [24, 1, 1, "", "Sensor"], [24, 4, 1, "", "euclidean_dist"], [24, 4, 1, "", "in_range"], [24, 4, 1, "", "to_rad"]], "pomdp_py.problems.multi_object_search.models.components.sensor.Laser2DSensor": [[24, 2, 1, "", "in_field_of_view"], [24, 2, 1, "", "observe"], [24, 5, 1, "", "sensing_region_size"], [24, 2, 1, "", "shoot_beam"], [24, 2, 1, "", "valid_beam"], [24, 2, 1, "", "within_range"]], "pomdp_py.problems.multi_object_search.models.components.sensor.Sensor": [[24, 3, 1, "", "LASER"], [24, 3, 1, "", "PROXIMITY"], [24, 2, 1, "", "observe"], [24, 5, 1, "", "robot_id"], [24, 5, 1, "", "sensing_region_size"], [24, 2, 1, "", "within_range"]], "pomdp_py.problems.multi_object_search.models.observation_model": [[23, 1, 1, "", "MosObservationModel"], [23, 1, 1, "", "ObjectObservationModel"], [23, 4, 1, "", "unittest"]], "pomdp_py.problems.multi_object_search.models.observation_model.MosObservationModel": [[23, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.observation_model.ObjectObservationModel": [[23, 2, 1, "", "argmax"], [23, 2, 1, "", "probability"], [23, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.policy_model": [[23, 1, 1, "", "PolicyModel"]], "pomdp_py.problems.multi_object_search.models.policy_model.PolicyModel": [[23, 2, 1, "", "argmax"], [23, 2, 1, "", "get_all_actions"], [23, 2, 1, "", "probability"], [23, 2, 1, "", "rollout"], [23, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.reward_model": [[23, 1, 1, "", "GoalRewardModel"], [23, 1, 1, "", "MosRewardModel"]], "pomdp_py.problems.multi_object_search.models.reward_model.MosRewardModel": [[23, 2, 1, "", "argmax"], [23, 2, 1, "", "probability"], [23, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.transition_model": [[23, 1, 1, "", "MosTransitionModel"], [23, 1, 1, "", "RobotTransitionModel"], [23, 1, 1, "", "StaticObjectTransitionModel"], [23, 4, 1, "", "in_boundary"], [23, 4, 1, "", "valid_pose"]], "pomdp_py.problems.multi_object_search.models.transition_model.MosTransitionModel": [[23, 2, 1, "", "argmax"], [23, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.transition_model.RobotTransitionModel": [[23, 2, 1, "", "argmax"], [23, 2, 1, "", "if_move_by"], [23, 2, 1, "", "probability"], [23, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.transition_model.StaticObjectTransitionModel": [[23, 2, 1, "", "argmax"], [23, 2, 1, "", "probability"], [23, 2, 1, "", "sample"]], "pomdp_py.problems.rocksample": [[26, 0, 0, "-", "cythonize"], [25, 0, 0, "-", "rocksample_problem"]], "pomdp_py.problems.rocksample.cythonize": [[26, 0, 0, "module-2", "rocksample_problem"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem": [[26, 1, 1, "id99", "CheckAction"], [26, 1, 1, "id101", "MoveAction"], [26, 1, 1, "id107", "RSAction"], [26, 1, 1, "id108", "RSObservation"], [26, 1, 1, "id110", "RSObservationModel"], [26, 1, 1, "id114", "RSPolicyModel"], [26, 1, 1, "id120", "RSRewardModel"], [26, 1, 1, "id124", "RSState"], [26, 1, 1, "id128", "RSTransitionModel"], [26, 1, 1, "id132", "RockSampleProblem"], [26, 1, 1, "id137", "RockType"], [26, 1, 1, "id142", "SampleAction"], [26, 4, 1, "id143", "euclidean_dist"], [26, 4, 1, "id144", "init_particles_belief"], [26, 4, 1, "id145", "main"], [26, 4, 1, "id146", "test_planner"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.CheckAction": [[26, 3, 1, "id100", "rock_id"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction": [[26, 3, 1, "id102", "EAST"], [26, 3, 1, "id103", "NORTH"], [26, 3, 1, "id104", "SOUTH"], [26, 3, 1, "id105", "WEST"], [26, 3, 1, "id106", "motion"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservation": [[26, 3, 1, "id109", "quality"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservationModel": [[26, 2, 1, "id111", "argmax"], [26, 2, 1, "id112", "probability"], [26, 2, 1, "id113", "sample"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel": [[26, 2, 1, "id115", "argmax"], [26, 2, 1, "id116", "get_all_actions"], [26, 2, 1, "id117", "probability"], [26, 2, 1, "id118", "rollout"], [26, 2, 1, "id119", "sample"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSRewardModel": [[26, 2, 1, "id121", "argmax"], [26, 2, 1, "id122", "probability"], [26, 2, 1, "id123", "sample"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState": [[26, 3, 1, "id125", "position"], [26, 3, 1, "id126", "rocktypes"], [26, 3, 1, "id127", "terminal"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSTransitionModel": [[26, 2, 1, "id129", "argmax"], [26, 2, 1, "id130", "probability"], [26, 2, 1, "id131", "sample"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem": [[26, 2, 1, "id133", "generate_instance"], [26, 2, 1, "id134", "in_exit_area"], [26, 2, 1, "id135", "print_state"], [26, 2, 1, "id136", "random_free_location"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType": [[26, 3, 1, "id138", "BAD"], [26, 3, 1, "id139", "GOOD"], [26, 2, 1, "id140", "invert"], [26, 2, 1, "id141", "random"]], "pomdp_py.problems.rocksample.rocksample_problem": [[25, 1, 1, "", "Action"], [25, 1, 1, "", "CheckAction"], [25, 1, 1, "", "MoveAction"], [25, 1, 1, "", "Observation"], [25, 1, 1, "", "RSObservationModel"], [25, 1, 1, "", "RSPolicyModel"], [25, 1, 1, "", "RSRewardModel"], [25, 1, 1, "", "RSTransitionModel"], [25, 1, 1, "", "RockSampleProblem"], [25, 1, 1, "", "RockType"], [25, 1, 1, "", "SampleAction"], [25, 1, 1, "", "State"], [25, 4, 1, "", "euclidean_dist"], [25, 4, 1, "", "init_particles_belief"], [25, 4, 1, "", "main"], [25, 4, 1, "", "test_planner"]], "pomdp_py.problems.rocksample.rocksample_problem.MoveAction": [[25, 3, 1, "", "EAST"], [25, 3, 1, "", "NORTH"], [25, 3, 1, "", "SOUTH"], [25, 3, 1, "", "WEST"]], "pomdp_py.problems.rocksample.rocksample_problem.RSObservationModel": [[25, 2, 1, "", "argmax"], [25, 2, 1, "", "probability"], [25, 2, 1, "", "sample"]], "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel": [[25, 2, 1, "", "argmax"], [25, 2, 1, "", "get_all_actions"], [25, 2, 1, "", "probability"], [25, 2, 1, "", "rollout"], [25, 2, 1, "", "sample"]], "pomdp_py.problems.rocksample.rocksample_problem.RSRewardModel": [[25, 2, 1, "", "argmax"], [25, 2, 1, "", "probability"], [25, 2, 1, "", "sample"]], "pomdp_py.problems.rocksample.rocksample_problem.RSTransitionModel": [[25, 2, 1, "", "argmax"], [25, 2, 1, "", "probability"], [25, 2, 1, "", "sample"]], "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem": [[25, 2, 1, "", "generate_instance"], [25, 2, 1, "", "in_exit_area"], [25, 2, 1, "", "print_state"], [25, 2, 1, "", "random_free_location"]], "pomdp_py.problems.rocksample.rocksample_problem.RockType": [[25, 3, 1, "", "BAD"], [25, 3, 1, "", "GOOD"], [25, 2, 1, "", "invert"], [25, 2, 1, "", "random"]], "pomdp_py.problems.tag": [[28, 0, 0, "-", "agent"], [27, 0, 0, "-", "constants"], [29, 0, 0, "-", "domain"], [30, 0, 0, "-", "env"], [27, 0, 0, "-", "example_worlds"], [31, 0, 0, "-", "models"]], "pomdp_py.problems.tag.agent": [[28, 0, 0, "-", "agent"]], "pomdp_py.problems.tag.agent.agent": [[28, 1, 1, "", "TagAgent"], [28, 4, 1, "", "belief_update"], [28, 4, 1, "", "initialize_belief"], [28, 4, 1, "", "initialize_particles_belief"]], "pomdp_py.problems.tag.agent.agent.TagAgent": [[28, 2, 1, "", "clear_history"]], "pomdp_py.problems.tag.domain": [[29, 0, 0, "-", "action"], [29, 0, 0, "-", "observation"], [29, 0, 0, "-", "state"]], "pomdp_py.problems.tag.domain.action": [[29, 1, 1, "", "TagAction"]], "pomdp_py.problems.tag.domain.observation": [[29, 1, 1, "", "TagObservation"]], "pomdp_py.problems.tag.domain.state": [[29, 1, 1, "", "TagState"]], "pomdp_py.problems.tag.models": [[32, 0, 0, "-", "components"], [31, 0, 0, "-", "observation_model"], [31, 0, 0, "-", "policy_model"], [31, 0, 0, "-", "reward_model"], [31, 0, 0, "-", "transition_model"]], "pomdp_py.problems.tag.models.components": [[32, 0, 0, "-", "grid_map"], [32, 0, 0, "-", "motion_policy"]], "pomdp_py.problems.tag.models.components.grid_map": [[32, 1, 1, "", "GridMap"]], "pomdp_py.problems.tag.models.components.grid_map.GridMap": [[32, 2, 1, "", "free_cells"], [32, 2, 1, "", "from_str"], [32, 2, 1, "", "valid_motions"], [32, 2, 1, "", "valid_pose"]], "pomdp_py.problems.tag.models.components.motion_policy": [[32, 1, 1, "", "TagTargetMotionPolicy"]], "pomdp_py.problems.tag.models.components.motion_policy.TagTargetMotionPolicy": [[32, 2, 1, "", "mpe"], [32, 2, 1, "", "probability"], [32, 2, 1, "", "random"]], "pomdp_py.problems.tag.models.observation_model": [[31, 1, 1, "", "TagObservationModel"]], "pomdp_py.problems.tag.models.observation_model.TagObservationModel": [[31, 2, 1, "", "argmax"], [31, 2, 1, "", "probability"], [31, 2, 1, "", "sample"]], "pomdp_py.problems.tag.models.policy_model": [[31, 1, 1, "", "TagPolicyModel"]], "pomdp_py.problems.tag.models.policy_model.TagPolicyModel": [[31, 2, 1, "", "get_all_actions"], [31, 2, 1, "", "rollout"], [31, 2, 1, "", "sample"]], "pomdp_py.problems.tag.models.reward_model": [[31, 1, 1, "", "TagRewardModel"]], "pomdp_py.problems.tag.models.reward_model.TagRewardModel": [[31, 2, 1, "", "probability"], [31, 2, 1, "", "sample"]], "pomdp_py.problems.tag.models.transition_model": [[31, 1, 1, "", "TagTransitionModel"]], "pomdp_py.problems.tag.models.transition_model.TagTransitionModel": [[31, 2, 1, "", "argmax"], [31, 2, 1, "", "if_move_by"], [31, 2, 1, "", "probability"], [31, 2, 1, "", "sample"]], "pomdp_py.problems.tiger": [[34, 0, 0, "-", "cythonize"], [33, 0, 0, "-", "tiger_problem"]], "pomdp_py.problems.tiger.cythonize": [[34, 0, 0, "module-2", "tiger_problem"]], "pomdp_py.problems.tiger.cythonize.tiger_problem": [[34, 1, 1, "id80", "TigerAction"], [34, 1, 1, "id81", "TigerObservation"], [34, 1, 1, "id83", "TigerObservationModel"], [34, 1, 1, "id89", "TigerPolicyModel"], [34, 1, 1, "id94", "TigerProblem"], [34, 1, 1, "id98", "TigerRewardModel"], [34, 1, 1, "id103", "TigerState"], [34, 1, 1, "id105", "TigerTransitionModel"], [34, 4, 1, "id111", "build_actions"], [34, 4, 1, "id112", "build_observations"], [34, 4, 1, "id113", "build_setting"], [34, 4, 1, "id114", "build_states"], [34, 4, 1, "id115", "main"], [34, 4, 1, "id116", "test_planner"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservation": [[34, 3, 1, "id82", "name"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel": [[34, 2, 1, "id84", "argmax"], [34, 2, 1, "id85", "get_all_observations"], [34, 2, 1, "id86", "get_distribution"], [34, 2, 1, "id87", "probability"], [34, 2, 1, "id88", "sample"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel": [[34, 2, 1, "id90", "argmax"], [34, 2, 1, "id91", "get_all_actions"], [34, 2, 1, "id92", "probability"], [34, 2, 1, "id93", "sample"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem": [[34, 3, 1, "id95", "ACTIONS"], [34, 3, 1, "id96", "OBSERVATIONS"], [34, 3, 1, "id97", "STATES"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel": [[34, 2, 1, "id99", "argmax"], [34, 2, 1, "id100", "get_distribution"], [34, 2, 1, "id101", "probability"], [34, 2, 1, "id102", "sample"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerState": [[34, 3, 1, "id104", "name"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel": [[34, 2, 1, "id106", "argmax"], [34, 2, 1, "id107", "get_all_states"], [34, 2, 1, "id108", "get_distribution"], [34, 2, 1, "id109", "probability"], [34, 2, 1, "id110", "sample"]], "pomdp_py.problems.tiger.tiger_problem": [[33, 1, 1, "", "ObservationModel"], [33, 1, 1, "", "PolicyModel"], [33, 1, 1, "", "RewardModel"], [33, 1, 1, "", "TigerAction"], [33, 1, 1, "", "TigerObservation"], [33, 1, 1, "", "TigerProblem"], [33, 1, 1, "", "TigerState"], [33, 1, 1, "", "TransitionModel"], [33, 4, 1, "", "main"], [33, 4, 1, "", "make_tiger"], [33, 4, 1, "", "test_planner"]], "pomdp_py.problems.tiger.tiger_problem.ObservationModel": [[33, 2, 1, "", "get_all_observations"], [33, 2, 1, "", "probability"], [33, 2, 1, "", "sample"]], "pomdp_py.problems.tiger.tiger_problem.PolicyModel": [[33, 3, 1, "", "ACTIONS"], [33, 2, 1, "", "get_all_actions"], [33, 2, 1, "", "rollout"], [33, 2, 1, "", "sample"]], "pomdp_py.problems.tiger.tiger_problem.RewardModel": [[33, 2, 1, "", "sample"]], "pomdp_py.problems.tiger.tiger_problem.TigerProblem": [[33, 2, 1, "", "create"]], "pomdp_py.problems.tiger.tiger_problem.TigerState": [[33, 2, 1, "", "other"]], "pomdp_py.problems.tiger.tiger_problem.TransitionModel": [[33, 2, 1, "", "get_all_states"], [33, 2, 1, "", "probability"], [33, 2, 1, "", "sample"]], "pomdp_py.representations.belief": [[36, 0, 0, "-", "histogram"], [36, 0, 0, "-", "particles"]], "pomdp_py.representations.belief.histogram": [[36, 4, 1, "", "abstraction_over_histogram"], [36, 4, 1, "", "update_histogram_belief"]], "pomdp_py.representations.belief.particles": [[36, 4, 1, "", "abstraction_over_particles"], [36, 4, 1, "", "particle_reinvigoration"], [36, 4, 1, "", "update_particles_belief"]], "pomdp_py.representations.distribution": [[37, 0, 0, "-", "gaussian"], [37, 0, 0, "-", "histogram"], [37, 0, 0, "-", "particles"]], "pomdp_py.representations.distribution.gaussian": [[37, 1, 1, "", "Gaussian"]], "pomdp_py.representations.distribution.gaussian.Gaussian": [[37, 2, 1, "", "__getitem__"], [37, 2, 1, "", "__setitem__"], [37, 3, 1, "", "cov"], [37, 3, 1, "", "covariance"], [37, 3, 1, "", "mean"], [37, 2, 1, "", "mpe"], [37, 2, 1, "", "random"], [37, 3, 1, "", "sigma"]], "pomdp_py.representations.distribution.histogram": [[37, 1, 1, "", "Histogram"]], "pomdp_py.representations.distribution.histogram.Histogram": [[37, 2, 1, "", "__getitem__"], [37, 2, 1, "", "__setitem__"], [37, 2, 1, "", "get_histogram"], [37, 3, 1, "", "histogram"], [37, 2, 1, "", "is_normalized"], [37, 2, 1, "", "mpe"], [37, 2, 1, "", "random"]], "pomdp_py.representations.distribution.particles": [[37, 1, 1, "", "Particles"], [37, 1, 1, "", "WeightedParticles"]], "pomdp_py.representations.distribution.particles.Particles": [[37, 2, 1, "", "add"], [37, 2, 1, "", "from_histogram"], [37, 2, 1, "", "get_abstraction"], [37, 2, 1, "", "get_histogram"], [37, 3, 1, "", "particles"], [37, 2, 1, "", "random"]], "pomdp_py.representations.distribution.particles.WeightedParticles": [[37, 2, 1, "", "__getitem__"], [37, 2, 1, "", "__setitem__"], [37, 2, 1, "", "add"], [37, 2, 1, "", "condense"], [37, 2, 1, "", "from_histogram"], [37, 2, 1, "", "get_histogram"], [37, 2, 1, "", "mpe"], [37, 3, 1, "", "particles"], [37, 2, 1, "", "random"], [37, 3, 1, "", "values"], [37, 3, 1, "", "weights"]], "pomdp_py.utils": [[38, 0, 0, "-", "colors"], [38, 0, 0, "-", "cython_utils"], [38, 0, 0, "-", "debugging"], [38, 0, 0, "-", "math"], [38, 0, 0, "-", "misc"], [38, 0, 0, "-", "templates"], [38, 0, 0, "-", "typ"]], "pomdp_py.utils.colors": [[38, 4, 1, "", "hex_to_rgb"], [38, 4, 1, "", "inverse_color_hex"], [38, 4, 1, "", "inverse_color_rgb"], [38, 4, 1, "", "lighter"], [38, 4, 1, "", "random_unique_color"], [38, 4, 1, "", "rgb_to_hex"]], "pomdp_py.utils.cython_utils": [[38, 4, 1, "", "det_dict_hash"]], "pomdp_py.utils.debugging": [[38, 1, 1, "", "TreeDebugger"], [38, 4, 1, "", "interpret_color"], [38, 4, 1, "", "sorted_by_str"]], "pomdp_py.utils.debugging.TreeDebugger": [[38, 5, 1, "", "b"], [38, 2, 1, "", "back"], [38, 5, 1, "", "bestseq"], [38, 2, 1, "", "bestseqd"], [38, 5, 1, "", "c"], [38, 5, 1, "", "clear"], [38, 5, 1, "", "d"], [38, 5, 1, "", "depth"], [38, 2, 1, "", "l"], [38, 2, 1, "", "layer"], [38, 5, 1, "", "leaf"], [38, 2, 1, "", "mark"], [38, 2, 1, "", "mark_path"], [38, 2, 1, "", "mark_sequence"], [38, 2, 1, "", "markp"], [38, 5, 1, "", "mbp"], [38, 5, 1, "", "nl"], [38, 5, 1, "", "nn"], [38, 5, 1, "", "nq"], [38, 5, 1, "", "num_layers"], [38, 2, 1, "", "num_nodes"], [38, 5, 1, "", "nv"], [38, 2, 1, "", "p"], [38, 2, 1, "", "path"], [38, 2, 1, "", "path_to"], [38, 5, 1, "", "pm"], [38, 5, 1, "", "pp"], [38, 2, 1, "", "preferred_actions"], [38, 5, 1, "", "r"], [38, 5, 1, "", "root"], [38, 2, 1, "", "s"], [38, 2, 1, "", "single_node_str"], [38, 2, 1, "", "step"], [38, 2, 1, "", "tree_stats"]], "pomdp_py.utils.interfaces.conversion": [[47, 1, 1, "", "AlphaVectorPolicy"], [47, 1, 1, "", "PolicyGraph"], [47, 4, 1, "", "to_pomdp_file"], [47, 4, 1, "", "to_pomdpx_file"]], "pomdp_py.utils.interfaces.conversion.AlphaVectorPolicy": [[47, 2, 1, "", "construct"], [47, 2, 1, "", "plan"], [47, 2, 1, "", "value"]], "pomdp_py.utils.interfaces.conversion.PolicyGraph": [[47, 2, 1, "", "construct"], [47, 2, 1, "", "plan"], [47, 2, 1, "", "update"]], "pomdp_py.utils.interfaces": [[47, 0, 0, "-", "solvers"]], "pomdp_py.utils.interfaces.solvers": [[47, 4, 1, "", "sarsop"], [47, 4, 1, "", "vi_pruning"]], "pomdp_py.utils.math": [[38, 4, 1, "", "R_between"], [38, 4, 1, "", "R_x"], [38, 4, 1, "", "R_y"], [38, 4, 1, "", "R_z"], [38, 4, 1, "", "T"], [38, 4, 1, "", "approx_equal"], [38, 4, 1, "", "euclidean_dist"], [38, 4, 1, "", "proj"], [38, 4, 1, "", "to_radians"], [38, 4, 1, "", "vec"]], "pomdp_py.utils.misc": [[38, 4, 1, "", "json_safe"], [38, 4, 1, "", "remap"], [38, 4, 1, "", "safe_slice"], [38, 4, 1, "", "similar"], [38, 1, 1, "", "special_char"]], "pomdp_py.utils.misc.special_char": [[38, 3, 1, "", "SUBSCRIPT"], [38, 3, 1, "", "bottomleft"], [38, 3, 1, "", "bottomright"], [38, 3, 1, "", "bottomt"], [38, 3, 1, "", "down"], [38, 3, 1, "", "hline"], [38, 3, 1, "", "intersect"], [38, 3, 1, "", "left"], [38, 3, 1, "", "leftt"], [38, 3, 1, "", "longbottomleft"], [38, 3, 1, "", "longbottomright"], [38, 3, 1, "", "longleft"], [38, 3, 1, "", "longright"], [38, 3, 1, "", "longtopleft"], [38, 3, 1, "", "longtopright"], [38, 3, 1, "", "right"], [38, 3, 1, "", "rightt"], [38, 3, 1, "", "shadebar"], [38, 3, 1, "", "topleft"], [38, 3, 1, "", "topright"], [38, 3, 1, "", "topt"], [38, 3, 1, "", "up"], [38, 3, 1, "", "vline"]], "pomdp_py.utils.templates": [[38, 1, 1, "", "DetObservationModel"], [38, 1, 1, "", "DetRewardModel"], [38, 1, 1, "", "DetTransitionModel"], [38, 1, 1, "", "SimpleAction"], [38, 1, 1, "", "SimpleObservation"], [38, 1, 1, "", "SimpleState"], [38, 1, 1, "", "TabularObservationModel"], [38, 1, 1, "", "TabularRewardModel"], [38, 1, 1, "", "TabularTransitionModel"], [38, 1, 1, "", "UniformPolicyModel"]], "pomdp_py.utils.templates.DetObservationModel": [[38, 2, 1, "", "probability"], [38, 2, 1, "", "sample"]], "pomdp_py.utils.templates.DetRewardModel": [[38, 2, 1, "", "argmax"], [38, 2, 1, "", "reward_func"], [38, 2, 1, "", "sample"]], "pomdp_py.utils.templates.DetTransitionModel": [[38, 2, 1, "", "probability"], [38, 2, 1, "", "sample"]], "pomdp_py.utils.templates.TabularObservationModel": [[38, 2, 1, "", "get_all_observations"], [38, 2, 1, "", "probability"], [38, 2, 1, "", "sample"]], "pomdp_py.utils.templates.TabularRewardModel": [[38, 2, 1, "", "sample"]], "pomdp_py.utils.templates.TabularTransitionModel": [[38, 2, 1, "", "get_all_states"], [38, 2, 1, "", "probability"], [38, 2, 1, "", "sample"]], "pomdp_py.utils.templates.UniformPolicyModel": [[38, 2, 1, "", "get_all_actions"], [38, 2, 1, "", "rollout"], [38, 2, 1, "", "sample"]], "pomdp_py.utils.typ": [[38, 1, 1, "", "bcolors"], [38, 4, 1, "", "blue"], [38, 4, 1, "", "bold"], [38, 4, 1, "", "cyan"], [38, 4, 1, "", "error"], [38, 4, 1, "", "green"], [38, 4, 1, "", "info"], [38, 4, 1, "", "magenta"], [38, 4, 1, "", "note"], [38, 4, 1, "", "red"], [38, 4, 1, "", "success"], [38, 4, 1, "", "warning"], [38, 4, 1, "", "white"], [38, 4, 1, "", "yellow"]], "pomdp_py.utils.typ.bcolors": [[38, 3, 1, "", "BLUE"], [38, 3, 1, "", "BOLD"], [38, 3, 1, "", "CYAN"], [38, 3, 1, "", "ENDC"], [38, 3, 1, "", "GREEN"], [38, 3, 1, "", "MAGENTA"], [38, 3, 1, "", "RED"], [38, 3, 1, "", "WHITE"], [38, 3, 1, "", "YELLOW"], [38, 2, 1, "", "disable"], [38, 2, 1, "", "s"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function", "5": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "function", "Python function"], "5": ["py", "property", "Python property"]}, "titleterms": {"pomdp_pi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 47, 53, 57], "packag": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 57], "algorithm": [2, 3, 4], "po_rollout": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 57], "po_uct": 2, "pomcp": 2, "value_iter": 2, "bsp": [2, 3], "blqr": [2, 3], "visual": [2, 4, 11, 22, 30, 41], "submodul": [3, 4, 8, 9, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 38, 41], "content": [3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 38, 41, 47, 54], "framework": 5, "basic": 5, "oopomdp": 5, "planner": 5, "problem": [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 42, 48], "subpackag": [6, 8, 14, 17, 19, 23, 25, 27, 31, 33, 38], "lasertag": 7, "light_dark": [8, 9, 10, 11, 12], "problem_discret": 8, "test": [8, 54], "agent": [9, 20, 28, 47], "belief": [9, 20, 36], "domain": [10, 15, 21, 29, 49, 50], "action": [10, 15, 21, 29, 46], "observ": [10, 15, 21, 29], "state": [10, 15, 21, 29], "env": [11, 16, 22, 30], "plot": [11, 38], "model": [12, 17, 18, 23, 24, 31, 32, 49], "observation_model": [12, 23, 31], "transition_model": [12, 23, 31], "load_unload": 13, "maze": [14, 15, 16, 17, 18], "compon": [18, 24, 32], "map": 18, "multi_object_search": [19, 20, 21, 22, 23, 24], "example_world": [19, 27], "policy_model": [23, 31], "reward_model": [23, 31], "grid_map": [24, 32], "sensor": 24, "rocksampl": [25, 26], "cython": [25, 26, 33, 34], "rocksample_problem": [25, 26], "run_rocksampl": 26, "tag": [27, 28, 29, 30, 31, 32], "constant": 27, "experi": 27, "motion_polici": 32, "tiger": [33, 34, 45, 49], "tiger_problem": [33, 34], "run_tig": 34, "represent": [35, 36, 37], "histogram": [36, 37], "particl": [36, 37], "distribut": 37, "gaussian": 37, "util": [38, 39, 40, 57], "color": 38, "cython_util": 38, "cpython": 38, "37m": 38, "x86_64": 38, "linux": 38, "gnu": 38, "debug": [38, 39], "treedebugg": [38, 39], "math": 38, "misc": 38, "templat": 38, "test_util": 38, "typ": 38, "interfac": [40, 57], "simple_rl": [40, 57], "search_tre": 41, "build": 42, "document": [42, 53], "doc": [42, 55], "pomdp_problem": [], "note": 42, "changelog": [42, 43], "design": 44, "principl": 44, "exampl": [45, 47], "multi": [45, 48], "object": [45, 48], "search": [45, 48], "mo": [45, 48], "prefer": 46, "base": 46, "prior": 46, "us": [47, 52], "extern": 47, "solver": [47, 51], "tabl": [47, 54], "convert": 47, "pomdp": [47, 48, 49, 50, 51, 54, 56], "file": 47, "solv": [47, 49], "sarsop": 47, "policygraph": 47, "alphavectorpolici": 47, "overview": [48, 53], "implement": 48, "thi": 48, "convent": 48, "try": 48, "defin": 49, "instanti": 49, "instanc": 49, "summari": 49, "exist": [50, 51], "case": 52, "extens": 52, "get": 53, "start": 53, "further": 53, "citat": 53, "api": 53, "refer": 53, "tool": 53, "instal": 54, "pre": 54, "py": 54, "thing": 54, "out": 54, "docker": 54, "imag": 54, "other": 56, "librari": 56, "integr": 57, "version": 43, "1": 43, "3": 43, "4": 43, "01": 43, "26": 43, "2024": 43, "07": 43, "25": 43, "2023": 43, "2": 43, "04": 43, "03": 43, "2022": 43, "11": 43, "2021": 43, "0": 43, "09": 43, "30": 43, "6": 43, "cancel": 43, "5": 43, "05": 43, "06": 43, "02": 43, "22": 43, "17": 43, "12": 43, "23": 43, "2020": 43, "pull": 43, "request": 43, "08": 43, "16": 43}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinxcontrib.bibtex": 9, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"pomdp_py": [[0, "pomdp-py"]], "pomdp_py package": [[1, "pomdp-py-package"]], "pomdp_py.framework package": [[5, "pomdp-py-framework-package"]], "pomdp_py.framework.basics module": [[5, "module-pomdp_py.framework.basics"]], "pomdp_py.framework.oopomdp module": [[5, "module-pomdp_py.framework.oopomdp"]], "pomdp_py.framework.planner module": [[5, "module-pomdp_py.framework.planner"]], "pomdp_py.representations package": [[35, "pomdp-py-representations-package"]], "pomdp_py.representations.distribution package": [[37, "pomdp-py-representations-distribution-package"]], "pomdp_py.representations.distribution.histogram module": [[37, "module-pomdp_py.representations.distribution.histogram"]], "pomdp_py.representations.distribution.particles module": [[37, "module-pomdp_py.representations.distribution.particles"]], "pomdp_py.representations.distribution.gaussian module": [[37, "module-pomdp_py.representations.distribution.gaussian"]], "Design Principles": [[44, "design-principles"]], "Examples": [[45, "examples"]], "Tiger": [[45, "tiger"], [49, "tiger"]], "Multi-Object Search (MOS)": [[45, "multi-object-search-mos"], [48, "multi-object-search-mos"]], "Preference-based Action Prior": [[46, "preference-based-action-prior"]], "Existing POMDP Solvers": [[51, "existing-pomdp-solvers"]], "Use Case Extensions": [[52, "use-case-extensions"]], "docs": [[55, "docs"]], "Other POMDP Libraries": [[56, "other-pomdp-libraries"]], "pomdp_py.algorithms.bsp.blqr module": [[3, "module-pomdp_py.algorithms.bsp.blqr"], [2, "module-pomdp_py.algorithms.bsp.blqr"]], "pomdp_py.algorithms.bsp package": [[3, "pomdp-py-algorithms-bsp-package"]], "Submodules": [[3, "submodules"], [15, "submodules"], [16, "submodules"], [20, "submodules"], [21, "submodules"], [23, "submodules"], [24, "submodules"], [25, "submodules"], [28, "submodules"], [29, "submodules"], [31, "submodules"], [32, "submodules"], [33, "submodules"], [4, "submodules"], [8, "submodules"], [9, "submodules"], [10, "submodules"], [11, "submodules"], [12, "submodules"], [13, "submodules"], [18, "submodules"], [19, "submodules"], [22, "submodules"], [26, "submodules"], [27, "submodules"], [30, "submodules"], [34, "submodules"], [38, "submodules"], [41, "submodules"]], "Module contents": [[3, "module-pomdp_py.algorithms.bsp"], [6, "module-pomdp_py.problems"], [7, "module-pomdp_py.problems.lasertag"], [14, "module-pomdp_py.problems.maze"], [15, "module-pomdp_py.problems.maze.domain"], [16, "module-pomdp_py.problems.maze.env"], [17, "module-pomdp_py.problems.maze.models"], [20, "module-pomdp_py.problems.multi_object_search.agent"], [21, "module-pomdp_py.problems.multi_object_search.domain"], [23, "module-pomdp_py.problems.multi_object_search.models"], [24, "module-pomdp_py.problems.multi_object_search.models.components"], [25, "module-pomdp_py.problems.rocksample"], [28, "module-pomdp_py.problems.tag.agent"], [29, "module-pomdp_py.problems.tag.domain"], [31, "module-pomdp_py.problems.tag.models"], [32, "module-pomdp_py.problems.tag.models.components"], [33, "module-pomdp_py.problems.tiger"], [4, "module-contents"], [8, "module-contents"], [9, "module-contents"], [10, "module-contents"], [11, "module-pomdp_py.problems.light_dark.env"], [12, "module-contents"], [13, "module-pomdp_py.problems.load_unload"], [18, "module-pomdp_py.problems.maze.models.components"], [19, "module-pomdp_py.problems.multi_object_search"], [22, "module-pomdp_py.problems.multi_object_search.env"], [26, "module-pomdp_py.problems.rocksample.cythonize"], [27, "module-pomdp_py.problems.tag"], [30, "module-pomdp_py.problems.tag.env"], [34, "module-pomdp_py.problems.tiger.cythonize"], [38, "module-pomdp_py.utils"], [41, "module-contents"]], "pomdp_py.problems package": [[6, "pomdp-py-problems-package"]], "Subpackages": [[6, "subpackages"], [14, "subpackages"], [17, "subpackages"], [23, "subpackages"], [25, "subpackages"], [31, "subpackages"], [33, "subpackages"], [8, "subpackages"], [19, "subpackages"], [27, "subpackages"], [38, "subpackages"]], "pomdp_py.problems.lasertag package": [[7, "pomdp-py-problems-lasertag-package"]], "pomdp_py.problems.maze package": [[14, "pomdp-py-problems-maze-package"]], "Maze": [[14, "maze"]], "pomdp_py.problems.maze.domain package": [[15, "pomdp-py-problems-maze-domain-package"]], "pomdp_py.problems.maze.domain.action module": [[15, "module-pomdp_py.problems.maze.domain.action"]], "pomdp_py.problems.maze.domain.observation module": [[15, "module-pomdp_py.problems.maze.domain.observation"]], "pomdp_py.problems.maze.domain.state module": [[15, "module-pomdp_py.problems.maze.domain.state"]], "pomdp_py.problems.maze.env package": [[16, "pomdp-py-problems-maze-env-package"]], "pomdp_py.problems.maze.env.env module": [[16, "module-pomdp_py.problems.maze.env.env"]], "pomdp_py.problems.maze.models package": [[17, "pomdp-py-problems-maze-models-package"]], "pomdp_py.problems.multi_object_search.agent package": [[20, "pomdp-py-problems-multi-object-search-agent-package"]], "pomdp_py.problems.multi_object_search.agent.agent module": [[20, "module-pomdp_py.problems.multi_object_search.agent.agent"]], "pomdp_py.problems.multi_object_search.agent.belief module": [[20, "module-pomdp_py.problems.multi_object_search.agent.belief"]], "pomdp_py.problems.multi_object_search.domain package": [[21, "pomdp-py-problems-multi-object-search-domain-package"]], "pomdp_py.problems.multi_object_search.domain.action module": [[21, "module-pomdp_py.problems.multi_object_search.domain.action"]], "pomdp_py.problems.multi_object_search.domain.observation module": [[21, "module-pomdp_py.problems.multi_object_search.domain.observation"]], "pomdp_py.problems.multi_object_search.domain.state module": [[21, "module-pomdp_py.problems.multi_object_search.domain.state"]], "pomdp_py.problems.multi_object_search.models package": [[23, "pomdp-py-problems-multi-object-search-models-package"]], "pomdp_py.problems.multi_object_search.models.observation_model module": [[23, "module-pomdp_py.problems.multi_object_search.models.observation_model"]], "pomdp_py.problems.multi_object_search.models.policy_model module": [[23, "module-pomdp_py.problems.multi_object_search.models.policy_model"]], "pomdp_py.problems.multi_object_search.models.reward_model module": [[23, "module-pomdp_py.problems.multi_object_search.models.reward_model"]], "pomdp_py.problems.multi_object_search.models.transition_model module": [[23, "module-pomdp_py.problems.multi_object_search.models.transition_model"]], "pomdp_py.problems.multi_object_search.models.components package": [[24, "pomdp-py-problems-multi-object-search-models-components-package"]], "pomdp_py.problems.multi_object_search.models.components.grid_map module": [[24, "module-pomdp_py.problems.multi_object_search.models.components.grid_map"]], "pomdp_py.problems.multi_object_search.models.components.sensor module": [[24, "module-pomdp_py.problems.multi_object_search.models.components.sensor"]], "pomdp_py.problems.rocksample package": [[25, "pomdp-py-problems-rocksample-package"]], "pomdp_py.problems.rocksample.cythonize module": [[25, "module-pomdp_py.problems.rocksample.cythonize"]], "pomdp_py.problems.rocksample.rocksample_problem module": [[25, "module-pomdp_py.problems.rocksample.rocksample_problem"]], "pomdp_py.problems.tag.agent package": [[28, "pomdp-py-problems-tag-agent-package"]], "pomdp_py.problems.tag.agent.agent module": [[28, "module-pomdp_py.problems.tag.agent.agent"]], "pomdp_py.problems.tag.domain package": [[29, "pomdp-py-problems-tag-domain-package"]], "pomdp_py.problems.tag.domain.action module": [[29, "module-pomdp_py.problems.tag.domain.action"]], "pomdp_py.problems.tag.domain.observation module": [[29, "module-pomdp_py.problems.tag.domain.observation"]], "pomdp_py.problems.tag.domain.state module": [[29, "module-pomdp_py.problems.tag.domain.state"]], "pomdp_py.problems.tag.models package": [[31, "pomdp-py-problems-tag-models-package"]], "pomdp_py.problems.tag.models.observation_model module": [[31, "module-pomdp_py.problems.tag.models.observation_model"]], "pomdp_py.problems.tag.models.policy_model module": [[31, "module-pomdp_py.problems.tag.models.policy_model"]], "pomdp_py.problems.tag.models.reward_model module": [[31, "module-pomdp_py.problems.tag.models.reward_model"]], "pomdp_py.problems.tag.models.transition_model module": [[31, "module-pomdp_py.problems.tag.models.transition_model"]], "pomdp_py.problems.tag.models.components package": [[32, "pomdp-py-problems-tag-models-components-package"]], "pomdp_py.problems.tag.models.components.grid_map module": [[32, "module-pomdp_py.problems.tag.models.components.grid_map"]], "pomdp_py.problems.tag.models.components.motion_policy module": [[32, "module-pomdp_py.problems.tag.models.components.motion_policy"]], "pomdp_py.problems.tiger package": [[33, "pomdp-py-problems-tiger-package"]], "pomdp_py.problems.tiger.cythonize module": [[33, "module-pomdp_py.problems.tiger.cythonize"]], "pomdp_py.problems.tiger.tiger_problem module": [[33, "module-pomdp_py.problems.tiger.tiger_problem"]], "pomdp_py.representations.belief package": [[36, "pomdp-py-representations-belief-package"]], "pomdp_py.representations.belief.histogram module": [[36, "module-pomdp_py.representations.belief.histogram"]], "pomdp_py.representations.belief.particles module": [[36, "module-pomdp_py.representations.belief.particles"]], "pomdp_py.utils.debugging module": [[39, "module-pomdp_py.utils.debugging"], [38, "module-pomdp_py.utils.debugging"]], "TreeDebugger": [[39, "treedebugger"], [38, "treedebugger"]], "Building Documentations": [[42, "building-documentations"]], "Building docs for pomdp_py": [[42, "building-docs-for-pomdp-py"]], "Building docs for pomdp_py.problems": [[42, "building-docs-for-pomdp-py-problems"]], "Note on Changelog": [[42, "note-on-changelog"]], "Using External Solvers": [[47, "module-pomdp_py.utils.interfaces.solvers"]], "Table of Contents": [[47, "table-of-contents"], [54, "table-of-contents"]], "Converting a pomdp_py Agent to a POMDP File": [[47, "converting-a-pomdp-py-agent-to-a-pomdp-file"]], "Example": [[47, "example"], [47, "id2"], [47, "id4"]], "Using pomdp-solve": [[47, "using-pomdp-solve"]], "Using sarsop": [[47, "using-sarsop"]], "PolicyGraph and AlphaVectorPolicy": [[47, "policygraph-and-alphavectorpolicy"]], "Problem overview": [[48, "problem-overview"]], "Implementing this POMDP: Conventions": [[48, "implementing-this-pomdp-conventions"]], "Try it": [[48, "try-it"]], "Define the domain": [[49, "define-the-domain"]], "Define the models": [[49, "define-the-models"]], "Define the POMDP": [[49, "define-the-pomdp"]], "Instantiate the POMDP": [[49, "instantiate-the-pomdp"]], "Solve the POMDP instance": [[49, "solve-the-pomdp-instance"]], "Summary": [[49, "summary"]], "Existing POMDP Domains": [[50, "existing-pomdp-domains"]], "Installation": [[54, "installation"]], "Pre-installation": [[54, "pre-installation"]], "Install pomdp-py": [[54, "install-pomdp-py"]], "Test things out": [[54, "test-things-out"]], "Docker image": [[54, "docker-image"]], "pomdp_py.algorithms package": [[2, "pomdp-py-algorithms-package"]], "pomdp_py.algorithms.po_rollout module": [[2, "module-pomdp_py.algorithms.po_rollout"]], "pomdp_py.algorithms.po_uct module": [[2, "module-pomdp_py.algorithms.po_uct"]], "pomdp_py.algorithms.pomcp module": [[2, "module-pomdp_py.algorithms.pomcp"]], "pomdp_py.algorithms.value_iteration module": [[2, "module-pomdp_py.algorithms.value_iteration"]], "pomdp_py.algorithms.visual.visual module": [[2, "pomdp-py-algorithms-visual-visual-module"], [4, "pomdp-py-algorithms-visual-visual-module"]], "pomdp_py.algorithms.visual package": [[4, "pomdp-py-algorithms-visual-package"]], "pomdp_py.problems.light_dark package": [[8, "pomdp-py-problems-light-dark-package"]], "pomdp_py.problems.light_dark.problem_discrete module": [[8, "pomdp-py-problems-light-dark-problem-discrete-module"]], "pomdp_py.problems.light_dark.test module": [[8, "pomdp-py-problems-light-dark-test-module"]], "pomdp_py.problems.light_dark.agent package": [[9, "pomdp-py-problems-light-dark-agent-package"]], "pomdp_py.problems.light_dark.agent.belief module": [[9, "pomdp-py-problems-light-dark-agent-belief-module"]], "pomdp_py.problems.light_dark.domain package": [[10, "pomdp-py-problems-light-dark-domain-package"]], "pomdp_py.problems.light_dark.domain.action module": [[10, "pomdp-py-problems-light-dark-domain-action-module"]], "pomdp_py.problems.light_dark.domain.observation module": [[10, "pomdp-py-problems-light-dark-domain-observation-module"]], "pomdp_py.problems.light_dark.domain.state module": [[10, "pomdp-py-problems-light-dark-domain-state-module"]], "pomdp_py.problems.light_dark.env package": [[11, "pomdp-py-problems-light-dark-env-package"]], "pomdp_py.problems.light_dark.env.env module": [[11, "module-pomdp_py.problems.light_dark.env.env"]], "pomdp_py.problems.light_dark.env.plotting module": [[11, "pomdp-py-problems-light-dark-env-plotting-module"]], "pomdp_py.problems.light_dark.env.visual module": [[11, "pomdp-py-problems-light-dark-env-visual-module"]], "pomdp_py.problems.light_dark.models package": [[12, "pomdp-py-problems-light-dark-models-package"]], "pomdp_py.problems.light_dark.models.observation_model module": [[12, "pomdp-py-problems-light-dark-models-observation-model-module"]], "pomdp_py.problems.light_dark.models.transition_model module": [[12, "pomdp-py-problems-light-dark-models-transition-model-module"]], "pomdp_py.problems.load_unload package": [[13, "pomdp-py-problems-load-unload-package"]], "pomdp_py.problems.load_unload.load_unload module": [[13, "pomdp-py-problems-load-unload-load-unload-module"]], "pomdp_py.problems.maze.models.components package": [[18, "pomdp-py-problems-maze-models-components-package"]], "pomdp_py.problems.maze.models.components.map module": [[18, "pomdp-py-problems-maze-models-components-map-module"]], "pomdp_py.problems.multi_object_search package": [[19, "pomdp-py-problems-multi-object-search-package"]], "pomdp_py.problems.multi_object_search.example_worlds module": [[19, "module-pomdp_py.problems.multi_object_search.example_worlds"]], "pomdp_py.problems.multi_object_search.problem module": [[19, "pomdp-py-problems-multi-object-search-problem-module"]], "pomdp_py.problems.multi_object_search.env package": [[22, "pomdp-py-problems-multi-object-search-env-package"]], "pomdp_py.problems.multi_object_search.env.env module": [[22, "module-pomdp_py.problems.multi_object_search.env.env"]], "pomdp_py.problems.multi_object_search.env.visual module": [[22, "pomdp-py-problems-multi-object-search-env-visual-module"]], "pomdp_py.problems.rocksample.cythonize package": [[26, "pomdp-py-problems-rocksample-cythonize-package"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem module": [[26, "module-pomdp_py.problems.rocksample.cythonize.rocksample_problem"], [26, "id1"], [26, "id49"], [26, "id98"]], "pomdp_py.problems.rocksample.cythonize.run_rocksample module": [[26, "pomdp-py-problems-rocksample-cythonize-run-rocksample-module"]], "pomdp_py.problems.tag package": [[27, "pomdp-py-problems-tag-package"]], "pomdp_py.problems.tag.constants module": [[27, "module-pomdp_py.problems.tag.constants"]], "pomdp_py.problems.tag.example_worlds module": [[27, "module-pomdp_py.problems.tag.example_worlds"]], "pomdp_py.problems.tag.experiment module": [[27, "pomdp-py-problems-tag-experiment-module"]], "pomdp_py.problems.tag.problem module": [[27, "pomdp-py-problems-tag-problem-module"]], "pomdp_py.problems.tag.env package": [[30, "pomdp-py-problems-tag-env-package"]], "pomdp_py.problems.tag.env.env module": [[30, "pomdp-py-problems-tag-env-env-module"]], "pomdp_py.problems.tag.env.visual module": [[30, "pomdp-py-problems-tag-env-visual-module"]], "pomdp_py.problems.tiger.cythonize package": [[34, "pomdp-py-problems-tiger-cythonize-package"]], "pomdp_py.problems.tiger.cythonize.run_tiger module": [[34, "pomdp-py-problems-tiger-cythonize-run-tiger-module"]], "pomdp_py.problems.tiger.cythonize.tiger_problem module": [[34, "module-pomdp_py.problems.tiger.cythonize.tiger_problem"], [34, "id1"], [34, "id39"], [34, "id78"]], "pomdp_py.utils package": [[38, "pomdp-py-utils-package"]], "pomdp_py.utils.colors module": [[38, "module-pomdp_py.utils.colors"]], "pomdp_py.utils.cython_utils.cpython-37m-x86_64-linux-gnu module": [[38, "pomdp-py-utils-cython-utils-cpython-37m-x86-64-linux-gnu-module"]], "pomdp_py.utils.cython_utils module": [[38, "module-pomdp_py.utils.cython_utils"]], "pomdp_py.utils.math module": [[38, "module-pomdp_py.utils.math"]], "pomdp_py.utils.misc module": [[38, "module-pomdp_py.utils.misc"]], "pomdp_py.utils.plotting module": [[38, "pomdp-py-utils-plotting-module"]], "pomdp_py.utils.templates module": [[38, "module-pomdp_py.utils.templates"]], "pomdp_py.utils.test_utils module": [[38, "pomdp-py-utils-test-utils-module"]], "pomdp_py.utils.typ module": [[38, "module-pomdp_py.utils.typ"]], "pomdp_py.utils.interfaces package": [[40, "pomdp-py-utils-interfaces-package"], [57, "pomdp-py-utils-interfaces-package"]], "pomdp_py.utils.interfaces.simple_rl module": [[40, "pomdp-py-utils-interfaces-simple-rl-module"], [57, "pomdp-py-utils-interfaces-simple-rl-module"]], "pomdp_py.visual package": [[41, "pomdp-py-visual-package"]], "pomdp_py.visual.search_tree module": [[41, "pomdp-py-visual-search-tree-module"]], "Changelog": [[43, "changelog"]], "Version 1.3.4 (01/26/2024)": [[43, "version-1-3-4-01-26-2024"]], "Version 1.3.3 (07/25/2023)": [[43, "version-1-3-3-07-25-2023"]], "Version 1.3.2 (04/03/2022)": [[43, "version-1-3-2-04-03-2022"]], "Version 1.3.1 (11/03/2021)": [[43, "version-1-3-1-11-03-2021"]], "Version 1.3.0.1 (09/30/2021)": [[43, "version-1-3-0-1-09-30-2021"]], "Version 1.2.4.6 (canceled)": [[43, "version-1-2-4-6-canceled"]], "Version 1.2.4.5 (07/05/2021)": [[43, "version-1-2-4-5-07-05-2021"]], "Version 1.2.4.1 (06/02/2021)": [[43, "version-1-2-4-1-06-02-2021"]], "Version 1.2.4 (06/01/2021)": [[43, "version-1-2-4-06-01-2021"]], "Version 1.2.3 (03/22/2021)": [[43, "version-1-2-3-03-22-2021"]], "Version 1.2.2.1 (01/25/2021)": [[43, "version-1-2-2-1-01-25-2021"]], "Version 1.2.2 (01/17/2021)": [[43, "version-1-2-2-01-17-2021"]], "Version 1.2.1 (12/23/2020)": [[43, "version-1-2-1-12-23-2020"]], "Pull Request #3 (08/01/2020)": [[43, "pull-request-3-08-01-2020"]], "Pull Request #1 (06/02/2020)": [[43, "pull-request-1-06-02-2020"]], "Version 1.0 - 1.2 (02/08/2020 - 02/16/2020)": [[43, "version-1-0-1-2-02-08-2020-02-16-2020"]], "Version 0.0": [[43, "version-0-0"]], "pomdp_py Documentation": [[53, "pomdp-py-documentation"]], "Overview": [[53, "overview"]], "Getting Started": [[53, "getting-started"]], "Further": [[53, "further"]], "Citation": [[53, "citation"]], "API References": [[53, "api-references"], [53, null]], "Tools": [[53, "tools"]], "Integration with simple_rl": [[57, "integration-with-simple-rl"]]}, "indexentries": {"actionprior (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.ActionPrior"]], "blqr (class in pomdp_py.algorithms.bsp.blqr)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR"]], "pomcp (class in pomdp_py.algorithms.pomcp)": [[2, "pomdp_py.algorithms.pomcp.POMCP"]], "porollout (class in pomdp_py.algorithms.po_rollout)": [[2, "pomdp_py.algorithms.po_rollout.PORollout"]], "pouct (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.POUCT"]], "qnode (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.QNode"]], "randomrollout (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.RandomRollout"]], "rolloutpolicy (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.RolloutPolicy"]], "rootvnode (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.RootVNode"]], "rootvnodeparticles (class in pomdp_py.algorithms.pomcp)": [[2, "pomdp_py.algorithms.pomcp.RootVNodeParticles"]], "treenode (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.TreeNode"]], "vnode (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.VNode"]], "vnodeparticles (class in pomdp_py.algorithms.pomcp)": [[2, "pomdp_py.algorithms.pomcp.VNodeParticles"]], "valueiteration (class in pomdp_py.algorithms.value_iteration)": [[2, "pomdp_py.algorithms.value_iteration.ValueIteration"]], "argmax() (pomdp_py.algorithms.po_uct.vnode method)": [[2, "pomdp_py.algorithms.po_uct.VNode.argmax"]], "belief (pomdp_py.algorithms.pomcp.rootvnodeparticles attribute)": [[2, "pomdp_py.algorithms.pomcp.RootVNodeParticles.belief"]], "belief (pomdp_py.algorithms.pomcp.vnodeparticles attribute)": [[2, "pomdp_py.algorithms.pomcp.VNodeParticles.belief"]], "children (pomdp_py.algorithms.po_uct.treenode attribute)": [[2, "pomdp_py.algorithms.po_uct.TreeNode.children"]], "clear_agent() (pomdp_py.algorithms.po_rollout.porollout method)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.clear_agent"]], "clear_agent() (pomdp_py.algorithms.po_uct.pouct method)": [[2, "pomdp_py.algorithms.po_uct.POUCT.clear_agent"]], "create_plan() (pomdp_py.algorithms.bsp.blqr.blqr method)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR.create_plan"]], "ekf_update_mlo() (pomdp_py.algorithms.bsp.blqr.blqr method)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR.ekf_update_mlo"]], "from_vnode() (pomdp_py.algorithms.po_uct.rootvnode class method)": [[2, "pomdp_py.algorithms.po_uct.RootVNode.from_vnode"]], "from_vnode() (pomdp_py.algorithms.pomcp.rootvnodeparticles class method)": [[2, "pomdp_py.algorithms.pomcp.RootVNodeParticles.from_vnode"]], "get_preferred_actions() (pomdp_py.algorithms.po_uct.actionprior method)": [[2, "pomdp_py.algorithms.po_uct.ActionPrior.get_preferred_actions"]], "history (pomdp_py.algorithms.po_uct.rootvnode attribute)": [[2, "pomdp_py.algorithms.po_uct.RootVNode.history"]], "integrate_belief_segment() (pomdp_py.algorithms.bsp.blqr.blqr method)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR.integrate_belief_segment"]], "interpret_sqp_plan() (pomdp_py.algorithms.bsp.blqr.blqr method)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR.interpret_sqp_plan"]], "last_best_reward (pomdp_py.algorithms.po_rollout.porollout attribute)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.last_best_reward"]], "last_num_sims (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.last_num_sims"]], "last_planning_time (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.last_planning_time"]], "module": [[2, "module-pomdp_py.algorithms.bsp.blqr"], [2, "module-pomdp_py.algorithms.po_rollout"], [2, "module-pomdp_py.algorithms.po_uct"], [2, "module-pomdp_py.algorithms.pomcp"], [2, "module-pomdp_py.algorithms.value_iteration"], [6, "module-pomdp_py.problems"], [11, "module-pomdp_py.problems.light_dark.env"], [11, "module-pomdp_py.problems.light_dark.env.env"], [13, "module-pomdp_py.problems.load_unload"], [17, "module-pomdp_py.problems.maze.models"], [18, "module-pomdp_py.problems.maze.models.components"], [19, "module-pomdp_py.problems.multi_object_search"], [19, "module-pomdp_py.problems.multi_object_search.example_worlds"], [22, "module-pomdp_py.problems.multi_object_search.env"], [22, "module-pomdp_py.problems.multi_object_search.env.env"], [25, "module-pomdp_py.problems.rocksample"], [25, "module-pomdp_py.problems.rocksample.cythonize"], [25, "module-pomdp_py.problems.rocksample.rocksample_problem"], [26, "module-0"], [26, "module-1"], [26, "module-2"], [26, "module-pomdp_py.problems.rocksample.cythonize"], [26, "module-pomdp_py.problems.rocksample.cythonize.rocksample_problem"], [27, "module-pomdp_py.problems.tag"], [27, "module-pomdp_py.problems.tag.constants"], [27, "module-pomdp_py.problems.tag.example_worlds"], [30, "module-pomdp_py.problems.tag.env"], [33, "module-pomdp_py.problems.tiger"], [33, "module-pomdp_py.problems.tiger.cythonize"], [33, "module-pomdp_py.problems.tiger.tiger_problem"], [34, "module-0"], [34, "module-1"], [34, "module-2"], [34, "module-pomdp_py.problems.tiger.cythonize"], [34, "module-pomdp_py.problems.tiger.cythonize.tiger_problem"], [38, "module-pomdp_py.utils"], [38, "module-pomdp_py.utils.colors"], [38, "module-pomdp_py.utils.cython_utils"], [38, "module-pomdp_py.utils.debugging"], [38, "module-pomdp_py.utils.math"], [38, "module-pomdp_py.utils.misc"], [38, "module-pomdp_py.utils.templates"], [38, "module-pomdp_py.utils.typ"]], "num_visits (pomdp_py.algorithms.po_uct.treenode attribute)": [[2, "pomdp_py.algorithms.po_uct.TreeNode.num_visits"]], "plan() (pomdp_py.algorithms.po_rollout.porollout method)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.plan"]], "plan() (pomdp_py.algorithms.po_uct.pouct method)": [[2, "pomdp_py.algorithms.po_uct.POUCT.plan"]], "plan() (pomdp_py.algorithms.pomcp.pomcp method)": [[2, "pomdp_py.algorithms.pomcp.POMCP.plan"]], "plan() (pomdp_py.algorithms.value_iteration.valueiteration method)": [[2, "pomdp_py.algorithms.value_iteration.ValueIteration.plan"]], "pomdp_py.algorithms.bsp.blqr": [[2, "module-pomdp_py.algorithms.bsp.blqr"]], "pomdp_py.algorithms.po_rollout": [[2, "module-pomdp_py.algorithms.po_rollout"]], "pomdp_py.algorithms.po_uct": [[2, "module-pomdp_py.algorithms.po_uct"]], "pomdp_py.algorithms.pomcp": [[2, "module-pomdp_py.algorithms.pomcp"]], "pomdp_py.algorithms.value_iteration": [[2, "module-pomdp_py.algorithms.value_iteration"]], "print_children_value() (pomdp_py.algorithms.po_uct.vnode method)": [[2, "pomdp_py.algorithms.po_uct.VNode.print_children_value"]], "rollout() (pomdp_py.algorithms.po_uct.randomrollout method)": [[2, "pomdp_py.algorithms.po_uct.RandomRollout.rollout"]], "rollout() (pomdp_py.algorithms.po_uct.rolloutpolicy method)": [[2, "pomdp_py.algorithms.po_uct.RolloutPolicy.rollout"]], "segmented_cost_function() (pomdp_py.algorithms.bsp.blqr.blqr method)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR.segmented_cost_function"]], "set_rollout_policy() (pomdp_py.algorithms.po_rollout.porollout method)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.set_rollout_policy"]], "set_rollout_policy() (pomdp_py.algorithms.po_uct.pouct method)": [[2, "pomdp_py.algorithms.po_uct.POUCT.set_rollout_policy"]], "update() (pomdp_py.algorithms.po_rollout.porollout method)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.update"]], "update() (pomdp_py.algorithms.po_uct.pouct method)": [[2, "pomdp_py.algorithms.po_uct.POUCT.update"]], "update() (pomdp_py.algorithms.pomcp.pomcp method)": [[2, "pomdp_py.algorithms.pomcp.POMCP.update"]], "update_agent_belief (pomdp_py.algorithms.po_rollout.porollout attribute)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.update_agent_belief"]], "update_agent_belief (pomdp_py.algorithms.pomcp.pomcp attribute)": [[2, "pomdp_py.algorithms.pomcp.POMCP.update_agent_belief"]], "updates_agent_belief (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.updates_agent_belief"]], "value (pomdp_py.algorithms.po_uct.treenode attribute)": [[2, "pomdp_py.algorithms.po_uct.TreeNode.value"]], "value (pomdp_py.algorithms.po_uct.vnode attribute)": [[2, "pomdp_py.algorithms.po_uct.VNode.value"]], "pomdp_py.problems": [[6, "module-pomdp_py.problems"]], "lightdarkenvironment (class in pomdp_py.problems.light_dark.env.env)": [[11, "pomdp_py.problems.light_dark.env.env.LightDarkEnvironment"]], "const (pomdp_py.problems.light_dark.env.env.lightdarkenvironment property)": [[11, "pomdp_py.problems.light_dark.env.env.LightDarkEnvironment.const"]], "light (pomdp_py.problems.light_dark.env.env.lightdarkenvironment property)": [[11, "pomdp_py.problems.light_dark.env.env.LightDarkEnvironment.light"]], "pomdp_py.problems.light_dark.env": [[11, "module-pomdp_py.problems.light_dark.env"]], "pomdp_py.problems.light_dark.env.env": [[11, "module-pomdp_py.problems.light_dark.env.env"]], "pomdp_py.problems.load_unload": [[13, "module-pomdp_py.problems.load_unload"]], "pomdp_py.problems.maze.models": [[17, "module-pomdp_py.problems.maze.models"]], "pomdp_py.problems.maze.models.components": [[18, "module-pomdp_py.problems.maze.models.components"]], "pomdp_py.problems.multi_object_search": [[19, "module-pomdp_py.problems.multi_object_search"]], "pomdp_py.problems.multi_object_search.example_worlds": [[19, "module-pomdp_py.problems.multi_object_search.example_worlds"]], "random_world() (in module pomdp_py.problems.multi_object_search.example_worlds)": [[19, "pomdp_py.problems.multi_object_search.example_worlds.random_world"]], "mosenvironment (class in pomdp_py.problems.multi_object_search.env.env)": [[22, "pomdp_py.problems.multi_object_search.env.env.MosEnvironment"]], "equip_sensors() (in module pomdp_py.problems.multi_object_search.env.env)": [[22, "pomdp_py.problems.multi_object_search.env.env.equip_sensors"]], "interpret() (in module pomdp_py.problems.multi_object_search.env.env)": [[22, "pomdp_py.problems.multi_object_search.env.env.interpret"]], "interpret_robot_id() (in module pomdp_py.problems.multi_object_search.env.env)": [[22, "pomdp_py.problems.multi_object_search.env.env.interpret_robot_id"]], "make_laser_sensor() (in module pomdp_py.problems.multi_object_search.env.env)": [[22, "pomdp_py.problems.multi_object_search.env.env.make_laser_sensor"]], "make_proximity_sensor() (in module pomdp_py.problems.multi_object_search.env.env)": [[22, "pomdp_py.problems.multi_object_search.env.env.make_proximity_sensor"]], "pomdp_py.problems.multi_object_search.env": [[22, "module-pomdp_py.problems.multi_object_search.env"]], "pomdp_py.problems.multi_object_search.env.env": [[22, "module-pomdp_py.problems.multi_object_search.env.env"]], "robot_ids (pomdp_py.problems.multi_object_search.env.env.mosenvironment property)": [[22, "pomdp_py.problems.multi_object_search.env.env.MosEnvironment.robot_ids"]], "state_transition() (pomdp_py.problems.multi_object_search.env.env.mosenvironment method)": [[22, "pomdp_py.problems.multi_object_search.env.env.MosEnvironment.state_transition"]], "action (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.Action"]], "bad (pomdp_py.problems.rocksample.rocksample_problem.rocktype attribute)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RockType.BAD"]], "checkaction (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.CheckAction"]], "east (pomdp_py.problems.rocksample.rocksample_problem.moveaction attribute)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.MoveAction.EAST"]], "good (pomdp_py.problems.rocksample.rocksample_problem.rocktype attribute)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RockType.GOOD"]], "moveaction (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.MoveAction"]], "north (pomdp_py.problems.rocksample.rocksample_problem.moveaction attribute)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.MoveAction.NORTH"]], "observation (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.Observation"]], "rsobservationmodel (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSObservationModel"]], "rspolicymodel (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel"]], "rsrewardmodel (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSRewardModel"]], "rstransitionmodel (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSTransitionModel"]], "rocksampleproblem (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem"]], "rocktype (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RockType"]], "south (pomdp_py.problems.rocksample.rocksample_problem.moveaction attribute)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.MoveAction.SOUTH"]], "sampleaction (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.SampleAction"]], "state (class in pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.State"]], "west (pomdp_py.problems.rocksample.rocksample_problem.moveaction attribute)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.MoveAction.WEST"]], "argmax() (pomdp_py.problems.rocksample.rocksample_problem.rsobservationmodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSObservationModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.rocksample_problem.rspolicymodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.rocksample_problem.rsrewardmodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSRewardModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.rocksample_problem.rstransitionmodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSTransitionModel.argmax"]], "euclidean_dist() (in module pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.euclidean_dist"]], "generate_instance() (pomdp_py.problems.rocksample.rocksample_problem.rocksampleproblem static method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem.generate_instance"]], "get_all_actions() (pomdp_py.problems.rocksample.rocksample_problem.rspolicymodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel.get_all_actions"]], "in_exit_area() (pomdp_py.problems.rocksample.rocksample_problem.rocksampleproblem method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem.in_exit_area"]], "init_particles_belief() (in module pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.init_particles_belief"]], "invert() (pomdp_py.problems.rocksample.rocksample_problem.rocktype static method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RockType.invert"]], "main() (in module pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.main"]], "pomdp_py.problems.rocksample": [[25, "module-pomdp_py.problems.rocksample"]], "pomdp_py.problems.rocksample.cythonize": [[25, "module-pomdp_py.problems.rocksample.cythonize"], [26, "module-pomdp_py.problems.rocksample.cythonize"]], "pomdp_py.problems.rocksample.rocksample_problem": [[25, "module-pomdp_py.problems.rocksample.rocksample_problem"]], "print_state() (pomdp_py.problems.rocksample.rocksample_problem.rocksampleproblem method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem.print_state"]], "probability() (pomdp_py.problems.rocksample.rocksample_problem.rsobservationmodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSObservationModel.probability"]], "probability() (pomdp_py.problems.rocksample.rocksample_problem.rspolicymodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel.probability"]], "probability() (pomdp_py.problems.rocksample.rocksample_problem.rsrewardmodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSRewardModel.probability"]], "probability() (pomdp_py.problems.rocksample.rocksample_problem.rstransitionmodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSTransitionModel.probability"]], "random() (pomdp_py.problems.rocksample.rocksample_problem.rocktype static method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RockType.random"]], "random_free_location() (pomdp_py.problems.rocksample.rocksample_problem.rocksampleproblem static method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem.random_free_location"]], "rollout() (pomdp_py.problems.rocksample.rocksample_problem.rspolicymodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel.rollout"]], "sample() (pomdp_py.problems.rocksample.rocksample_problem.rsobservationmodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSObservationModel.sample"]], "sample() (pomdp_py.problems.rocksample.rocksample_problem.rspolicymodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel.sample"]], "sample() (pomdp_py.problems.rocksample.rocksample_problem.rsrewardmodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSRewardModel.sample"]], "sample() (pomdp_py.problems.rocksample.rocksample_problem.rstransitionmodel method)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.RSTransitionModel.sample"]], "test_planner() (in module pomdp_py.problems.rocksample.rocksample_problem)": [[25, "pomdp_py.problems.rocksample.rocksample_problem.test_planner"]], "bad (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocktype attribute)": [[26, "id138"], [26, "id40"], [26, "id89"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType.BAD"]], "checkaction (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id0"], [26, "id50"], [26, "id99"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.CheckAction"]], "east (pomdp_py.problems.rocksample.cythonize.rocksample_problem.moveaction attribute)": [[26, "id102"], [26, "id4"], [26, "id53"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction.EAST"]], "good (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocktype attribute)": [[26, "id139"], [26, "id41"], [26, "id90"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType.GOOD"]], "moveaction (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id101"], [26, "id3"], [26, "id52"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction"]], "north (pomdp_py.problems.rocksample.cythonize.rocksample_problem.moveaction attribute)": [[26, "id103"], [26, "id5"], [26, "id54"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction.NORTH"]], "rsaction (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id107"], [26, "id58"], [26, "id9"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSAction"]], "rsobservation (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id10"], [26, "id108"], [26, "id59"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservation"]], "rsobservationmodel (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id110"], [26, "id12"], [26, "id61"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservationModel"]], "rspolicymodel (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id114"], [26, "id16"], [26, "id65"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel"]], "rsrewardmodel (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id120"], [26, "id22"], [26, "id71"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSRewardModel"]], "rsstate (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id124"], [26, "id26"], [26, "id75"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState"]], "rstransitionmodel (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id128"], [26, "id30"], [26, "id79"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSTransitionModel"]], "rocksampleproblem (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id132"], [26, "id34"], [26, "id83"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem"]], "rocktype (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id137"], [26, "id39"], [26, "id88"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType"]], "south (pomdp_py.problems.rocksample.cythonize.rocksample_problem.moveaction attribute)": [[26, "id104"], [26, "id55"], [26, "id6"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction.SOUTH"]], "sampleaction (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id142"], [26, "id44"], [26, "id93"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.SampleAction"]], "west (pomdp_py.problems.rocksample.cythonize.rocksample_problem.moveaction attribute)": [[26, "id105"], [26, "id56"], [26, "id7"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction.WEST"]], "argmax() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsobservationmodel method)": [[26, "id111"], [26, "id13"], [26, "id62"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservationModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rspolicymodel method)": [[26, "id115"], [26, "id17"], [26, "id66"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsrewardmodel method)": [[26, "id121"], [26, "id23"], [26, "id72"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSRewardModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rstransitionmodel method)": [[26, "id129"], [26, "id31"], [26, "id80"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSTransitionModel.argmax"]], "euclidean_dist() (in module pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id143"], [26, "id45"], [26, "id94"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.euclidean_dist"]], "generate_instance() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocksampleproblem static method)": [[26, "id133"], [26, "id35"], [26, "id84"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem.generate_instance"]], "get_all_actions() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rspolicymodel method)": [[26, "id116"], [26, "id18"], [26, "id67"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel.get_all_actions"]], "in_exit_area() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocksampleproblem method)": [[26, "id134"], [26, "id36"], [26, "id85"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem.in_exit_area"]], "init_particles_belief() (in module pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id144"], [26, "id46"], [26, "id95"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.init_particles_belief"]], "invert() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocktype static method)": [[26, "id140"], [26, "id42"], [26, "id91"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType.invert"]], "main() (in module pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id145"], [26, "id47"], [26, "id96"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.main"]], "motion (pomdp_py.problems.rocksample.cythonize.rocksample_problem.moveaction attribute)": [[26, "id106"], [26, "id57"], [26, "id8"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction.motion"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem": [[26, "module-0"], [26, "module-1"], [26, "module-2"], [26, "module-pomdp_py.problems.rocksample.cythonize.rocksample_problem"]], "position (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsstate attribute)": [[26, "id125"], [26, "id27"], [26, "id76"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState.position"]], "print_state() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocksampleproblem method)": [[26, "id135"], [26, "id37"], [26, "id86"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem.print_state"]], "probability() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsobservationmodel method)": [[26, "id112"], [26, "id14"], [26, "id63"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservationModel.probability"]], "probability() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rspolicymodel method)": [[26, "id117"], [26, "id19"], [26, "id68"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel.probability"]], "probability() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsrewardmodel method)": [[26, "id122"], [26, "id24"], [26, "id73"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSRewardModel.probability"]], "probability() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rstransitionmodel method)": [[26, "id130"], [26, "id32"], [26, "id81"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSTransitionModel.probability"]], "quality (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsobservation attribute)": [[26, "id109"], [26, "id11"], [26, "id60"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservation.quality"]], "random() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocktype static method)": [[26, "id141"], [26, "id43"], [26, "id92"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType.random"]], "random_free_location() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocksampleproblem static method)": [[26, "id136"], [26, "id38"], [26, "id87"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem.random_free_location"]], "rock_id (pomdp_py.problems.rocksample.cythonize.rocksample_problem.checkaction attribute)": [[26, "id100"], [26, "id2"], [26, "id51"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.CheckAction.rock_id"]], "rocktypes (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsstate attribute)": [[26, "id126"], [26, "id28"], [26, "id77"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState.rocktypes"]], "rollout() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rspolicymodel method)": [[26, "id118"], [26, "id20"], [26, "id69"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel.rollout"]], "sample() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsobservationmodel method)": [[26, "id113"], [26, "id15"], [26, "id64"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservationModel.sample"]], "sample() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rspolicymodel method)": [[26, "id119"], [26, "id21"], [26, "id70"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel.sample"]], "sample() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsrewardmodel method)": [[26, "id123"], [26, "id25"], [26, "id74"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSRewardModel.sample"]], "sample() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rstransitionmodel method)": [[26, "id131"], [26, "id33"], [26, "id82"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSTransitionModel.sample"]], "terminal (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsstate attribute)": [[26, "id127"], [26, "id29"], [26, "id78"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState.terminal"]], "test_planner() (in module pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[26, "id146"], [26, "id48"], [26, "id97"], [26, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.test_planner"]], "pomdp_py.problems.tag": [[27, "module-pomdp_py.problems.tag"]], "pomdp_py.problems.tag.constants": [[27, "module-pomdp_py.problems.tag.constants"]], "pomdp_py.problems.tag.example_worlds": [[27, "module-pomdp_py.problems.tag.example_worlds"]], "pomdp_py.problems.tag.env": [[30, "module-pomdp_py.problems.tag.env"]], "actions (pomdp_py.problems.tiger.tiger_problem.policymodel attribute)": [[33, "pomdp_py.problems.tiger.tiger_problem.PolicyModel.ACTIONS"]], "observationmodel (class in pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.ObservationModel"]], "policymodel (class in pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.PolicyModel"]], "rewardmodel (class in pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.RewardModel"]], "tigeraction (class in pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.TigerAction"]], "tigerobservation (class in pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.TigerObservation"]], "tigerproblem (class in pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.TigerProblem"]], "tigerstate (class in pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.TigerState"]], "transitionmodel (class in pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.TransitionModel"]], "create() (pomdp_py.problems.tiger.tiger_problem.tigerproblem static method)": [[33, "pomdp_py.problems.tiger.tiger_problem.TigerProblem.create"]], "get_all_actions() (pomdp_py.problems.tiger.tiger_problem.policymodel method)": [[33, "pomdp_py.problems.tiger.tiger_problem.PolicyModel.get_all_actions"]], "get_all_observations() (pomdp_py.problems.tiger.tiger_problem.observationmodel method)": [[33, "pomdp_py.problems.tiger.tiger_problem.ObservationModel.get_all_observations"]], "get_all_states() (pomdp_py.problems.tiger.tiger_problem.transitionmodel method)": [[33, "pomdp_py.problems.tiger.tiger_problem.TransitionModel.get_all_states"]], "main() (in module pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.main"]], "make_tiger() (in module pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.make_tiger"]], "other() (pomdp_py.problems.tiger.tiger_problem.tigerstate method)": [[33, "pomdp_py.problems.tiger.tiger_problem.TigerState.other"]], "pomdp_py.problems.tiger": [[33, "module-pomdp_py.problems.tiger"]], "pomdp_py.problems.tiger.cythonize": [[33, "module-pomdp_py.problems.tiger.cythonize"], [34, "module-pomdp_py.problems.tiger.cythonize"]], "pomdp_py.problems.tiger.tiger_problem": [[33, "module-pomdp_py.problems.tiger.tiger_problem"]], "probability() (pomdp_py.problems.tiger.tiger_problem.observationmodel method)": [[33, "pomdp_py.problems.tiger.tiger_problem.ObservationModel.probability"]], "probability() (pomdp_py.problems.tiger.tiger_problem.transitionmodel method)": [[33, "pomdp_py.problems.tiger.tiger_problem.TransitionModel.probability"]], "rollout() (pomdp_py.problems.tiger.tiger_problem.policymodel method)": [[33, "pomdp_py.problems.tiger.tiger_problem.PolicyModel.rollout"]], "sample() (pomdp_py.problems.tiger.tiger_problem.observationmodel method)": [[33, "pomdp_py.problems.tiger.tiger_problem.ObservationModel.sample"]], "sample() (pomdp_py.problems.tiger.tiger_problem.policymodel method)": [[33, "pomdp_py.problems.tiger.tiger_problem.PolicyModel.sample"]], "sample() (pomdp_py.problems.tiger.tiger_problem.rewardmodel method)": [[33, "pomdp_py.problems.tiger.tiger_problem.RewardModel.sample"]], "sample() (pomdp_py.problems.tiger.tiger_problem.transitionmodel method)": [[33, "pomdp_py.problems.tiger.tiger_problem.TransitionModel.sample"]], "test_planner() (in module pomdp_py.problems.tiger.tiger_problem)": [[33, "pomdp_py.problems.tiger.tiger_problem.test_planner"]], "actions (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerproblem attribute)": [[34, "id17"], [34, "id56"], [34, "id95"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem.ACTIONS"]], "observations (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerproblem attribute)": [[34, "id18"], [34, "id57"], [34, "id96"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem.OBSERVATIONS"]], "states (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerproblem attribute)": [[34, "id19"], [34, "id58"], [34, "id97"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem.STATES"]], "tigeraction (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id0"], [34, "id41"], [34, "id80"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerAction"]], "tigerobservation (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id3"], [34, "id42"], [34, "id81"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservation"]], "tigerobservationmodel (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id44"], [34, "id5"], [34, "id83"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel"]], "tigerpolicymodel (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id11"], [34, "id50"], [34, "id89"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel"]], "tigerproblem (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id16"], [34, "id55"], [34, "id94"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem"]], "tigerrewardmodel (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id20"], [34, "id59"], [34, "id98"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel"]], "tigerstate (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id103"], [34, "id25"], [34, "id64"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerState"]], "tigertransitionmodel (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id105"], [34, "id27"], [34, "id66"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel"]], "argmax() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservationmodel method)": [[34, "id45"], [34, "id6"], [34, "id84"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel.argmax"]], "argmax() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerpolicymodel method)": [[34, "id12"], [34, "id51"], [34, "id90"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel.argmax"]], "argmax() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerrewardmodel method)": [[34, "id21"], [34, "id60"], [34, "id99"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel.argmax"]], "argmax() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigertransitionmodel method)": [[34, "id106"], [34, "id28"], [34, "id67"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel.argmax"]], "build_actions() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id111"], [34, "id33"], [34, "id72"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.build_actions"]], "build_observations() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id112"], [34, "id34"], [34, "id73"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.build_observations"]], "build_setting() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id113"], [34, "id35"], [34, "id74"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.build_setting"]], "build_states() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id114"], [34, "id36"], [34, "id75"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.build_states"]], "get_all_actions() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerpolicymodel method)": [[34, "id13"], [34, "id52"], [34, "id91"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel.get_all_actions"]], "get_all_observations() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservationmodel method)": [[34, "id46"], [34, "id7"], [34, "id85"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel.get_all_observations"]], "get_all_states() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigertransitionmodel method)": [[34, "id107"], [34, "id29"], [34, "id68"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel.get_all_states"]], "get_distribution() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservationmodel method)": [[34, "id47"], [34, "id8"], [34, "id86"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel.get_distribution"]], "get_distribution() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerrewardmodel method)": [[34, "id100"], [34, "id22"], [34, "id61"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel.get_distribution"]], "get_distribution() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigertransitionmodel method)": [[34, "id108"], [34, "id30"], [34, "id69"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel.get_distribution"]], "main() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id115"], [34, "id37"], [34, "id76"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.main"]], "name (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservation attribute)": [[34, "id4"], [34, "id43"], [34, "id82"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservation.name"]], "name (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerstate attribute)": [[34, "id104"], [34, "id26"], [34, "id65"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerState.name"]], "pomdp_py.problems.tiger.cythonize.tiger_problem": [[34, "module-0"], [34, "module-1"], [34, "module-2"], [34, "module-pomdp_py.problems.tiger.cythonize.tiger_problem"]], "probability() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservationmodel method)": [[34, "id48"], [34, "id87"], [34, "id9"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel.probability"]], "probability() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerpolicymodel method)": [[34, "id14"], [34, "id53"], [34, "id92"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel.probability"]], "probability() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerrewardmodel method)": [[34, "id101"], [34, "id23"], [34, "id62"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel.probability"]], "probability() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigertransitionmodel method)": [[34, "id109"], [34, "id31"], [34, "id70"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel.probability"]], "sample() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservationmodel method)": [[34, "id10"], [34, "id49"], [34, "id88"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel.sample"]], "sample() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerpolicymodel method)": [[34, "id15"], [34, "id54"], [34, "id93"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel.sample"]], "sample() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerrewardmodel method)": [[34, "id102"], [34, "id24"], [34, "id63"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel.sample"]], "sample() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigertransitionmodel method)": [[34, "id110"], [34, "id32"], [34, "id71"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel.sample"]], "test_planner() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[34, "id116"], [34, "id38"], [34, "id77"], [34, "pomdp_py.problems.tiger.cythonize.tiger_problem.test_planner"]], "blue (pomdp_py.utils.typ.bcolors attribute)": [[38, "pomdp_py.utils.typ.bcolors.BLUE"]], "bold (pomdp_py.utils.typ.bcolors attribute)": [[38, "pomdp_py.utils.typ.bcolors.BOLD"]], "cyan (pomdp_py.utils.typ.bcolors attribute)": [[38, "pomdp_py.utils.typ.bcolors.CYAN"]], "detobservationmodel (class in pomdp_py.utils.templates)": [[38, "pomdp_py.utils.templates.DetObservationModel"]], "detrewardmodel (class in pomdp_py.utils.templates)": [[38, "pomdp_py.utils.templates.DetRewardModel"]], "dettransitionmodel (class in pomdp_py.utils.templates)": [[38, "pomdp_py.utils.templates.DetTransitionModel"]], "endc (pomdp_py.utils.typ.bcolors attribute)": [[38, "pomdp_py.utils.typ.bcolors.ENDC"]], "green (pomdp_py.utils.typ.bcolors attribute)": [[38, "pomdp_py.utils.typ.bcolors.GREEN"]], "magenta (pomdp_py.utils.typ.bcolors attribute)": [[38, "pomdp_py.utils.typ.bcolors.MAGENTA"]], "red (pomdp_py.utils.typ.bcolors attribute)": [[38, "pomdp_py.utils.typ.bcolors.RED"]], "r_between() (in module pomdp_py.utils.math)": [[38, "pomdp_py.utils.math.R_between"]], "r_x() (in module pomdp_py.utils.math)": [[38, "pomdp_py.utils.math.R_x"]], "r_y() (in module pomdp_py.utils.math)": [[38, "pomdp_py.utils.math.R_y"]], "r_z() (in module pomdp_py.utils.math)": [[38, "pomdp_py.utils.math.R_z"]], "subscript (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.SUBSCRIPT"]], "simpleaction (class in pomdp_py.utils.templates)": [[38, "pomdp_py.utils.templates.SimpleAction"]], "simpleobservation (class in pomdp_py.utils.templates)": [[38, "pomdp_py.utils.templates.SimpleObservation"]], "simplestate (class in pomdp_py.utils.templates)": [[38, "pomdp_py.utils.templates.SimpleState"]], "t() (in module pomdp_py.utils.math)": [[38, "pomdp_py.utils.math.T"]], "tabularobservationmodel (class in pomdp_py.utils.templates)": [[38, "pomdp_py.utils.templates.TabularObservationModel"]], "tabularrewardmodel (class in pomdp_py.utils.templates)": [[38, "pomdp_py.utils.templates.TabularRewardModel"]], "tabulartransitionmodel (class in pomdp_py.utils.templates)": [[38, "pomdp_py.utils.templates.TabularTransitionModel"]], "treedebugger (class in pomdp_py.utils.debugging)": [[38, "pomdp_py.utils.debugging.TreeDebugger"]], "uniformpolicymodel (class in pomdp_py.utils.templates)": [[38, "pomdp_py.utils.templates.UniformPolicyModel"]], "white (pomdp_py.utils.typ.bcolors attribute)": [[38, "pomdp_py.utils.typ.bcolors.WHITE"]], "yellow (pomdp_py.utils.typ.bcolors attribute)": [[38, "pomdp_py.utils.typ.bcolors.YELLOW"]], "approx_equal() (in module pomdp_py.utils.math)": [[38, "pomdp_py.utils.math.approx_equal"]], "argmax() (pomdp_py.utils.templates.detrewardmodel method)": [[38, "pomdp_py.utils.templates.DetRewardModel.argmax"]], "b (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.b"]], "back() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.back"]], "bcolors (class in pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.bcolors"]], "bestseq (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.bestseq"]], "bestseqd() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.bestseqd"]], "blue() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.blue"]], "bold() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.bold"]], "bottomleft (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.bottomleft"]], "bottomright (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.bottomright"]], "bottomt (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.bottomt"]], "c (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.c"]], "clear (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.clear"]], "cyan() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.cyan"]], "d (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.d"]], "depth (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.depth"]], "det_dict_hash() (in module pomdp_py.utils.cython_utils)": [[38, "pomdp_py.utils.cython_utils.det_dict_hash"]], "disable() (pomdp_py.utils.typ.bcolors static method)": [[38, "pomdp_py.utils.typ.bcolors.disable"]], "down (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.down"]], "error() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.error"]], "euclidean_dist() (in module pomdp_py.utils.math)": [[38, "pomdp_py.utils.math.euclidean_dist"]], "get_all_actions() (pomdp_py.utils.templates.uniformpolicymodel method)": [[38, "pomdp_py.utils.templates.UniformPolicyModel.get_all_actions"]], "get_all_observations() (pomdp_py.utils.templates.tabularobservationmodel method)": [[38, "pomdp_py.utils.templates.TabularObservationModel.get_all_observations"]], "get_all_states() (pomdp_py.utils.templates.tabulartransitionmodel method)": [[38, "pomdp_py.utils.templates.TabularTransitionModel.get_all_states"]], "green() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.green"]], "hex_to_rgb() (in module pomdp_py.utils.colors)": [[38, "pomdp_py.utils.colors.hex_to_rgb"]], "hline (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.hline"]], "info() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.info"]], "interpret_color() (in module pomdp_py.utils.debugging)": [[38, "pomdp_py.utils.debugging.interpret_color"]], "intersect (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.intersect"]], "inverse_color_hex() (in module pomdp_py.utils.colors)": [[38, "pomdp_py.utils.colors.inverse_color_hex"]], "inverse_color_rgb() (in module pomdp_py.utils.colors)": [[38, "pomdp_py.utils.colors.inverse_color_rgb"]], "json_safe() (in module pomdp_py.utils.misc)": [[38, "pomdp_py.utils.misc.json_safe"]], "l() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.l"]], "layer() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.layer"]], "leaf (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.leaf"]], "left (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.left"]], "leftt (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.leftt"]], "lighter() (in module pomdp_py.utils.colors)": [[38, "pomdp_py.utils.colors.lighter"]], "longbottomleft (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.longbottomleft"]], "longbottomright (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.longbottomright"]], "longleft (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.longleft"]], "longright (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.longright"]], "longtopleft (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.longtopleft"]], "longtopright (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.longtopright"]], "magenta() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.magenta"]], "mark() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.mark"]], "mark_path() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.mark_path"]], "mark_sequence() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.mark_sequence"]], "markp() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.markp"]], "mbp (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.mbp"]], "nl (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.nl"]], "nn (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.nn"]], "note() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.note"]], "nq (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.nq"]], "num_layers (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.num_layers"]], "num_nodes() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.num_nodes"]], "nv (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.nv"]], "p() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.p"]], "path() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.path"]], "path_to() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.path_to"]], "pm (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.pm"]], "pomdp_py.utils": [[38, "module-pomdp_py.utils"]], "pomdp_py.utils.colors": [[38, "module-pomdp_py.utils.colors"]], "pomdp_py.utils.cython_utils": [[38, "module-pomdp_py.utils.cython_utils"]], "pomdp_py.utils.debugging": [[38, "module-pomdp_py.utils.debugging"]], "pomdp_py.utils.math": [[38, "module-pomdp_py.utils.math"]], "pomdp_py.utils.misc": [[38, "module-pomdp_py.utils.misc"]], "pomdp_py.utils.templates": [[38, "module-pomdp_py.utils.templates"]], "pomdp_py.utils.typ": [[38, "module-pomdp_py.utils.typ"]], "pp (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.pp"]], "preferred_actions() (pomdp_py.utils.debugging.treedebugger static method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.preferred_actions"]], "probability() (pomdp_py.utils.templates.detobservationmodel method)": [[38, "pomdp_py.utils.templates.DetObservationModel.probability"]], "probability() (pomdp_py.utils.templates.dettransitionmodel method)": [[38, "pomdp_py.utils.templates.DetTransitionModel.probability"]], "probability() (pomdp_py.utils.templates.tabularobservationmodel method)": [[38, "pomdp_py.utils.templates.TabularObservationModel.probability"]], "probability() (pomdp_py.utils.templates.tabulartransitionmodel method)": [[38, "pomdp_py.utils.templates.TabularTransitionModel.probability"]], "proj() (in module pomdp_py.utils.math)": [[38, "pomdp_py.utils.math.proj"]], "r (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.r"]], "random_unique_color() (in module pomdp_py.utils.colors)": [[38, "pomdp_py.utils.colors.random_unique_color"]], "red() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.red"]], "remap() (in module pomdp_py.utils.misc)": [[38, "pomdp_py.utils.misc.remap"]], "reward_func() (pomdp_py.utils.templates.detrewardmodel method)": [[38, "pomdp_py.utils.templates.DetRewardModel.reward_func"]], "rgb_to_hex() (in module pomdp_py.utils.colors)": [[38, "pomdp_py.utils.colors.rgb_to_hex"]], "right (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.right"]], "rightt (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.rightt"]], "rollout() (pomdp_py.utils.templates.uniformpolicymodel method)": [[38, "pomdp_py.utils.templates.UniformPolicyModel.rollout"]], "root (pomdp_py.utils.debugging.treedebugger property)": [[38, "pomdp_py.utils.debugging.TreeDebugger.root"]], "s() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.s"]], "s() (pomdp_py.utils.typ.bcolors static method)": [[38, "pomdp_py.utils.typ.bcolors.s"]], "safe_slice() (in module pomdp_py.utils.misc)": [[38, "pomdp_py.utils.misc.safe_slice"]], "sample() (pomdp_py.utils.templates.detobservationmodel method)": [[38, "pomdp_py.utils.templates.DetObservationModel.sample"]], "sample() (pomdp_py.utils.templates.detrewardmodel method)": [[38, "pomdp_py.utils.templates.DetRewardModel.sample"]], "sample() (pomdp_py.utils.templates.dettransitionmodel method)": [[38, "pomdp_py.utils.templates.DetTransitionModel.sample"]], "sample() (pomdp_py.utils.templates.tabularobservationmodel method)": [[38, "pomdp_py.utils.templates.TabularObservationModel.sample"]], "sample() (pomdp_py.utils.templates.tabularrewardmodel method)": [[38, "pomdp_py.utils.templates.TabularRewardModel.sample"]], "sample() (pomdp_py.utils.templates.tabulartransitionmodel method)": [[38, "pomdp_py.utils.templates.TabularTransitionModel.sample"]], "sample() (pomdp_py.utils.templates.uniformpolicymodel method)": [[38, "pomdp_py.utils.templates.UniformPolicyModel.sample"]], "shadebar (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.shadebar"]], "similar() (in module pomdp_py.utils.misc)": [[38, "pomdp_py.utils.misc.similar"]], "single_node_str() (pomdp_py.utils.debugging.treedebugger static method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.single_node_str"]], "sorted_by_str() (in module pomdp_py.utils.debugging)": [[38, "pomdp_py.utils.debugging.sorted_by_str"]], "special_char (class in pomdp_py.utils.misc)": [[38, "pomdp_py.utils.misc.special_char"]], "step() (pomdp_py.utils.debugging.treedebugger method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.step"]], "success() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.success"]], "to_radians() (in module pomdp_py.utils.math)": [[38, "pomdp_py.utils.math.to_radians"]], "topleft (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.topleft"]], "topright (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.topright"]], "topt (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.topt"]], "tree_stats() (pomdp_py.utils.debugging.treedebugger static method)": [[38, "pomdp_py.utils.debugging.TreeDebugger.tree_stats"]], "up (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.up"]], "vec() (in module pomdp_py.utils.math)": [[38, "pomdp_py.utils.math.vec"]], "vline (pomdp_py.utils.misc.special_char attribute)": [[38, "pomdp_py.utils.misc.special_char.vline"]], "warning() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.warning"]], "white() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.white"]], "yellow() (in module pomdp_py.utils.typ)": [[38, "pomdp_py.utils.typ.yellow"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["api/modules", "api/pomdp_py", "api/pomdp_py.algorithms", "api/pomdp_py.algorithms.bsp", "api/pomdp_py.algorithms.visual", "api/pomdp_py.framework", "api/pomdp_py.problems", "api/pomdp_py.problems.light_dark", "api/pomdp_py.problems.light_dark.agent", "api/pomdp_py.problems.light_dark.domain", "api/pomdp_py.problems.light_dark.env", "api/pomdp_py.problems.light_dark.models", "api/pomdp_py.problems.load_unload", "api/pomdp_py.problems.maze", "api/pomdp_py.problems.maze.domain", "api/pomdp_py.problems.maze.env", "api/pomdp_py.problems.maze.models", "api/pomdp_py.problems.maze.models.components", "api/pomdp_py.problems.multi_object_search", "api/pomdp_py.problems.multi_object_search.agent", "api/pomdp_py.problems.multi_object_search.domain", "api/pomdp_py.problems.multi_object_search.env", "api/pomdp_py.problems.multi_object_search.models", "api/pomdp_py.problems.multi_object_search.models.components", "api/pomdp_py.problems.rocksample", "api/pomdp_py.problems.rocksample.cythonize", "api/pomdp_py.problems.tag", "api/pomdp_py.problems.tag.agent", "api/pomdp_py.problems.tag.domain", "api/pomdp_py.problems.tag.env", "api/pomdp_py.problems.tag.models", "api/pomdp_py.problems.tag.models.components", "api/pomdp_py.problems.tiger", "api/pomdp_py.problems.tiger.cythonize", "api/pomdp_py.representations", "api/pomdp_py.representations.belief", "api/pomdp_py.representations.distribution", "api/pomdp_py.utils", "api/pomdp_py.utils.debugging", "api/pomdp_py.utils.interfaces", "api/pomdp_py.visual", "building_docs", "changelog", "design_principles", "examples", "examples.action_prior", "examples.external_solvers", "examples.mos", "examples.tiger", "existing_domains", "existing_solvers", "extensions", "index", "installation", "modules", "other_libraries"], "filenames": ["api/modules.rst", "api/pomdp_py.rst", "api/pomdp_py.algorithms.rst", "api/pomdp_py.algorithms.bsp.rst", "api/pomdp_py.algorithms.visual.rst", "api/pomdp_py.framework.rst", "api/pomdp_py.problems.rst", "api/pomdp_py.problems.light_dark.rst", "api/pomdp_py.problems.light_dark.agent.rst", "api/pomdp_py.problems.light_dark.domain.rst", "api/pomdp_py.problems.light_dark.env.rst", "api/pomdp_py.problems.light_dark.models.rst", "api/pomdp_py.problems.load_unload.rst", "api/pomdp_py.problems.maze.rst", "api/pomdp_py.problems.maze.domain.rst", "api/pomdp_py.problems.maze.env.rst", "api/pomdp_py.problems.maze.models.rst", "api/pomdp_py.problems.maze.models.components.rst", "api/pomdp_py.problems.multi_object_search.rst", "api/pomdp_py.problems.multi_object_search.agent.rst", "api/pomdp_py.problems.multi_object_search.domain.rst", "api/pomdp_py.problems.multi_object_search.env.rst", "api/pomdp_py.problems.multi_object_search.models.rst", "api/pomdp_py.problems.multi_object_search.models.components.rst", "api/pomdp_py.problems.rocksample.rst", "api/pomdp_py.problems.rocksample.cythonize.rst", "api/pomdp_py.problems.tag.rst", "api/pomdp_py.problems.tag.agent.rst", "api/pomdp_py.problems.tag.domain.rst", "api/pomdp_py.problems.tag.env.rst", "api/pomdp_py.problems.tag.models.rst", "api/pomdp_py.problems.tag.models.components.rst", "api/pomdp_py.problems.tiger.rst", "api/pomdp_py.problems.tiger.cythonize.rst", "api/pomdp_py.representations.rst", "api/pomdp_py.representations.belief.rst", "api/pomdp_py.representations.distribution.rst", "api/pomdp_py.utils.rst", "api/pomdp_py.utils.debugging.rst", "api/pomdp_py.utils.interfaces.rst", "api/pomdp_py.visual.rst", "building_docs.rst", "changelog.rst", "design_principles.rst", "examples.rst", "examples.action_prior.rst", "examples.external_solvers.rst", "examples.mos.rst", "examples.tiger.rst", "existing_domains.rst", "existing_solvers.rst", "extensions.rst", "index.rst", "installation.rst", "modules.rst", "other_libraries.rst"], "titles": ["pomdp_py", "pomdp_py package", "pomdp_py.algorithms package", "pomdp_py.algorithms.bsp package", "pomdp_py.algorithms.visual package", "pomdp_py.framework package", "pomdp_py.problems package", "pomdp_py.problems.light_dark package", "pomdp_py.problems.light_dark.agent package", "pomdp_py.problems.light_dark.domain package", "pomdp_py.problems.light_dark.env package", "pomdp_py.problems.light_dark.models package", "pomdp_py.problems.load_unload package", "pomdp_py.problems.maze package", "pomdp_py.problems.maze.domain package", "pomdp_py.problems.maze.env package", "pomdp_py.problems.maze.models package", "pomdp_py.problems.maze.models.components package", "pomdp_py.problems.multi_object_search package", "pomdp_py.problems.multi_object_search.agent package", "pomdp_py.problems.multi_object_search.domain package", "pomdp_py.problems.multi_object_search.env package", "pomdp_py.problems.multi_object_search.models package", "pomdp_py.problems.multi_object_search.models.components package", "pomdp_py.problems.rocksample package", "pomdp_py.problems.rocksample.cythonize package", "pomdp_py.problems.tag package", "pomdp_py.problems.tag.agent package", "pomdp_py.problems.tag.domain package", "pomdp_py.problems.tag.env package", "pomdp_py.problems.tag.models package", "pomdp_py.problems.tag.models.components package", "pomdp_py.problems.tiger package", "pomdp_py.problems.tiger.cythonize package", "pomdp_py.representations package", "pomdp_py.representations.belief package", "pomdp_py.representations.distribution package", "pomdp_py.utils package", "pomdp_py.utils.debugging module", "pomdp_py.utils.interfaces package", "pomdp_py.visual package", "Building Documentations", "Changelog", "Design Principles", "Examples", "Preference-based Action Prior", "Using External Solvers", "Multi-Object Search (MOS)", "Tiger", "Existing POMDP Domains", "Existing POMDP Solvers", "Use Case Extensions", "pomdp_py Documentation", "Installation", "docs", "Other POMDP Libraries"], "terms": {"packag": [0, 41, 47, 52, 53], "algorithm": [0, 1, 5, 7, 42, 46, 51, 52, 55], "po_rollout": [0, 1], "modul": [0, 1, 34, 41, 42, 47, 48, 52], "porollout": [0, 1, 2], "po_uct": [0, 1], "actionprior": [0, 1, 2, 42, 45, 48], "pouct": [0, 1, 2, 18, 26, 37, 38, 42, 45, 47, 48, 50, 51], "qnode": [0, 1, 2, 37, 38], "randomrollout": [0, 1, 2, 12, 33], "rolloutpolici": [0, 1, 2, 22, 24, 25, 30, 32, 37, 45, 48], "rootvnod": [0, 1, 2], "treenod": [0, 1, 2], "vnode": [0, 1, 2, 37, 38, 42], "pomcp": [0, 1, 18, 35, 37, 38, 42, 45, 48, 50, 51, 53, 55], "rootvnodeparticl": [0, 1, 2], "vnodeparticl": [0, 1, 2], "value_iter": [0, 1], "valueiter": [0, 1, 2, 42, 48, 50], "bsp": [0, 1], "blqr": [0, 1, 7, 42], "visual": [0, 1, 6, 7, 18, 26, 47], "framework": [0, 1, 12, 33, 42, 43, 47, 48, 52], "basic": [0, 1, 2, 24, 25, 35, 43, 46, 48, 50], "action": [0, 1, 2, 5, 6, 7, 12, 13, 18, 21, 22, 23, 24, 25, 26, 29, 30, 31, 32, 33, 35, 37, 38, 42, 43, 46, 47, 48, 50, 53], "agent": [0, 1, 2, 5, 6, 7, 12, 13, 14, 18, 22, 23, 24, 25, 26, 28, 32, 33, 35, 37, 38, 42, 43, 47, 48, 49, 50, 51, 52, 53], "blackboxmodel": [0, 1, 5, 35, 42, 48], "distribut": [0, 1, 2, 5, 12, 19, 22, 24, 25, 30, 32, 33, 34, 35, 37, 43, 45, 48], "environ": [0, 1, 5, 10, 15, 18, 21, 22, 29, 32, 33, 42, 43, 47, 48], "generativedistribut": [0, 1, 5, 19, 31, 36], "observ": [0, 1, 2, 3, 5, 6, 7, 10, 12, 13, 18, 21, 22, 23, 24, 25, 26, 29, 30, 32, 33, 35, 37, 38, 42, 43, 46, 47, 48, 50, 52, 53], "observationmodel": [0, 1, 5, 6, 12, 22, 24, 25, 30, 32, 33, 35, 37, 43, 48, 51], "option": [0, 1, 2, 5, 20, 22, 23, 24, 25, 32, 33, 37, 38, 42, 46, 48, 53], "pomdp": [0, 1, 2, 5, 7, 12, 13, 18, 20, 22, 24, 25, 26, 28, 29, 30, 32, 33, 37, 38, 41, 42, 43, 44, 45, 51, 52], "policymodel": [0, 1, 2, 5, 6, 18, 22, 32, 42, 45, 48, 51], "rewardmodel": [0, 1, 5, 6, 12, 22, 24, 25, 30, 32, 33, 37, 42, 43, 48], "state": [0, 1, 2, 3, 5, 6, 7, 12, 13, 18, 19, 21, 22, 24, 25, 26, 30, 32, 33, 35, 36, 37, 42, 43, 45, 46, 47, 48, 50, 53, 55], "transitionmodel": [0, 1, 5, 6, 12, 22, 24, 25, 30, 32, 33, 35, 37, 43, 48, 51], "sample_explict_model": [0, 1, 5], "sample_generative_model": [0, 1, 5], "oopomdp": [0, 1, 18, 42, 47, 51], "oobelief": [0, 1, 5, 19, 21, 29, 42], "ooobserv": [0, 1, 5, 20], "ooobservationmodel": [0, 1, 5, 22], "oostat": [0, 1, 5, 20, 42], "ootransitionmodel": [0, 1, 5, 22], "objectst": [0, 1, 5, 18, 20], "planner": [0, 1, 2, 3, 12, 18, 24, 25, 32, 33, 46, 48], "represent": [0, 1, 2, 5, 19, 21, 42, 52], "belief": [0, 1, 2, 3, 5, 6, 7, 10, 12, 18, 21, 24, 25, 27, 29, 32, 34, 36, 42, 46, 47, 48, 53], "histogram": [0, 1, 18, 19, 33, 34, 42, 46, 48], "particl": [0, 1, 2, 19, 34, 42, 53], "gaussian": [0, 1, 2, 3, 34], "util": [0, 1, 42, 46, 52], "subpackag": [0, 1, 52], "interfac": [0, 1, 5, 37, 42, 43, 46, 47, 48, 49, 50, 51, 52, 55], "submodul": [0, 1, 6, 13, 16], "color": [0, 1, 10, 21, 29, 38], "lighter": [0, 1, 37], "rgb_to_hex": [0, 1, 37], "hex_to_rgb": [0, 1, 37], "inverse_color_rgb": [0, 1, 37], "inverse_color_hex": [0, 1, 37], "random_unique_color": [0, 1, 37], "cython_util": [0, 1], "cpython": [0, 1], "37m": [0, 1], "x86_64": [0, 1], "linux": [0, 1, 53], "gnu": [0, 1], "det_dict_hash": [0, 1, 37, 42], "debug": [0, 1, 42, 52], "treedebugg": [0, 1, 32, 42], "sorted_by_str": [0, 1, 37, 38], "interpret_color": [0, 1, 37, 38], "math": [0, 1, 2, 5, 42], "vec": [0, 1, 37], "proj": [0, 1, 37], "r_x": [0, 1, 37], "r_y": [0, 1, 37], "r_z": [0, 1, 37], "t": [0, 1, 2, 3, 5, 18, 19, 21, 32, 33, 35, 36, 37, 43, 46, 48, 50, 55], "to_radian": [0, 1, 37], "r_between": [0, 1, 37], "approx_equ": [0, 1, 37], "euclidean_dist": [0, 1, 6, 22, 23, 24, 25, 37], "misc": [0, 1], "remap": [0, 1, 37], "json_saf": [0, 1, 37], "safe_slic": [0, 1, 37], "similar": [0, 1, 37, 46, 48], "special_char": [0, 1, 37], "plot": [0, 1, 6, 7, 53], "templat": [0, 1, 42], "simplest": [0, 1, 37], "simpleact": [0, 1, 37], "simpleobserv": [0, 1, 37], "dettransitionmodel": [0, 1, 37], "detobservationmodel": [0, 1, 37], "detrewardmodel": [0, 1, 37], "uniformpolicymodel": [0, 1, 37], "tabulartransitionmodel": [0, 1, 37, 42], "tabularobservationmodel": [0, 1, 37, 42], "tabularrewardmodel": [0, 1, 37, 42], "test_util": [0, 1], "typ": [0, 1], "bcolor": [0, 1, 37], "info": [0, 1, 37], "note": [0, 1, 2, 5, 7, 18, 22, 32, 33, 35, 36, 37, 38, 45, 46, 48, 52, 53], "error": [0, 1, 37, 42], "warn": [0, 1, 2, 37, 38, 46], "success": [0, 1, 2, 37], "bold": [0, 1, 37], "cyan": [0, 1, 37], "magenta": [0, 1, 37], "blue": [0, 1, 10, 37, 38], "green": [0, 1, 37, 53], "yellow": [0, 1, 37], "red": [0, 1, 37, 47], "white": [0, 1, 10, 37], "content": [0, 1, 41, 52], "clear_ag": [1, 2], "last_best_reward": [1, 2], "plan": [1, 2, 3, 5, 7, 10, 18, 22, 23, 32, 37, 38, 42, 45, 46, 48, 51, 52, 55], "set_rollout_polici": [1, 2], "updat": [1, 2, 3, 5, 18, 21, 26, 29, 35, 37, 38, 42, 46, 47, 48], "update_agent_belief": [1, 2, 5], "get_preferred_act": [1, 2, 45], "last_num_sim": [1, 2, 48], "last_planning_tim": [1, 2], "updates_agent_belief": [1, 2, 5], "rollout": [1, 2, 6, 18, 22, 24, 25, 26, 30, 32, 37, 42, 45, 48], "from_vnod": [1, 2], "histori": [1, 2, 5, 19, 22, 24, 25, 27, 30, 32, 37, 38, 45, 48], "children": [1, 2, 37, 38, 42], "num_visit": [1, 2], "valu": [1, 2, 5, 24, 25, 31, 32, 34, 36, 37, 38, 42, 45, 46, 48, 53, 55], "argmax": [1, 2, 5, 6, 12, 18, 22, 24, 25, 26, 30, 32, 33, 37, 42, 48], "print_children_valu": [1, 2], "ekf_update_mlo": [1, 2, 3], "integrate_belief_seg": [1, 2, 3], "segmented_cost_funct": [1, 2, 3], "create_plan": [1, 2, 3], "interpret_sqp_plan": [1, 2, 3], "add_attr": [1, 5], "all_act": [1, 5], "all_observ": [1, 5], "all_stat": [1, 5], "init_belief": [1, 5, 12, 24, 27, 32, 33, 48], "sample_belief": [1, 5], "set_belief": [1, 5, 46, 48], "update_histori": [1, 5, 48], "sampl": [1, 2, 5, 6, 12, 18, 19, 22, 24, 25, 26, 30, 32, 33, 36, 37, 42, 45, 46, 48, 53], "__getitem__": [1, 5, 34, 36, 37, 38], "__setitem__": [1, 5, 34, 36], "apply_transit": [1, 5], "blackbox_model": [1, 5, 35], "cur_stat": [1, 5], "provide_observ": [1, 5], "reward_model": [1, 5, 6, 10, 18, 26, 47, 48], "state_transit": [1, 5, 18, 21, 46, 48], "transition_model": [1, 5, 6, 7, 18, 26, 35, 46, 47, 48], "get_histogram": [1, 5, 34, 36], "mpe": [1, 5, 18, 19, 30, 31, 34, 36, 42], "get_all_observ": [1, 5, 6, 32, 33, 37, 48], "get_distribut": [1, 5, 32, 33], "probabl": [1, 5, 6, 12, 13, 18, 19, 22, 24, 25, 26, 30, 31, 32, 33, 36, 37, 42, 43, 46, 48, 50], "initi": [1, 5, 7, 19, 21, 24, 25, 27, 32, 42, 45, 46, 47, 48], "polici": [1, 2, 5, 12, 13, 22, 24, 25, 30, 32, 33, 37, 42, 45, 46, 48], "termin": [1, 2, 5, 18, 24, 25, 37, 38, 46, 48], "get_all_act": [1, 5, 6, 12, 18, 22, 24, 25, 26, 30, 32, 33, 37, 45, 48], "get_all_st": [1, 5, 6, 32, 33, 37, 48], "b": [1, 2, 3, 5, 35, 37, 38, 46], "object_belief": [1, 5, 19], "random": [1, 2, 5, 6, 18, 19, 22, 24, 25, 30, 31, 34, 36, 37, 42, 45, 48], "set_object_belief": [1, 5], "factor": [1, 5, 18, 20, 46], "merg": [1, 5, 18, 20], "observation_model": [1, 5, 6, 7, 18, 26, 29, 35, 46, 47, 48], "copi": [1, 5, 53], "get_object_attribut": [1, 5], "get_object_class": [1, 5], "get_object_st": [1, 5], "": [1, 2, 3, 5, 7, 12, 13, 18, 20, 21, 22, 23, 24, 25, 28, 30, 32, 33, 35, 37, 38, 41, 42, 43, 46, 48, 50, 52], "set_object_st": [1, 5], "situat": [1, 5, 47], "abstraction_over_histogram": [1, 34, 35], "update_histogram_belief": [1, 34, 35, 46, 48], "abstraction_over_particl": [1, 34, 35], "particle_reinvigor": [1, 34, 35], "update_particles_belief": [1, 34, 35], "is_norm": [1, 34, 36], "add": [1, 2, 19, 34, 36, 42], "from_histogram": [1, 34, 36], "get_abstract": [1, 34, 36], "weightedparticl": [1, 34, 36, 42], "condens": [1, 34, 36], "weight": [1, 2, 34, 36, 37], "cov": [1, 34, 36], "covari": [1, 2, 3, 34, 36], "mean": [1, 2, 21, 23, 26, 34, 35, 36, 46], "sigma": [1, 18, 19, 22, 34, 36], "simple_rl": [1, 37, 55], "num_nod": [1, 37, 38], "depth": [1, 2, 37, 38], "d": [1, 2, 3, 37, 38, 48, 52], "num_lay": [1, 37, 38], "nl": [1, 37, 38], "nn": [1, 37, 38], "nq": [1, 37, 38], "nv": [1, 10, 37, 38], "l": [1, 2, 3, 12, 37, 38, 47, 48, 52], "layer": [1, 37, 38], "leaf": [1, 37, 38], "step": [1, 2, 18, 32, 33, 37, 38, 41, 42, 46, 48, 53], "back": [1, 37, 38], "root": [1, 37, 38, 41, 53], "r": [1, 2, 3, 5, 12, 18, 21, 22, 24, 25, 29, 30, 32, 33, 37, 38, 42, 43, 46, 48, 50, 52, 53], "c": [1, 2, 10, 37, 38, 55], "p": [1, 24, 25, 37, 38, 52], "pp": [1, 37, 38], "mbp": [1, 37, 38], "pm": [1, 37, 38], "mark_sequ": [1, 37, 38], "mark": [1, 7, 13, 20, 37, 38, 47], "mark_path": [1, 37, 38], "markp": [1, 37, 38], "clear": [1, 2, 19, 27, 37, 38, 47], "bestseq": [1, 37, 38], "bestseqd": [1, 37, 38], "single_node_str": [1, 37, 38], "preferred_act": [1, 37, 38], "path": [1, 37, 38, 41, 46], "path_to": [1, 37, 38], "tree_stat": [1, 37, 38], "left": [1, 12, 18, 20, 32, 33, 37, 38, 46, 48, 53], "up": [1, 5, 12, 37, 38], "right": [1, 10, 12, 18, 19, 20, 32, 33, 37, 38, 46, 48, 53], "down": [1, 37, 48], "longleft": [1, 37], "longright": [1, 37], "hline": [1, 37], "vline": [1, 37], "bottomleft": [1, 37], "longbottomleft": [1, 37], "topleft": [1, 37], "longtopleft": [1, 37], "topright": [1, 37], "longtopright": [1, 37], "bottomright": [1, 37], "longbottomright": [1, 37], "intersect": [1, 37], "topt": [1, 37], "leftt": [1, 37], "rightt": [1, 37], "bottomt": [1, 37], "shadebar": [1, 37], "subscript": [1, 37], "reward_func": [1, 37], "endc": [1, 37], "disabl": [1, 37], "exist": [2, 37, 38, 44, 46, 48, 51, 52], "solver": [2, 32, 42, 44, 47, 48, 52], "under": [2, 23, 41, 46, 48, 55], "develop": [2, 5, 42, 46, 50, 52, 53, 55], "contribut": [2, 49, 52, 53], "want": [2, 19, 41, 47], "po": [2, 24, 25, 52], "baselin": 2, "paper": [2, 3, 7, 12, 13, 18, 20, 22, 28, 30, 45, 47, 48, 52], "2": [2, 10, 12, 20, 24, 25, 26, 27, 29, 30, 31, 37, 38, 45, 46, 48, 52, 53, 55], "quot": [2, 7, 12, 13, 32, 33, 48], "from": [2, 5, 7, 12, 13, 19, 20, 21, 22, 23, 27, 30, 32, 33, 36, 37, 38, 41, 42, 45, 46, 47, 48, 53], "To": [2, 12, 33, 37, 38, 41, 45, 47, 48], "provid": [2, 42, 46, 47, 48, 51, 52, 55], "perform": [2, 3, 5, 46, 48, 55], "benchmark": 2, "case": [2, 18, 21, 22, 32, 33, 35, 46, 48, 49, 52, 55], "we": [2, 7, 18, 19, 22, 23, 41, 44, 46, 47, 48, 49, 52, 53, 55], "evalu": [2, 36], "simpl": [2, 7, 20, 22, 23, 24, 25, 26, 32, 44, 47, 48, 52], "mont": [2, 48], "carlo": [2, 48], "simul": [2, 5, 18, 21, 32, 42, 46, 48], "without": [2, 37, 42, 46, 47, 48], "ani": [2, 13, 21, 22, 36, 46], "tree": [2, 37, 38, 42, 47, 48], "The": [2, 3, 5, 7, 12, 13, 14, 18, 20, 21, 22, 23, 24, 25, 28, 30, 32, 33, 36, 37, 38, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52, 55], "us": [2, 3, 5, 7, 18, 19, 20, 21, 22, 23, 32, 35, 36, 37, 38, 41, 42, 43, 44, 45, 47, 48, 49, 50, 52, 53, 55], "describ": [2, 3, 5, 18, 21, 41, 43, 44, 45, 47, 48, 52], "section": [2, 47, 48], "3": [2, 12, 20, 21, 24, 25, 32, 33, 37, 38, 46, 48, 53, 55], "It": [2, 3, 5, 20, 22, 36, 37, 38, 42, 45, 46, 47, 48, 52, 55], "n": [2, 18, 20, 24, 25, 35, 36, 37, 38, 46, 47], "A": [2, 3, 5, 7, 12, 13, 18, 19, 21, 27, 32, 33, 37, 38, 42, 43, 46, 47, 48, 50, 52, 55], "each": [2, 3, 5, 12, 13, 21, 22, 36, 37, 38, 46], "legal": 2, "select": 2, "highest": [2, 5, 31, 36, 37, 38], "averag": [2, 36], "return": [2, 3, 5, 12, 19, 21, 22, 23, 24, 25, 30, 31, 32, 33, 35, 36, 37, 38, 42, 45, 46, 48], "don": [2, 5, 18, 35, 48], "requir": [2, 5, 12, 22, 24, 25, 30, 32, 33, 35, 37, 42, 43, 53], "an": [2, 3, 5, 7, 10, 12, 13, 18, 19, 20, 21, 22, 23, 24, 25, 29, 32, 33, 36, 37, 42, 43, 45, 46, 47, 48, 50, 52, 55], "But": [2, 5, 18, 20, 22, 32, 33, 35, 41, 42, 48], "do": [2, 5, 7, 41, 47, 48], "class": [2, 3, 5, 10, 12, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 42, 43, 45, 46, 47, 48, 51], "base": [2, 3, 5, 10, 12, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 41, 46, 47, 48, 51, 52, 55], "self": [2, 5, 12, 19, 21, 22, 24, 25, 30, 31, 32, 33, 36, 37, 38, 45, 47, 48], "carri": [2, 5], "inform": [2, 3, 5, 23, 27, 41, 43, 48], "bt": [2, 3, 5], "ht": [2, 5], "o": [2, 5, 12, 24, 25, 30, 32, 33, 35, 37, 41, 43, 46, 48, 50, 52], "g": [2, 3, 5, 13, 18, 21, 32, 42, 48, 49], "pi": [2, 5, 12, 22, 24, 25, 33, 43, 48], "necessari": [2, 5, 18, 47], "rollout_polici": [1, 2, 37, 38, 48], "given": [2, 5, 12, 18, 21, 22, 33, 35, 36, 37, 38, 43, 45, 46, 48], "one": [2, 5, 12, 19, 21, 32, 33, 37, 38, 44, 48, 52, 55], "real_act": [2, 5, 18, 27, 35], "real_observ": [2, 5, 18, 27, 35, 48], "real": [2, 5, 18, 21, 29, 35, 46, 48], "accordingli": [2, 5], "If": [2, 3, 5, 19, 21, 22, 27, 32, 33, 35, 36, 37, 38, 46, 48, 52], "i": [2, 3, 5, 7, 10, 12, 13, 14, 18, 19, 20, 21, 22, 23, 24, 25, 29, 30, 32, 33, 35, 36, 37, 38, 41, 42, 43, 45, 46, 47, 48, 49, 52, 53, 55], "also": [2, 5, 22, 32, 33, 37, 38, 47, 48, 50, 52, 55], "here": [2, 5, 7, 37, 38, 41, 45, 46, 48, 49, 53], "attribut": [2, 5, 20], "should": [2, 3, 5, 20, 22, 35, 41, 42, 43, 46, 47, 48, 51, 53], "set": [2, 5, 12, 19, 20, 21, 23, 24, 25, 30, 32, 33, 35, 36, 37, 42, 45, 46, 47, 48, 55], "true": [2, 5, 10, 13, 18, 21, 22, 23, 26, 32, 35, 36, 37, 38, 42, 46, 48, 53], "By": [2, 5, 23, 46], "default": [2, 5, 32, 35, 42, 46], "doe": [2, 5, 13, 23, 30, 36, 37, 38, 42, 43, 46, 48, 55], "noth": [2, 5], "function": [2, 3, 5, 7, 18, 19, 21, 27, 32, 35, 36, 37, 38, 42, 45, 46, 48, 50], "thi": [2, 3, 5, 7, 12, 18, 19, 20, 21, 22, 23, 24, 25, 29, 30, 32, 33, 35, 36, 37, 38, 41, 42, 43, 44, 45, 46, 48, 52, 53, 55], "uct": 2, "partial": [2, 12, 13, 32, 33, 48, 52], "present": [2, 7, 36], "extens": [2, 20, 22, 42, 48, 49, 52, 55], "combin": [2, 37], "mct": 2, "ucb1": [2, 42], "In": [2, 7, 18, 30, 32, 33, 44, 45, 46, 47, 48, 49], "other": [2, 6, 24, 25, 32, 33, 48, 52], "word": 2, "just": [2, 14, 19, 32, 33, 36, 37, 46, 48, 53], "arbitrari": 2, "strategi": 2, "mai": [2, 5, 7, 18, 24, 35, 41, 43, 44, 47, 52, 53], "refer": [2, 3, 7, 18, 24, 32, 33, 41, 42, 45], "spars": 2, "poss": 2, "introduc": [2, 12, 13, 42, 47, 48], "recent": 2, "5": [2, 3, 10, 21, 23, 24, 25, 32, 37, 38, 46, 48, 53], "mdp": [2, 5, 52, 55], "6": [2, 26, 37, 38, 46, 48, 53], "propos": 2, "call": [2, 5, 35, 46, 48], "powss": 2, "howev": [2, 48], "line": [2, 46, 47], "work": [2, 37, 38, 42, 46, 48, 52, 53, 55], "sole": 2, "still": [2, 35, 48], "compar": [2, 36], "exactli": 2, "while": [2, 12, 32, 33, 42, 48], "depend": [2, 3, 5, 7, 24, 30, 37, 42, 53], "explor": [2, 37, 38], "constant": [0, 2, 6, 37], "7": [2, 10, 37, 38, 42, 46], "reflect": 2, "prior": [2, 5, 18, 19, 26, 27, 32, 42, 48], "knowledg": [2, 48], "regard": [2, 5, 42, 48], "amount": [2, 7], "thei": [2, 19, 23, 35, 46], "follow": [2, 3, 5, 18, 32, 33, 37, 38, 45, 46, 47, 48, 52, 53], "wa": [2, 42, 47], "r_": 2, "hi": 2, "lo": 2, "where": [2, 3, 5, 7, 10, 18, 20, 21, 22, 24, 25, 35, 47, 48, 53], "rhi": 2, "achiev": 2, "dure": [2, 23, 37, 38, 42, 45, 46, 48], "run": [2, 23, 32, 33, 41, 42, 46, 47, 48, 53], "0": [2, 5, 10, 12, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 36, 37, 38, 45, 46, 48, 53], "rlo": 2, "lowest": 2, "inde": [2, 48], "differ": [2, 12, 18, 20, 22, 41, 42, 43, 47, 55], "between": [2, 5, 12, 21, 23, 24, 32, 37, 42, 43, 47, 55], "certainli": 2, "onli": [2, 5, 13, 22, 32, 37, 38, 42, 43, 48], "wai": [2, 46, 48, 55], "obtainx1": 2, "object": [2, 5, 6, 10, 19, 20, 21, 22, 23, 24, 25, 29, 31, 36, 37, 38, 42, 45, 48, 51, 52, 53], "problem": [0, 2, 3, 5, 35, 42, 44, 46, 48, 49, 52, 53, 55], "specif": [2, 5, 36, 37, 38, 42, 48, 55], "cl": [2, 5], "kwarg": [2, 5, 12, 19, 20, 21, 22, 24, 25, 26, 29, 31, 33, 36, 37, 38, 42], "intend": 2, "classmethod": [2, 5, 20, 22, 29, 30, 31, 36, 46], "mimic": 2, "behavior": [2, 20, 42, 48], "generateleg": 2, "generatepref": 2, "david": [2, 48], "silver": [2, 48], "code": [2, 5, 37, 42, 45, 46, 47, 48, 52, 55], "tupl": [2, 3, 5, 10, 19, 21, 22, 24, 25, 30, 36, 37], "form": [2, 35], "num_visits_init": [1, 2], "value_init": [1, 2], "repres": [2, 3, 5, 10, 19, 24, 25, 35, 36, 37, 38, 44, 46, 47], "prefer": [2, 37, 38, 42, 48], "act": [2, 5, 32, 48, 52, 53], "despot": [2, 55], "For": [2, 5, 21, 23, 36, 42, 48, 53], "exampl": [2, 5, 18, 21, 23, 32, 33, 37, 38, 42, 45, 47, 48, 49, 50, 52], "certain": [2, 5], "possibl": [2, 5, 12, 20, 22, 24, 25, 30, 32, 33, 37, 48, 55], "subset": [2, 37, 38], "all": [2, 5, 12, 19, 22, 24, 25, 30, 32, 33, 36, 37, 38, 42, 48, 55], "when": [2, 5, 18, 24, 25, 28, 30, 36, 37, 38, 41, 42, 44, 45, 46, 47, 48, 52, 53, 55], "domain": [2, 6, 7, 10, 13, 18, 22, 24, 26, 32, 42, 44, 47, 52], "can": [2, 5, 7, 12, 14, 18, 20, 21, 22, 28, 32, 33, 37, 38, 42, 46, 47, 48, 50, 53, 55], "heurist": [2, 24, 25, 48], "space": [2, 3, 5, 7, 10, 12, 13, 19, 20, 22, 24, 25, 28, 32, 33, 35, 42, 46, 47, 48, 50], "enumer": [2, 32, 37, 38, 42, 43, 46, 48, 50], "__init__": [2, 5, 36, 41, 42, 45, 47, 48], "max_depth": [1, 2, 18, 26, 37, 38, 48], "planning_tim": [2, 18, 26, 42, 48], "1": [2, 3, 5, 7, 10, 12, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 32, 33, 36, 37, 38, 45, 46, 47, 48, 52, 53], "num_sim": [2, 37, 38, 42], "discount_factor": [1, 2, 5, 18, 26, 37, 38, 46, 48], "9": [2, 37, 42, 46, 48, 53], "exploration_const": [2, 18, 26, 37, 38, 48], "sqrt": 2, "action_prior": [1, 2, 45], "none": [2, 3, 5, 10, 18, 19, 20, 22, 24, 25, 29, 30, 32, 35, 36, 37, 38, 45, 46, 48, 53], "show_progress": 2, "fals": [2, 5, 10, 12, 18, 19, 21, 22, 23, 24, 25, 29, 31, 32, 33, 35, 36, 37, 46, 53], "pbar_update_interv": 2, "paramet": [2, 3, 5, 12, 18, 19, 21, 22, 24, 25, 27, 30, 32, 33, 35, 36, 37, 38, 42, 46, 48], "int": [2, 19, 21, 32, 33, 37, 38, 46], "float": [2, 5, 12, 21, 22, 24, 25, 30, 32, 33, 36, 37, 46], "time": [2, 12, 18, 20, 24, 25, 35, 46, 47], "second": [2, 35, 37, 38, 41, 46, 47], "neg": [2, 32, 33, 42, 48], "number": [2, 5, 18, 19, 32, 33, 35, 36, 37, 38, 42, 46, 55], "reach": [2, 5, 18, 46, 48], "both": [2, 32, 33, 37, 38, 46, 47], "ar": [2, 5, 7, 12, 18, 19, 22, 23, 24, 25, 28, 32, 33, 35, 36, 37, 38, 41, 42, 43, 46, 47, 48, 49, 53, 55], "over": [2, 7, 19, 32, 35, 36, 43, 44, 45, 48], "bool": [2, 5, 18, 21, 32, 35, 37, 38, 46], "print": [2, 37, 38, 42, 46, 48], "progress": [2, 42], "bar": [2, 42], "after": [2, 5, 12, 20, 21, 22, 29, 42, 46, 48], "you": [2, 5, 7, 18, 32, 33, 35, 37, 38, 41, 42, 45, 46, 47, 48, 52, 53], "even": [2, 49], "your": [2, 42, 47, 52], "stop": 2, "criteria": 2, "ran": 2, "last": [2, 13, 20], "assum": [2, 3, 5, 7, 10, 12, 19, 22, 23, 24, 25, 30, 32, 33, 36, 37, 42, 46, 53], "ha": [2, 5, 18, 23, 24, 25, 31, 36, 41, 46, 47, 51, 55], "been": [2, 48, 49], "take": [2, 5, 14, 24, 25, 28, 36, 42, 45, 46, 47, 48], "receiv": [2, 5, 12, 24, 25, 32, 33, 47, 48], "choos": [2, 45, 48], "uniformli": [2, 48], "child": 2, "implement": [2, 3, 5, 7, 12, 13, 18, 22, 24, 25, 28, 30, 32, 33, 36, 37, 42, 44, 45, 48, 49, 50, 51, 52, 55], "origin": [2, 7, 10, 12, 13, 20, 22, 24, 25, 45, 47, 48, 52], "larg": [2, 5, 28, 29, 30, 48], "http": [2, 3, 46, 52, 53], "nip": 2, "cc": 2, "4031": 2, "One": [2, 19, 48], "thing": 2, "happen": [2, 18, 22], "new": [2, 5, 21, 29, 35, 36, 42, 52], "store": [2, 5, 37, 46, 48], "level": [2, 47], "execut": [2, 5, 21, 23, 37, 38, 46, 48], "next": [2, 5, 12, 22, 24, 25, 30, 32, 33, 37, 48], "These": 2, "reinvigor": [2, 35, 53], "enough": [2, 12, 33, 49], "separ": [2, 41, 42, 47], "complet": [2, 7, 37, 46], "node": [2, 37, 38, 42, 46], "longer": 2, "keep": [2, 12, 33, 35, 37], "track": [2, 35], "reinvogr": 2, "onc": [2, 5, 32, 48], "have": [2, 3, 5, 18, 19, 21, 24, 25, 32, 33, 35, 36, 37, 38, 42, 43, 46, 47, 48, 49, 55], "previous": [2, 42, 47], "version": [2, 46, 53], "basicpomcp": 2, "jl": [2, 46, 55], "github": [2, 41, 42, 46, 52, 53], "com": [2, 46, 53], "juliapomdp": [2, 7], "two": [2, 32, 33, 36, 37, 41, 44, 46, 48, 55], "equival": [2, 10, 48], "gener": [2, 5, 18, 32, 33, 36, 41, 43, 45, 46, 47, 48, 49, 52], "doesn": [2, 19, 32, 33, 55], "hurt": [2, 32, 33, 48], "featur": [2, 37, 38, 42, 52, 55], "state_transform_func": [2, 35], "artifici": [2, 48, 52], "transform": 2, "signatur": [2, 42], "s_transform": 2, "maintain": [2, 5, 12, 35, 46], "iter": [2, 24, 25, 32, 35, 42, 46, 48, 53, 55], "explain": [2, 41], "4": [2, 3, 20, 37, 38, 46, 48, 53], "stochast": [2, 13, 32, 48, 52], "No": [2, 46], "prune": [2, 46], "explod": 2, "veri": [2, 5, 48], "fast": 2, "feasibl": [2, 5, 12, 24, 25, 30, 32, 33, 37], "small": [2, 12, 22, 26, 27, 29, 30, 32, 33, 42, 48], "explicitli": [2, 24, 25, 35, 43, 45, 46, 48, 50], "horizon": [2, 42, 46, 48], "inf": [2, 46], "epsilon": [2, 18, 19, 22, 36, 37], "1e": [2, 22, 36, 37, 48], "lqr": [2, 3], "maximum": [2, 3, 7, 10, 18, 19, 32, 33, 42, 46], "likelihood": [2, 3, 7, 10, 36], "func_sysd": [2, 3], "func_ob": [2, 3], "jac_sysd": [2, 3], "jac_ob": [2, 3], "jac_sysd_u": [2, 3], "noise_ob": [2, 3], "noise_sysd": [2, 3], "qlarg": [2, 3], "q": [2, 3, 37, 38, 42], "planning_horizon": [2, 3], "15": [2, 3, 32, 37, 38, 46, 48], "sourc": [2, 3, 10, 12, 14, 15, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 35, 37, 38, 41, 46, 47, 48, 53], "ut": [2, 3], "ekf": [2, 3], "equat": [2, 3, 35], "12": [2, 3, 21, 29, 37, 46, 53], "13": [2, 3, 42], "f": [2, 3, 10], "point": [2, 3, 23, 28, 30, 46], "mt": [2, 3], "cov_t": [2, 3], "np": [2, 3], "arrai": [2, 3, 10, 36], "shape": [2, 3, 10, 20, 22, 23, 47], "cost": [2, 3, 19, 24, 25, 35], "need": [2, 3, 7, 19, 22, 32, 33, 35, 42, 45, 46, 48, 53], "turn": [2, 3], "long": [2, 3], "vector": [2, 3, 36, 37, 46], "consist": [2, 3, 12, 33], "column": [2, 3], "stich": [2, 3], "togeth": [2, 3], "control": [2, 3, 21, 22, 29, 48], "noise_t": [2, 3], "nois": [2, 3, 24, 25, 32, 33, 48], "possibli": [2, 3], "matrix": [2, 3], "wt": [2, 3], "term": [2, 3], "e": [2, 3, 5, 12, 18, 20, 21, 22, 23, 24, 25, 30, 32, 33, 37, 38, 42, 47, 48, 49, 53], "ad": [2, 3, 5, 42], "system": [2, 3, 46, 48, 55], "dynam": [2, 3, 22, 23], "v": [2, 3, 37, 38, 42, 46], "eq": [2, 3], "sam": [2, 3], "dimension": [2, 3, 12], "noise_obs_cov": [2, 3], "correspond": [2, 3, 21, 45, 46], "b_i": [2, 3], "u_i": [2, 3], "num_seg": [2, 3], "18": [2, 3, 37, 38, 46], "phi": [2, 3], "sum": [2, 3], "b_": [2, 3, 35, 48], "b_t": [2, 3, 48], "seg": [2, 3], "essenti": [2, 3, 43], "bu_traj": [2, 3], "b_de": [2, 3], "u_d": [2, 3], "17": [2, 3], "desir": [2, 3, 41], "covt": [2, 3], "comput": [2, 3, 19, 35, 42, 46], "list": [2, 3, 36, 37, 38, 42, 46], "begin": [2, 3, 37, 48], "segment": [2, 3], "avail": [2, 3, 5, 42, 52], "pass": [2, 3, 5, 12, 46, 48], "empti": [2, 3, 27], "b_0": [2, 3], "u_init": [2, 3], "control_bound": [2, 3], "opt_opt": [2, 3], "opt_callback": [2, 3], "solv": [2, 3, 6, 12, 13, 18, 26, 32, 42, 44, 47, 50, 52, 53], "sqp": [2, 3], "direct": [2, 3, 51], "transcript": [2, 3], "produc": [2, 3], "doc": [2, 3, 42], "scipi": [2, 3], "org": [2, 3, 42, 46, 52, 53], "tutori": [2, 3, 42, 45], "optim": [2, 3, 48], "html": [2, 3, 41, 46, 53], "opt_r": [2, 3], "lesli": [2, 48, 52], "pack": [2, 48, 52], "kaelbl": [2, 48, 52], "michael": [2, 47, 48, 52], "littman": [2, 48, 52], "anthoni": [2, 46, 48, 50, 52], "cassandra": [2, 46, 48, 50, 52], "intellig": [2, 48, 52], "101": [2, 48, 52], "99": [2, 18, 26, 46, 48, 52], "134": [2, 48, 52], "1998": [2, 48, 52], "joel": [2, 48], "veness": [2, 48], "advanc": [2, 48, 55], "neural": [2, 48], "process": [2, 32, 33, 48], "2164": [2, 48], "2172": [2, 48], "2010": [2, 48], "levent": 2, "kocsi": 2, "csaba": 2, "szepesv": 2, "\u00e1": 2, "ri": 2, "bandit": 2, "european": 2, "confer": [2, 47, 48, 52], "machin": [2, 46], "learn": [2, 5, 43, 48, 49, 51, 52, 55], "282": 2, "293": 2, "springer": 2, "2006": 2, "platt": 2, "tedrak": 2, "lozano": 2, "perez": 2, "proceed": [2, 48], "robot": [2, 7, 14, 18, 19, 20, 21, 22, 23, 24, 25, 28, 30, 47, 48, 52, 55], "scienc": 2, "zaragoza": 2, "spain": 2, "june": 2, "doi": 2, "10": [2, 18, 21, 24, 25, 26, 27, 29, 30, 32, 33, 37, 38, 42, 46, 48, 52], "15607": 2, "rss": 2, "vi": [2, 48], "037": 2, "h": [2, 48], "lim": 2, "clair": 2, "j": 2, "tomlin": 2, "zachari": 2, "sunberg": 2, "search": [2, 6, 12, 13, 19, 20, 22, 24, 25, 37, 38, 42, 48, 52, 53], "guarante": 2, "continu": [2, 7, 42, 48], "arxiv": [2, 52], "preprint": 2, "1910": 2, "04332": 2, "2019": [2, 18, 20, 22, 47, 48], "kearn": 2, "yishai": 2, "mansour": 2, "andrew": 2, "y": [2, 19, 20, 21, 22, 24, 25, 27, 28, 29], "ng": 2, "markov": [2, 32, 33, 48], "decis": [2, 32, 33, 48], "49": [2, 37], "193": 2, "208": 2, "2002": 2, "ant": 2, "\u00f3": 2, "nio": 2, "gusmao": 2, "tapani": 2, "raiko": 2, "toward": 2, "beyond": [2, 52], "game": 2, "go": [2, 13, 41, 44, 53], "ecai": 2, "384": 2, "389": 2, "2012": 2, "import": [5, 37, 38, 43, 45, 46, 48, 53], "must": [5, 7, 12, 13, 46, 48], "hashabl": [5, 36, 37, 42], "oper": 5, "its": [5, 7, 12, 13, 14, 21, 22, 23, 24, 25, 32, 33, 42, 43, 46, 48, 50, 51, 55], "job": [5, 43, 48], "taken": [5, 18, 36], "care": [5, 19], "suppli": [5, 45], "OR": 5, "policy_model": [5, 6, 18, 26, 37, 38, 47, 48], "attr_nam": 5, "attr_valu": 5, "allow": [5, 42, 47, 48, 52], "sometim": [5, 48], "model": [5, 6, 7, 12, 13, 18, 19, 20, 24, 25, 26, 32, 33, 37, 42, 46, 47, 50, 51, 52], "transit": [5, 12, 21, 22, 24, 25, 30, 32, 33, 35, 37, 46, 47, 48], "current": [5, 13, 21, 24, 25, 35, 37, 38, 46, 50], "which": [5, 14, 21, 24, 32, 33, 35, 36, 37, 38, 42, 45, 46, 48, 55], "most": [5, 12, 19, 22, 24, 25, 30, 33, 36, 37], "like": [5, 12, 19, 22, 24, 25, 30, 33, 36, 37, 38, 41, 42, 43, 47, 48, 53], "map": [5, 13, 16, 19, 20, 21, 22, 23, 27, 36, 37, 46], "variabl": [5, 31, 32, 36, 46], "pr": [5, 12, 22, 24, 25, 30, 32, 33, 35, 36, 37], "x": [5, 7, 10, 12, 19, 20, 21, 22, 24, 25, 27, 28, 29, 36, 53], "varval": 5, "evaul": 5, "world": [5, 12, 18, 20, 21, 22, 32, 48, 53], "2d": [5, 18, 20, 22, 23, 42], "gridworld": [5, 19, 20, 22, 47], "render": 5, "pygam": [5, 21, 29, 53], "Or": [5, 36, 48, 53], "could": [5, 18, 20, 21, 22, 32, 36, 44, 45, 48, 52, 55], "3d": 5, "opengl": 5, "therefor": [5, 12, 35], "mind": 5, "how": [5, 32, 44, 47, 52], "so": [5, 13, 37, 38, 41, 42, 48, 53, 55], "passiv": 5, "never": [5, 30], "nor": [5, 32, 33, 48], "init_st": [5, 10, 12, 15, 21, 24, 25, 29, 32, 46], "next_stat": [5, 12, 20, 21, 22, 24, 25, 30, 32, 33, 37, 48], "appli": [5, 42], "assign": [5, 36], "underli": [5, 33, 36], "accord": [5, 12, 22, 23, 24, 25, 28, 30, 32, 33, 37, 47, 48], "type": [5, 12, 19, 21, 22, 24, 25, 30, 32, 33, 35, 36, 37, 42, 45, 46], "synonym": 5, "result": [5, 20, 21, 22, 35, 48], "trigger": [5, 21], "becom": [5, 21, 48], "discount": [5, 12, 24, 25, 46, 53], "until": [5, 46], "condit": [5, 48], "reward": [5, 12, 21, 22, 24, 25, 30, 32, 33, 37, 46, 47, 48, 53], "addition": [5, 53], "exhibit": 5, "properti": [5, 10, 20, 21, 23, 24, 25, 29, 37, 38, 42], "That": [5, 46], "support": [5, 22, 36, 43, 45, 51, 52, 55], "dictionari": [5, 19, 36, 37, 48], "randomli": [5, 12, 22, 24, 25, 30, 32, 33, 36, 37, 47], "tempor": 5, "abstract": [5, 36], "defin": [5, 10, 12, 13, 14, 18, 20, 22, 36, 37, 42, 44, 45, 46, 47, 50, 51], "semi": 5, "reinforc": [5, 51, 55], "satisfi": 5, "conveni": [5, 32, 37, 42], "overriden": 5, "feel": [5, 55], "write": [5, 46], "boolean": 5, "whether": [5, 12, 43, 46], "technic": 5, "instanc": [5, 21, 24, 25, 32, 33, 46, 47], "env": [5, 6, 7, 13, 18, 26, 46, 47, 48], "name": [5, 12, 20, 24, 32, 33, 37, 46, 48], "treat": [5, 19, 32, 48], "h_t": [5, 48], "reason": 5, "accommod": 5, "vari": [5, 7, 20, 22], "probabilti": 5, "arg": [5, 12, 24, 25, 30, 32, 33, 37, 38, 42, 48], "pair": 5, "mathbb": 5, "denot": 5, "sim": [5, 48], "black": [5, 10], "box": 5, "creat": [5, 6, 7, 10, 32, 37, 38, 41, 46, 47, 48], "n_step": 5, "compon": [5, 13, 16, 18, 22, 26, 30, 46, 47, 48], "oo": [5, 20, 29, 42, 47, 51], "As": [5, 45, 47], "main": [5, 6, 12, 24, 25, 26, 32, 33, 42, 46, 48], "benefit": 5, "reduc": [5, 20, 35], "scale": 5, "exponenti": [5, 24], "linear": 5, "increas": [5, 24], "see": [5, 36, 42, 43, 46, 47, 48, 49, 50, 52, 53], "alwai": [5, 13, 49], "objid": [5, 18, 19, 20, 21, 22], "alia": [5, 37, 38], "return_oost": [5, 19, 42], "z": [5, 21, 29, 35], "mapsto": 5, "z_1": 5, "cdot": [5, 46], "z_n": 5, "id": [5, 19, 20, 21, 22], "dict": [5, 19, 20, 21, 27, 35, 36, 42], "object_observ": [5, 20], "singl": [5, 20, 37, 38, 47], "prod_i": 5, "z_i": 5, "param": [5, 20], "again": 5, "chang": [5, 20, 22, 36, 42, 43, 48, 53], "directli": [5, 12, 33, 35, 48, 50], "object_st": [5, 20, 22], "becaus": [5, 12, 13, 19, 41, 43, 46, 48], "caus": 5, "hashcod": 5, "incorrect": [5, 37], "kei": [5, 37, 38], "attr": 5, "request": [5, 7], "frozenset": 5, "identifi": 5, "sinc": [5, 35, 48], "hash": [5, 37, 42], "s_i": [5, 20], "made": [5, 35, 42, 53], "str": [5, 21, 32, 36, 46], "onlin": [5, 7, 48], "pure": 5, "underneath": 5, "hood": 5, "Its": 5, "output": [5, 41, 46, 53], "expect": [5, 46, 53], "same": [5, 28, 30, 32, 35, 36, 42, 46, 48], "lasertag": 0, "light_dark": [0, 6, 49], "problem_discret": [0, 6], "test": [0, 6, 32, 35, 42, 46], "load_unload": [0, 6], "maze": [0, 6, 49], "multi_object_search": [0, 6, 47, 53], "example_world": [0, 6, 47], "random_world": [6, 18], "rocksampl": [0, 6, 42, 53], "cython": [0, 6, 37, 42, 52, 53, 55], "rocksample_problem": [0, 6], "run_rocksampl": [6, 24], "rocktyp": [6, 24, 25], "good": [6, 24, 25, 47, 53], "bad": [6, 24, 25, 53], "invert": [6, 24, 25], "moveact": [6, 24, 25], "east": [6, 18, 20, 24, 25], "west": [6, 18, 20, 24, 25], "north": [6, 18, 20, 24, 25, 53], "south": [6, 18, 20, 24, 25], "sampleact": [6, 24, 25], "checkact": [6, 24, 25], "rstransitionmodel": [6, 24, 25], "rsobservationmodel": [6, 24, 25], "rsrewardmodel": [6, 24, 25], "rspolicymodel": [6, 24, 25], "rocksampleproblem": [6, 24, 25], "random_free_loc": [6, 24, 25], "in_exit_area": [6, 24, 25], "generate_inst": [6, 24, 25], "print_stat": [6, 24, 25], "test_plann": [6, 12, 24, 25, 32, 33, 48], "init_particles_belief": [6, 24, 25], "tag": [0, 6, 42], "experi": [0, 6, 7], "tiger": [0, 6, 37, 38, 42, 45, 46, 47, 52, 53], "run_tig": [6, 32], "tiger_problem": [0, 6, 37, 38, 42, 46, 48], "tigerst": [6, 32, 33, 46], "tigeract": [6, 32, 33], "tigerobserv": [6, 32, 33], "tigerproblem": [6, 32, 33, 37, 38, 46, 48], "make_tig": [6, 32], "lightdarkenviron": [7, 10], "light": [6, 10, 42], "const": [7, 10], "dark": [6, 10, 42], "mazeenviron": [13, 15], "finit": [12, 13, 32, 46, 48], "descript": [7, 12, 13, 18, 20, 21, 22, 24, 25, 32, 33, 48], "start": [12, 13, 21, 37, 38, 48, 53], "goal": [7, 13, 48], "cannot": [12, 13, 36, 41], "perceiv": [12, 13], "locat": [12, 13, 19, 23, 24, 25, 28, 30, 53], "orient": [13, 14, 18, 19, 20, 22, 23, 47, 51], "presenc": 13, "absenc": 13, "wall": [13, 14], "side": [12, 13, 48], "squar": 13, "non": 13, "zero": [13, 42], "slip": 13, "know": [13, 18, 35], "attempt": [13, 42], "make": [13, 19, 36, 37, 38, 41, 42, 43, 47, 52, 53, 55], "move": [7, 12, 13, 24, 25, 30, 31, 37, 38, 47, 53], "had": 13, "consequ": 13, "actual": [7, 13, 18, 23, 32, 33, 48], "posit": [7, 13, 14, 24, 25, 30, 31, 32, 33, 48], "Not": [13, 36], "yet": [7, 13, 42, 47], "motion": [14, 18, 20, 22, 24, 25, 28, 47], "look": [14, 20, 22, 47, 53], "positit": 14, "mosag": [18, 19], "clear_histori": [18, 19, 26, 27], "mosoobelief": [18, 19], "initialize_belief": [18, 19, 26, 27], "motionact": [18, 20, 23], "scheme_xyth": [18, 20], "scheme_vw": [18, 20], "forward": [18, 20], "backward": [18, 20, 42], "scheme_xi": [18, 20], "east2d": [18, 20, 31], "west2d": [18, 20, 31], "north2d": [18, 20, 31], "south2d": [18, 20, 31], "scheme": [18, 20], "lookact": [18, 20], "findact": [18, 20], "objectobserv": [18, 20, 22], "null": [18, 20, 22], "mosooobserv": [18, 20, 21, 53], "for_obj": [18, 20], "pose": [18, 20, 22, 23, 47], "robotst": [18, 20], "robot_pos": [18, 20, 23], "objects_found": [18, 20], "mosoost": [18, 20], "object_pos": [18, 20], "mosenviron": [18, 21], "robot_id": [18, 19, 20, 21, 22, 23], "interpret": [18, 20, 21, 36, 47], "interpret_robot_id": [18, 21], "equip_sensor": [18, 21, 47], "make_laser_sensor": [18, 21, 47], "make_proximity_sensor": [18, 21, 47], "grid_map": [18, 19, 22, 26, 27, 29, 30, 47], "sensor": [18, 19, 20, 21, 22, 24, 25, 47, 48], "mosobservationmodel": [18, 22], "objectobservationmodel": [18, 22], "unittest": [6, 18, 21, 22, 26, 29], "mosrewardmodel": [18, 22], "goalrewardmodel": [18, 22], "mostransitionmodel": [18, 22], "staticobjecttransitionmodel": [18, 22], "robottransitionmodel": [18, 22], "if_move_bi": [18, 22, 26, 30], "valid_pos": [18, 22, 30, 31], "in_boundari": [18, 22], "file": [18, 41, 42, 47, 48, 53, 55], "some": [18, 37, 42, 44, 46, 48, 49, 53, 55], "string": [10, 18, 21, 33, 37, 38, 46], "width": [18, 19, 22, 23, 26, 29, 31], "length": [18, 19, 22, 23, 26, 29, 31], "num_obj": 18, "num_obstacl": 18, "robot_char": 18, "init_robot_st": 19, "object_id": [19, 22], "dim": [19, 21, 22], "01": [18, 19, 22, 46], "belief_rep": [18, 19], "num_particl": [12, 18, 19, 24, 25, 26, 27, 35, 36], "100": [12, 18, 19, 27, 32, 33, 46, 48], "custum": [19, 27], "sure": [19, 48], "robot_orient": 19, "multi": [6, 19, 20, 22, 42, 49, 51, 52, 53], "target": [18, 19, 21, 28, 30, 32, 46, 47, 48], "obstacl": [19, 21, 23, 47], "realli": [19, 48], "about": [12, 19, 23, 24, 25, 37, 38, 42, 47], "them": [19, 37, 42, 44, 48, 53, 55], "includ": [18, 19, 22, 41, 42, 43], "unspecifi": 19, "uniform": [19, 24, 25, 26, 27, 32, 48], "radian": 19, "cup": [20, 48], "find": [20, 22, 42, 47, 52, 53], "45deg": 20, "input": [20, 21, 46, 50], "forc": 20, "everi": [20, 24, 25], "w": [20, 47], "drop": 20, "mo": [6, 20, 42, 52, 53], "xy": [10, 20, 31], "distance_cost": 20, "motion_nam": 20, "xyth": [20, 53], "141592653589793": 20, "71238898038469": 20, "5707963267948966": 20, "vw": 20, "7853981633974483": 20, "icra": [18, 20, 22, 47], "instead": [18, 20, 22, 32, 33, 42, 43, 48], "topolog": [18, 20, 22, 47], "graph": [18, 20, 22, 46, 47], "fan": [20, 22, 23, 47], "someth": [20, 22, 53], "els": [20, 22, 45, 46, 48], "objpos": 20, "thu": [20, 35, 47], "grid": [12, 20, 22, 23, 24, 25, 30, 47], "s_1": 20, "s_2": 20, "s_n": 20, "s_r": 20, "leq": 20, "sr": 20, "objclass": 20, "camera_direct": 20, "overrid": 21, "parent": [21, 37, 38], "worldstr": [21, 26, 29, 31], "rx": [21, 29], "xt": 21, "laser": [21, 22, 23, 47], "fov": [21, 23], "90": [21, 23], "min_rang": [21, 23], "max_rang": [21, 23], "indic": [21, 35], "obsticl": 21, "replac": 21, "upper": 21, "letter": 21, "serv": 21, "lower": [10, 21], "except": [21, 29, 37, 38], "signal": 21, "laser2dsensor": [21, 22, 23], "robot_nam": 21, "worldmap": 21, "charact": [10, 21], "angle_incr": [21, 23], "dist_rang": 21, "occlus": [21, 23, 47], "scanner": [21, 23, 47], "configur": [7, 21], "angl": [21, 23, 47], "end": [21, 37], "beam": [21, 23, 47], "scan": [21, 23, 47], "degre": [21, 23, 47], "angular": 21, "distanc": [21, 23, 24], "measur": 21, "rad": 21, "consid": [18, 21, 35, 47], "radiu": [10, 21, 23], "proxim": [21, 22, 23], "occlusion_en": [21, 23], "gridmap": [22, 23, 27, 30, 31], "valid_mot": [22, 23, 30, 31], "to_rad": [22, 23], "in_rang": [22, 23], "within_rang": [22, 23], "sensing_region_s": [22, 23], "in_field_of_view": [22, 23], "shoot_beam": [22, 23], "valid_beam": [22, 23], "proximitysensor": [22, 23], "own": [22, 42, 43], "well": [22, 32, 33, 47, 48], "within": [22, 23, 47], "rang": [22, 23, 46, 47, 48], "equip": [22, 47], "occup": [22, 27], "target_object": 22, "big": [22, 26, 27, 29, 30], "1000": [18, 22, 26, 36], "normal": [12, 22, 24, 25, 33, 35, 36], "get": [22, 26, 32, 33, 48, 53], "detect": 22, "relat": [22, 52], "determinist": [22, 23, 24, 25, 30, 35, 37, 48], "09": [22, 36], "necessarili": 22, "static": [21, 22, 24, 25, 29, 32, 37, 38], "next_object_st": 22, "perfect": [22, 24, 25, 47], "check_collis": 22, "robot_st": 22, "next_robot_st": [18, 22], "pose_objid": 22, "valid": [22, 23, 43], "overlap": 22, "addit": [22, 35, 46, 49, 52, 53], "assist": 23, "collis": 23, "avoid": [23, 35, 42, 43], "invalid": [23, 48], "contain": [23, 32, 33, 35, 37, 38, 41, 42, 46, 48, 50, 55], "all_motion_act": 23, "bump": [23, 42], "determin": [23, 24, 25, 48], "assumpt": 23, "p1": [10, 23, 24, 25, 37], "p2": [10, 23, 24, 25, 37], "deg": 23, "val": 23, "env_stat": 23, "might": [23, 32, 33, 47, 48], "visibl": [23, 42], "due": [23, 42, 47], "gap": 23, "view_angl": 23, "th": [21, 23, 29, 37], "field": [23, 32, 33, 42], "view": [23, 42], "size": [10, 21, 23, 29, 42, 46], "180": 23, "front": [23, 32, 33, 48], "our": [7, 23, 47, 48, 55], "convent": [23, 42, 44, 52], "270": 23, "360": [23, 47], "shoot": 23, "bear": 23, "dist": 23, "increment": 23, "mosobserv": 23, "region": [21, 23, 47], "center": [10, 23], "rock_id": [24, 25], "rsaction": [24, 25], "rsobserv": [24, 25], "qualiti": [24, 25], "rsstate": [24, 25], "k": [24, 25], "uai": [24, 25], "2004": [24, 25, 52], "rocktype_1": [24, 25], "rocktype_2": [24, 25], "rocktype_k": [24, 25], "rocktype_i": [24, 25], "terminalst": [24, 25], "rock": [24, 25], "known": [24, 25, 55], "check_i": [24, 25], "smartli": [24, 25], "check": [24, 25, 42, 46, 47, 48, 55], "check_1": [24, 25], "check_k": [24, 25], "first": [24, 25, 37, 38, 41, 46, 47, 48, 53], "four": [24, 25], "noisi": [24, 25], "eta": [24, 25], "exit": [24, 25], "area": [24, 25], "equal": [24, 25, 32, 33, 37, 38, 48], "being": [5, 24, 25], "rock_loc": 24, "half_efficiency_dist": 24, "20": [24, 37, 38, 42, 46], "not_free_loc": [24, 25], "nxn": [24, 25], "free": [24, 25, 32, 33, 47, 48, 51, 52, 55], "nstep": [12, 24, 25, 32, 33, 48], "95": [12, 24, 25, 37, 38, 46, 48], "initialize_particles_belief": [26, 27], "belief_upd": [6, 18, 26, 27], "tagag": [26, 27], "tagact": [26, 28], "tagobserv": [26, 28], "tagstat": [26, 28], "motion_polici": [26, 30], "tagobservationmodel": [26, 30], "tagpolicymodel": [26, 30], "tagrewardmodel": [26, 30], "tagtransitionmodel": [26, 30], "init_robot_posit": [26, 27], "hold": [27, 43], "pr_stai": [26, 27, 29, 31], "anytim": [28, 30, 46], "approxim": [28, 30, 36, 55], "cell": [28, 30, 47], "target_posit": [28, 31], "person": 28, "found": [28, 46, 47, 53], "robot_posit": [28, 31], "target_found": 28, "from_str": [26, 29, 30, 31], "free_cel": [30, 31], "tagtargetmotionpolici": [30, 31], "ohterwis": 30, "anyth": 30, "There": [7, 30, 41, 46, 48, 49, 55], "stochaist": 30, "movement": 30, "With": [30, 48], "8": [12, 30, 37, 38, 42, 46, 53], "awai": [7, 30, 32, 33, 48], "stai": [30, 32, 42, 48], "place": [12, 30, 47, 48], "closer": 30, "target_motion_polici": 30, "obstacle_pos": 31, "all_mot": 31, "next_target_posit": 31, "valid_target_motion_act": 31, "tigerobservationmodel": [32, 33], "tigerpolicymodel": [32, 33], "tigerrewardmodel": [32, 33], "tigertransitionmodel": [32, 33], "build_act": [32, 33], "build_observ": [32, 33], "build_set": [32, 33], "build_stat": [32, 33], "classic": [24, 32, 33, 48], "specifi": [32, 33, 37, 41, 42, 45, 46, 48], "introduct": [32, 33, 48], "kamalzadeh": [32, 33, 48], "hahsler": [32, 33, 48], "put": [32, 33, 48], "behind": [32, 33, 48], "door": [32, 33, 48], "treasur": [32, 33, 48], "stand": [32, 33, 37, 38, 48, 52], "close": [32, 33, 48], "decid": [32, 33, 48], "open": [32, 33, 37, 38, 46, 48], "wait": [32, 33, 48], "listen": [32, 33, 37, 38, 42, 46, 48, 53], "neither": [32, 33, 48], "entir": [32, 33, 37, 38, 48], "accur": [32, 33, 48], "hear": [32, 33, 48], "vice": [32, 33, 48], "versa": [32, 33, 48], "either": [32, 33, 35, 42, 46, 47, 48], "more": [18, 24, 32, 33, 35, 37, 38, 41, 42, 44, 45, 46, 47, 48, 49, 51, 52, 55], "complic": [32, 33, 44, 47, 48, 52], "re": [5, 21, 29, 32, 41, 48], "spec": [32, 46, 48], "reset": [32, 48], "otherwis": [12, 32, 48], "obs_nois": [32, 48], "init_true_st": [32, 33, 48], "fact": 32, "debug_tre": 32, "feedback": [32, 33, 47, 48], "loop": [32, 33, 47, 48], "pdb": [32, 37, 38], "dd": [32, 37, 38], "quickli": [32, 44, 52], "build": [32, 42, 43, 46, 47, 52, 53], "extern": [12, 33, 42, 48, 50, 52, 53], "extrem": [12, 33], "dumb": [12, 33], "obs_prob": 33, "trans_prob": 33, "current_histogram": 35, "state_mapp": [35, 36], "oarg": 35, "targ": 35, "static_transit": 35, "next_state_spac": 35, "sum_": 35, "help": [35, 37, 38, 46, 47, 52], "nest": 35, "alreadi": [35, 51], "prohibit": 35, "effici": [24, 35], "part": [35, 46], "simpli": [35, 48], "At": 35, "least": 35, "ok": 35, "current_particl": 35, "todo": [13, 35, 42], "prob": 36, "unweight": 36, "inherit": [36, 42, 48], "feed": 36, "through": [12, 18, 36, 37, 38, 45, 48], "multipl": [36, 51], "those": [36, 42, 48, 53], "approx_method": 36, "distance_func": 36, "drawn": 36, "nearest": 36, "queri": 36, "match": [36, 42], "closest": 36, "exact": [12, 36, 42, 48], "uniqu": 36, "aggreg": 36, "numer": [36, 46, 55], "densiti": 36, "multivari": 36, "isn": 36, "arbitrarili": 36, "deal": 37, "percent": 37, "rgb": 37, "255": [21, 29, 37], "hx": 37, "len": [37, 45], "ctype": 37, "dct": 37, "easier": [37, 38, 42], "core": [37, 38, 42, 43], "incorpor": [37, 38], "design": [37, 38, 52], "eas": [37, 38], "ipdb": [37, 38], "session": [37, 38], "minim": [37, 38, 42], "usag": [37, 38], "pomdp_problem": [6, 37, 38, 42], "suppos": [37, 38], "too": [37, 38], "4096": [37, 38], "200": [37, 38], "set_trac": [37, 38], "program": [37, 38, 46, 50], "enter": [37, 38], "debugg": [37, 38], "_vnodepp": [37, 38], "4095": [37, 38], "19": [37, 38, 46], "529": [37, 38], "\u2080listen": [37, 38], "_qnodepp": [37, 38], "4059": [37, 38], "\u2080tiger": [37, 38], "2013": [37, 38], "16": [37, 38], "586": [37, 38], "1883": [37, 38], "1441": [37, 38], "300": [37, 38], "out": [37, 38, 46, 47, 55], "\u2081open": [37, 38], "139": [37, 38], "847": [37, 38], "\u2082open": [37, 38], "112": [37, 38, 46], "57": [37, 38], "191": [37, 38], "text": [37, 38, 46], "retriev": [37, 38], "subtre": [37, 38], "index": [37, 38, 46, 52], "2044": [37, 38], "160": [37, 38], "148": [37, 38], "634": [37, 38], "237": [37, 38], "500": [18, 26, 37, 38], "obtain": [37, 38], "sequenc": [10, 37, 38, 42, 48], "\u2081tiger": [37, 38], "1955": [37, 38], "947": [37, 38], "768": [37, 38], "022": [37, 38], "462": [37, 38], "395": [37, 38], "000": [37, 38], "247": [37, 38], "best": [37, 38, 42], "brows": [37, 38], "method": [37, 38, 42], "document": [37, 38, 42, 44, 46, 55], "futur": [37, 38], "organ": [37, 38, 47, 48], "kind": [37, 38], "total": [37, 38, 46], "largest": [37, 38], "edg": [37, 38, 46], "as_debugg": [37, 38], "Will": [37, 38], "high": [37, 38, 47, 55], "huge": [37, 38], "interact": [37, 38, 43], "along": [37, 38], "preset": [37, 38], "seq": [37, 38], "understand": [37, 38, 43], "_nodepp": [37, 38], "dest": [37, 38], "Such": [37, 38], "parent_edg": [37, 38], "indent": [37, 38], "include_children": [37, 38], "df": [37, 38], "gether": [37, 38], "statist": [37, 38], "colorstr": [37, 38], "assort": 37, "vec1": 37, "vec2": 37, "scalar": 37, "dx": 37, "dy": 37, "dz": 37, "v1": 37, "v2": 37, "06": [37, 46], "python": [12, 37, 42, 46, 47, 48, 52, 53, 55], "oldvalu": 37, "oldmin": 37, "oldmax": 37, "newmin": 37, "newmax": 37, "obj": 37, "arr": 37, "48": 37, "8320": 37, "8321": 37, "50": [37, 46], "8322": 37, "51": [37, 46], "8323": 37, "52": [37, 46], "8324": 37, "53": 37, "8325": 37, "54": 37, "8326": 37, "55": 37, "8327": 37, "56": 37, "8328": 37, "8329": 37, "particular": 37, "data": 37, "piec": 37, "correct": [37, 43, 48], "typic": [37, 48], "tabular": [37, 42], "built": [37, 41, 42, 43], "nextstat": 37, "emit": 37, "utilti": [10, 37], "typographi": 37, "purpos": [37, 47, 52], "displai": 37, "x1b": 37, "97m": 37, "96m": 37, "95m": 37, "94m": 37, "92m": 37, "93m": 37, "91m": 37, "1m": 37, "0m": 37, "shown": [37, 47], "sphinx": [41, 42], "web": 41, "page": [41, 52, 53], "Their": 41, "directori": [41, 53], "cd": 41, "py": [41, 42, 47, 48], "_sphinx_src": 41, "apidoc": 41, "api": 41, "rst": 41, "argument": [41, 42, 45], "readm": 41, "read": [41, 48], "me": 41, "Then": [18, 41, 48], "top": [41, 42], "repositori": [41, 53], "websit": [41, 42, 53], "construct": [18, 41, 46, 48], "symbol": 41, "link": [41, 42, 46, 47, 52], "ln": 41, "access": [41, 42, 48, 52], "remov": [41, 42, 46], "site": 41, "deploi": 41, "fundament": 43, "block": [12, 43, 47], "formal": 43, "encapsul": 43, "few": 43, "pomdp_pi": [42, 43, 44, 45, 47, 48, 49, 50, 51, 53, 55], "around": [43, 55], "convei": [5, 43], "idea": [43, 48], "abov": [43, 46, 47, 48, 50, 53], "gist": [42, 43], "captur": 43, "versu": 43, "much": [42, 43], "sens": [21, 43, 47], "verifi": [42, 43, 53], "diagram": 43, "langl": 43, "omega": [43, 46, 50], "rangl": 43, "discuss": 44, "simpler": [18, 42, 44, 55], "interest": 44, "former": 44, "latter": 44, "structur": [44, 47, 52], "project": [44, 47, 51, 52, 55], "below": [45, 47, 49, 53], "minimum": [42, 45], "def": [45, 48], "rais": [45, 48], "notimplementederror": 45, "notion": 45, "narrow": 45, "express": 45, "detail": [18, 32, 45, 46, 47, 48, 50], "paragraph": 45, "visit": [42, 45], "count": [21, 45, 53], "account": 45, "nu": [46, 50], "hope": [46, 49], "u": [12, 46], "mani": [46, 55], "librari": [42, 46, 50, 52, 53], "written": [46, 48, 52, 55], "format": [42, 46, 48, 55], "pomdpx": [42, 46, 55], "pomdpconvert": 46, "toolkit": 46, "to_pomdp_fil": [42, 46], "to_pomdpx_fil": 46, "convers": [42, 46], "output_path": 46, "float_precis": [42, 46], "www": [46, 53], "independ": 46, "blank": 46, "decim": 46, "order": [7, 46, 48], "pomdpconvert_path": 46, "adacompnu": 46, "instruct": [46, 53], "download": [46, 53], "ubuntu": 46, "04": 46, "gcc": 46, "bigbird": 46, "comp": 46, "edu": 46, "sg": 46, "pmwiki": 46, "farm": 46, "appl": [46, 55], "php": 46, "pomdpxdocument": 46, "binari": [46, 50], "let": [46, 48], "filenam": [46, 47], "test_tig": 46, "softwar": [46, 53, 55], "src": 46, "vi_prun": 46, "pomdp_solve_path": 46, "pomdp_nam": 46, "temp": 46, "remove_generated_fil": 46, "return_policy_graph": 46, "definit": [46, 48], "pomdp_solv": [42, 46], "compil": 46, "command": [46, 47, 53], "stop_criteria": 46, "weak": 46, "time_limit": 46, "alpha": [10, 46], "pg": 46, "instal": [42, 46, 52], "appear": [7, 46, 55], "recommend": [46, 47, 53], "isinst": [46, 48], "cur_belief": [46, 48], "new_belief": [46, 48], "pid": 46, "8239": 46, "mcgs_prune_freq": 46, "verbos": 46, "context": 46, "done": [18, 46, 48, 55], "epoch": 46, "00": 46, "sec": 46, "err": 46, "39": 46, "96": 46, "97": 46, "98": 46, "40": 46, "solut": 46, "user": [46, 48], "hr": 46, "min": 46, "lp_solv": 46, "report": 46, "lp": 46, "instabl": 46, "85": 46, "9697986575573173": 46, "03020134244268276": 46, "pomdpsol_path": 46, "timeout": 46, "30": [21, 29, 46], "memori": 46, "precis": 46, "logfil": 46, "pomdpsol": 46, "limit": 46, "mb": 46, "regret": 46, "less": 46, "than": [46, 55], "finish": 46, "log": [42, 46], "stdout": 46, "stderr": 46, "_": 46, "000001": 46, "load": [6, 42, 46], "trial": [6, 26, 46], "backup": 46, "lbound": 46, "ubound": 46, "92": 46, "8205": 46, "821": 46, "2981": 46, "63": 46, "7547": 46, "70": 46, "0528": 46, "103": 46, "35722": 46, "3746": 46, "0174": 46, "155": 46, "44093": 46, "45": 46, "1431": 46, "38": 46, "7021": 46, "205": 46, "1184": 46, "36": 46, "4409": 46, "24": 46, "3225": 46, "1255": 46, "3714": 46, "13808e": 46, "21": 46, "41": 46, "1300": 46, "76277e": 46, "42": 46, "1350": 46, "75044e": 46, "43": 46, "1393": 46, "22729e": 46, "07": 46, "11": [46, 53], "extend": [42, 46, 47, 48, 49], "encod": 46, "alpha_path": 46, "pg_path": 46, "parse_pomdp_solve_output": 46, "pointer": 46, "incom": 46, "offlin": 46, "collect": 46, "associ": 46, "dot": 46, "product": 46, "lead": [46, 47], "domin": 46, "activ": [46, 55], "max_": 46, "gamma": 46, "policy_path": 46, "parse_appl_policy_fil": 46, "involv": 47, "whose": 47, "better": 47, "mainten": 47, "readabl": 47, "task": [6, 12, 47, 51, 52, 55], "rel": 47, "share": [47, 52], "wandzel": 47, "et": 47, "al": 47, "slightli": 47, "room": [18, 47], "formul": 47, "three": [47, 48], "categori": 47, "adjust": 47, "disk": 47, "artifact": 47, "discret": [7, 47], "figur": [7, 12, 47], "screenshot": 47, "frame": 47, "imag": [42, 47], "circl": [47, 53], "third": 47, "show": [42, 47, 52], "later": [42, 47], "summari": 47, "procedur": [47, 48], "instanti": [18, 47], "squeez": 47, "everyth": 47, "giant": 47, "reus": 47, "whatev": 47, "save": 47, "evid": 47, "role": 47, "mosoopomdp": [6, 18, 47], "logic": 47, "m": [12, 42, 47, 52, 53], "custom": 47, "arthur": 47, "yoonseon": 47, "oh": 47, "fishman": 47, "nishanth": 47, "kumar": 47, "stefani": [47, 48, 52], "tellex": [47, 48, 52], "intern": [47, 48], "autom": [47, 48], "7194": 47, "7200": 47, "ieee": 47, "encourag": 48, "valueerror": 48, "__hash__": 48, "__eq__": 48, "boil": 48, "heard": 48, "growl": 48, "thresh": 48, "similarli": 48, "startswith": 48, "choic": 48, "easili": 48, "tabl": 48, "flexibl": 48, "intract": 48, "sever": [48, 49], "would": [42, 48, 55], "usual": 48, "human": 48, "engin": 48, "sort": [37, 42, 48], "guid": 48, "guidanc": 48, "caution": 48, "sai": 48, "inject": 48, "final": 48, "straightforward": 48, "commonli": 48, "_reward_func": 48, "elif": 48, "abl": [42, 48], "mostli": 48, "super": 48, "notic": 48, "constructor": 48, "now": [42, 48], "standard": 48, "a_t": 48, "s_t": 48, "rightarrow": 48, "s_": 48, "r_t": 48, "o_t": 48, "h_": 48, "unless": 48, "repeat": 48, "110": 48, "ennviron": 48, "skip": [42, 48], "estim": 48, "percept": 48, "stack": 48, "saniti": 48, "come": 48, "automat": [42, 48], "num": 48, "short": 48, "abel": 48, "elli": 48, "hershkowitz": 48, "gabriel": 48, "barth": 48, "maron": 48, "stephen": 48, "brawner": 48, "kevin": 48, "farrel": 48, "jame": 48, "macglashan": 48, "twenti": 48, "fifth": 48, "schedul": 48, "2015": 48, "yuchen": 48, "xiao": 48, "sammi": 48, "katt": 48, "andrea": 48, "ten": 48, "pa": 48, "shengjian": 48, "chen": 48, "christoph": 48, "amato": 48, "clutter": 48, "welcom": [49, 52], "sarsop": [42, 50, 53, 55], "rl": 51, "transfer": [51, 52], "research": [51, 52, 55], "baslin": 51, "comprehens": 52, "why": 52, "clean": 52, "intuit": 52, "peopl": 52, "commun": [52, 53, 55], "artial": 52, "bservabl": 52, "arkov": 52, "ecis": 52, "rocess": 52, "major": 52, "languag": 52, "what": 52, "changelog": 52, "principl": 52, "integr": 42, "pleas": 52, "cite": 52, "inproceed": 52, "zheng2020pomdp_pi": 52, "titl": 52, "_py": 52, "author": 52, "zheng": 52, "kaiyu": 52, "booktitl": 52, "icap": 52, "2020": 52, "workshop": 52, "planrob": 52, "year": 52, "url": 52, "icaps20subpag": 52, "wp": 52, "upload": [42, 52], "14": [12, 52, 53], "planrob_2020_paper_3": 52, "pdf": 52, "10099": 52, "virtualenv": 53, "pip": [42, 53], "manag": 53, "offici": 53, "maco": 53, "On": 53, "window": [42, 53], "wiki": 53, "latest": [42, 53], "releas": [42, 53], "clone": 53, "git": 53, "h2r": 53, "setup": [42, 53], "pyx": [42, 53], "pyd": 53, "rebuild": 53, "messi": [], "66": 53, "cumul": 53, "__num_sims__": 53, "1217": 53, "______id______": 53, "210": 53, "_____g": 53, "b_____": 53, "hello": 53, "542": 53, "506": 53, "test_al": 53, "via": [53, 55], "hub": 53, "credit": 53, "romain": 53, "egel": 53, "think": 55, "peer": 55, "easi": 55, "ro": 55, "acceler": 55, "pomdpi": 55, "suffici": 55, "convolut": 55, "potenti": [42, 55], "connect": [10, 18, 55], "clearer": 55, "pars": 55, "art": 55, "great": 55, "julia": 55, "suit": [7, 55], "analysi": 55, "besid": 55, "librai": 55, "port": 55, "ai": 55, "toolbox": 55, "bind": 55, "focus": 55, "lear": 55, "beliefmdp": 55, "modern": 42, "repo": [7, 42], "migrat": 42, "pyproject": 42, "toml": 42, "ci": 42, "pre": 42, "commit": 42, "eol": 42, "fix": 42, "cpdef": 42, "cdef": 42, "failur": 42, "29": 42, "comment": 42, "sp": 42, "wheel": 42, "properli": 42, "tame": 42, "minor": 42, "bug": 42, "__str__": 42, "confus": 42, "improv": 42, "clarifi": 42, "gave": 42, "cryingbabi": 42, "pygraphviz": 42, "inspect": 42, "refactor": 42, "cli": 42, "simplifi": 42, "__ne__": 42, "reorgan": 42, "break": 42, "unnecessari": 42, "compat": 42, "pickl": 42, "edit": 42, "cimport": 42, "ed": 42, "pypi": 42, "value_funct": 42, "18fc58e0": 42, "cfc88e8d8": 42, "719c2edf5": 42, "docker": 42, "issu": 42, "citat": 42, "resolv": 42, "max": 42, "among": 42, "infin": 42, "thank": 42, "jason": 42, "clarif": 42, "convert": 42, "were": 42, "calcul": 42, "divid": 42, "thrown": 42, "infinit": 42, "anoth": 42, "differenti": 42, "unload": [6, 42], "per": 42, "faster": 42, "readi": 42, "changeabl": 42, "rewritten": 42, "cleaner": 42, "dictstat": [0, 1, 5, 42], "set_model": [1, 5, 42], "frozen": [1, 34, 36, 42], "ones": 5, "lustat": [6, 12], "luaction": [6, 12], "luobserv": [6, 12], "luobservationmodel": [6, 12], "lutransitionmodel": [6, 12], "lurewardmodel": [6, 12], "lupolicymodel": [6, 12], "loadunloadproblem": [6, 12], "generate_random_st": [6, 12], "generate_init_belief": [6, 12], "minimal_inst": [6, 24], "create_inst": [6, 24], "tagproblem": [6, 26], "plot_point": [7, 10], "plot_polygon": [7, 10], "plot_lin": [7, 10], "plot_circl": [7, 10], "xval": 10, "yval": 10, "label": 10, "style": 10, "linewidth": 10, "xlabel": 10, "ylabel": 10, "loc": 10, "vert": 10, "ax": 10, "edgecolor": 10, "verts0": 10, "verts1": 10, "verts_i": 10, "vertic": 10, "numpi": 10, "color0": 10, "color1": 10, "color_i": 10, "hex": 10, "xxxxxx": 10, "polygoncollect": 10, "axi": 10, "zorder": 10, "linestyl": 10, "fill": 10, "label_text": 10, "text_color": 10, "itself": [7, 12], "tell": 12, "statu": 12, "ob": 12, "load_unload_problem": 12, "object_color": [18, 21], "mosviz": [18, 21, 29], "img_width": [18, 21, 26, 29], "img_height": [18, 21, 26, 29], "last_observ": [18, 21, 26, 29], "draw_robot": [18, 21, 26, 29], "draw_observ": [18, 21, 26, 29], "draw_belief": [18, 21, 26, 29], "on_init": [18, 21, 26, 29], "on_ev": [18, 21, 26, 29], "on_loop": [18, 21, 26, 29], "on_rend": [18, 21, 26, 29], "on_cleanup": [18, 21, 26, 29], "on_execut": [18, 21, 26, 29], "render_env": [18, 21, 26, 29], "agent_has_map": 18, "cours": 18, "scenario": 18, "past": 18, "give": 18, "max_tim": [18, 26], "120": [18, 26], "max_step": [18, 26], "fp": [21, 29], "viz_observ": 21, "img": [21, 29], "ry": [21, 29], "rth": [21, 29], "target_color": [21, 29], "init": [21, 29], "event": [21, 29], "display_surf": [21, 29], "decreas": 24, "rover": 24, "influenc": 24, "larger": 24, "robust": 24, "tagenviron": [26, 29], "tagviz": [26, 29], "init_target_posit": 26, "belief_typ": 26, "hist": 26, "planner_typ": 26, "modifi": 36, "_search": 42, "modular": 42, "renam": 42, "gha": 42, "workflow": 42, "branch": 42, "master": 42, "dev": 42, "local": 7, "plane": 7, "befor": 7, "approach": 7, "abil": 7, "upon": 7, "quadrat": 7, "horizont": 7, "coordin": 7, "ultim": 7, "illustr": 7, "intens": 7, "magnitud": 7, "unknown": 7, "variant": 7, "kept": 7, "pull": 7, "lightdarkdomain": 7, "distinguish": 12}, "objects": {"pomdp_py.algorithms": [[3, 0, 0, "-", "bsp"], [2, 0, 0, "-", "po_rollout"], [2, 0, 0, "-", "po_uct"], [2, 0, 0, "-", "pomcp"], [2, 0, 0, "-", "value_iteration"]], "pomdp_py.algorithms.bsp": [[2, 0, 0, "-", "blqr"]], "pomdp_py.algorithms.bsp.blqr": [[2, 1, 1, "", "BLQR"]], "pomdp_py.algorithms.bsp.blqr.BLQR": [[2, 2, 1, "", "create_plan"], [2, 2, 1, "", "ekf_update_mlo"], [2, 2, 1, "", "integrate_belief_segment"], [2, 2, 1, "", "interpret_sqp_plan"], [2, 2, 1, "", "segmented_cost_function"]], "pomdp_py.algorithms.po_rollout": [[2, 1, 1, "", "PORollout"]], "pomdp_py.algorithms.po_rollout.PORollout": [[2, 2, 1, "", "clear_agent"], [2, 3, 1, "", "last_best_reward"], [2, 2, 1, "", "plan"], [2, 2, 1, "", "set_rollout_policy"], [2, 2, 1, "", "update"], [2, 3, 1, "", "update_agent_belief"]], "pomdp_py.algorithms.po_uct": [[2, 1, 1, "", "ActionPrior"], [2, 1, 1, "", "POUCT"], [2, 1, 1, "", "QNode"], [2, 1, 1, "", "RandomRollout"], [2, 1, 1, "", "RolloutPolicy"], [2, 1, 1, "", "RootVNode"], [2, 1, 1, "", "TreeNode"], [2, 1, 1, "", "VNode"]], "pomdp_py.algorithms.po_uct.ActionPrior": [[2, 2, 1, "", "get_preferred_actions"]], "pomdp_py.algorithms.po_uct.POUCT": [[2, 3, 1, "", "action_prior"], [2, 2, 1, "", "clear_agent"], [2, 3, 1, "", "discount_factor"], [2, 3, 1, "", "last_num_sims"], [2, 3, 1, "", "last_planning_time"], [2, 3, 1, "", "max_depth"], [2, 3, 1, "", "num_visits_init"], [2, 2, 1, "", "plan"], [2, 3, 1, "", "rollout_policy"], [2, 2, 1, "", "set_rollout_policy"], [2, 2, 1, "", "update"], [2, 3, 1, "", "updates_agent_belief"], [2, 3, 1, "", "value_init"]], "pomdp_py.algorithms.po_uct.RandomRollout": [[2, 2, 1, "", "rollout"]], "pomdp_py.algorithms.po_uct.RolloutPolicy": [[2, 2, 1, "", "rollout"]], "pomdp_py.algorithms.po_uct.RootVNode": [[2, 2, 1, "", "from_vnode"], [2, 3, 1, "", "history"]], "pomdp_py.algorithms.po_uct.TreeNode": [[2, 3, 1, "", "children"], [2, 3, 1, "", "num_visits"], [2, 3, 1, "", "value"]], "pomdp_py.algorithms.po_uct.VNode": [[2, 2, 1, "", "argmax"], [2, 2, 1, "", "print_children_value"], [2, 3, 1, "", "value"]], "pomdp_py.algorithms.pomcp": [[2, 1, 1, "", "POMCP"], [2, 1, 1, "", "RootVNodeParticles"], [2, 1, 1, "", "VNodeParticles"]], "pomdp_py.algorithms.pomcp.POMCP": [[2, 2, 1, "", "plan"], [2, 2, 1, "", "update"], [2, 3, 1, "", "update_agent_belief"]], "pomdp_py.algorithms.pomcp.RootVNodeParticles": [[2, 3, 1, "", "belief"], [2, 2, 1, "", "from_vnode"]], "pomdp_py.algorithms.pomcp.VNodeParticles": [[2, 3, 1, "", "belief"]], "pomdp_py.algorithms.value_iteration": [[2, 1, 1, "", "ValueIteration"]], "pomdp_py.algorithms.value_iteration.ValueIteration": [[2, 2, 1, "", "plan"]], "pomdp_py.framework": [[5, 0, 0, "-", "basics"], [5, 0, 0, "-", "oopomdp"], [5, 0, 0, "-", "planner"]], "pomdp_py.framework.basics": [[5, 1, 1, "", "Action"], [5, 1, 1, "", "Agent"], [5, 1, 1, "", "BlackboxModel"], [5, 1, 1, "", "Distribution"], [5, 1, 1, "", "Environment"], [5, 1, 1, "", "GenerativeDistribution"], [5, 1, 1, "", "Observation"], [5, 1, 1, "", "ObservationModel"], [5, 1, 1, "", "Option"], [5, 1, 1, "", "POMDP"], [5, 1, 1, "", "PolicyModel"], [5, 1, 1, "", "RewardModel"], [5, 1, 1, "", "State"], [5, 1, 1, "", "TransitionModel"], [5, 4, 1, "", "sample_explict_models"], [5, 4, 1, "", "sample_generative_model"]], "pomdp_py.framework.basics.Agent": [[5, 2, 1, "", "add_attr"], [5, 3, 1, "", "all_actions"], [5, 3, 1, "", "all_observations"], [5, 3, 1, "", "all_states"], [5, 3, 1, "", "belief"], [5, 3, 1, "", "history"], [5, 3, 1, "", "init_belief"], [5, 2, 1, "", "sample_belief"], [5, 2, 1, "", "set_belief"], [5, 2, 1, "", "set_models"], [5, 2, 1, "", "update"], [5, 2, 1, "", "update_history"]], "pomdp_py.framework.basics.BlackboxModel": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "sample"]], "pomdp_py.framework.basics.Distribution": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "__setitem__"]], "pomdp_py.framework.basics.Environment": [[5, 2, 1, "", "apply_transition"], [5, 3, 1, "", "blackbox_model"], [5, 3, 1, "", "cur_state"], [5, 2, 1, "", "provide_observation"], [5, 3, 1, "", "reward_model"], [5, 2, 1, "", "set_models"], [5, 3, 1, "", "state"], [5, 2, 1, "", "state_transition"], [5, 3, 1, "", "transition_model"]], "pomdp_py.framework.basics.GenerativeDistribution": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "get_histogram"], [5, 2, 1, "", "mpe"]], "pomdp_py.framework.basics.ObservationModel": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "get_all_observations"], [5, 2, 1, "", "get_distribution"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"]], "pomdp_py.framework.basics.Option": [[5, 2, 1, "", "initiate"], [5, 3, 1, "", "policy"], [5, 2, 1, "", "sample"], [5, 2, 1, "", "terminate"]], "pomdp_py.framework.basics.PolicyModel": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "get_all_actions"], [5, 2, 1, "", "get_distribution"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"], [5, 2, 1, "", "update"]], "pomdp_py.framework.basics.RewardModel": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "get_distribution"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"]], "pomdp_py.framework.basics.TransitionModel": [[5, 2, 1, "", "argmax"], [5, 2, 1, "", "get_all_states"], [5, 2, 1, "", "get_distribution"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"]], "pomdp_py.framework.oopomdp": [[5, 1, 1, "", "DictState"], [5, 1, 1, "", "OOBelief"], [5, 1, 1, "", "OOObservation"], [5, 1, 1, "", "OOObservationModel"], [5, 1, 1, "", "OOPOMDP"], [5, 1, 1, "", "OOState"], [5, 1, 1, "", "OOTransitionModel"], [5, 1, 1, "", "ObjectState"]], "pomdp_py.framework.oopomdp.OOBelief": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "__setitem__"], [5, 2, 1, "", "b"], [5, 2, 1, "", "mpe"], [5, 2, 1, "", "object_belief"], [5, 3, 1, "", "object_beliefs"], [5, 2, 1, "", "random"], [5, 2, 1, "", "set_object_belief"]], "pomdp_py.framework.oopomdp.OOObservation": [[5, 2, 1, "", "factor"], [5, 2, 1, "", "merge"]], "pomdp_py.framework.oopomdp.OOObservationModel": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "argmax"], [5, 3, 1, "", "observation_models"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"]], "pomdp_py.framework.oopomdp.OOState": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "copy"], [5, 2, 1, "", "get_object_attribute"], [5, 2, 1, "", "get_object_class"], [5, 2, 1, "", "get_object_state"], [5, 2, 1, "", "s"], [5, 2, 1, "", "set_object_state"], [5, 3, 1, "", "situation"]], "pomdp_py.framework.oopomdp.OOTransitionModel": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "argmax"], [5, 2, 1, "", "probability"], [5, 2, 1, "", "sample"], [5, 3, 1, "", "transition_models"]], "pomdp_py.framework.oopomdp.ObjectState": [[5, 2, 1, "", "__getitem__"], [5, 2, 1, "", "__setitem__"], [5, 2, 1, "", "copy"]], "pomdp_py.framework.planner": [[5, 1, 1, "", "Planner"]], "pomdp_py.framework.planner.Planner": [[5, 2, 1, "", "plan"], [5, 2, 1, "", "update"], [5, 2, 1, "", "updates_agent_belief"]], "pomdp_py": [[6, 0, 0, "-", "problems"], [37, 0, 0, "-", "utils"]], "pomdp_py.problems.light_dark": [[10, 0, 0, "-", "env"]], "pomdp_py.problems.light_dark.env": [[10, 0, 0, "-", "env"], [10, 0, 0, "-", "plotting"]], "pomdp_py.problems.light_dark.env.env": [[10, 1, 1, "", "LightDarkEnvironment"]], "pomdp_py.problems.light_dark.env.env.LightDarkEnvironment": [[10, 5, 1, "", "const"], [10, 5, 1, "", "light"]], "pomdp_py.problems.light_dark.env.plotting": [[10, 4, 1, "", "plot_circle"], [10, 4, 1, "", "plot_line"], [10, 4, 1, "", "plot_points"], [10, 4, 1, "", "plot_polygons"]], "pomdp_py.problems": [[12, 0, 0, "-", "load_unload"], [13, 0, 0, "-", "maze"], [18, 0, 0, "-", "multi_object_search"], [24, 0, 0, "-", "rocksample"], [26, 0, 0, "-", "tag"], [32, 0, 0, "-", "tiger"]], "pomdp_py.problems.load_unload": [[12, 0, 0, "-", "load_unload"]], "pomdp_py.problems.load_unload.load_unload": [[12, 1, 1, "", "LUAction"], [12, 1, 1, "", "LUObservation"], [12, 1, 1, "", "LUObservationModel"], [12, 1, 1, "", "LUPolicyModel"], [12, 1, 1, "", "LURewardModel"], [12, 1, 1, "", "LUState"], [12, 1, 1, "", "LUTransitionModel"], [12, 1, 1, "", "LoadUnloadProblem"], [12, 4, 1, "", "generate_init_belief"], [12, 4, 1, "", "generate_random_state"], [12, 4, 1, "", "main"], [12, 4, 1, "", "test_planner"]], "pomdp_py.problems.load_unload.load_unload.LUObservationModel": [[12, 2, 1, "", "argmax"], [12, 2, 1, "", "probability"], [12, 2, 1, "", "sample"]], "pomdp_py.problems.load_unload.load_unload.LUPolicyModel": [[12, 2, 1, "", "argmax"], [12, 2, 1, "", "get_all_actions"], [12, 2, 1, "", "probability"], [12, 2, 1, "", "sample"]], "pomdp_py.problems.load_unload.load_unload.LURewardModel": [[12, 2, 1, "", "argmax"], [12, 2, 1, "", "probability"], [12, 2, 1, "", "sample"]], "pomdp_py.problems.load_unload.load_unload.LUTransitionModel": [[12, 2, 1, "", "argmax"], [12, 2, 1, "", "probability"], [12, 2, 1, "", "sample"]], "pomdp_py.problems.maze": [[14, 0, 0, "-", "domain"], [15, 0, 0, "-", "env"], [16, 0, 0, "-", "models"]], "pomdp_py.problems.maze.domain": [[14, 0, 0, "-", "action"], [14, 0, 0, "-", "observation"], [14, 0, 0, "-", "state"]], "pomdp_py.problems.maze.domain.observation": [[14, 1, 1, "", "Observation"]], "pomdp_py.problems.maze.domain.state": [[14, 1, 1, "", "State"]], "pomdp_py.problems.maze.env": [[15, 0, 0, "-", "env"]], "pomdp_py.problems.maze.env.env": [[15, 1, 1, "", "MazeEnvironment"]], "pomdp_py.problems.maze.models": [[17, 0, 0, "-", "components"]], "pomdp_py.problems.multi_object_search": [[19, 0, 0, "-", "agent"], [20, 0, 0, "-", "domain"], [21, 0, 0, "-", "env"], [18, 0, 0, "-", "example_worlds"], [22, 0, 0, "-", "models"], [18, 0, 0, "-", "problem"]], "pomdp_py.problems.multi_object_search.agent": [[19, 0, 0, "-", "agent"], [19, 0, 0, "-", "belief"]], "pomdp_py.problems.multi_object_search.agent.agent": [[19, 1, 1, "", "MosAgent"]], "pomdp_py.problems.multi_object_search.agent.agent.MosAgent": [[19, 2, 1, "", "clear_history"]], "pomdp_py.problems.multi_object_search.agent.belief": [[19, 1, 1, "", "MosOOBelief"], [19, 4, 1, "", "initialize_belief"]], "pomdp_py.problems.multi_object_search.agent.belief.MosOOBelief": [[19, 2, 1, "", "mpe"], [19, 2, 1, "", "random"]], "pomdp_py.problems.multi_object_search.domain": [[20, 0, 0, "-", "action"], [20, 0, 0, "-", "observation"], [20, 0, 0, "-", "state"]], "pomdp_py.problems.multi_object_search.domain.action": [[20, 1, 1, "", "Action"], [20, 1, 1, "", "FindAction"], [20, 1, 1, "", "LookAction"], [20, 1, 1, "", "MotionAction"]], "pomdp_py.problems.multi_object_search.domain.action.MotionAction": [[20, 3, 1, "", "BACKWARD"], [20, 3, 1, "", "EAST"], [20, 3, 1, "", "EAST2D"], [20, 3, 1, "", "FORWARD"], [20, 3, 1, "", "LEFT"], [20, 3, 1, "", "NORTH"], [20, 3, 1, "", "NORTH2D"], [20, 3, 1, "", "RIGHT"], [20, 3, 1, "", "SCHEMES"], [20, 3, 1, "", "SCHEME_VW"], [20, 3, 1, "", "SCHEME_XY"], [20, 3, 1, "", "SCHEME_XYTH"], [20, 3, 1, "", "SOUTH"], [20, 3, 1, "", "SOUTH2D"], [20, 3, 1, "", "WEST"], [20, 3, 1, "", "WEST2D"]], "pomdp_py.problems.multi_object_search.domain.observation": [[20, 1, 1, "", "MosOOObservation"], [20, 1, 1, "", "ObjectObservation"]], "pomdp_py.problems.multi_object_search.domain.observation.MosOOObservation": [[20, 2, 1, "", "factor"], [20, 2, 1, "", "for_obj"], [20, 2, 1, "", "merge"]], "pomdp_py.problems.multi_object_search.domain.observation.ObjectObservation": [[20, 3, 1, "", "NULL"]], "pomdp_py.problems.multi_object_search.domain.state": [[20, 1, 1, "", "MosOOState"], [20, 1, 1, "", "ObjectState"], [20, 1, 1, "", "RobotState"]], "pomdp_py.problems.multi_object_search.domain.state.MosOOState": [[20, 2, 1, "", "object_pose"], [20, 5, 1, "", "object_poses"], [20, 2, 1, "", "pose"]], "pomdp_py.problems.multi_object_search.domain.state.ObjectState": [[20, 5, 1, "", "objid"], [20, 5, 1, "", "pose"]], "pomdp_py.problems.multi_object_search.domain.state.RobotState": [[20, 5, 1, "", "objects_found"], [20, 5, 1, "", "pose"], [20, 5, 1, "", "robot_pose"]], "pomdp_py.problems.multi_object_search.env": [[21, 0, 0, "-", "env"], [21, 0, 0, "-", "visual"]], "pomdp_py.problems.multi_object_search.env.env": [[21, 1, 1, "", "MosEnvironment"], [21, 4, 1, "", "equip_sensors"], [21, 4, 1, "", "interpret"], [21, 4, 1, "", "interpret_robot_id"], [21, 4, 1, "", "make_laser_sensor"], [21, 4, 1, "", "make_proximity_sensor"]], "pomdp_py.problems.multi_object_search.env.env.MosEnvironment": [[21, 5, 1, "", "robot_ids"], [21, 2, 1, "", "state_transition"]], "pomdp_py.problems.multi_object_search.env.visual": [[21, 1, 1, "", "MosViz"], [21, 4, 1, "", "object_color"], [21, 4, 1, "", "unittest"]], "pomdp_py.problems.multi_object_search.env.visual.MosViz": [[21, 2, 1, "", "draw_belief"], [21, 2, 1, "", "draw_observation"], [21, 2, 1, "", "draw_robot"], [21, 5, 1, "", "img_height"], [21, 5, 1, "", "img_width"], [21, 5, 1, "", "last_observation"], [21, 2, 1, "", "on_cleanup"], [21, 2, 1, "", "on_event"], [21, 2, 1, "", "on_execute"], [21, 2, 1, "", "on_init"], [21, 2, 1, "", "on_loop"], [21, 2, 1, "", "on_render"], [21, 2, 1, "", "render_env"], [21, 2, 1, "", "update"]], "pomdp_py.problems.multi_object_search.example_worlds": [[18, 4, 1, "", "random_world"]], "pomdp_py.problems.multi_object_search.models": [[23, 0, 0, "-", "components"], [22, 0, 0, "-", "observation_model"], [22, 0, 0, "-", "policy_model"], [22, 0, 0, "-", "reward_model"], [22, 0, 0, "-", "transition_model"]], "pomdp_py.problems.multi_object_search.models.components": [[23, 0, 0, "-", "grid_map"], [23, 0, 0, "-", "sensor"]], "pomdp_py.problems.multi_object_search.models.components.grid_map": [[23, 1, 1, "", "GridMap"]], "pomdp_py.problems.multi_object_search.models.components.grid_map.GridMap": [[23, 2, 1, "", "valid_motions"]], "pomdp_py.problems.multi_object_search.models.components.sensor": [[23, 1, 1, "", "Laser2DSensor"], [23, 1, 1, "", "ProximitySensor"], [23, 1, 1, "", "Sensor"], [23, 4, 1, "", "euclidean_dist"], [23, 4, 1, "", "in_range"], [23, 4, 1, "", "to_rad"]], "pomdp_py.problems.multi_object_search.models.components.sensor.Laser2DSensor": [[23, 2, 1, "", "in_field_of_view"], [23, 2, 1, "", "observe"], [23, 5, 1, "", "sensing_region_size"], [23, 2, 1, "", "shoot_beam"], [23, 2, 1, "", "valid_beam"], [23, 2, 1, "", "within_range"]], "pomdp_py.problems.multi_object_search.models.components.sensor.Sensor": [[23, 3, 1, "", "LASER"], [23, 3, 1, "", "PROXIMITY"], [23, 2, 1, "", "observe"], [23, 5, 1, "", "robot_id"], [23, 5, 1, "", "sensing_region_size"], [23, 2, 1, "", "within_range"]], "pomdp_py.problems.multi_object_search.models.observation_model": [[22, 1, 1, "", "MosObservationModel"], [22, 1, 1, "", "ObjectObservationModel"], [22, 4, 1, "", "unittest"]], "pomdp_py.problems.multi_object_search.models.observation_model.MosObservationModel": [[22, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.observation_model.ObjectObservationModel": [[22, 2, 1, "", "argmax"], [22, 2, 1, "", "probability"], [22, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.policy_model": [[22, 1, 1, "", "PolicyModel"]], "pomdp_py.problems.multi_object_search.models.policy_model.PolicyModel": [[22, 2, 1, "", "argmax"], [22, 2, 1, "", "get_all_actions"], [22, 2, 1, "", "probability"], [22, 2, 1, "", "rollout"], [22, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.reward_model": [[22, 1, 1, "", "GoalRewardModel"], [22, 1, 1, "", "MosRewardModel"]], "pomdp_py.problems.multi_object_search.models.reward_model.MosRewardModel": [[22, 2, 1, "", "argmax"], [22, 2, 1, "", "probability"], [22, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.transition_model": [[22, 1, 1, "", "MosTransitionModel"], [22, 1, 1, "", "RobotTransitionModel"], [22, 1, 1, "", "StaticObjectTransitionModel"], [22, 4, 1, "", "in_boundary"], [22, 4, 1, "", "valid_pose"]], "pomdp_py.problems.multi_object_search.models.transition_model.MosTransitionModel": [[22, 2, 1, "", "argmax"], [22, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.transition_model.RobotTransitionModel": [[22, 2, 1, "", "argmax"], [22, 2, 1, "", "if_move_by"], [22, 2, 1, "", "probability"], [22, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.models.transition_model.StaticObjectTransitionModel": [[22, 2, 1, "", "argmax"], [22, 2, 1, "", "probability"], [22, 2, 1, "", "sample"]], "pomdp_py.problems.multi_object_search.problem": [[18, 1, 1, "", "MosOOPOMDP"], [18, 4, 1, "", "belief_update"], [18, 4, 1, "", "solve"], [18, 4, 1, "", "unittest"]], "pomdp_py.problems.rocksample": [[25, 0, 0, "-", "cythonize"], [24, 0, 0, "-", "rocksample_problem"]], "pomdp_py.problems.rocksample.cythonize": [[25, 0, 0, "module-2", "rocksample_problem"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem": [[25, 1, 1, "id99", "CheckAction"], [25, 1, 1, "id101", "MoveAction"], [25, 1, 1, "id107", "RSAction"], [25, 1, 1, "id108", "RSObservation"], [25, 1, 1, "id110", "RSObservationModel"], [25, 1, 1, "id114", "RSPolicyModel"], [25, 1, 1, "id120", "RSRewardModel"], [25, 1, 1, "id124", "RSState"], [25, 1, 1, "id128", "RSTransitionModel"], [25, 1, 1, "id132", "RockSampleProblem"], [25, 1, 1, "id137", "RockType"], [25, 1, 1, "id142", "SampleAction"], [25, 4, 1, "id143", "euclidean_dist"], [25, 4, 1, "id144", "init_particles_belief"], [25, 4, 1, "id145", "main"], [25, 4, 1, "id146", "test_planner"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.CheckAction": [[25, 3, 1, "id100", "rock_id"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction": [[25, 3, 1, "id102", "EAST"], [25, 3, 1, "id103", "NORTH"], [25, 3, 1, "id104", "SOUTH"], [25, 3, 1, "id105", "WEST"], [25, 3, 1, "id106", "motion"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservation": [[25, 3, 1, "id109", "quality"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservationModel": [[25, 2, 1, "id111", "argmax"], [25, 2, 1, "id112", "probability"], [25, 2, 1, "id113", "sample"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel": [[25, 2, 1, "id115", "argmax"], [25, 2, 1, "id116", "get_all_actions"], [25, 2, 1, "id117", "probability"], [25, 2, 1, "id118", "rollout"], [25, 2, 1, "id119", "sample"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSRewardModel": [[25, 2, 1, "id121", "argmax"], [25, 2, 1, "id122", "probability"], [25, 2, 1, "id123", "sample"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState": [[25, 3, 1, "id125", "position"], [25, 3, 1, "id126", "rocktypes"], [25, 3, 1, "id127", "terminal"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSTransitionModel": [[25, 2, 1, "id129", "argmax"], [25, 2, 1, "id130", "probability"], [25, 2, 1, "id131", "sample"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem": [[25, 2, 1, "id133", "generate_instance"], [25, 2, 1, "id134", "in_exit_area"], [25, 2, 1, "id135", "print_state"], [25, 2, 1, "id136", "random_free_location"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType": [[25, 3, 1, "id138", "BAD"], [25, 3, 1, "id139", "GOOD"], [25, 2, 1, "id140", "invert"], [25, 2, 1, "id141", "random"]], "pomdp_py.problems.rocksample.rocksample_problem": [[24, 1, 1, "", "Action"], [24, 1, 1, "", "CheckAction"], [24, 1, 1, "", "MoveAction"], [24, 1, 1, "", "Observation"], [24, 1, 1, "", "RSObservationModel"], [24, 1, 1, "", "RSPolicyModel"], [24, 1, 1, "", "RSRewardModel"], [24, 1, 1, "", "RSTransitionModel"], [24, 1, 1, "", "RockSampleProblem"], [24, 1, 1, "", "RockType"], [24, 1, 1, "", "SampleAction"], [24, 1, 1, "", "State"], [24, 4, 1, "", "create_instance"], [24, 4, 1, "", "euclidean_dist"], [24, 4, 1, "", "init_particles_belief"], [24, 4, 1, "", "main"], [24, 4, 1, "", "minimal_instance"], [24, 4, 1, "", "test_planner"]], "pomdp_py.problems.rocksample.rocksample_problem.MoveAction": [[24, 3, 1, "", "EAST"], [24, 3, 1, "", "NORTH"], [24, 3, 1, "", "SOUTH"], [24, 3, 1, "", "WEST"]], "pomdp_py.problems.rocksample.rocksample_problem.RSObservationModel": [[24, 2, 1, "", "argmax"], [24, 2, 1, "", "probability"], [24, 2, 1, "", "sample"]], "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel": [[24, 2, 1, "", "argmax"], [24, 2, 1, "", "get_all_actions"], [24, 2, 1, "", "probability"], [24, 2, 1, "", "rollout"], [24, 2, 1, "", "sample"]], "pomdp_py.problems.rocksample.rocksample_problem.RSRewardModel": [[24, 2, 1, "", "argmax"], [24, 2, 1, "", "probability"], [24, 2, 1, "", "sample"]], "pomdp_py.problems.rocksample.rocksample_problem.RSTransitionModel": [[24, 2, 1, "", "argmax"], [24, 2, 1, "", "probability"], [24, 2, 1, "", "sample"]], "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem": [[24, 2, 1, "", "generate_instance"], [24, 2, 1, "", "in_exit_area"], [24, 2, 1, "", "print_state"], [24, 2, 1, "", "random_free_location"]], "pomdp_py.problems.rocksample.rocksample_problem.RockType": [[24, 3, 1, "", "BAD"], [24, 3, 1, "", "GOOD"], [24, 2, 1, "", "invert"], [24, 2, 1, "", "random"]], "pomdp_py.problems.tag": [[27, 0, 0, "-", "agent"], [26, 0, 0, "-", "constants"], [28, 0, 0, "-", "domain"], [29, 0, 0, "-", "env"], [26, 0, 0, "-", "example_worlds"], [26, 0, 0, "-", "experiment"], [30, 0, 0, "-", "models"], [26, 0, 0, "-", "problem"]], "pomdp_py.problems.tag.agent": [[27, 0, 0, "-", "agent"]], "pomdp_py.problems.tag.agent.agent": [[27, 1, 1, "", "TagAgent"], [27, 4, 1, "", "belief_update"], [27, 4, 1, "", "initialize_belief"], [27, 4, 1, "", "initialize_particles_belief"]], "pomdp_py.problems.tag.agent.agent.TagAgent": [[27, 2, 1, "", "clear_history"]], "pomdp_py.problems.tag.domain": [[28, 0, 0, "-", "action"], [28, 0, 0, "-", "observation"], [28, 0, 0, "-", "state"]], "pomdp_py.problems.tag.domain.action": [[28, 1, 1, "", "TagAction"]], "pomdp_py.problems.tag.domain.observation": [[28, 1, 1, "", "TagObservation"]], "pomdp_py.problems.tag.domain.state": [[28, 1, 1, "", "TagState"]], "pomdp_py.problems.tag.env": [[29, 0, 0, "-", "env"], [29, 0, 0, "-", "visual"]], "pomdp_py.problems.tag.env.env": [[29, 1, 1, "", "TagEnvironment"]], "pomdp_py.problems.tag.env.env.TagEnvironment": [[29, 2, 1, "", "from_str"], [29, 5, 1, "", "grid_map"], [29, 5, 1, "", "length"], [29, 5, 1, "", "width"]], "pomdp_py.problems.tag.env.visual": [[29, 1, 1, "", "TagViz"], [29, 4, 1, "", "unittest"]], "pomdp_py.problems.tag.env.visual.TagViz": [[29, 2, 1, "", "draw_belief"], [29, 2, 1, "", "draw_observation"], [29, 2, 1, "", "draw_robot"], [29, 5, 1, "", "img_height"], [29, 5, 1, "", "img_width"], [29, 5, 1, "", "last_observation"], [29, 2, 1, "", "on_cleanup"], [29, 2, 1, "", "on_event"], [29, 2, 1, "", "on_execute"], [29, 2, 1, "", "on_init"], [29, 2, 1, "", "on_loop"], [29, 2, 1, "", "on_render"], [29, 2, 1, "", "render_env"], [29, 2, 1, "", "update"]], "pomdp_py.problems.tag.experiment": [[26, 4, 1, "", "main"], [26, 4, 1, "", "trial"]], "pomdp_py.problems.tag.models": [[31, 0, 0, "-", "components"], [30, 0, 0, "-", "observation_model"], [30, 0, 0, "-", "policy_model"], [30, 0, 0, "-", "reward_model"], [30, 0, 0, "-", "transition_model"]], "pomdp_py.problems.tag.models.components": [[31, 0, 0, "-", "grid_map"], [31, 0, 0, "-", "motion_policy"]], "pomdp_py.problems.tag.models.components.grid_map": [[31, 1, 1, "", "GridMap"]], "pomdp_py.problems.tag.models.components.grid_map.GridMap": [[31, 2, 1, "", "free_cells"], [31, 2, 1, "", "from_str"], [31, 2, 1, "", "valid_motions"], [31, 2, 1, "", "valid_pose"]], "pomdp_py.problems.tag.models.components.motion_policy": [[31, 1, 1, "", "TagTargetMotionPolicy"]], "pomdp_py.problems.tag.models.components.motion_policy.TagTargetMotionPolicy": [[31, 2, 1, "", "mpe"], [31, 2, 1, "", "probability"], [31, 2, 1, "", "random"]], "pomdp_py.problems.tag.models.observation_model": [[30, 1, 1, "", "TagObservationModel"]], "pomdp_py.problems.tag.models.observation_model.TagObservationModel": [[30, 2, 1, "", "argmax"], [30, 2, 1, "", "probability"], [30, 2, 1, "", "sample"]], "pomdp_py.problems.tag.models.policy_model": [[30, 1, 1, "", "TagPolicyModel"]], "pomdp_py.problems.tag.models.policy_model.TagPolicyModel": [[30, 2, 1, "", "get_all_actions"], [30, 2, 1, "", "rollout"], [30, 2, 1, "", "sample"]], "pomdp_py.problems.tag.models.reward_model": [[30, 1, 1, "", "TagRewardModel"]], "pomdp_py.problems.tag.models.reward_model.TagRewardModel": [[30, 2, 1, "", "probability"], [30, 2, 1, "", "sample"]], "pomdp_py.problems.tag.models.transition_model": [[30, 1, 1, "", "TagTransitionModel"]], "pomdp_py.problems.tag.models.transition_model.TagTransitionModel": [[30, 2, 1, "", "argmax"], [30, 2, 1, "", "if_move_by"], [30, 2, 1, "", "probability"], [30, 2, 1, "", "sample"]], "pomdp_py.problems.tag.problem": [[26, 1, 1, "", "TagProblem"], [26, 4, 1, "", "main"], [26, 4, 1, "", "solve"]], "pomdp_py.problems.tiger": [[33, 0, 0, "-", "cythonize"], [32, 0, 0, "-", "tiger_problem"]], "pomdp_py.problems.tiger.cythonize": [[33, 0, 0, "module-2", "tiger_problem"]], "pomdp_py.problems.tiger.cythonize.tiger_problem": [[33, 1, 1, "id80", "TigerAction"], [33, 1, 1, "id81", "TigerObservation"], [33, 1, 1, "id83", "TigerObservationModel"], [33, 1, 1, "id89", "TigerPolicyModel"], [33, 1, 1, "id94", "TigerProblem"], [33, 1, 1, "id98", "TigerRewardModel"], [33, 1, 1, "id103", "TigerState"], [33, 1, 1, "id105", "TigerTransitionModel"], [33, 4, 1, "id111", "build_actions"], [33, 4, 1, "id112", "build_observations"], [33, 4, 1, "id113", "build_setting"], [33, 4, 1, "id114", "build_states"], [33, 4, 1, "id115", "main"], [33, 4, 1, "id116", "test_planner"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservation": [[33, 3, 1, "id82", "name"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel": [[33, 2, 1, "id84", "argmax"], [33, 2, 1, "id85", "get_all_observations"], [33, 2, 1, "id86", "get_distribution"], [33, 2, 1, "id87", "probability"], [33, 2, 1, "id88", "sample"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel": [[33, 2, 1, "id90", "argmax"], [33, 2, 1, "id91", "get_all_actions"], [33, 2, 1, "id92", "probability"], [33, 2, 1, "id93", "sample"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem": [[33, 3, 1, "id95", "ACTIONS"], [33, 3, 1, "id96", "OBSERVATIONS"], [33, 3, 1, "id97", "STATES"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel": [[33, 2, 1, "id99", "argmax"], [33, 2, 1, "id100", "get_distribution"], [33, 2, 1, "id101", "probability"], [33, 2, 1, "id102", "sample"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerState": [[33, 3, 1, "id104", "name"]], "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel": [[33, 2, 1, "id106", "argmax"], [33, 2, 1, "id107", "get_all_states"], [33, 2, 1, "id108", "get_distribution"], [33, 2, 1, "id109", "probability"], [33, 2, 1, "id110", "sample"]], "pomdp_py.problems.tiger.tiger_problem": [[32, 1, 1, "", "ObservationModel"], [32, 1, 1, "", "PolicyModel"], [32, 1, 1, "", "RewardModel"], [32, 1, 1, "", "TigerAction"], [32, 1, 1, "", "TigerObservation"], [32, 1, 1, "", "TigerProblem"], [32, 1, 1, "", "TigerState"], [32, 1, 1, "", "TransitionModel"], [32, 4, 1, "", "main"], [32, 4, 1, "", "make_tiger"], [32, 4, 1, "", "test_planner"]], "pomdp_py.problems.tiger.tiger_problem.ObservationModel": [[32, 2, 1, "", "get_all_observations"], [32, 2, 1, "", "probability"], [32, 2, 1, "", "sample"]], "pomdp_py.problems.tiger.tiger_problem.PolicyModel": [[32, 3, 1, "", "ACTIONS"], [32, 2, 1, "", "get_all_actions"], [32, 2, 1, "", "rollout"], [32, 2, 1, "", "sample"]], "pomdp_py.problems.tiger.tiger_problem.RewardModel": [[32, 2, 1, "", "sample"]], "pomdp_py.problems.tiger.tiger_problem.TigerProblem": [[32, 2, 1, "", "create"]], "pomdp_py.problems.tiger.tiger_problem.TigerState": [[32, 2, 1, "", "other"]], "pomdp_py.problems.tiger.tiger_problem.TransitionModel": [[32, 2, 1, "", "get_all_states"], [32, 2, 1, "", "probability"], [32, 2, 1, "", "sample"]], "pomdp_py.representations.belief": [[35, 0, 0, "-", "histogram"], [35, 0, 0, "-", "particles"]], "pomdp_py.representations.belief.histogram": [[35, 4, 1, "", "abstraction_over_histogram"], [35, 4, 1, "", "update_histogram_belief"]], "pomdp_py.representations.belief.particles": [[35, 4, 1, "", "abstraction_over_particles"], [35, 4, 1, "", "particle_reinvigoration"], [35, 4, 1, "", "update_particles_belief"]], "pomdp_py.representations.distribution": [[36, 0, 0, "-", "gaussian"], [36, 0, 0, "-", "histogram"], [36, 0, 0, "-", "particles"]], "pomdp_py.representations.distribution.gaussian": [[36, 1, 1, "", "Gaussian"]], "pomdp_py.representations.distribution.gaussian.Gaussian": [[36, 2, 1, "", "__getitem__"], [36, 2, 1, "", "__setitem__"], [36, 3, 1, "", "cov"], [36, 3, 1, "", "covariance"], [36, 3, 1, "", "mean"], [36, 2, 1, "", "mpe"], [36, 2, 1, "", "random"], [36, 3, 1, "", "sigma"]], "pomdp_py.representations.distribution.histogram": [[36, 1, 1, "", "Histogram"]], "pomdp_py.representations.distribution.histogram.Histogram": [[36, 2, 1, "", "__getitem__"], [36, 2, 1, "", "__setitem__"], [36, 2, 1, "", "get_histogram"], [36, 3, 1, "", "histogram"], [36, 2, 1, "", "is_normalized"], [36, 2, 1, "", "mpe"], [36, 2, 1, "", "random"]], "pomdp_py.representations.distribution.particles": [[36, 1, 1, "", "Particles"], [36, 1, 1, "", "WeightedParticles"]], "pomdp_py.representations.distribution.particles.Particles": [[36, 2, 1, "", "add"], [36, 2, 1, "", "from_histogram"], [36, 2, 1, "", "get_abstraction"], [36, 2, 1, "", "get_histogram"], [36, 3, 1, "", "particles"], [36, 2, 1, "", "random"]], "pomdp_py.representations.distribution.particles.WeightedParticles": [[36, 2, 1, "", "__getitem__"], [36, 2, 1, "", "__setitem__"], [36, 2, 1, "", "add"], [36, 2, 1, "", "condense"], [36, 2, 1, "", "from_histogram"], [36, 3, 1, "", "frozen"], [36, 2, 1, "", "get_histogram"], [36, 2, 1, "", "mpe"], [36, 3, 1, "", "particles"], [36, 2, 1, "", "random"], [36, 3, 1, "", "values"], [36, 3, 1, "", "weights"]], "pomdp_py.utils": [[37, 0, 0, "-", "colors"], [37, 0, 0, "-", "cython_utils"], [37, 0, 0, "-", "debugging"], [37, 0, 0, "-", "math"], [37, 0, 0, "-", "misc"], [37, 0, 0, "-", "templates"], [37, 0, 0, "-", "typ"]], "pomdp_py.utils.colors": [[37, 4, 1, "", "hex_to_rgb"], [37, 4, 1, "", "inverse_color_hex"], [37, 4, 1, "", "inverse_color_rgb"], [37, 4, 1, "", "lighter"], [37, 4, 1, "", "random_unique_color"], [37, 4, 1, "", "rgb_to_hex"]], "pomdp_py.utils.cython_utils": [[37, 4, 1, "", "det_dict_hash"]], "pomdp_py.utils.debugging": [[37, 1, 1, "", "TreeDebugger"], [37, 4, 1, "", "interpret_color"], [37, 4, 1, "", "sorted_by_str"]], "pomdp_py.utils.debugging.TreeDebugger": [[37, 5, 1, "", "b"], [37, 2, 1, "", "back"], [37, 5, 1, "", "bestseq"], [37, 2, 1, "", "bestseqd"], [37, 5, 1, "", "c"], [37, 5, 1, "", "clear"], [37, 5, 1, "", "d"], [37, 5, 1, "", "depth"], [37, 2, 1, "", "l"], [37, 2, 1, "", "layer"], [37, 5, 1, "", "leaf"], [37, 2, 1, "", "mark"], [37, 2, 1, "", "mark_path"], [37, 2, 1, "", "mark_sequence"], [37, 2, 1, "", "markp"], [37, 5, 1, "", "mbp"], [37, 5, 1, "", "nl"], [37, 5, 1, "", "nn"], [37, 5, 1, "", "nq"], [37, 5, 1, "", "num_layers"], [37, 2, 1, "", "num_nodes"], [37, 5, 1, "", "nv"], [37, 2, 1, "", "p"], [37, 2, 1, "", "path"], [37, 2, 1, "", "path_to"], [37, 5, 1, "", "pm"], [37, 5, 1, "", "pp"], [37, 2, 1, "", "preferred_actions"], [37, 5, 1, "", "r"], [37, 5, 1, "", "root"], [37, 2, 1, "", "s"], [37, 2, 1, "", "single_node_str"], [37, 2, 1, "", "step"], [37, 2, 1, "", "tree_stats"]], "pomdp_py.utils.interfaces.conversion": [[46, 1, 1, "", "AlphaVectorPolicy"], [46, 1, 1, "", "PolicyGraph"], [46, 4, 1, "", "to_pomdp_file"], [46, 4, 1, "", "to_pomdpx_file"]], "pomdp_py.utils.interfaces.conversion.AlphaVectorPolicy": [[46, 2, 1, "", "construct"], [46, 2, 1, "", "plan"], [46, 2, 1, "", "value"]], "pomdp_py.utils.interfaces.conversion.PolicyGraph": [[46, 2, 1, "", "construct"], [46, 2, 1, "", "plan"], [46, 2, 1, "", "update"]], "pomdp_py.utils.interfaces": [[46, 0, 0, "-", "solvers"]], "pomdp_py.utils.interfaces.solvers": [[46, 4, 1, "", "sarsop"], [46, 4, 1, "", "vi_pruning"]], "pomdp_py.utils.math": [[37, 4, 1, "", "R_between"], [37, 4, 1, "", "R_x"], [37, 4, 1, "", "R_y"], [37, 4, 1, "", "R_z"], [37, 4, 1, "", "T"], [37, 4, 1, "", "approx_equal"], [37, 4, 1, "", "euclidean_dist"], [37, 4, 1, "", "proj"], [37, 4, 1, "", "to_radians"], [37, 4, 1, "", "vec"]], "pomdp_py.utils.misc": [[37, 4, 1, "", "json_safe"], [37, 4, 1, "", "remap"], [37, 4, 1, "", "safe_slice"], [37, 4, 1, "", "similar"], [37, 1, 1, "", "special_char"]], "pomdp_py.utils.misc.special_char": [[37, 3, 1, "", "SUBSCRIPT"], [37, 3, 1, "", "bottomleft"], [37, 3, 1, "", "bottomright"], [37, 3, 1, "", "bottomt"], [37, 3, 1, "", "down"], [37, 3, 1, "", "hline"], [37, 3, 1, "", "intersect"], [37, 3, 1, "", "left"], [37, 3, 1, "", "leftt"], [37, 3, 1, "", "longbottomleft"], [37, 3, 1, "", "longbottomright"], [37, 3, 1, "", "longleft"], [37, 3, 1, "", "longright"], [37, 3, 1, "", "longtopleft"], [37, 3, 1, "", "longtopright"], [37, 3, 1, "", "right"], [37, 3, 1, "", "rightt"], [37, 3, 1, "", "shadebar"], [37, 3, 1, "", "topleft"], [37, 3, 1, "", "topright"], [37, 3, 1, "", "topt"], [37, 3, 1, "", "up"], [37, 3, 1, "", "vline"]], "pomdp_py.utils.templates": [[37, 1, 1, "", "DetObservationModel"], [37, 1, 1, "", "DetRewardModel"], [37, 1, 1, "", "DetTransitionModel"], [37, 1, 1, "", "SimpleAction"], [37, 1, 1, "", "SimpleObservation"], [37, 1, 1, "", "SimpleState"], [37, 1, 1, "", "TabularObservationModel"], [37, 1, 1, "", "TabularRewardModel"], [37, 1, 1, "", "TabularTransitionModel"], [37, 1, 1, "", "UniformPolicyModel"]], "pomdp_py.utils.templates.DetObservationModel": [[37, 2, 1, "", "probability"], [37, 2, 1, "", "sample"]], "pomdp_py.utils.templates.DetRewardModel": [[37, 2, 1, "", "argmax"], [37, 2, 1, "", "reward_func"], [37, 2, 1, "", "sample"]], "pomdp_py.utils.templates.DetTransitionModel": [[37, 2, 1, "", "probability"], [37, 2, 1, "", "sample"]], "pomdp_py.utils.templates.TabularObservationModel": [[37, 2, 1, "", "get_all_observations"], [37, 2, 1, "", "probability"], [37, 2, 1, "", "sample"]], "pomdp_py.utils.templates.TabularRewardModel": [[37, 2, 1, "", "sample"]], "pomdp_py.utils.templates.TabularTransitionModel": [[37, 2, 1, "", "get_all_states"], [37, 2, 1, "", "probability"], [37, 2, 1, "", "sample"]], "pomdp_py.utils.templates.UniformPolicyModel": [[37, 2, 1, "", "get_all_actions"], [37, 2, 1, "", "rollout"], [37, 2, 1, "", "sample"]], "pomdp_py.utils.typ": [[37, 1, 1, "", "bcolors"], [37, 4, 1, "", "blue"], [37, 4, 1, "", "bold"], [37, 4, 1, "", "cyan"], [37, 4, 1, "", "error"], [37, 4, 1, "", "green"], [37, 4, 1, "", "info"], [37, 4, 1, "", "magenta"], [37, 4, 1, "", "note"], [37, 4, 1, "", "red"], [37, 4, 1, "", "success"], [37, 4, 1, "", "warning"], [37, 4, 1, "", "white"], [37, 4, 1, "", "yellow"]], "pomdp_py.utils.typ.bcolors": [[37, 3, 1, "", "BLUE"], [37, 3, 1, "", "BOLD"], [37, 3, 1, "", "CYAN"], [37, 3, 1, "", "ENDC"], [37, 3, 1, "", "GREEN"], [37, 3, 1, "", "MAGENTA"], [37, 3, 1, "", "RED"], [37, 3, 1, "", "WHITE"], [37, 3, 1, "", "YELLOW"], [37, 2, 1, "", "disable"], [37, 2, 1, "", "s"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function", "5": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "function", "Python function"], "5": ["py", "property", "Python property"]}, "titleterms": {"pomdp_pi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 46, 52], "packag": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40], "algorithm": [2, 3, 4], "po_rollout": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40], "po_uct": 2, "pomcp": 2, "value_iter": 2, "bsp": [2, 3], "blqr": [2, 3], "visual": [2, 4, 10, 21, 29, 40], "submodul": [3, 4, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 37, 40], "content": [3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 37, 40, 46, 53], "framework": 5, "basic": 5, "oopomdp": 5, "planner": 5, "problem": [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 41, 47], "subpackag": [6, 7, 13, 16, 18, 22, 24, 26, 30, 32, 37], "lasertag": [], "light_dark": [7, 8, 9, 10, 11], "problem_discret": 7, "test": [7, 53], "agent": [8, 19, 27, 46], "belief": [8, 19, 35], "domain": [9, 14, 20, 28, 48, 49], "action": [9, 14, 20, 28, 45], "observ": [9, 14, 20, 28], "state": [9, 14, 20, 28], "env": [10, 15, 21, 29], "plot": [10, 37], "model": [11, 16, 17, 22, 23, 30, 31, 48], "observation_model": [11, 22, 30], "transition_model": [11, 22, 30], "load_unload": 12, "maze": [13, 14, 15, 16, 17], "compon": [17, 23, 31], "map": 17, "multi_object_search": [18, 19, 20, 21, 22, 23], "example_world": [18, 26], "policy_model": [22, 30], "reward_model": [22, 30], "grid_map": [23, 31], "sensor": 23, "rocksampl": [24, 25], "cython": [24, 25, 32, 33], "rocksample_problem": [24, 25], "run_rocksampl": 25, "tag": [26, 27, 28, 29, 30, 31], "constant": 26, "experi": 26, "motion_polici": 31, "tiger": [32, 33, 44, 48], "tiger_problem": [32, 33], "run_tig": 33, "represent": [34, 35, 36], "histogram": [35, 36], "particl": [35, 36], "distribut": 36, "gaussian": 36, "util": [37, 38, 39], "color": 37, "cython_util": 37, "cpython": 37, "37m": 37, "x86_64": 37, "linux": 37, "gnu": 37, "debug": [37, 38], "treedebugg": [37, 38], "math": 37, "misc": 37, "templat": 37, "test_util": 37, "typ": 37, "interfac": 39, "simple_rl": 39, "search_tre": 40, "build": 41, "document": [41, 52], "doc": [41, 54], "pomdp_problem": 24, "note": 41, "changelog": [41, 42], "design": 43, "principl": 43, "exampl": [44, 46], "multi": [18, 44, 47], "object": [18, 44, 47], "search": [18, 44, 47], "mo": [18, 44, 47], "prefer": 45, "base": 45, "prior": 45, "us": [46, 51], "extern": 46, "solver": [46, 50], "tabl": [46, 53], "convert": 46, "pomdp": [46, 47, 48, 49, 50, 53, 55], "file": 46, "solv": [46, 48], "sarsop": 46, "policygraph": 46, "alphavectorpolici": 46, "overview": [47, 52], "implement": 47, "thi": 47, "convent": 47, "try": 47, "defin": 48, "instanti": 48, "instanc": 48, "summari": 48, "exist": [49, 50], "case": 51, "extens": 51, "get": 52, "start": 52, "further": 52, "citat": 52, "api": 52, "refer": 52, "tool": 52, "instal": 53, "pre": 53, "py": 53, "thing": 53, "out": 53, "docker": 53, "imag": 53, "other": 55, "librari": 55, "integr": [], "version": 42, "1": 42, "3": 42, "4": 42, "01": 42, "26": 42, "2024": 42, "07": 42, "25": 42, "2023": 42, "2": 42, "04": 42, "03": 42, "2022": 42, "11": 42, "2021": 42, "0": 42, "09": 42, "30": 42, "6": 42, "cancel": 42, "5": 42, "05": 42, "06": 42, "02": 42, "22": 42, "17": 42, "12": 42, "23": 42, "2020": 42, "pull": 42, "request": 42, "08": 42, "16": 42, "light": 7, "dark": 7, "load": 12, "unload": 12, "task": 18}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinxcontrib.bibtex": 9, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"pomdp_py package": [[1, "pomdp-py-package"]], "pomdp_py.algorithms.bsp.blqr module": [[3, "module-pomdp_py.algorithms.bsp.blqr"], [2, "module-pomdp_py.algorithms.bsp.blqr"]], "pomdp_py.algorithms.bsp package": [[3, "pomdp-py-algorithms-bsp-package"]], "Submodules": [[3, "submodules"], [14, "submodules"], [15, "submodules"], [19, "submodules"], [20, "submodules"], [21, "submodules"], [22, "submodules"], [23, "submodules"], [26, "submodules"], [27, "submodules"], [28, "submodules"], [29, "submodules"], [30, "submodules"], [31, "submodules"], [4, "submodules"], [7, "submodules"], [8, "submodules"], [9, "submodules"], [10, "submodules"], [11, "submodules"], [12, "submodules"], [17, "submodules"], [18, "submodules"], [24, "submodules"], [25, "submodules"], [32, "submodules"], [33, "submodules"], [37, "submodules"], [40, "submodules"]], "Module contents": [[3, "module-pomdp_py.algorithms.bsp"], [6, "module-pomdp_py.problems"], [14, "module-pomdp_py.problems.maze.domain"], [15, "module-pomdp_py.problems.maze.env"], [16, "module-pomdp_py.problems.maze.models"], [19, "module-pomdp_py.problems.multi_object_search.agent"], [20, "module-pomdp_py.problems.multi_object_search.domain"], [21, "module-pomdp_py.problems.multi_object_search.env"], [22, "module-pomdp_py.problems.multi_object_search.models"], [23, "module-pomdp_py.problems.multi_object_search.models.components"], [26, "module-pomdp_py.problems.tag"], [27, "module-pomdp_py.problems.tag.agent"], [28, "module-pomdp_py.problems.tag.domain"], [29, "module-pomdp_py.problems.tag.env"], [30, "module-pomdp_py.problems.tag.models"], [31, "module-pomdp_py.problems.tag.models.components"], [4, "module-contents"], [7, "module-contents"], [8, "module-contents"], [9, "module-contents"], [10, "module-pomdp_py.problems.light_dark.env"], [11, "module-contents"], [12, "module-pomdp_py.problems.load_unload"], [13, "module-pomdp_py.problems.maze"], [17, "module-pomdp_py.problems.maze.models.components"], [18, "module-pomdp_py.problems.multi_object_search"], [24, "module-pomdp_py.problems.rocksample"], [25, "module-pomdp_py.problems.rocksample.cythonize"], [32, "module-pomdp_py.problems.tiger"], [33, "module-pomdp_py.problems.tiger.cythonize"], [37, "module-pomdp_py.utils"], [40, "module-contents"]], "pomdp_py.framework package": [[5, "pomdp-py-framework-package"]], "pomdp_py.framework.basics module": [[5, "module-pomdp_py.framework.basics"]], "pomdp_py.framework.oopomdp module": [[5, "module-pomdp_py.framework.oopomdp"]], "pomdp_py.framework.planner module": [[5, "module-pomdp_py.framework.planner"]], "pomdp_py.problems package": [[6, "pomdp-py-problems-package"]], "Subpackages": [[6, "subpackages"], [16, "subpackages"], [22, "subpackages"], [26, "subpackages"], [30, "subpackages"], [7, "subpackages"], [13, "subpackages"], [18, "subpackages"], [24, "subpackages"], [32, "subpackages"], [37, "subpackages"]], "pomdp_py.problems.maze.domain package": [[14, "pomdp-py-problems-maze-domain-package"]], "pomdp_py.problems.maze.domain.action module": [[14, "module-pomdp_py.problems.maze.domain.action"]], "pomdp_py.problems.maze.domain.observation module": [[14, "module-pomdp_py.problems.maze.domain.observation"]], "pomdp_py.problems.maze.domain.state module": [[14, "module-pomdp_py.problems.maze.domain.state"]], "pomdp_py.problems.maze.env package": [[15, "pomdp-py-problems-maze-env-package"]], "pomdp_py.problems.maze.env.env module": [[15, "module-pomdp_py.problems.maze.env.env"]], "pomdp_py.problems.maze.models package": [[16, "pomdp-py-problems-maze-models-package"]], "pomdp_py.problems.multi_object_search.agent package": [[19, "pomdp-py-problems-multi-object-search-agent-package"]], "pomdp_py.problems.multi_object_search.agent.agent module": [[19, "module-pomdp_py.problems.multi_object_search.agent.agent"]], "pomdp_py.problems.multi_object_search.agent.belief module": [[19, "module-pomdp_py.problems.multi_object_search.agent.belief"]], "pomdp_py.problems.multi_object_search.domain package": [[20, "pomdp-py-problems-multi-object-search-domain-package"]], "pomdp_py.problems.multi_object_search.domain.action module": [[20, "module-pomdp_py.problems.multi_object_search.domain.action"]], "pomdp_py.problems.multi_object_search.domain.observation module": [[20, "module-pomdp_py.problems.multi_object_search.domain.observation"]], "pomdp_py.problems.multi_object_search.domain.state module": [[20, "module-pomdp_py.problems.multi_object_search.domain.state"]], "pomdp_py.problems.multi_object_search.env package": [[21, "pomdp-py-problems-multi-object-search-env-package"]], "pomdp_py.problems.multi_object_search.env.env module": [[21, "module-pomdp_py.problems.multi_object_search.env.env"]], "pomdp_py.problems.multi_object_search.env.visual module": [[21, "module-pomdp_py.problems.multi_object_search.env.visual"]], "pomdp_py.problems.multi_object_search.models package": [[22, "pomdp-py-problems-multi-object-search-models-package"]], "pomdp_py.problems.multi_object_search.models.observation_model module": [[22, "module-pomdp_py.problems.multi_object_search.models.observation_model"]], "pomdp_py.problems.multi_object_search.models.policy_model module": [[22, "module-pomdp_py.problems.multi_object_search.models.policy_model"]], "pomdp_py.problems.multi_object_search.models.reward_model module": [[22, "module-pomdp_py.problems.multi_object_search.models.reward_model"]], "pomdp_py.problems.multi_object_search.models.transition_model module": [[22, "module-pomdp_py.problems.multi_object_search.models.transition_model"]], "pomdp_py.problems.multi_object_search.models.components package": [[23, "pomdp-py-problems-multi-object-search-models-components-package"]], "pomdp_py.problems.multi_object_search.models.components.grid_map module": [[23, "module-pomdp_py.problems.multi_object_search.models.components.grid_map"]], "pomdp_py.problems.multi_object_search.models.components.sensor module": [[23, "module-pomdp_py.problems.multi_object_search.models.components.sensor"]], "pomdp_py.problems.tag package": [[26, "pomdp-py-problems-tag-package"]], "pomdp_py.problems.tag.constants module": [[26, "module-pomdp_py.problems.tag.constants"]], "pomdp_py.problems.tag.example_worlds module": [[26, "module-pomdp_py.problems.tag.example_worlds"]], "pomdp_py.problems.tag.experiment module": [[26, "module-pomdp_py.problems.tag.experiment"]], "pomdp_py.problems.tag.problem module": [[26, "module-pomdp_py.problems.tag.problem"]], "pomdp_py.problems.tag.agent package": [[27, "pomdp-py-problems-tag-agent-package"]], "pomdp_py.problems.tag.agent.agent module": [[27, "module-pomdp_py.problems.tag.agent.agent"]], "pomdp_py.problems.tag.domain package": [[28, "pomdp-py-problems-tag-domain-package"]], "pomdp_py.problems.tag.domain.action module": [[28, "module-pomdp_py.problems.tag.domain.action"]], "pomdp_py.problems.tag.domain.observation module": [[28, "module-pomdp_py.problems.tag.domain.observation"]], "pomdp_py.problems.tag.domain.state module": [[28, "module-pomdp_py.problems.tag.domain.state"]], "pomdp_py.problems.tag.env package": [[29, "pomdp-py-problems-tag-env-package"]], "pomdp_py.problems.tag.env.env module": [[29, "module-pomdp_py.problems.tag.env.env"]], "pomdp_py.problems.tag.env.visual module": [[29, "module-pomdp_py.problems.tag.env.visual"]], "pomdp_py.problems.tag.models package": [[30, "pomdp-py-problems-tag-models-package"]], "pomdp_py.problems.tag.models.observation_model module": [[30, "module-pomdp_py.problems.tag.models.observation_model"]], "pomdp_py.problems.tag.models.policy_model module": [[30, "module-pomdp_py.problems.tag.models.policy_model"]], "pomdp_py.problems.tag.models.reward_model module": [[30, "module-pomdp_py.problems.tag.models.reward_model"]], "pomdp_py.problems.tag.models.transition_model module": [[30, "module-pomdp_py.problems.tag.models.transition_model"]], "pomdp_py.problems.tag.models.components package": [[31, "pomdp-py-problems-tag-models-components-package"]], "pomdp_py.problems.tag.models.components.grid_map module": [[31, "module-pomdp_py.problems.tag.models.components.grid_map"]], "pomdp_py.problems.tag.models.components.motion_policy module": [[31, "module-pomdp_py.problems.tag.models.components.motion_policy"]], "pomdp_py.representations package": [[34, "pomdp-py-representations-package"]], "pomdp_py.representations.belief package": [[35, "pomdp-py-representations-belief-package"]], "pomdp_py.representations.belief.histogram module": [[35, "module-pomdp_py.representations.belief.histogram"]], "pomdp_py.representations.belief.particles module": [[35, "module-pomdp_py.representations.belief.particles"]], "pomdp_py.representations.distribution package": [[36, "pomdp-py-representations-distribution-package"]], "pomdp_py.representations.distribution.histogram module": [[36, "module-pomdp_py.representations.distribution.histogram"]], "pomdp_py.representations.distribution.particles module": [[36, "module-pomdp_py.representations.distribution.particles"]], "pomdp_py.representations.distribution.gaussian module": [[36, "module-pomdp_py.representations.distribution.gaussian"]], "pomdp_py.utils.debugging module": [[38, "module-pomdp_py.utils.debugging"], [37, "module-pomdp_py.utils.debugging"]], "TreeDebugger": [[38, "treedebugger"], [37, "treedebugger"]], "Changelog": [[42, "changelog"]], "Version 1.3.5 (03/12/2024)": [[42, "version-1-3-5-03-12-2024"]], "Version 1.3.4 (01/26/2024)": [[42, "version-1-3-4-01-26-2024"]], "Version 1.3.3 (07/25/2023)": [[42, "version-1-3-3-07-25-2023"]], "Version 1.3.2 (04/03/2022)": [[42, "version-1-3-2-04-03-2022"]], "Version 1.3.1 (11/03/2021)": [[42, "version-1-3-1-11-03-2021"]], "Version 1.3.0.1 (09/30/2021)": [[42, "version-1-3-0-1-09-30-2021"]], "Version 1.2.4.6 (canceled)": [[42, "version-1-2-4-6-canceled"]], "Version 1.2.4.5 (07/05/2021)": [[42, "version-1-2-4-5-07-05-2021"]], "Version 1.2.4.1 (06/02/2021)": [[42, "version-1-2-4-1-06-02-2021"]], "Version 1.2.4 (06/01/2021)": [[42, "version-1-2-4-06-01-2021"]], "Version 1.2.3 (03/22/2021)": [[42, "version-1-2-3-03-22-2021"]], "Version 1.2.2.1 (01/25/2021)": [[42, "version-1-2-2-1-01-25-2021"]], "Version 1.2.2 (01/17/2021)": [[42, "version-1-2-2-01-17-2021"]], "Version 1.2.1 (12/23/2020)": [[42, "version-1-2-1-12-23-2020"]], "Pull Request #3 (08/01/2020)": [[42, "pull-request-3-08-01-2020"]], "Pull Request #1 (06/02/2020)": [[42, "pull-request-1-06-02-2020"]], "Version 1.0 - 1.2 (02/08/2020 - 02/16/2020)": [[42, "version-1-0-1-2-02-08-2020-02-16-2020"]], "Version 0.0": [[42, "version-0-0"]], "Design Principles": [[43, "design-principles"]], "Examples": [[44, "examples"]], "Tiger": [[44, "tiger"], [48, "tiger"], [32, "tiger"]], "Multi-Object Search (MOS)": [[44, "multi-object-search-mos"], [47, "multi-object-search-mos"]], "Preference-based Action Prior": [[45, "preference-based-action-prior"]], "Using External Solvers": [[46, "module-pomdp_py.utils.interfaces.solvers"]], "Table of Contents": [[46, "table-of-contents"], [53, "table-of-contents"]], "Converting a pomdp_py Agent to a POMDP File": [[46, "converting-a-pomdp-py-agent-to-a-pomdp-file"]], "Example": [[46, "example"], [46, "id2"], [46, "id4"]], "Using pomdp-solve": [[46, "using-pomdp-solve"]], "Using sarsop": [[46, "using-sarsop"]], "PolicyGraph and AlphaVectorPolicy": [[46, "policygraph-and-alphavectorpolicy"]], "Problem overview": [[47, "problem-overview"]], "Implementing this POMDP: Conventions": [[47, "implementing-this-pomdp-conventions"]], "Try it": [[47, "try-it"]], "Define the domain": [[48, "define-the-domain"]], "Define the models": [[48, "define-the-models"]], "Define the POMDP": [[48, "define-the-pomdp"]], "Instantiate the POMDP": [[48, "instantiate-the-pomdp"]], "Solve the POMDP instance": [[48, "solve-the-pomdp-instance"]], "Summary": [[48, "summary"]], "Existing POMDP Domains": [[49, "existing-pomdp-domains"]], "Existing POMDP Solvers": [[50, "existing-pomdp-solvers"]], "Use Case Extensions": [[51, "use-case-extensions"]], "Installation": [[53, "installation"]], "Pre-installation": [[53, "pre-installation"]], "Install pomdp-py": [[53, "install-pomdp-py"]], "Test things out": [[53, "test-things-out"]], "Docker image": [[53, "docker-image"]], "docs": [[54, "docs"]], "Other POMDP Libraries": [[55, "other-pomdp-libraries"]], "pomdp_py": [[0, "pomdp-py"]], "pomdp_py Documentation": [[52, "pomdp-py-documentation"]], "Overview": [[52, "overview"]], "Getting Started": [[52, "getting-started"]], "Further": [[52, "further"]], "Citation": [[52, "citation"]], "API References": [[52, "api-references"], [52, null]], "Tools": [[52, "tools"]], "Building Documentations": [[41, "building-documentations"]], "Building docs for pomdp_py": [[41, "building-docs-for-pomdp-py"]], "Building docs for pomdp_py.problems": [[41, "building-docs-for-pomdp-py-problems"]], "Note on Changelog": [[41, "note-on-changelog"]], "pomdp_py.algorithms package": [[2, "pomdp-py-algorithms-package"]], "pomdp_py.algorithms.po_rollout module": [[2, "module-pomdp_py.algorithms.po_rollout"]], "pomdp_py.algorithms.po_uct module": [[2, "module-pomdp_py.algorithms.po_uct"]], "pomdp_py.algorithms.pomcp module": [[2, "module-pomdp_py.algorithms.pomcp"]], "pomdp_py.algorithms.value_iteration module": [[2, "module-pomdp_py.algorithms.value_iteration"]], "pomdp_py.algorithms.visual.visual module": [[2, "pomdp-py-algorithms-visual-visual-module"], [4, "pomdp-py-algorithms-visual-visual-module"]], "pomdp_py.algorithms.visual package": [[4, "pomdp-py-algorithms-visual-package"]], "pomdp_py.problems.light_dark package": [[7, "pomdp-py-problems-light-dark-package"]], "Light-Dark": [[7, "light-dark"]], "pomdp_py.problems.light_dark.problem_discrete module": [[7, "pomdp-py-problems-light-dark-problem-discrete-module"]], "pomdp_py.problems.light_dark.test module": [[7, "pomdp-py-problems-light-dark-test-module"]], "pomdp_py.problems.light_dark.agent package": [[8, "pomdp-py-problems-light-dark-agent-package"]], "pomdp_py.problems.light_dark.agent.belief module": [[8, "pomdp-py-problems-light-dark-agent-belief-module"]], "pomdp_py.problems.light_dark.domain package": [[9, "pomdp-py-problems-light-dark-domain-package"]], "pomdp_py.problems.light_dark.domain.action module": [[9, "pomdp-py-problems-light-dark-domain-action-module"]], "pomdp_py.problems.light_dark.domain.observation module": [[9, "pomdp-py-problems-light-dark-domain-observation-module"]], "pomdp_py.problems.light_dark.domain.state module": [[9, "pomdp-py-problems-light-dark-domain-state-module"]], "pomdp_py.problems.light_dark.env package": [[10, "pomdp-py-problems-light-dark-env-package"]], "pomdp_py.problems.light_dark.env.env module": [[10, "module-pomdp_py.problems.light_dark.env.env"]], "pomdp_py.problems.light_dark.env.plotting module": [[10, "module-pomdp_py.problems.light_dark.env.plotting"]], "pomdp_py.problems.light_dark.env.visual module": [[10, "pomdp-py-problems-light-dark-env-visual-module"]], "pomdp_py.problems.light_dark.models package": [[11, "pomdp-py-problems-light-dark-models-package"]], "pomdp_py.problems.light_dark.models.observation_model module": [[11, "pomdp-py-problems-light-dark-models-observation-model-module"]], "pomdp_py.problems.light_dark.models.transition_model module": [[11, "pomdp-py-problems-light-dark-models-transition-model-module"]], "pomdp_py.problems.load_unload package": [[12, "pomdp-py-problems-load-unload-package"]], "Load/Unload": [[12, "load-unload"]], "pomdp_py.problems.load_unload.load_unload module": [[12, "module-pomdp_py.problems.load_unload.load_unload"]], "pomdp_py.problems.maze package": [[13, "pomdp-py-problems-maze-package"]], "Maze": [[13, "maze"], [13, "id1"]], "pomdp_py.problems.maze.models.components package": [[17, "pomdp-py-problems-maze-models-components-package"]], "pomdp_py.problems.maze.models.components.map module": [[17, "pomdp-py-problems-maze-models-components-map-module"]], "pomdp_py.problems.multi_object_search package": [[18, "pomdp-py-problems-multi-object-search-package"]], "Multi-Object Search (MOS) Task": [[18, "multi-object-search-mos-task"]], "pomdp_py.problems.multi_object_search.example_worlds module": [[18, "module-pomdp_py.problems.multi_object_search.example_worlds"]], "pomdp_py.problems.multi_object_search.problem module": [[18, "module-pomdp_py.problems.multi_object_search.problem"]], "pomdp_py.problems.rocksample package": [[24, "pomdp-py-problems-rocksample-package"]], "RockSample": [[24, "rocksample"]], "pomdp_problems.rocksample.rocksample_problem module": [[24, "pomdp-problems-rocksample-rocksample-problem-module"]], "pomdp_py.problems.rocksample.cythonize module": [[24, "module-pomdp_py.problems.rocksample.cythonize"]], "pomdp_py.problems.rocksample.rocksample_problem module": [[24, "module-pomdp_py.problems.rocksample.rocksample_problem"]], "pomdp_py.problems.rocksample.cythonize package": [[25, "pomdp-py-problems-rocksample-cythonize-package"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem module": [[25, "module-pomdp_py.problems.rocksample.cythonize.rocksample_problem"], [25, "id1"], [25, "id49"], [25, "id98"]], "pomdp_py.problems.rocksample.cythonize.run_rocksample module": [[25, "pomdp-py-problems-rocksample-cythonize-run-rocksample-module"]], "pomdp_py.problems.tiger package": [[32, "pomdp-py-problems-tiger-package"]], "pomdp_py.problems.tiger.cythonize module": [[32, "module-pomdp_py.problems.tiger.cythonize"]], "pomdp_py.problems.tiger.tiger_problem module": [[32, "module-pomdp_py.problems.tiger.tiger_problem"]], "pomdp_py.problems.tiger.cythonize package": [[33, "pomdp-py-problems-tiger-cythonize-package"]], "pomdp_py.problems.tiger.cythonize.run_tiger module": [[33, "pomdp-py-problems-tiger-cythonize-run-tiger-module"]], "pomdp_py.problems.tiger.cythonize.tiger_problem module": [[33, "module-pomdp_py.problems.tiger.cythonize.tiger_problem"], [33, "id1"], [33, "id39"], [33, "id78"]], "pomdp_py.utils package": [[37, "pomdp-py-utils-package"]], "pomdp_py.utils.colors module": [[37, "module-pomdp_py.utils.colors"]], "pomdp_py.utils.cython_utils.cpython-37m-x86_64-linux-gnu module": [[37, "pomdp-py-utils-cython-utils-cpython-37m-x86-64-linux-gnu-module"]], "pomdp_py.utils.cython_utils module": [[37, "module-pomdp_py.utils.cython_utils"]], "pomdp_py.utils.math module": [[37, "module-pomdp_py.utils.math"]], "pomdp_py.utils.misc module": [[37, "module-pomdp_py.utils.misc"]], "pomdp_py.utils.plotting module": [[37, "pomdp-py-utils-plotting-module"]], "pomdp_py.utils.templates module": [[37, "module-pomdp_py.utils.templates"]], "pomdp_py.utils.test_utils module": [[37, "pomdp-py-utils-test-utils-module"]], "pomdp_py.utils.typ module": [[37, "module-pomdp_py.utils.typ"]], "pomdp_py.utils.interfaces package": [[39, "pomdp-py-utils-interfaces-package"]], "pomdp_py.utils.interfaces.simple_rl module": [[39, "pomdp-py-utils-interfaces-simple-rl-module"]], "pomdp_py.visual package": [[40, "pomdp-py-visual-package"]], "pomdp_py.visual.search_tree module": [[40, "pomdp-py-visual-search-tree-module"]]}, "indexentries": {"actionprior (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.ActionPrior"]], "blqr (class in pomdp_py.algorithms.bsp.blqr)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR"]], "pomcp (class in pomdp_py.algorithms.pomcp)": [[2, "pomdp_py.algorithms.pomcp.POMCP"]], "porollout (class in pomdp_py.algorithms.po_rollout)": [[2, "pomdp_py.algorithms.po_rollout.PORollout"]], "pouct (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.POUCT"]], "qnode (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.QNode"]], "randomrollout (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.RandomRollout"]], "rolloutpolicy (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.RolloutPolicy"]], "rootvnode (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.RootVNode"]], "rootvnodeparticles (class in pomdp_py.algorithms.pomcp)": [[2, "pomdp_py.algorithms.pomcp.RootVNodeParticles"]], "treenode (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.TreeNode"]], "vnode (class in pomdp_py.algorithms.po_uct)": [[2, "pomdp_py.algorithms.po_uct.VNode"]], "vnodeparticles (class in pomdp_py.algorithms.pomcp)": [[2, "pomdp_py.algorithms.pomcp.VNodeParticles"]], "valueiteration (class in pomdp_py.algorithms.value_iteration)": [[2, "pomdp_py.algorithms.value_iteration.ValueIteration"]], "action_prior (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.action_prior"]], "argmax() (pomdp_py.algorithms.po_uct.vnode method)": [[2, "pomdp_py.algorithms.po_uct.VNode.argmax"]], "belief (pomdp_py.algorithms.pomcp.rootvnodeparticles attribute)": [[2, "pomdp_py.algorithms.pomcp.RootVNodeParticles.belief"]], "belief (pomdp_py.algorithms.pomcp.vnodeparticles attribute)": [[2, "pomdp_py.algorithms.pomcp.VNodeParticles.belief"]], "children (pomdp_py.algorithms.po_uct.treenode attribute)": [[2, "pomdp_py.algorithms.po_uct.TreeNode.children"]], "clear_agent() (pomdp_py.algorithms.po_rollout.porollout method)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.clear_agent"]], "clear_agent() (pomdp_py.algorithms.po_uct.pouct method)": [[2, "pomdp_py.algorithms.po_uct.POUCT.clear_agent"]], "create_plan() (pomdp_py.algorithms.bsp.blqr.blqr method)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR.create_plan"]], "discount_factor (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.discount_factor"]], "ekf_update_mlo() (pomdp_py.algorithms.bsp.blqr.blqr method)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR.ekf_update_mlo"]], "from_vnode() (pomdp_py.algorithms.po_uct.rootvnode class method)": [[2, "pomdp_py.algorithms.po_uct.RootVNode.from_vnode"]], "from_vnode() (pomdp_py.algorithms.pomcp.rootvnodeparticles class method)": [[2, "pomdp_py.algorithms.pomcp.RootVNodeParticles.from_vnode"]], "get_preferred_actions() (pomdp_py.algorithms.po_uct.actionprior method)": [[2, "pomdp_py.algorithms.po_uct.ActionPrior.get_preferred_actions"]], "history (pomdp_py.algorithms.po_uct.rootvnode attribute)": [[2, "pomdp_py.algorithms.po_uct.RootVNode.history"]], "integrate_belief_segment() (pomdp_py.algorithms.bsp.blqr.blqr method)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR.integrate_belief_segment"]], "interpret_sqp_plan() (pomdp_py.algorithms.bsp.blqr.blqr method)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR.interpret_sqp_plan"]], "last_best_reward (pomdp_py.algorithms.po_rollout.porollout attribute)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.last_best_reward"]], "last_num_sims (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.last_num_sims"]], "last_planning_time (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.last_planning_time"]], "max_depth (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.max_depth"]], "module": [[2, "module-pomdp_py.algorithms.bsp.blqr"], [2, "module-pomdp_py.algorithms.po_rollout"], [2, "module-pomdp_py.algorithms.po_uct"], [2, "module-pomdp_py.algorithms.pomcp"], [2, "module-pomdp_py.algorithms.value_iteration"], [6, "module-pomdp_py.problems"], [10, "module-pomdp_py.problems.light_dark.env"], [10, "module-pomdp_py.problems.light_dark.env.env"], [10, "module-pomdp_py.problems.light_dark.env.plotting"], [12, "module-pomdp_py.problems.load_unload"], [12, "module-pomdp_py.problems.load_unload.load_unload"], [13, "module-pomdp_py.problems.maze"], [16, "module-pomdp_py.problems.maze.models"], [17, "module-pomdp_py.problems.maze.models.components"], [18, "module-pomdp_py.problems.multi_object_search"], [18, "module-pomdp_py.problems.multi_object_search.example_worlds"], [18, "module-pomdp_py.problems.multi_object_search.problem"], [24, "module-pomdp_py.problems.rocksample"], [24, "module-pomdp_py.problems.rocksample.cythonize"], [24, "module-pomdp_py.problems.rocksample.rocksample_problem"], [25, "module-0"], [25, "module-1"], [25, "module-2"], [25, "module-pomdp_py.problems.rocksample.cythonize"], [25, "module-pomdp_py.problems.rocksample.cythonize.rocksample_problem"], [32, "module-pomdp_py.problems.tiger"], [32, "module-pomdp_py.problems.tiger.cythonize"], [32, "module-pomdp_py.problems.tiger.tiger_problem"], [33, "module-0"], [33, "module-1"], [33, "module-2"], [33, "module-pomdp_py.problems.tiger.cythonize"], [33, "module-pomdp_py.problems.tiger.cythonize.tiger_problem"], [37, "module-pomdp_py.utils"], [37, "module-pomdp_py.utils.colors"], [37, "module-pomdp_py.utils.cython_utils"], [37, "module-pomdp_py.utils.debugging"], [37, "module-pomdp_py.utils.math"], [37, "module-pomdp_py.utils.misc"], [37, "module-pomdp_py.utils.templates"], [37, "module-pomdp_py.utils.typ"]], "num_visits (pomdp_py.algorithms.po_uct.treenode attribute)": [[2, "pomdp_py.algorithms.po_uct.TreeNode.num_visits"]], "num_visits_init (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.num_visits_init"]], "plan() (pomdp_py.algorithms.po_rollout.porollout method)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.plan"]], "plan() (pomdp_py.algorithms.po_uct.pouct method)": [[2, "pomdp_py.algorithms.po_uct.POUCT.plan"]], "plan() (pomdp_py.algorithms.pomcp.pomcp method)": [[2, "pomdp_py.algorithms.pomcp.POMCP.plan"]], "plan() (pomdp_py.algorithms.value_iteration.valueiteration method)": [[2, "pomdp_py.algorithms.value_iteration.ValueIteration.plan"]], "pomdp_py.algorithms.bsp.blqr": [[2, "module-pomdp_py.algorithms.bsp.blqr"]], "pomdp_py.algorithms.po_rollout": [[2, "module-pomdp_py.algorithms.po_rollout"]], "pomdp_py.algorithms.po_uct": [[2, "module-pomdp_py.algorithms.po_uct"]], "pomdp_py.algorithms.pomcp": [[2, "module-pomdp_py.algorithms.pomcp"]], "pomdp_py.algorithms.value_iteration": [[2, "module-pomdp_py.algorithms.value_iteration"]], "print_children_value() (pomdp_py.algorithms.po_uct.vnode method)": [[2, "pomdp_py.algorithms.po_uct.VNode.print_children_value"]], "rollout() (pomdp_py.algorithms.po_uct.randomrollout method)": [[2, "pomdp_py.algorithms.po_uct.RandomRollout.rollout"]], "rollout() (pomdp_py.algorithms.po_uct.rolloutpolicy method)": [[2, "pomdp_py.algorithms.po_uct.RolloutPolicy.rollout"]], "rollout_policy (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.rollout_policy"]], "segmented_cost_function() (pomdp_py.algorithms.bsp.blqr.blqr method)": [[2, "pomdp_py.algorithms.bsp.blqr.BLQR.segmented_cost_function"]], "set_rollout_policy() (pomdp_py.algorithms.po_rollout.porollout method)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.set_rollout_policy"]], "set_rollout_policy() (pomdp_py.algorithms.po_uct.pouct method)": [[2, "pomdp_py.algorithms.po_uct.POUCT.set_rollout_policy"]], "update() (pomdp_py.algorithms.po_rollout.porollout method)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.update"]], "update() (pomdp_py.algorithms.po_uct.pouct method)": [[2, "pomdp_py.algorithms.po_uct.POUCT.update"]], "update() (pomdp_py.algorithms.pomcp.pomcp method)": [[2, "pomdp_py.algorithms.pomcp.POMCP.update"]], "update_agent_belief (pomdp_py.algorithms.po_rollout.porollout attribute)": [[2, "pomdp_py.algorithms.po_rollout.PORollout.update_agent_belief"]], "update_agent_belief (pomdp_py.algorithms.pomcp.pomcp attribute)": [[2, "pomdp_py.algorithms.pomcp.POMCP.update_agent_belief"]], "updates_agent_belief (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.updates_agent_belief"]], "value (pomdp_py.algorithms.po_uct.treenode attribute)": [[2, "pomdp_py.algorithms.po_uct.TreeNode.value"]], "value (pomdp_py.algorithms.po_uct.vnode attribute)": [[2, "pomdp_py.algorithms.po_uct.VNode.value"]], "value_init (pomdp_py.algorithms.po_uct.pouct attribute)": [[2, "pomdp_py.algorithms.po_uct.POUCT.value_init"]], "pomdp_py.problems": [[6, "module-pomdp_py.problems"]], "lightdarkenvironment (class in pomdp_py.problems.light_dark.env.env)": [[10, "pomdp_py.problems.light_dark.env.env.LightDarkEnvironment"]], "const (pomdp_py.problems.light_dark.env.env.lightdarkenvironment property)": [[10, "pomdp_py.problems.light_dark.env.env.LightDarkEnvironment.const"]], "light (pomdp_py.problems.light_dark.env.env.lightdarkenvironment property)": [[10, "pomdp_py.problems.light_dark.env.env.LightDarkEnvironment.light"]], "plot_circle() (in module pomdp_py.problems.light_dark.env.plotting)": [[10, "pomdp_py.problems.light_dark.env.plotting.plot_circle"]], "plot_line() (in module pomdp_py.problems.light_dark.env.plotting)": [[10, "pomdp_py.problems.light_dark.env.plotting.plot_line"]], "plot_points() (in module pomdp_py.problems.light_dark.env.plotting)": [[10, "pomdp_py.problems.light_dark.env.plotting.plot_points"]], "plot_polygons() (in module pomdp_py.problems.light_dark.env.plotting)": [[10, "pomdp_py.problems.light_dark.env.plotting.plot_polygons"]], "pomdp_py.problems.light_dark.env": [[10, "module-pomdp_py.problems.light_dark.env"]], "pomdp_py.problems.light_dark.env.env": [[10, "module-pomdp_py.problems.light_dark.env.env"]], "pomdp_py.problems.light_dark.env.plotting": [[10, "module-pomdp_py.problems.light_dark.env.plotting"]], "luaction (class in pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.LUAction"]], "luobservation (class in pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.LUObservation"]], "luobservationmodel (class in pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.LUObservationModel"]], "lupolicymodel (class in pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.LUPolicyModel"]], "lurewardmodel (class in pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.LURewardModel"]], "lustate (class in pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.LUState"]], "lutransitionmodel (class in pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.LUTransitionModel"]], "loadunloadproblem (class in pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.LoadUnloadProblem"]], "argmax() (pomdp_py.problems.load_unload.load_unload.luobservationmodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LUObservationModel.argmax"]], "argmax() (pomdp_py.problems.load_unload.load_unload.lupolicymodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LUPolicyModel.argmax"]], "argmax() (pomdp_py.problems.load_unload.load_unload.lurewardmodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LURewardModel.argmax"]], "argmax() (pomdp_py.problems.load_unload.load_unload.lutransitionmodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LUTransitionModel.argmax"]], "generate_init_belief() (in module pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.generate_init_belief"]], "generate_random_state() (in module pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.generate_random_state"]], "get_all_actions() (pomdp_py.problems.load_unload.load_unload.lupolicymodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LUPolicyModel.get_all_actions"]], "main() (in module pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.main"]], "pomdp_py.problems.load_unload": [[12, "module-pomdp_py.problems.load_unload"]], "pomdp_py.problems.load_unload.load_unload": [[12, "module-pomdp_py.problems.load_unload.load_unload"]], "probability() (pomdp_py.problems.load_unload.load_unload.luobservationmodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LUObservationModel.probability"]], "probability() (pomdp_py.problems.load_unload.load_unload.lupolicymodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LUPolicyModel.probability"]], "probability() (pomdp_py.problems.load_unload.load_unload.lurewardmodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LURewardModel.probability"]], "probability() (pomdp_py.problems.load_unload.load_unload.lutransitionmodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LUTransitionModel.probability"]], "sample() (pomdp_py.problems.load_unload.load_unload.luobservationmodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LUObservationModel.sample"]], "sample() (pomdp_py.problems.load_unload.load_unload.lupolicymodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LUPolicyModel.sample"]], "sample() (pomdp_py.problems.load_unload.load_unload.lurewardmodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LURewardModel.sample"]], "sample() (pomdp_py.problems.load_unload.load_unload.lutransitionmodel method)": [[12, "pomdp_py.problems.load_unload.load_unload.LUTransitionModel.sample"]], "test_planner() (in module pomdp_py.problems.load_unload.load_unload)": [[12, "pomdp_py.problems.load_unload.load_unload.test_planner"]], "pomdp_py.problems.maze": [[13, "module-pomdp_py.problems.maze"]], "pomdp_py.problems.maze.models": [[16, "module-pomdp_py.problems.maze.models"]], "pomdp_py.problems.maze.models.components": [[17, "module-pomdp_py.problems.maze.models.components"]], "mosoopomdp (class in pomdp_py.problems.multi_object_search.problem)": [[18, "pomdp_py.problems.multi_object_search.problem.MosOOPOMDP"]], "belief_update() (in module pomdp_py.problems.multi_object_search.problem)": [[18, "pomdp_py.problems.multi_object_search.problem.belief_update"]], "pomdp_py.problems.multi_object_search": [[18, "module-pomdp_py.problems.multi_object_search"]], "pomdp_py.problems.multi_object_search.example_worlds": [[18, "module-pomdp_py.problems.multi_object_search.example_worlds"]], "pomdp_py.problems.multi_object_search.problem": [[18, "module-pomdp_py.problems.multi_object_search.problem"]], "random_world() (in module pomdp_py.problems.multi_object_search.example_worlds)": [[18, "pomdp_py.problems.multi_object_search.example_worlds.random_world"]], "solve() (in module pomdp_py.problems.multi_object_search.problem)": [[18, "pomdp_py.problems.multi_object_search.problem.solve"]], "unittest() (in module pomdp_py.problems.multi_object_search.problem)": [[18, "pomdp_py.problems.multi_object_search.problem.unittest"]], "action (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.Action"]], "bad (pomdp_py.problems.rocksample.rocksample_problem.rocktype attribute)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RockType.BAD"]], "checkaction (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.CheckAction"]], "east (pomdp_py.problems.rocksample.rocksample_problem.moveaction attribute)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.MoveAction.EAST"]], "good (pomdp_py.problems.rocksample.rocksample_problem.rocktype attribute)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RockType.GOOD"]], "moveaction (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.MoveAction"]], "north (pomdp_py.problems.rocksample.rocksample_problem.moveaction attribute)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.MoveAction.NORTH"]], "observation (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.Observation"]], "rsobservationmodel (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSObservationModel"]], "rspolicymodel (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel"]], "rsrewardmodel (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSRewardModel"]], "rstransitionmodel (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSTransitionModel"]], "rocksampleproblem (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem"]], "rocktype (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RockType"]], "south (pomdp_py.problems.rocksample.rocksample_problem.moveaction attribute)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.MoveAction.SOUTH"]], "sampleaction (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.SampleAction"]], "state (class in pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.State"]], "west (pomdp_py.problems.rocksample.rocksample_problem.moveaction attribute)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.MoveAction.WEST"]], "argmax() (pomdp_py.problems.rocksample.rocksample_problem.rsobservationmodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSObservationModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.rocksample_problem.rspolicymodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.rocksample_problem.rsrewardmodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSRewardModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.rocksample_problem.rstransitionmodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSTransitionModel.argmax"]], "create_instance() (in module pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.create_instance"]], "euclidean_dist() (in module pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.euclidean_dist"]], "generate_instance() (pomdp_py.problems.rocksample.rocksample_problem.rocksampleproblem static method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem.generate_instance"]], "get_all_actions() (pomdp_py.problems.rocksample.rocksample_problem.rspolicymodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel.get_all_actions"]], "in_exit_area() (pomdp_py.problems.rocksample.rocksample_problem.rocksampleproblem method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem.in_exit_area"]], "init_particles_belief() (in module pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.init_particles_belief"]], "invert() (pomdp_py.problems.rocksample.rocksample_problem.rocktype static method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RockType.invert"]], "main() (in module pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.main"]], "minimal_instance() (in module pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.minimal_instance"]], "pomdp_py.problems.rocksample": [[24, "module-pomdp_py.problems.rocksample"]], "pomdp_py.problems.rocksample.cythonize": [[24, "module-pomdp_py.problems.rocksample.cythonize"], [25, "module-pomdp_py.problems.rocksample.cythonize"]], "pomdp_py.problems.rocksample.rocksample_problem": [[24, "module-pomdp_py.problems.rocksample.rocksample_problem"]], "print_state() (pomdp_py.problems.rocksample.rocksample_problem.rocksampleproblem method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem.print_state"]], "probability() (pomdp_py.problems.rocksample.rocksample_problem.rsobservationmodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSObservationModel.probability"]], "probability() (pomdp_py.problems.rocksample.rocksample_problem.rspolicymodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel.probability"]], "probability() (pomdp_py.problems.rocksample.rocksample_problem.rsrewardmodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSRewardModel.probability"]], "probability() (pomdp_py.problems.rocksample.rocksample_problem.rstransitionmodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSTransitionModel.probability"]], "random() (pomdp_py.problems.rocksample.rocksample_problem.rocktype static method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RockType.random"]], "random_free_location() (pomdp_py.problems.rocksample.rocksample_problem.rocksampleproblem static method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RockSampleProblem.random_free_location"]], "rollout() (pomdp_py.problems.rocksample.rocksample_problem.rspolicymodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel.rollout"]], "sample() (pomdp_py.problems.rocksample.rocksample_problem.rsobservationmodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSObservationModel.sample"]], "sample() (pomdp_py.problems.rocksample.rocksample_problem.rspolicymodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSPolicyModel.sample"]], "sample() (pomdp_py.problems.rocksample.rocksample_problem.rsrewardmodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSRewardModel.sample"]], "sample() (pomdp_py.problems.rocksample.rocksample_problem.rstransitionmodel method)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.RSTransitionModel.sample"]], "test_planner() (in module pomdp_py.problems.rocksample.rocksample_problem)": [[24, "pomdp_py.problems.rocksample.rocksample_problem.test_planner"]], "bad (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocktype attribute)": [[25, "id138"], [25, "id40"], [25, "id89"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType.BAD"]], "checkaction (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id0"], [25, "id50"], [25, "id99"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.CheckAction"]], "east (pomdp_py.problems.rocksample.cythonize.rocksample_problem.moveaction attribute)": [[25, "id102"], [25, "id4"], [25, "id53"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction.EAST"]], "good (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocktype attribute)": [[25, "id139"], [25, "id41"], [25, "id90"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType.GOOD"]], "moveaction (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id101"], [25, "id3"], [25, "id52"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction"]], "north (pomdp_py.problems.rocksample.cythonize.rocksample_problem.moveaction attribute)": [[25, "id103"], [25, "id5"], [25, "id54"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction.NORTH"]], "rsaction (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id107"], [25, "id58"], [25, "id9"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSAction"]], "rsobservation (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id10"], [25, "id108"], [25, "id59"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservation"]], "rsobservationmodel (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id110"], [25, "id12"], [25, "id61"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservationModel"]], "rspolicymodel (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id114"], [25, "id16"], [25, "id65"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel"]], "rsrewardmodel (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id120"], [25, "id22"], [25, "id71"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSRewardModel"]], "rsstate (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id124"], [25, "id26"], [25, "id75"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState"]], "rstransitionmodel (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id128"], [25, "id30"], [25, "id79"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSTransitionModel"]], "rocksampleproblem (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id132"], [25, "id34"], [25, "id83"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem"]], "rocktype (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id137"], [25, "id39"], [25, "id88"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType"]], "south (pomdp_py.problems.rocksample.cythonize.rocksample_problem.moveaction attribute)": [[25, "id104"], [25, "id55"], [25, "id6"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction.SOUTH"]], "sampleaction (class in pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id142"], [25, "id44"], [25, "id93"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.SampleAction"]], "west (pomdp_py.problems.rocksample.cythonize.rocksample_problem.moveaction attribute)": [[25, "id105"], [25, "id56"], [25, "id7"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction.WEST"]], "argmax() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsobservationmodel method)": [[25, "id111"], [25, "id13"], [25, "id62"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservationModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rspolicymodel method)": [[25, "id115"], [25, "id17"], [25, "id66"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsrewardmodel method)": [[25, "id121"], [25, "id23"], [25, "id72"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSRewardModel.argmax"]], "argmax() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rstransitionmodel method)": [[25, "id129"], [25, "id31"], [25, "id80"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSTransitionModel.argmax"]], "euclidean_dist() (in module pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id143"], [25, "id45"], [25, "id94"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.euclidean_dist"]], "generate_instance() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocksampleproblem static method)": [[25, "id133"], [25, "id35"], [25, "id84"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem.generate_instance"]], "get_all_actions() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rspolicymodel method)": [[25, "id116"], [25, "id18"], [25, "id67"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel.get_all_actions"]], "in_exit_area() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocksampleproblem method)": [[25, "id134"], [25, "id36"], [25, "id85"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem.in_exit_area"]], "init_particles_belief() (in module pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id144"], [25, "id46"], [25, "id95"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.init_particles_belief"]], "invert() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocktype static method)": [[25, "id140"], [25, "id42"], [25, "id91"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType.invert"]], "main() (in module pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id145"], [25, "id47"], [25, "id96"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.main"]], "motion (pomdp_py.problems.rocksample.cythonize.rocksample_problem.moveaction attribute)": [[25, "id106"], [25, "id57"], [25, "id8"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.MoveAction.motion"]], "pomdp_py.problems.rocksample.cythonize.rocksample_problem": [[25, "module-0"], [25, "module-1"], [25, "module-2"], [25, "module-pomdp_py.problems.rocksample.cythonize.rocksample_problem"]], "position (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsstate attribute)": [[25, "id125"], [25, "id27"], [25, "id76"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState.position"]], "print_state() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocksampleproblem method)": [[25, "id135"], [25, "id37"], [25, "id86"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem.print_state"]], "probability() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsobservationmodel method)": [[25, "id112"], [25, "id14"], [25, "id63"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservationModel.probability"]], "probability() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rspolicymodel method)": [[25, "id117"], [25, "id19"], [25, "id68"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel.probability"]], "probability() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsrewardmodel method)": [[25, "id122"], [25, "id24"], [25, "id73"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSRewardModel.probability"]], "probability() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rstransitionmodel method)": [[25, "id130"], [25, "id32"], [25, "id81"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSTransitionModel.probability"]], "quality (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsobservation attribute)": [[25, "id109"], [25, "id11"], [25, "id60"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservation.quality"]], "random() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocktype static method)": [[25, "id141"], [25, "id43"], [25, "id92"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockType.random"]], "random_free_location() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rocksampleproblem static method)": [[25, "id136"], [25, "id38"], [25, "id87"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RockSampleProblem.random_free_location"]], "rock_id (pomdp_py.problems.rocksample.cythonize.rocksample_problem.checkaction attribute)": [[25, "id100"], [25, "id2"], [25, "id51"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.CheckAction.rock_id"]], "rocktypes (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsstate attribute)": [[25, "id126"], [25, "id28"], [25, "id77"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState.rocktypes"]], "rollout() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rspolicymodel method)": [[25, "id118"], [25, "id20"], [25, "id69"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel.rollout"]], "sample() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsobservationmodel method)": [[25, "id113"], [25, "id15"], [25, "id64"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSObservationModel.sample"]], "sample() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rspolicymodel method)": [[25, "id119"], [25, "id21"], [25, "id70"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSPolicyModel.sample"]], "sample() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsrewardmodel method)": [[25, "id123"], [25, "id25"], [25, "id74"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSRewardModel.sample"]], "sample() (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rstransitionmodel method)": [[25, "id131"], [25, "id33"], [25, "id82"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSTransitionModel.sample"]], "terminal (pomdp_py.problems.rocksample.cythonize.rocksample_problem.rsstate attribute)": [[25, "id127"], [25, "id29"], [25, "id78"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.RSState.terminal"]], "test_planner() (in module pomdp_py.problems.rocksample.cythonize.rocksample_problem)": [[25, "id146"], [25, "id48"], [25, "id97"], [25, "pomdp_py.problems.rocksample.cythonize.rocksample_problem.test_planner"]], "actions (pomdp_py.problems.tiger.tiger_problem.policymodel attribute)": [[32, "pomdp_py.problems.tiger.tiger_problem.PolicyModel.ACTIONS"]], "observationmodel (class in pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.ObservationModel"]], "policymodel (class in pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.PolicyModel"]], "rewardmodel (class in pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.RewardModel"]], "tigeraction (class in pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.TigerAction"]], "tigerobservation (class in pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.TigerObservation"]], "tigerproblem (class in pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.TigerProblem"]], "tigerstate (class in pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.TigerState"]], "transitionmodel (class in pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.TransitionModel"]], "create() (pomdp_py.problems.tiger.tiger_problem.tigerproblem static method)": [[32, "pomdp_py.problems.tiger.tiger_problem.TigerProblem.create"]], "get_all_actions() (pomdp_py.problems.tiger.tiger_problem.policymodel method)": [[32, "pomdp_py.problems.tiger.tiger_problem.PolicyModel.get_all_actions"]], "get_all_observations() (pomdp_py.problems.tiger.tiger_problem.observationmodel method)": [[32, "pomdp_py.problems.tiger.tiger_problem.ObservationModel.get_all_observations"]], "get_all_states() (pomdp_py.problems.tiger.tiger_problem.transitionmodel method)": [[32, "pomdp_py.problems.tiger.tiger_problem.TransitionModel.get_all_states"]], "main() (in module pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.main"]], "make_tiger() (in module pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.make_tiger"]], "other() (pomdp_py.problems.tiger.tiger_problem.tigerstate method)": [[32, "pomdp_py.problems.tiger.tiger_problem.TigerState.other"]], "pomdp_py.problems.tiger": [[32, "module-pomdp_py.problems.tiger"]], "pomdp_py.problems.tiger.cythonize": [[32, "module-pomdp_py.problems.tiger.cythonize"], [33, "module-pomdp_py.problems.tiger.cythonize"]], "pomdp_py.problems.tiger.tiger_problem": [[32, "module-pomdp_py.problems.tiger.tiger_problem"]], "probability() (pomdp_py.problems.tiger.tiger_problem.observationmodel method)": [[32, "pomdp_py.problems.tiger.tiger_problem.ObservationModel.probability"]], "probability() (pomdp_py.problems.tiger.tiger_problem.transitionmodel method)": [[32, "pomdp_py.problems.tiger.tiger_problem.TransitionModel.probability"]], "rollout() (pomdp_py.problems.tiger.tiger_problem.policymodel method)": [[32, "pomdp_py.problems.tiger.tiger_problem.PolicyModel.rollout"]], "sample() (pomdp_py.problems.tiger.tiger_problem.observationmodel method)": [[32, "pomdp_py.problems.tiger.tiger_problem.ObservationModel.sample"]], "sample() (pomdp_py.problems.tiger.tiger_problem.policymodel method)": [[32, "pomdp_py.problems.tiger.tiger_problem.PolicyModel.sample"]], "sample() (pomdp_py.problems.tiger.tiger_problem.rewardmodel method)": [[32, "pomdp_py.problems.tiger.tiger_problem.RewardModel.sample"]], "sample() (pomdp_py.problems.tiger.tiger_problem.transitionmodel method)": [[32, "pomdp_py.problems.tiger.tiger_problem.TransitionModel.sample"]], "test_planner() (in module pomdp_py.problems.tiger.tiger_problem)": [[32, "pomdp_py.problems.tiger.tiger_problem.test_planner"]], "actions (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerproblem attribute)": [[33, "id17"], [33, "id56"], [33, "id95"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem.ACTIONS"]], "observations (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerproblem attribute)": [[33, "id18"], [33, "id57"], [33, "id96"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem.OBSERVATIONS"]], "states (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerproblem attribute)": [[33, "id19"], [33, "id58"], [33, "id97"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem.STATES"]], "tigeraction (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id0"], [33, "id41"], [33, "id80"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerAction"]], "tigerobservation (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id3"], [33, "id42"], [33, "id81"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservation"]], "tigerobservationmodel (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id44"], [33, "id5"], [33, "id83"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel"]], "tigerpolicymodel (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id11"], [33, "id50"], [33, "id89"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel"]], "tigerproblem (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id16"], [33, "id55"], [33, "id94"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerProblem"]], "tigerrewardmodel (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id20"], [33, "id59"], [33, "id98"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel"]], "tigerstate (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id103"], [33, "id25"], [33, "id64"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerState"]], "tigertransitionmodel (class in pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id105"], [33, "id27"], [33, "id66"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel"]], "argmax() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservationmodel method)": [[33, "id45"], [33, "id6"], [33, "id84"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel.argmax"]], "argmax() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerpolicymodel method)": [[33, "id12"], [33, "id51"], [33, "id90"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel.argmax"]], "argmax() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerrewardmodel method)": [[33, "id21"], [33, "id60"], [33, "id99"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel.argmax"]], "argmax() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigertransitionmodel method)": [[33, "id106"], [33, "id28"], [33, "id67"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel.argmax"]], "build_actions() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id111"], [33, "id33"], [33, "id72"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.build_actions"]], "build_observations() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id112"], [33, "id34"], [33, "id73"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.build_observations"]], "build_setting() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id113"], [33, "id35"], [33, "id74"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.build_setting"]], "build_states() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id114"], [33, "id36"], [33, "id75"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.build_states"]], "get_all_actions() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerpolicymodel method)": [[33, "id13"], [33, "id52"], [33, "id91"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel.get_all_actions"]], "get_all_observations() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservationmodel method)": [[33, "id46"], [33, "id7"], [33, "id85"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel.get_all_observations"]], "get_all_states() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigertransitionmodel method)": [[33, "id107"], [33, "id29"], [33, "id68"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel.get_all_states"]], "get_distribution() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservationmodel method)": [[33, "id47"], [33, "id8"], [33, "id86"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel.get_distribution"]], "get_distribution() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerrewardmodel method)": [[33, "id100"], [33, "id22"], [33, "id61"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel.get_distribution"]], "get_distribution() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigertransitionmodel method)": [[33, "id108"], [33, "id30"], [33, "id69"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel.get_distribution"]], "main() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id115"], [33, "id37"], [33, "id76"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.main"]], "name (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservation attribute)": [[33, "id4"], [33, "id43"], [33, "id82"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservation.name"]], "name (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerstate attribute)": [[33, "id104"], [33, "id26"], [33, "id65"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerState.name"]], "pomdp_py.problems.tiger.cythonize.tiger_problem": [[33, "module-0"], [33, "module-1"], [33, "module-2"], [33, "module-pomdp_py.problems.tiger.cythonize.tiger_problem"]], "probability() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservationmodel method)": [[33, "id48"], [33, "id87"], [33, "id9"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel.probability"]], "probability() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerpolicymodel method)": [[33, "id14"], [33, "id53"], [33, "id92"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel.probability"]], "probability() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerrewardmodel method)": [[33, "id101"], [33, "id23"], [33, "id62"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel.probability"]], "probability() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigertransitionmodel method)": [[33, "id109"], [33, "id31"], [33, "id70"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel.probability"]], "sample() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerobservationmodel method)": [[33, "id10"], [33, "id49"], [33, "id88"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerObservationModel.sample"]], "sample() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerpolicymodel method)": [[33, "id15"], [33, "id54"], [33, "id93"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerPolicyModel.sample"]], "sample() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigerrewardmodel method)": [[33, "id102"], [33, "id24"], [33, "id63"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerRewardModel.sample"]], "sample() (pomdp_py.problems.tiger.cythonize.tiger_problem.tigertransitionmodel method)": [[33, "id110"], [33, "id32"], [33, "id71"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.TigerTransitionModel.sample"]], "test_planner() (in module pomdp_py.problems.tiger.cythonize.tiger_problem)": [[33, "id116"], [33, "id38"], [33, "id77"], [33, "pomdp_py.problems.tiger.cythonize.tiger_problem.test_planner"]], "blue (pomdp_py.utils.typ.bcolors attribute)": [[37, "pomdp_py.utils.typ.bcolors.BLUE"]], "bold (pomdp_py.utils.typ.bcolors attribute)": [[37, "pomdp_py.utils.typ.bcolors.BOLD"]], "cyan (pomdp_py.utils.typ.bcolors attribute)": [[37, "pomdp_py.utils.typ.bcolors.CYAN"]], "detobservationmodel (class in pomdp_py.utils.templates)": [[37, "pomdp_py.utils.templates.DetObservationModel"]], "detrewardmodel (class in pomdp_py.utils.templates)": [[37, "pomdp_py.utils.templates.DetRewardModel"]], "dettransitionmodel (class in pomdp_py.utils.templates)": [[37, "pomdp_py.utils.templates.DetTransitionModel"]], "endc (pomdp_py.utils.typ.bcolors attribute)": [[37, "pomdp_py.utils.typ.bcolors.ENDC"]], "green (pomdp_py.utils.typ.bcolors attribute)": [[37, "pomdp_py.utils.typ.bcolors.GREEN"]], "magenta (pomdp_py.utils.typ.bcolors attribute)": [[37, "pomdp_py.utils.typ.bcolors.MAGENTA"]], "red (pomdp_py.utils.typ.bcolors attribute)": [[37, "pomdp_py.utils.typ.bcolors.RED"]], "r_between() (in module pomdp_py.utils.math)": [[37, "pomdp_py.utils.math.R_between"]], "r_x() (in module pomdp_py.utils.math)": [[37, "pomdp_py.utils.math.R_x"]], "r_y() (in module pomdp_py.utils.math)": [[37, "pomdp_py.utils.math.R_y"]], "r_z() (in module pomdp_py.utils.math)": [[37, "pomdp_py.utils.math.R_z"]], "subscript (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.SUBSCRIPT"]], "simpleaction (class in pomdp_py.utils.templates)": [[37, "pomdp_py.utils.templates.SimpleAction"]], "simpleobservation (class in pomdp_py.utils.templates)": [[37, "pomdp_py.utils.templates.SimpleObservation"]], "simplestate (class in pomdp_py.utils.templates)": [[37, "pomdp_py.utils.templates.SimpleState"]], "t() (in module pomdp_py.utils.math)": [[37, "pomdp_py.utils.math.T"]], "tabularobservationmodel (class in pomdp_py.utils.templates)": [[37, "pomdp_py.utils.templates.TabularObservationModel"]], "tabularrewardmodel (class in pomdp_py.utils.templates)": [[37, "pomdp_py.utils.templates.TabularRewardModel"]], "tabulartransitionmodel (class in pomdp_py.utils.templates)": [[37, "pomdp_py.utils.templates.TabularTransitionModel"]], "treedebugger (class in pomdp_py.utils.debugging)": [[37, "pomdp_py.utils.debugging.TreeDebugger"]], "uniformpolicymodel (class in pomdp_py.utils.templates)": [[37, "pomdp_py.utils.templates.UniformPolicyModel"]], "white (pomdp_py.utils.typ.bcolors attribute)": [[37, "pomdp_py.utils.typ.bcolors.WHITE"]], "yellow (pomdp_py.utils.typ.bcolors attribute)": [[37, "pomdp_py.utils.typ.bcolors.YELLOW"]], "approx_equal() (in module pomdp_py.utils.math)": [[37, "pomdp_py.utils.math.approx_equal"]], "argmax() (pomdp_py.utils.templates.detrewardmodel method)": [[37, "pomdp_py.utils.templates.DetRewardModel.argmax"]], "b (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.b"]], "back() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.back"]], "bcolors (class in pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.bcolors"]], "bestseq (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.bestseq"]], "bestseqd() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.bestseqd"]], "blue() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.blue"]], "bold() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.bold"]], "bottomleft (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.bottomleft"]], "bottomright (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.bottomright"]], "bottomt (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.bottomt"]], "c (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.c"]], "clear (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.clear"]], "cyan() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.cyan"]], "d (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.d"]], "depth (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.depth"]], "det_dict_hash() (in module pomdp_py.utils.cython_utils)": [[37, "pomdp_py.utils.cython_utils.det_dict_hash"]], "disable() (pomdp_py.utils.typ.bcolors static method)": [[37, "pomdp_py.utils.typ.bcolors.disable"]], "down (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.down"]], "error() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.error"]], "euclidean_dist() (in module pomdp_py.utils.math)": [[37, "pomdp_py.utils.math.euclidean_dist"]], "get_all_actions() (pomdp_py.utils.templates.uniformpolicymodel method)": [[37, "pomdp_py.utils.templates.UniformPolicyModel.get_all_actions"]], "get_all_observations() (pomdp_py.utils.templates.tabularobservationmodel method)": [[37, "pomdp_py.utils.templates.TabularObservationModel.get_all_observations"]], "get_all_states() (pomdp_py.utils.templates.tabulartransitionmodel method)": [[37, "pomdp_py.utils.templates.TabularTransitionModel.get_all_states"]], "green() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.green"]], "hex_to_rgb() (in module pomdp_py.utils.colors)": [[37, "pomdp_py.utils.colors.hex_to_rgb"]], "hline (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.hline"]], "info() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.info"]], "interpret_color() (in module pomdp_py.utils.debugging)": [[37, "pomdp_py.utils.debugging.interpret_color"]], "intersect (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.intersect"]], "inverse_color_hex() (in module pomdp_py.utils.colors)": [[37, "pomdp_py.utils.colors.inverse_color_hex"]], "inverse_color_rgb() (in module pomdp_py.utils.colors)": [[37, "pomdp_py.utils.colors.inverse_color_rgb"]], "json_safe() (in module pomdp_py.utils.misc)": [[37, "pomdp_py.utils.misc.json_safe"]], "l() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.l"]], "layer() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.layer"]], "leaf (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.leaf"]], "left (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.left"]], "leftt (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.leftt"]], "lighter() (in module pomdp_py.utils.colors)": [[37, "pomdp_py.utils.colors.lighter"]], "longbottomleft (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.longbottomleft"]], "longbottomright (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.longbottomright"]], "longleft (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.longleft"]], "longright (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.longright"]], "longtopleft (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.longtopleft"]], "longtopright (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.longtopright"]], "magenta() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.magenta"]], "mark() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.mark"]], "mark_path() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.mark_path"]], "mark_sequence() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.mark_sequence"]], "markp() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.markp"]], "mbp (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.mbp"]], "nl (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.nl"]], "nn (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.nn"]], "note() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.note"]], "nq (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.nq"]], "num_layers (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.num_layers"]], "num_nodes() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.num_nodes"]], "nv (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.nv"]], "p() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.p"]], "path() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.path"]], "path_to() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.path_to"]], "pm (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.pm"]], "pomdp_py.utils": [[37, "module-pomdp_py.utils"]], "pomdp_py.utils.colors": [[37, "module-pomdp_py.utils.colors"]], "pomdp_py.utils.cython_utils": [[37, "module-pomdp_py.utils.cython_utils"]], "pomdp_py.utils.debugging": [[37, "module-pomdp_py.utils.debugging"]], "pomdp_py.utils.math": [[37, "module-pomdp_py.utils.math"]], "pomdp_py.utils.misc": [[37, "module-pomdp_py.utils.misc"]], "pomdp_py.utils.templates": [[37, "module-pomdp_py.utils.templates"]], "pomdp_py.utils.typ": [[37, "module-pomdp_py.utils.typ"]], "pp (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.pp"]], "preferred_actions() (pomdp_py.utils.debugging.treedebugger static method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.preferred_actions"]], "probability() (pomdp_py.utils.templates.detobservationmodel method)": [[37, "pomdp_py.utils.templates.DetObservationModel.probability"]], "probability() (pomdp_py.utils.templates.dettransitionmodel method)": [[37, "pomdp_py.utils.templates.DetTransitionModel.probability"]], "probability() (pomdp_py.utils.templates.tabularobservationmodel method)": [[37, "pomdp_py.utils.templates.TabularObservationModel.probability"]], "probability() (pomdp_py.utils.templates.tabulartransitionmodel method)": [[37, "pomdp_py.utils.templates.TabularTransitionModel.probability"]], "proj() (in module pomdp_py.utils.math)": [[37, "pomdp_py.utils.math.proj"]], "r (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.r"]], "random_unique_color() (in module pomdp_py.utils.colors)": [[37, "pomdp_py.utils.colors.random_unique_color"]], "red() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.red"]], "remap() (in module pomdp_py.utils.misc)": [[37, "pomdp_py.utils.misc.remap"]], "reward_func() (pomdp_py.utils.templates.detrewardmodel method)": [[37, "pomdp_py.utils.templates.DetRewardModel.reward_func"]], "rgb_to_hex() (in module pomdp_py.utils.colors)": [[37, "pomdp_py.utils.colors.rgb_to_hex"]], "right (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.right"]], "rightt (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.rightt"]], "rollout() (pomdp_py.utils.templates.uniformpolicymodel method)": [[37, "pomdp_py.utils.templates.UniformPolicyModel.rollout"]], "root (pomdp_py.utils.debugging.treedebugger property)": [[37, "pomdp_py.utils.debugging.TreeDebugger.root"]], "s() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.s"]], "s() (pomdp_py.utils.typ.bcolors static method)": [[37, "pomdp_py.utils.typ.bcolors.s"]], "safe_slice() (in module pomdp_py.utils.misc)": [[37, "pomdp_py.utils.misc.safe_slice"]], "sample() (pomdp_py.utils.templates.detobservationmodel method)": [[37, "pomdp_py.utils.templates.DetObservationModel.sample"]], "sample() (pomdp_py.utils.templates.detrewardmodel method)": [[37, "pomdp_py.utils.templates.DetRewardModel.sample"]], "sample() (pomdp_py.utils.templates.dettransitionmodel method)": [[37, "pomdp_py.utils.templates.DetTransitionModel.sample"]], "sample() (pomdp_py.utils.templates.tabularobservationmodel method)": [[37, "pomdp_py.utils.templates.TabularObservationModel.sample"]], "sample() (pomdp_py.utils.templates.tabularrewardmodel method)": [[37, "pomdp_py.utils.templates.TabularRewardModel.sample"]], "sample() (pomdp_py.utils.templates.tabulartransitionmodel method)": [[37, "pomdp_py.utils.templates.TabularTransitionModel.sample"]], "sample() (pomdp_py.utils.templates.uniformpolicymodel method)": [[37, "pomdp_py.utils.templates.UniformPolicyModel.sample"]], "shadebar (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.shadebar"]], "similar() (in module pomdp_py.utils.misc)": [[37, "pomdp_py.utils.misc.similar"]], "single_node_str() (pomdp_py.utils.debugging.treedebugger static method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.single_node_str"]], "sorted_by_str() (in module pomdp_py.utils.debugging)": [[37, "pomdp_py.utils.debugging.sorted_by_str"]], "special_char (class in pomdp_py.utils.misc)": [[37, "pomdp_py.utils.misc.special_char"]], "step() (pomdp_py.utils.debugging.treedebugger method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.step"]], "success() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.success"]], "to_radians() (in module pomdp_py.utils.math)": [[37, "pomdp_py.utils.math.to_radians"]], "topleft (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.topleft"]], "topright (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.topright"]], "topt (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.topt"]], "tree_stats() (pomdp_py.utils.debugging.treedebugger static method)": [[37, "pomdp_py.utils.debugging.TreeDebugger.tree_stats"]], "up (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.up"]], "vec() (in module pomdp_py.utils.math)": [[37, "pomdp_py.utils.math.vec"]], "vline (pomdp_py.utils.misc.special_char attribute)": [[37, "pomdp_py.utils.misc.special_char.vline"]], "warning() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.warning"]], "white() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.white"]], "yellow() (in module pomdp_py.utils.typ)": [[37, "pomdp_py.utils.typ.yellow"]]}}) \ No newline at end of file