domino oracle: generator-faithful place sampler + InFront name precedence#43
Merged
Conversation
…me precedence Takes the open-loop oracle_process_planning demonstrator from 3/5 to 5/5 on pybullet_domino seed 0 (verified: 5/5, 0 solve/exec failures): - _place_sampler (domino/processes.py): rank-sum three signals (future-target bridge, planner grid-cell distance, planner angle error) over the generator-faithful candidate placements and pick the cascade-correct pose, instead of the bare grid cell -- which omits the generator's inward domino_width/2 corner offset and stalls corner cascades. - BilevelProcessPlanningApproach.__init__: drop any base predicate whose name a helper already provides before unioning, so the grid's derived InFront fully replaces the env's position-based InFront. A plain set union kept both (==-equal but different hashes) and abstract() evaluated the looser position one, enabling a physically-impossible single-block bridge to the target.
Collaborator
Author
|
Added a no-fix baseline to the results table above — same 50 tasks (10 × seeds 0–4), run on master |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two independent fixes to the open-loop
oracle_process_planningdemonstrator onpybullet_domino, taking it from 3/5 to 5/5 on seed 0. This is distinct from the agent_bilevel domino path fixed in #42 — it targets the oracle demonstrator's grid-process place sampler and predicate setup.1. Generator-faithful rank-sum place sampler —
ground_truth_models/domino/processes.py::_place_samplerThe sampler read the bare grid cell — a uniform lattice that omits the task generator's inward
domino_width/2corner offset, so a turn block landed on the same cell a straight block would and corner cascades stalled. It now enumerates the generator-faithful candidate placements (_generator_placements, which carry the corner offset) and rank-sums three signals — future-target bridge, planner grid-cell distance, planner angle error — to pick the cascade-correct pose deterministically (top-ranked on ≥2 of 3; falls back to the bare cell only if no candidate exists).2. Helper-predicate name precedence —
approaches/process_planning_approach.py::__init__The env's position-based
InFront(aPredicate) and the grid's derivedInFront(aDerivedPredicate) are==-equal but hash differently, so a plainhelpers | baseset union kept both;abstract()then evaluated the looser position-based one, hallucinating adjacencies (e.g. the start block "in front of" a staged movable 13 cm away) that let the planner build a physically-impossible single-block bridge to the target. Now drop any base predicate whose name a helper already provides before the union, so the derivedInFrontfully replaces the position-based one.Results
Open-loop
oracle_process_planning(bilevel_plan_without_sim) onpybullet_domino, 10 test tasks × seeds 0–4 — the same task set, run with vs. without these fixes (baseline = master95239a7, the parent of this change):Both runs have zero crashes or timeouts (
num_solve_failures = num_execution_failures = num_*_timeouts = 0for every seed) — every miss is a cascade that executed cleanly but fell short of toppling the target, so the fix converts 15 of those "policy failed to reach goal" cases into solves. The remaining 15 misses are the long tail (harder layouts where staging geometry overlaps the chain region / occasional Pick collisions), which needs a task-generator change beyond this PR.yapf · isort (5.10.1) · docformatter · mypy (1.8.0) · pylint all pass.