@@ -39,13 +39,13 @@ is trivial to install, embed, teach with, and build on.
3939
4040</div >
4141
42- ## Features 🌱
42+ ## Features
4343
4444- 🧩 ** Hand-written PDDL parser** and grounder covering ** STRIPS, full ADL,
4545 derived predicates, numeric fluents, durative actions, trajectory
4646 constraints, preferences, timed initial literals and object fluents** — 20 of
4747 the 21 requirement flags, with the last one refused by name rather than
48- ignored. ([ the full matrix] ( #pddl-support- ) )
48+ ignored. ([ the full matrix] ( #pddl-support ) )
4949- 🔎 ** 14 planners** : BFS, DFS, Iterative Deepening, Dijkstra, Greedy Best-First,
5050 A* , Weighted A* , IDA* , Enforced Hill Climbing, hill climbing, beam search,
5151 Iterated Width, branch and bound, and anytime weighted A* .
@@ -55,7 +55,7 @@ is trivial to install, embed, teach with, and build on.
5555 against the number of nodes search expands rather than against ` h* ` . On
5656 blocksworld this beats ` h_ff ` by ~ 4× in expansions and ~ 15× on the clock, at
5757 instance sizes three times larger than it trained on.
58- ([ how, and when it fails] ( #learned-heuristics- ) )
58+ ([ how, and when it fails] ( #learned-heuristics ) )
5959- ⏱️ ** Search budgets** on every planner: bound a run by nodes or by seconds and
6060 a truncated result says so, so "we stopped looking" never masquerades as
6161 "no plan exists".
@@ -73,7 +73,7 @@ is trivial to install, embed, teach with, and build on.
7373 simple registries; add your own in a few lines.
7474- ✅ ** Zero runtime dependencies** and a comprehensive test suite.
7575
76- ## Install 💾
76+ ## Install
7777
7878Requires Python ≥ 3.10, and nothing else:
7979
@@ -101,7 +101,7 @@ the matplotlib charts; `learn` is only for speed — `jupyddl.learn` trains and
101101evaluates on the standard library alone, NumPy just makes it one to two orders
102102of magnitude faster.
103103
104- ## Command line ⚔️
104+ ## Command line
105105
106106``` bash
107107# Solve a single instance
@@ -156,7 +156,7 @@ jupyddl · astar/lmcut · gripper-6 (28 facts, 52 ground actions)
156156 ✔ solved · cost 17 · 17 actions · 1.77s
157157```
158158
159- ## Library usage 📑
159+ ## Library usage
160160
161161``` python
162162from jupyddl import solve, build_task, solve_task, trace_search, validate_plan
@@ -248,7 +248,7 @@ task = build_task("demos/gripper/domain.pddl", "demos/gripper/problem.pddl")
248248solve_task(task, " gbfs" , " hff" , observer = StallDetector())
249249```
250250
251- ## The browser workbench 🌐
251+ ## The browser workbench
252252
253253** [ openplan-labs.github.io/PythonPDDL] ( https://openplan-labs.github.io/PythonPDDL/ ) **
254254
@@ -295,7 +295,7 @@ python -m http.server -d web 8000 # then open http://localhost:8000
295295` web/dist ` is committed so the page works from a plain clone; CI fails if it
296296drifts out of step with the sources.
297297
298- ## Generating instances 🎲
298+ ## Generating instances
299299
300300A benchmark needs a difficulty ladder, and hand-writing one is tedious. The
301301generators are seeded, so a published experiment can be reproduced exactly —
@@ -323,7 +323,7 @@ ladder = [write_instance("gripper", "instances/", size=n, seed=1)
323323purely random operators are almost always unsolvable, which makes for a useless
324324benchmark. The test suite grounds and solves everything each generator emits.
325325
326- ## Learned heuristics 🧠
326+ ## Learned heuristics
327327
328328Every solved instance is a labelled trajectory: the cost of a plan's suffix from
329329any state on it is that state's cost-to-go. ` jupyddl learn ` turns a corpus of
@@ -377,7 +377,7 @@ jupyddl[learn]` adds NumPy purely for speed. A learned heuristic is **not
377377admissible** — nothing in the objective bounds it from above — so pair it with
378378` gbfs ` , or ` wastar ` if you want a bounded-suboptimality knob.
379379
380- ## Soft goals and trajectory constraints 🎯
380+ ## Soft goals and trajectory constraints
381381
382382Preferences say what you would * rather* were true; constraints say what must
383383hold along the whole trajectory. Both compile away before the search runs.
@@ -408,7 +408,7 @@ and `sometime-before` use monitor facts the planner sets when it can;
408408effects, because a constraint the planner could satisfy by not looking would not
409409be a constraint.
410410
411- ## Benchmarking 📈
411+ ## Benchmarking
412412
413413``` bash
414414jupyddl benchmark demos --planners astar,gbfs,ehc,bfs --heuristic hff \
@@ -424,7 +424,7 @@ jupyddl benchmark demos --planners astar,gbfs,ehc,bfs --heuristic hff \
424424
425425</div >
426426
427- ## Demo instances 🧪
427+ ## Demo instances
428428
429429` demos/ ` holds thirteen instances chosen to stress different parts of the framework —
430430and to make the difference between planners obvious:
@@ -477,7 +477,7 @@ plain A*, so its last plan is optimal if the run completes **and** the
477477heuristic is admissible. ` hc ` , ` beam ` and ` iw ` trade completeness for speed, and ` iw ` needs
478478no heuristic at all — it prunes by * novelty* instead.
479479
480- ## PDDL support 🧾
480+ ## PDDL support
481481
482482** 20 of the 21 requirement flags are supported.**
4834836 are modelled natively, 7 are compiled into the core
@@ -530,7 +530,7 @@ found. Fixing that properly needs a mutex-aware temporal scheduler
530530(POPF-style), not another source-to-source compilation — it is the one gap here
531531that is a project rather than a patch.
532532
533- ## Architecture 🏗️
533+ ## Architecture
534534
535535```
536536jupyddl/
@@ -572,7 +572,7 @@ one operator per disjunct. That is why the search only ever sees conjunctive
572572preconditions, and why a domain full of ` or ` still runs through the same
573573best-first engine as plain STRIPS.
574574
575- ## Development 🛠️
575+ ## Development
576576
577577``` bash
578578git submodule update --init # fetch the pddl-examples used by the tests
@@ -593,7 +593,7 @@ python tools/make_promo.py -o promo/jupyddl-promo.mp4 \
593593Every number in the promo video is measured at render time by running the real
594594planners — nothing in it is typed in by hand.
595595
596- ## Cite 📰
596+ ## Cite
597597
598598```
599599@misc{https://doi.org/10.13140/rg.2.2.22418.89282,
@@ -605,7 +605,7 @@ planners — nothing in it is typed in by hand.
605605}
606606```
607607
608- ## Maintainers Ⓜ️
608+ ## Maintainers
609609
610610- Erwin Lejeune
611611- Sampreet Sarkar
0 commit comments