jupyddl workbench

A pure-Python PDDL planner β€” running for real, in this tab.

GitHub

Starting the Python runtime…

It runs entirely in your browser. Nothing is uploaded.

PDDL

Live search

0expanded
0generated
0frontier
0.00selapsed

Cost estimates

Frontier size

nodes waiting on the open list

Search wavefront

ring = depth Β· colour = h
low h (near the goal) high h (far away)

Result

Run a search to see the plan.

Experiment

every configuration runs against the same grounding
Instances
Planners
Heuristics
Budget per run

A run that hits its budget is marked truncated and does not count as unsolvable.

Nothing queued.

PDDL requirement support

Every PDDL requirement flag this planner recognises, and what it actually does with it. A rejected flag is refused at parse time with an explanation β€” it is never silently ignored, because a silently ignored requirement produces plans that are wrong rather than absent.

Requirement support matrix
Requirement PDDL Support What jupyddl does

Learned heuristics

A planner's heuristic is a learned function waiting to happen. Every solved instance is a labelled trajectory: the cost of a plan's suffix from any state on it is that state's cost-to-go. Fitting a network to those labels is imitation. But imitation optimises a proxy β€” what we actually want is the heuristic that makes search expand the fewest nodes, and that is not a differentiable function of the weights. Optimising it directly, with the planner as a black box, is where this becomes reinforcement learning.

Trained small, judged large

Greedy best-first search on held-out instances
Heuristic Coverage Nodes expanded Seconds Plan cost

Read that mean with care

The held-out set has a heavy tail. Most instances sit in a narrow band and one moves the average on its own β€” the instance imitation could not solve at all. Reporting only the mean would be close to reporting that one instance.

Per instance, imitation versus tuned
Instance Imitation After tuning

Where it loses, and why

What we got wrong

    Read further

    The full write-up β€” prior work, the MDP the RL stage corresponds to, why the obvious policy gradient is hard here, and a roadmap β€” lives in the repository.

    Train one yourself

    pip install "jupyddl[learn]"
    
    jupyddl learn blocksworld --sizes 3-6 --seeds-per-size 3 \
        --cem 10 --cem-sizes 9-12 --evaluate 9-13 -o bw.heur.json
    
    jupyddl solve domain.pddl problem.pddl -s gbfs -H learned:bw.heur.json

    Training runs on the standard library alone; the learn extra adds NumPy purely for speed. A learned heuristic is not admissible β€” nothing in the objective bounds it from above β€” so pair it with gbfs, or wastar for a bounded-suboptimality knob, never with an optimality claim.

    Generate an instance

    same seed, same bytes β€” every time

    Benchmarks need a difficulty ladder, not a single instance. These generators are seeded, so a published experiment can be reproduced exactly: the same kind, size and seed always produce byte-identical PDDL.

    domain.pddl

    β€”

    problem.pddl

    β€”