PDDL
Live search
Cost estimates
Frontier size
nodes waiting on the open listSearch wavefront
ring = depth Β· colour = hResult
Experiment
every configuration runs against the same groundingResults
click a column heading to sort| Instance | Configuration | Solved | Cost | Length | Expanded | Generated | Evaluated | Runtime (ms) |
|---|
Total nodes expanded per configuration log scale
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 | 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
| 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.
| 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 timeBenchmarks 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
β