Skip to main content

POMDPPlanners

License: MIT Python 3.10+ Code style: black

POMDPPlanners is a set of reliable implementations of POMDP (Partially Observable Markov Decision Process) planning algorithms and environments in Python. It provides standardized simulation studies for research and production-quality planners for industrial applications — from classic benchmarks like Tiger and RockSample to photorealistic autonomous driving and robotic manipulation.

CARLA autonomous driving environment rendered by CarlaPOMDP's chase camera Isaac Sim Franka reach task rendered by IsaacLabPOMDP's viewport camera

Rendered by the package itself: the CARLA driving environment (left) and the Isaac Sim / IsaacLab Franka reach environment (right). Realistic environments are integrated from the open-source simulators CARLA and NVIDIA Isaac Lab — credit to their authors.

Main Features

Features POMDPPlanners
State-of-the-art online POMDP planners :heavy_check_mark:
Classic benchmarks & realistic simulator environments :heavy_check_mark:
Easy to define custom environments :heavy_check_mark:
Rich belief representations :heavy_check_mark:
GPU-vectorized planning & belief updates :heavy_check_mark:
Risk-sensitive (CVaR) & constrained planning :heavy_check_mark:
Parallel experiment framework with persistent caching :heavy_check_mark:
Hyperparameter tuning (Optuna) :heavy_check_mark:
Progress tracking & Slack notifications :heavy_check_mark:
Tutorial notebooks :heavy_check_mark:
Documentation :heavy_check_mark:
Comprehensive test suite & type hints :heavy_check_mark:

Documentation

Documentation is available online: https://yaacovpariente.github.io/POMDPPlanners/

Installation

Note: POMDPPlanners requires Python 3.10+.

# Clone the repository
git clone https://github.com/yaacovpariente/POMDPPlanners.git
cd POMDPPlanners

# Create and activate a virtual environment
python -m venv .venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate

# Install the package
pip install -e .

Example

Plan with POMCP on the classic Tiger problem in just a few lines:

from POMDPPlanners.environments.tiger_pomdp import TigerPOMDP
from POMDPPlanners.planners.mcts_planners.pomcp import POMCP
from POMDPPlanners.utils.belief_factory import create_environment_belief

env = TigerPOMDP(discount_factor=0.95)
planner = POMCP(environment=env, discount_factor=0.95, depth=20,
                exploration_constant=10.0, n_simulations=1000,
                name="POMCP")
belief = create_environment_belief(env, n_particles=200)

actions, _ = planner.action(belief)
print(f"Recommended action: {actions[0]}")

Running Experiments

The recommended entry point for end-to-end experiments is LocalSimulationsAPI, which runs parallel episodes, applies persistent caching, and returns aggregated statistics (mean return, CVaR, VaR, confidence intervals).

from POMDPPlanners.environments import ContinuousLightDarkPOMDPDiscreteActions
from POMDPPlanners.planners.mcts_planners.pomcpow import POMCPOW
from POMDPPlanners.planners.mcts_planners.pft_dpw import PFT_DPW
from POMDPPlanners.utils.action_samplers import DiscreteActionSampler
from POMDPPlanners.utils.belief_factory import create_environment_belief
from POMDPPlanners.simulations.simulation_apis.local_simulations_api import LocalSimulationsAPI
from POMDPPlanners.core.simulation import EnvironmentRunParams

env = ContinuousLightDarkPOMDPDiscreteActions(discount_factor=0.95)
sampler = DiscreteActionSampler(env.get_actions())

pomcpow = POMCPOW(environment=env, discount_factor=0.95, depth=10,
                  exploration_constant=10.0, k_o=2.0, k_a=2.0,
                  alpha_o=0.5, alpha_a=0.5, n_simulations=500,
                  action_sampler=sampler, name="POMCPOW")
pft_dpw = PFT_DPW(environment=env, discount_factor=0.95, depth=10,
                  exploration_constant=10.0, n_simulations=500,
                  action_sampler=sampler, name="PFT_DPW")
belief = create_environment_belief(env, n_particles=200)

api = LocalSimulationsAPI()
_, stats = api.run_multiple_environments_and_policies(
    environment_run_params=[EnvironmentRunParams(
        environment=env, belief=belief,
        policies=[pomcpow, pft_dpw], num_episodes=100, num_steps=30)],
    alpha=0.1, confidence_interval_level=0.95,
    experiment_name="LightDark_Evaluation",
)

For hyperparameter search, LocalSimulationsAPI.run_optimize_and_evaluate(...) accepts HyperParameterRunParams with Optuna search ranges and forwards the best configuration to evaluation automatically.

Long-running experiments can report progress to Slack and a local progress database, including detection of crashed or stalled runs — set SLACK_WEBHOOK_URL in your environment and notifications are picked up automatically. See NotificationConfig for details.

Tutorial Notebooks

Self-contained Jupyter notebooks with executable end-to-end examples live in docs/examples/:

Notebook What it covers
basic_usage.ipynb Environment setup, belief initialization, single-planner evaluation
planners_comparison.ipynb Side-by-side comparison of POMCP / POMCPOW / PFT-DPW on a shared environment
belief_representations.ipynb Particle, Gaussian, and Gaussian-mixture beliefs
hyperparameter_tuning.ipynb End-to-end Optuna search via run_optimize_and_evaluate
advanced_optimization.ipynb Multi-config tuning, custom search spaces
custom_environment.ipynb Implementing a new Environment subclass
tree_analysis_debugging.ipynb Inspecting and debugging search trees

Implemented Algorithms

Algorithm Description
POMCP Monte Carlo tree search with unweighted particle beliefs (Silver & Veness, 2010)
POMCP-DPW POMCP with double progressive widening for large action/observation spaces
POMCPOW Weighted-particle MCTS for continuous observation spaces (Sunberg & Kochenderfer, 2018)
PFT-DPW Particle filter tree with double progressive widening (Sunberg & Kochenderfer, 2018)
Sparse PFT Particle filter tree with sparse observation branching
Sparse Sampling Depth-limited sparse sampling of the belief MDP (Kearns et al., 2002)
BetaZero Neural-network-guided belief-state MCTS with learned policy and value
ConstrainedZero Safety-constrained variant of BetaZero
Constrained POMCPOW / Constrained PFT-DPW Cost-constrained online planning
iCVaR POMCPOW / iCVaR PFT-DPW / iCVaR Sparse Sampling Risk-averse planning with iterated CVaR objectives
VOPP Fully GPU-vectorized online POMDP planning (Hoerger et al., 2025)
Discrete Action Sequences Open-loop baseline planner

Implemented Environments

Environment Description
Tiger Classic information-gathering benchmark
Light-Dark Navigation under state-dependent observation noise (continuous & discrete variants)
RockSample Rover science mission with sensing trade-offs
LaserTag Pursuit with laser range-finder observations
PacMan Arcade-style pursuit-evasion with rendering
CartPole / MountainCar Partially observable versions of the Gym classics
Push Object manipulation under contact uncertainty
Safety-Ant-Velocity Safety-constrained quadruped locomotion
CARLA Photorealistic autonomous driving in the CARLA simulator
Isaac Lab Franka reach manipulation in NVIDIA Isaac Lab / Isaac Sim
nuPlan Autonomous driving planning on real-world driving logs
Sanity Minimal environment for quick sanity checks

Custom environments are first-class: subclass Environment, implement the transition, observation, and reward models, and every planner and the whole experiment framework work with it out of the box. See custom_environment.ipynb.

Belief Representations

Beliefs are pluggable and planner-independent: unweighted and weighted particle filters, batched particle beliefs, Gaussian and Gaussian-mixture beliefs, and GPU-vectorized particle belief updaters for large-scale simulation.

Citing the Project

If you use POMDPPlanners in your research, please cite:

@misc{pariente2026pomdpplannersopensourcepackagepomdp,
      title={POMDPPlanners: Open-Source Package for POMDP Planning}, 
      author={Yaacov Pariente and Vadim Indelman},
      year={2026},
      eprint={2602.20810},
      archivePrefix={arXiv},
      primaryClass={cs.AI},
      url={https://arxiv.org/abs/2602.20810}, 
}

Contributing & Support

Questions, bug reports, and feature requests are welcome on the issue tracker.

License

This project is licensed under the MIT License — see the LICENSE.md file for details.

Release files for POMDPPlanners 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for POMDPPlanners 0.5.0
File Size Uploaded
pomdpplanners-0.5.0.tar.gz 3.7 MB Details

Release files / pomdpplanners-0.5.0.tar.gz

Download URL pomdpplanners-0.5.0.tar.gz
Size 3.7 MB
Tags Source
SHA-256 checksum
How to use checksums
5ccd435410fad5524559a33999222b1964b993424cfe4803a40ac42940ab7dd2
BLAKE2b-256 checksum
How to use checksums
69728cc700886bc7dc54cac747a31533aafda1a47a1a5134db369a466f7b2b96
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Release history Release notifications | RSS feed

This release

0.5.0 This release

1 release file

0.4.0

1 release file

0.3.1

1 release file

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page