Skip to content

Add runnable tensegrity simulation demos (MuJoCo, PyBullet, PyChrono, Newton, DiffPD, PolyFEM+IPC) + 3D animated renders + Edison survey + regime-aware sweeps + PLA/TPU 85A printable-design model + BO integration bridge + PR #35 Sobol T3-prism sweep ac...#33

Open
sgbaird-alt with Copilot wants to merge 47 commits into
mainfrom
copilot/explore-simulations-for-tensegrity
Open

Conversation

Copilot AI commented May 8, 2026

Copy link
Copy Markdown
Contributor
  • Fetch Edison sim survey + drive both regimes
  • PLA strut + TPU 85A printable-design model + class-1 check + sweep
  • Newton (Warp) mid-fidelity drop with tendons in load path
  • DiffPD source build + cube drop (Edison Rec B)
  • PolyFEM source build + cube drop (Edison Rec A)
  • 3D animated GIF/MP4 renders (mujoco) with strain-coloured tendons
  • T-prism mesher (simulations/tprism_mesh.py): 3 PLA struts + 9 TPU 85A tendons fused via gmsh OCC fragment
  • simulations/polyfem_drop.py --geometry tprism JSON builder + CLI dispatch
  • PolyFEM rebuild (~25 min) and run prism drop end-to-end (124bba2)
  • Address PR #4427965775 / #4462016260 — crutch + NASA still going beyond floor
    • Drop the SUPERball-style "payload suspended inside cage" architecture (oscillated wildly with TPU-85A stiffness, prism flipped through floor on impact)
    • Distribute viz payload mass across the 3 struts (axial-load model — matches the working 1m baseline drop and matches a real crutch tip loaded through the strut tip)
    • Stiffen floor + strut contact (solref="0.002 1", solimp="0.98 0.999 0.0001")
    • Cap viz payload to what the cell can statically cradle (≤5% cable stretch); crutch viz now 0.5 kg (actual 75 kg labelled in title), NASA stays at 5 kg
    • Verified: min strut-bottom-z ≈ −1.3 mm (crutch) / −2.7 mm (lander) — invisible at cell scale (was −28 mm / −22 mm before)
  • Address PR comment 4462510090 — switch strut material PETG → PLA per Edison query on strut material (PLA vs PETG vs HF/CF) — fetched + interpreted #45 across simulation constants, comments, and READMEs (printable_design.py primary PLA Material with PETG kept as a backward-compat alias; tprism_mesh.py physical-volume group renamed PETG_strutPLA_strut; polyfem_drop.py NeoHookean kwargs renamed *_petg**_pla* with PLA defaults E=3.5 GPa, ν=0.36, ρ=1240; updates in newton_drop.py, printable_sweep.py, render_regimes.py, regimes.py, simulations/README.md)
  • Address comment 4500576843 — Edison LITERATURE_HIGH task 78fb09a2 modeling-feedback contacts brief committed at edison-trajectories/modeling-feedback-contacts/ (6dae17f)
  • Address comment 4500578897simulations/validation_experiments.md: 10-row bench-test table mapping each Instron/drop-tower experiment to a specific simulation output, plus a 3-test minimum-viable validation budget for the T3 prints we already have (Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35)
  • Address comment 4500584002simulations/bo_integration.md + simulations/bo_evaluator.py: drop-in replacement for PR Scaffold Bayesian-optimization script with honegumi + customized tensegrity campaign #30 simulate_specimen that maps Ax parameterization → PrintableDesign → overridden Regimerun_regimes.simulate(...){F_peak_N, SEA_J_per_g, eta}; forward-compatible fidelity={"C","B","A"} signature for the three-tier ladder (MuJoCo / Newton / PolyFEM+IPC) from Edison sim survey 782657e0
  • Address comment 4500844340bo_evaluator._t3_seed_designs() returns the three PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 T3-prism prints (scale 1.0× / 1.5× / soft-tendon variant) as Ax-compatible dicts so the BO loop's first batch reflects parts already on the bench; other PR Scaffold Bayesian-optimization script with honegumi + customized tensegrity campaign #30 topologies (truncated-octa, simplex-4-strut, stacked-prism) emit a warning and fall back to T3 physics until the generic mesher lands
  • Address comment 4663414812 — simulation cost, PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 BO integration, and Edison analysis query
  • Address comment 4664686033 — tier B/A fidelity clarification + multi-task BO recommendation: new ## Multi-task treatment of the regimes section in simulations/bo_integration.md recommends a multi-task GP (MTBO) that carries the regime as a task and shares information across the crutch/lander campaigns (replacing the prior one-campaign-per-regime suggestion), with the Ax Specified_Task_ST_MTGP_trans / BOTORCH_MODULAR wiring from the Honegumi multitask tutorial, the mean-collapse caveat from the Honegumi concept page, a note that fidelity (C/B/A) generalizes as a second task axis, and updated open-questions
  • Address comment 4686442352 — re-ran every simulation type from a fresh environment and committed the refreshed simulations/outputs/
    • MuJoCo tier-C: mujoco_drop (37.2 g), mujoco_sweep, run_regimes (crutch k*=5798/16.3 g, lander k*=400/103.9 g), printable_sweep, benchmark_costs (~107 ms/design on this runner's AMD EPYC 9V74)
    • PyBullet drop (peak KE 0.95 J); PyChrono drop via conda (peak KE 1.01 J)
    • Newton/Warp XPBD drop + tendon sweep on CPU: 3003 / 6346 / 13165 g at d_t 1.5 / 3.0 / 5.0 mm
    • gmsh T-prism mesher (2168 nodes / 5481 tets, 15 PLA + 9 TPU volumes)
    • OSMesa renders: render_spotchecks, render_mujoco_drop, render_regimes
    • DiffPD built from source (swig + cmake) + cube drop (peak 61.2 g, settled 15.0 mm)
    • PolyFEM+IPC built from source (~30 min, 161 MB binary) + cube drop (0.9 g) + welded PLA/TPU T-prism drop (1.0 g, settled 29.66 mm)
    • Added simulations/outputs_bundle.zip (11 MB, < 100 MB so no split needed) archiving the full simulations/outputs/ set
  • Address comment 4686953016 — run many PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 T3-prism Sobol variations through the simulators and analyse the results
  • Address comment 4687620375 — extend the Sobol T3-prism campaign beyond Tier-C/Tier-B to the full C→B→A ladder across 5 engines, using parallel background builds to fit Tier-A inside the window
    • Started the ~33 min PolyFEM+IPC source build (161 MB binary) in a detached background process and built/installed the rest in parallel (MuJoCo, Newton, PyBullet, DiffPD, PyChrono-via-conda) while running the fast sims; Sobol set drawn with scipy.stats.qmc.Sobol (Ax not required, per the comment)
    • Tier-A PolyFEM+IPC added to sobol_t3_campaign.py (run_tier_a + _tier_a_one multiprocessing worker, 2 concurrent processes) — welded PLA/TPU T-prism drops on an 8-design subset; mesh resolution scaled with cross-section (lc_strut/lc_tendon) to hold tet count ~6k; meshes written outside run_drop's work_dir (which it wipes on entry)
    • Added two more Tier-C rigid engines to the campaign: PyBullet (32 designs) and PyChrono (16, run via a conda-env subprocess --param-json bridge); added parameterized run_param() to pybullet_drop.py and pychrono_drop.py (+ --param-json stdin/stdout CLI for the conda interpreter)
    • Extended analyse() with an engine-ladder Spearman comparison (sobol_t3_engine_ladder.png) and a Tier-A figure (sobol_t3_tierA.png); rewrote the cross-fidelity report section as a C→B→A ladder; new CLI args --n-tiera, --n-pybullet, --n-pychrono, --tiera-workers
    • Engine-ladder Spearman ρ vs Tier-C MuJoCo lander F_peak: PyChrono +0.70, Newton +0.60, PolyFEM +0.43, PyBullet ≈ −0.02 (bare-prism peak is contact-dominated/design-invariant — reported honestly, not weighted); Tier-A peak-g is ~1 g (settles below the IPC dhat envelope) so settled-COM height (68–112 mm) is its discriminating observable
    • New outputs (sobol_t3_tierA.csv, sobol_t3_pybullet.csv, sobol_t3_pychrono.csv, sobol_t3_tierA.png, sobol_t3_engine_ladder.png), refreshed sobol_t3_analysis.md, README, and outputs_bundle.zip (11.8 MB)
    • Scope note: DiffPD remains a material-only soft-cube smoke test (it can't ingest the prism geometry without a generic soft-body mesher), so it is not part of the geometry-varying Sobol sweep
  • Address comment 4700384140 — violin plots (with jittered raw points) of the Sobol T3-prism measurements
    • New simulations/sobol_t3_violins.py: reads the existing outputs/sobol_t3_*.csv campaign measurements and renders plotly.express.violin(..., points="all", box=True) with non-zero jitter so every raw measurement is drawn as a jittered swarm beside each violin (PNG via kaleido + interactive HTML)
    • outputs/sobol_t3_violin_objectives.{png,html} — Tier-C MuJoCo objectives (F_peak, SEA, eta), one violin per regime, faceted with independent y-axes (512 feasible designs)
    • outputs/sobol_t3_violin_engines.{png,html} — per-engine peak deceleration (g) across the C→B→A ladder (PyBullet/PyChrono/Newton/PolyFEM) on a log y-axis
    • Documented the script in simulations/README.md, sobol_t3_analysis.md, and the campaign Files list; refreshed outputs_bundle.zip
  • Address comment 4713093337 — send the Sobol T3-prism campaign results (scripts, data, figures) + project context to Edison ANALYSIS, fetch, and report back
    • New scripts/edison/submit_sobol_t3_results.py + scripts/edison/fetch_sobol_t3_results.py: bundle the campaign scripts (sobol_t3_campaign.py, sobol_t3_violins.py, bo_evaluator.py, run_regimes.py), the measured CSVs (sobol_t3_tierC/tierB/tierA/pybullet/pychrono.csv), the figures (Pareto / sensitivity / Tier-C-vs-Tier-B / engine-ladder / Tier-A / both violin plots), the sobol_t3_analysis.md + bo_integration.md write-ups, and a project-context note as a single Edison data collection, submit ANALYSIS, poll, and commit the answer
    • Edison ANALYSIS task ff8faab3 (status success) committed at edison-trajectories/sobol-t3-results/ — Edison re-analysed the CSVs directly and confirmed our reproducible numbers (Tier-C F_peak near-invariant; SEA/eta discriminating; engine-ladder ρ PyChrono +0.70 / Newton +0.60 / PyBullet −0.02 / PolyFEM +0.43) while sharpening several claims we should revise: crutch Tier-C F_peak is essentially the static payload weight (ratio 1.002), Tier-C SEA is a conservative elastic-energy proxy (not true dissipation), PolyFEM peak-g is ~1 g flat (so Tier-A does not back the Tier-C F_peak ladder), and strut_d_mm's apparent leverage is largely a rigid-body mass/contact-geometry artifact (ρ=−0.976 vs an L·d² strut-mass proxy, sign flips by regime)
    • Recommendations captured in the committed brief: treat Tier-C as a biased cheap auxiliary (warm-start a low-fidelity surrogate only), promote 8–12 diverse/high-uncertainty designs to Tier-B/bench, fit a Kennedy–O'Hagan / recursive co-kriging discrepancy model, and run cost-aware constrained qNEHVI with regime+fidelity as task labels; first print batch should be information-maximising (strut_d/H extremes + matched twist pairs + replicates), with priority ablations (base-reaction-force vs payload-accel F_peak, filtered/unfiltered peaks, constant-mass strut-diameter sweep, twist-injection plumbing audit at Tier-C/Tier-B) and a full multi-fidelity BO citation list
  • Address comment 4756521145 ("carry on") — implement the priority artifact-vs-physics ablations Edison's ff8faab3 review recommended, in new simulations/sobol_t3_diagnostics.py (run on 48 feasible PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 designs)
    • Base reaction force vs payload acceleration — re-measure the vertical floor-reaction force (sum of strut↔floor contact forces via mj_contactForce, the sensorized-platen observable): genuine ~104× static-weight transient for the lander while the crutch's large soft cell barely loads the floor in the 25 ms window, confirming the payload-accel F_peak is a support-load proxy not an impact peak → outputs/sobol_t3_diag_base_reaction.csv
    • CFC-180 on vs off — lander raw F_peak span (~10%) is ~3× the filtered span (~3%), so the filter suppresses part of the design transient (the fix is the observable, not removing the filter) → outputs/sobol_t3_diag_cfc.csv
    • Constant-mass strut-diameter sweep — holding strut mass fixed (PLA density ∝ 1/d²) shrinks the lander strut_d effect ~17×, confirming Edison's L·d² inertia/contact confound; reported as effect-size (peak-g range) since Spearman stays ≈±1 on a monotonic sweep → outputs/sobol_t3_diag_constmass.csv
    • Twist plumbing audit — geometry shifts ~20 mm across 40–80° twist when supplied, but regimes.Regime has no twist field and run_regimes.build_xml never passes it, so the twist≈0 Tier-C result is un-consumed plumbing not physical irrelevance
    • 3-panel summary figure outputs/sobol_t3_diagnostics.png + write-up simulations/sobol_t3_diagnostics.md; narrowed the matching over-claims in sobol_t3_analysis.md (payload-accel F_peak relabeled support-load proxy; strut_d demoted from "dominant lever" to inertia confound; twist framed as plumbing); documented the script in simulations/README.md; refreshed outputs_bundle.zip
  • Address comment 4759514616 — run a closed-loop Bayesian-optimization campaign using only simulations as the objective functions, mirroring PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 but with simulations instead of real experiments
  • Address comment 4759900555 — rework the sim-only BO plots so the optimization behavior is legible per regime, per seed, and per tier method, with predictive-signal diagnostics
    • Separated regimes onto independent figures — every figure now belongs to a single (tier, regime) pair so crutch and lander never share an axis (the prior shared plots were unreadable given their ~6× objective-scale gap)
    • Individual per-seed plotsoutputs/sim_bo_<tier>_<regime>_seed<k>_{convergence,pareto,cv}.png
    • Std-dev bands on the averaged-behavior plotsoutputs/sim_bo_<tier>_<regime>_convergence.png plots the mean running-best with a ±1σ band across seeds (faint per-seed traces behind it)
    • Repeated across tier methods — rewrote simulations/sim_bo_campaign.py into a tier/seed-parameterized closed-loop driver (--tiers C B, --seeds, --n-iter, --regime, --raw-peak, --outdir): Tier-C MuJoCo runs the 3-objective qNEHVI loop while Tier-B Newton/Warp XPBD runs a single-objective F_peak loop (Newton only exposes the payload-accel trace). Headline cross-tier result: Tier-C F_peak is near-flat (support-load proxy) but Tier-B F_peak spans ~2.5× and the BO genuinely descends because the elastic tendons sit in the dynamic load path
    • LOO-CV plots per seed and modeloutputs/sim_bo_<tier>_<regime>_seed<k>_cv.png via Ax's built-in cross_validate (refit Generators.BOTORCH_MODULAR adapter), showing strong predictive signal where it matters (Tier-C crutch SEA R²≈0.97/ρ≈0.96, Tier-B F_peak R²≈0.99); near-flat CV outcomes (e.g. Tier-C lander eta) are pinned observables, not model failures
    • Ran full Tier-C (3 seeds × both regimes) and Tier-B Newton (2 seeds × both regimes) campaigns; replaced the old single-layout outputs (sim_bo_{crutch,lander}.csv, sim_bo_{pareto,convergence}.png) with tier-named CSVs (sim_bo_<tier>_<regime>.csv + _pareto.csv) and the per-seed/aggregate figures; rewrote simulations/sim_bo_campaign.md, updated simulations/README.md, and refreshed outputs_bundle.zip
    • Scope note: Tier-A (PolyFEM) is intentionally left out of the closed loop (expensive, single geometry-only observable) and flagged as future work
  • Address comment 4759775185 / 4760735518 — send the sim-only BO figures/data to Edison ANALYSIS for mock-reviewer feedback, fetch, report back, and implement the follow-up recommendations (the prior session timed out before reporting back)
    • New scripts/edison/submit_sim_bo_review.py + scripts/edison/fetch_sim_bo_review.py: bundle the campaign driver (sim_bo_campaign.py), the sim→BO bridge (bo_evaluator.py), the per-(tier,regime) trial + Pareto CSVs, and the per-seed/aggregate convergence, Pareto, and LOO-CV figures, plus sim_bo_campaign.md/bo_integration.md and a project-context note, as a single Edison collection; submit ANALYSIS, poll, and commit the answer
    • Edison ANALYSIS task 491f90ae (status success) committed at edison-trajectories/sim-bo-review/ — confirms real predictive signal on the discriminating outcomes (Tier-C crutch SEA, Tier-B F_peak) and that weak CV on near-constant outcomes (Tier-C lander eta) is intrinsic, not model failure; flags Tier-B was regime-blind (matched crutch/lander F_peak ratio 0.998), that the per-fidelity constraints don't align (Tier-C 100% feasible / Tier-B 0%), Tier-C lander BO proposal collapse, and recommends a contextual, cost-aware, discrepancy-aware multi-fidelity BO (regime + fidelity as task/context, physics features, Kennedy–O'Hagan / co-kriging fusion, peak-g as the constraint variable, constrained qNEHVI)
    • Fixed the Tier-B regime-plumbing artifact in simulations/sim_bo_campaign.py: _eval_tier_b now seeds each Newton drop with the regime's own impact velocity (crutch 1.4 m/s, lander 9.8 m/s) via newton_drop.build_model(impact_velocity_mps=…) and reads a robust start-up-gated peak (newton_drop.peak_decel_g), so crutch and lander are now physically distinct (e.g. ~1463 N vs ~564 N for the same seed design instead of the prior 0.998 ratio)
    • Added range-normalized CV diagnostics (nrmse = RMSE/(max−min) and a constant-mean null_skill baseline) to every per-(tier,regime) outputs/sim_bo_<tier>_<regime>_cv_summary.csv, per Edison rec. B, so a high on a near-constant outcome is not mistaken for decision-useful signal
    • Refreshed the regime-aware Tier-B simulations/outputs/ (CSVs + figures) and synced simulations/sim_bo_campaign.md (Tier-B narrative + numbers, LOO-CV table, Files list) to the new regime-distinct results, which the output refresh had made stale
  • Address comment 4760877672 — find the actual Tier-C Pareto front over the PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 box and render the best/worst/mediocre designs as callouts (sims are cheap enough that no cost-aware/multi-fidelity loop is needed)
    • New simulations/pareto_render_campaign.py: densely Sobol-maps 2048 designs per regime over the exact PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 box and scores each at Tier-C MuJoCo (bo_evaluator.evaluate_design, CFC-180 filtered) on the three objectives (minimize F_peak_N, maximize SEA_J_per_g, maximize eta) at ~0.15 s/eval; takes the 3-objective non-dominated set as the empirical Pareto front
    • Selects representative designs — Pareto winners (max-SEA, max-eta, balanced knee, min-F_peak), 2 worst dominated, and 2 mediocre mid-rank — and renders each as a 3-D MuJoCo still (geometry + strain-coloured tendons via an overridden Regime), plus headline best/worst drop GIF/MP4 animations per regime
    • Annotated outputs/pareto_<regime>_annotated.png: a SEA↔eta Pareto scatter (colour = near-invariant F_peak) with the render stills dropped on as callout thumbnails + leader lines, and a clean 2-D SEA↔eta frontier staircase rather than the zig-zagging 3-objective set
    • Outputs: pareto_<regime>.csv (2048 rows + feasible/pareto flags), per-pick stills pareto_<regime>_render_<tag>.png, pareto_<regime>_{best,worst}_drop.{gif,mp4}, and pareto_summary.md; both regimes report the whole box printable, F_peak span ~3–4 % (crutch 712–739 N, lander 4628–4790 N), SEA↔eta the live trade-off (best cells short/fat-strut/large-radius, worst tall/slender)
    • Honest caveats carried over: Tier-C F_peak is a support-load proxy (shown as colour), SEA is an elastic-energy proxy, and twist_deg≈0 at Tier-C is un-consumed plumbing; write-up simulations/pareto_render_campaign.md + README.md entry; refreshed outputs_bundle.zip (~25 MB)
  • Address comment 4760939061 — assess whether the objective evaluations are "fair" w.r.t. mass / volume / contact area (especially for the lander) and send the thinking to Edison for mock feedback
    • New simulations/fair_evaluation_analysis.md: quantifies the size confound — across the PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 box the cell mass varies 6.2× (9.5→59 g), envelope volume 4.7× (118→553 cm³), and strut-tip footprint 4.0× (85→339 mm²), so designs are compared at very different sizes; only SEA_J_per_g controls for mass, none control for volume/footprint, and the lander F_peak is a real ~94–98 g transient (only the crutch F_peak is a support-load proxy)
    • Documents the real scaled-up lander-module constraints (hard mass budget ≈2–5 % of landed mass → ~100–250 g for the 5 kg regime; stowed/deployed envelope volume; footprint/ground-pressure as a cap and a floor; crush stroke with physics floor s ≥ v²/2a_max ≈ 3.3 mm) and lays out two routes to fairness — (A) re-parameterize onto a constant-mass / scale-free shape-ratio manifold so budgets hold by construction, vs (B) keep the box but score intensive objectives (SEA_J_per_g + SEA_J_per_cm³, base-reaction peak-g, ground pressure) with mass/volume/footprint + peak-g as Ax outcome constraints under constrained qNEHVI — plus a recommended hybrid for the lander
    • New scripts/edison/submit_fair_evaluation.py + scripts/edison/fetch_fair_evaluation.py; README entry
    • Edison ANALYSIS task e43abed6 (status success) committed at edison-trajectories/fair-evaluation/ — endorses the diagnosis and the hybrid, independently reproduces the confound (~6.6× mass / 4.69× volume / 4.0× footprint), and sharpens the write-up: re-parameterization (constant-mass equality manifold + dimensionless Buckingham-π shape groups) is sounder than outcome constraints for the binding mass budget; don't hard-constrain a biased cheap observable (use Tier-C base reaction only for coarse screening, reserve peak-g acceptance for Tier-B/A/bench); report fronts at 2–3 fixed mass/envelope budgets; corrected the over-claim that lander F_peak ≈ static load and reframed GEVS/HAVS as requirement proxies — all folded back into fair_evaluation_analysis.md
    • Scope note: the constant-mass-manifold re-parameterization and constrained-qNEHVI wiring are listed as prioritized follow-on changes; this comment's deliverable is the analysis + the Edison mock review
  • Address comment 4815289639 — clarify that "hybrid" means combining Route A + Route B inside a single AxClient campaign per regime (not two separate campaigns); added a clarifying paragraph under "Recommended hybrid" in simulations/fair_evaluation_analysis.md (cbcf27b)
  • Address comment 4815305004 — update the BO script(s) to implement the hybrid (Route A constant-mass manifold + Route B intensive objectives/outcome constraints in one campaign per regime)
    • Extended simulations/bo_evaluator.py with the hybrid geometry/manifold machinery: cell_geometry_metrics() (cell mass / envelope volume / strut-tip footprint, all derived from PrintableDesign.nodes — also fixes a pre-existing strut-length bug by using design.strut_length_m); design_from_shape_ratios() — the Route A constant-mass manifold that builds a cell from four dimensionless ratios (H/R, H/strut_d, cable_d/strut_d, twist) and solves the single overall scale by closed-form cube root so cell mass equals m* exactly; the inverse design_to_shape_ratios(); and base_reaction_peak_N() — the Route B base floor-reaction observable (sums vertical strut↔floor contact forces, optionally CFC-180 filtered)
    • Refactored the Tier-C sim core into evaluate_printable_design(design, *, regime, fidelity, cfc180, base_reaction) (called by evaluate_design) and extended the return dict with cell_mass_g, envelope_cm3, footprint_mm2, SEA_J_per_cm3, and optional F_base_peak_N; all existing keys (F_peak_N, SEA_J_per_g, eta) and behaviour preserved for backward compatibility
    • New simulations/sim_bo_hybrid_campaign.py: the fair closed-loop analogue of sim_bo_campaign.py — one AxClient constrained-qNEHVI campaign per regime over the four scale-free shape ratios at a fixed cell mass m* (Route A), scoring intensive objectives (impact F — base floor-reaction for the lander, payload-accel F_peak for the crutch's large soft cell —, SEA_J_per_g, SEA_J_per_cm³, eta) under envelope-volume + strut-tip-footprint Ax outcome constraints (Route B; mass is structurally fixed so it is not a constraint); seeded with the three printed PR Add T3-prism (3-strut tensegrity) parametric CAD with Bambu PETG .gcode.3mf slice + re-importable project .3mf (H2D-only, supports enabled, scale 1.5× / cable_d 4.5 mm) + PLA-cables and PLA-struts/TPU-cables MM variants (with modeled-in PLA scaffo... #35 T3 cells projected onto the manifold; per-seed + mean±σ convergence, intensive-trade Pareto, constraint-feasibility, and LOO-CV figures; CLI --regime/--seeds/--n-iter/--mass-g/--envelope-max-cm3/--footprint-min-mm2/--footprint-max-mm2/--raw-peak/--outdir
    • Verified end-to-end on both regimes (constant-mass round-trip exact; crutch payload-accel channel and lander base-reaction channel; constrained qNEHVI + LOO-CV run cleanly); updated fair_evaluation_analysis.md §4 (steps 1–4 marked implemented, pointing at the new helpers/script) and simulations/README.md
    • Follow-on: commit a full multi-seed outputs/ artifact set and a dedicated simulations/sim_bo_hybrid_campaign.md write-up (the 4-objective constrained-qNEHVI run is slow; the module docstring documents usage and the output files in the meantime), and re-run the dense Pareto render campaign on the constant-mass manifold (fair_evaluation_analysis.md §4 step 5)

Copilot AI changed the title [WIP] Begin exploring state-of-the-art simulations for tensegrity structures Add runnable tensegrity simulation demos (MuJoCo, PyBullet, PyChrono) + Edison survey May 8, 2026
Copilot AI requested a review from sgbaird-alt May 8, 2026 17:30
@sgbaird-alt

Copy link
Copy Markdown
Collaborator

@copilot fetch edison results. Extensively consider #28 and #18 in terms of the choices of simulations and parameters (e.g., forces/loads/timescales/etc.). This doesn't preclude other applications like the ones mentioned in #14 and #16 ; provide recommendations and try things out from both regimes.

Re-run additional simulations based on this. Embed visualizations from those simulations directly in your comment reply.

@sgbaird-alt

Copy link
Copy Markdown
Collaborator

@copilot consider also the fact that we might be using PETG struts + TPU "strings" as a tensegrity-like structure, and how we might best design and model that in a way that helps us mimic a true tensegrity structure if were to make one manually.

…) and commit Edison survey

Agent-Logs-Url: https://github.com/vertical-cloud-lab/tensegrity-optimization/sessions/bfc9f985-512f-4973-b7a2-c04715c29984

Co-authored-by: sgbaird-alt <71569943+sgbaird-alt@users.noreply.github.com>

Copilot AI commented May 8, 2026

Copy link
Copy Markdown
Contributor Author

@copilot fetch edison results. Extensively consider #28 and #18 in terms of the choices of simulations and parameters (e.g., forces/loads/timescales/etc.). This doesn't preclude other ...

Edison 782657e0-0818-4755-9e18-60c8039b2ccd finished success and is committed at edison-trajectories/2026-05-08-sim-survey-782657e0.{md,json}. Its core recommendation is a three-tier multi-fidelity stack: (A) PolyFEM+IPC differentiable FEM for high-fidelity contact, (B) DiffPD for fast differentiable mid-fidelity sampling, (C) NTRT/MuJoCo rigid-strut + tendon for cheap topology screening — with the explicit caveat that tier C "cables may lack contact modeling… energy absorption predictions will be unreliable without higher-fidelity refinement."

I encoded the two application regimes in simulations/regimes.py, both clamped to the Lansmont M23 envelope from #28 (≤ 5,000 g, ≥ 0.25 ms half-sine, ΔV ≤ 9.8 m/s, ≤ 36 kg payload):

regime source payload ΔV cell target peak target pulse
crutch_tip #18 + tasks 39708fbc/9832f01a/f21cf79c/7a21d00e 75 kg 1.4 m/s (≈ 0.10 m drop) Ø24 mm × 25 mm ≤ 8 g (HAVS) ≥ 5 ms
nasa_lander #14, #16 (SUPERball, MER airbag, GSFC GEVS) 5 kg 9.8 m/s (M23 max ΔV) Ø200 mm × 200 mm ≤ 1500 g (GEVS) ≥ 0.5 ms

simulations/run_regimes.py then drives the MuJoCo prism through both regimes — three illustrative cable stiffnesses for the time-history figure, and an 11-point ~3-decade geometric sweep for the BO-objective figure.

Crutch-tip regime (#18) — payload accel / vertical velocity / tendon strain energy vs. time, then a stiffness sweep:

crutch time series
crutch sweep

NASA lander / CubeSat regime (#14, #16) — same plots:

NASA time series
NASA sweep

regime best-fit k (N/m) peak (g) pulse (ms) SEA (J/kg)
crutch_tip 5,798 16.3 7.5 ~0
nasa_lander 5,060 102.8 7.9 0.06

NASA-lander 100 g / 8 ms comfortably clears the GEVS 1500 g target; crutch 16 g is ~2× the 8 g HAVS target. The most actionable finding from the sweeps is empirical confirmation of Edison's Rec C limitation: peak g is flat (±2 %) across three decades of cable stiffness because in a rigid-strut model the impulse is set by floor contact, not the cable network — but SEA varies ~10×. That motivates moving to Edison Rec B (DiffPD) before doing real crutch-design BO; I've left that as a follow-up checklist item rather than dragging this PR into a second engine. (commit ce1edba)

Copilot AI changed the title Add runnable tensegrity simulation demos (MuJoCo, PyBullet, PyChrono) + Edison survey Add runnable tensegrity simulation demos (MuJoCo, PyBullet, PyChrono) + Edison survey + regime-aware sweeps May 8, 2026

Copilot AI commented May 8, 2026

Copy link
Copy Markdown
Contributor Author

@copilot consider also the fact that we might be using PETG struts + TPU "strings" as a tensegrity-like structure, and how we might best design and model that in a way that helps us mi...

Added a PETG strut + TPU 95A printable-design module that replaces the abstract cable stiffness k with the actual physical knobs an operator turns when fabricating one manually on the H2D, and that explicitly checks whether the resulting geometry is still a true (class-1) tensegrity.

simulations/printable_design.py — material model + class-1 check:

  • k = E_TPU · π·(d_t/2)² / L, with TPU 95A E ≈ 25 MPa (small-strain secant) and PETG E ≈ 2 GPa.
  • PrintableDesign.is_class_1 / class_1_margin_m compute the closest-approach distance between the three struts and flag designs where d_s ≥ d_min (the structure becomes "tensegrity-like": loads bypass tendons through strut-strut contact, BO objective stops reflecting design intent). Crutch margin 10.9 mm, lander margin 103 mm — both regime defaults pass.
  • Bambu H2D printability bounds baked in: tendon Ø ∈ [1.2, 6.0] mm (3-perimeter rule at 0.4 mm nozzle ↔ switch to multi-strand), strut Ø ≥ 2.0 mm, prestrain capped by TPU break stress.

simulations/printable_sweep.py — 7 × 5 grid over (tendon Ø, prestrain) for each regime, with cable stiffness derived from the printable design every iteration. Peak |a| (g) and SEA (J/kg) heatmaps:

crutch printable heatmap
NASA printable heatmap

Pareto clouds (peak vs SEA, marker colour = tendon Ø, marker size ∝ prestrain, red dashed = regime peak target):

crutch printable pareto
NASA printable pareto

Regime Best class-1 design (peak ≤ target, max SEA)
nasa_lander d_t = 4.0 mm, prestrain 0 % → 92 g / 1.03 J/kg (under the 1500 g GEVS target); comfortably printable on H2D.
crutch_tip None — the entire printable k-range (1.1 – 28 kN/m at the 25 mm strut length) still leaves the rigid-prism floor-contact impulse > the 8 g HAVS target. Confirms in printable units the same Edison Rec C limitation: crutch design needs DiffPD/IPC fidelity, or a redesigned cell where a TPU shell carries the contact load instead of the rigid strut tips.

The CSV outputs include the class-1 flag column so a future BO loop can filter out non-tensegrity designs without re-running the geometry check. Two earlier comments from the code reviewer were minor nits; I addressed the meaningful one (2.0 * 0.5 * xx in the class-1 inequality) in 5031a67 and left the cosmetic ones (parens around r*2*1e3, table cell wrapping) alone to keep the change focused. (commits 8f36c3a, 5031a67)

Copilot AI changed the title Add runnable tensegrity simulation demos (MuJoCo, PyBullet, PyChrono) + Edison survey + regime-aware sweeps Add runnable tensegrity simulation demos (MuJoCo, PyBullet, PyChrono) + Edison survey + regime-aware sweeps + PETG/TPU printable-design model May 8, 2026
@sgbaird-yolo

Copy link
Copy Markdown
Collaborator

@copilot btw it's TPU 85A that we're using. Attempt running DiffPD and PolyFEM+IPC

Copilot AI commented May 9, 2026

Copy link
Copy Markdown
Contributor Author

@copilot btw it's TPU 85A that we're using. Attempt running DiffPD and PolyFEM+IPC

Done both.

TPU 85A propagated through printable_design.py, printable_sweep.py, and the README: Material("TPU85A", young_MPa=12.0, density_kgm3=1200.0, yield_break_MPa=26.0) (NinjaFlex-class, ~2× softer per unit cross-section than the 95A I had earlier). Sweep outputs regenerated; class-1 / printability constants unchanged.

DiffPD / PolyFEM+IPC attempts:

  • DiffPD (MIT GFX, SIGGRAPH 2021) is not on PyPI — only as a C++/Pangolin source repo whose CMake build needs OpenGL drivers that aren't on this runner.
  • PolyFEMpip install polyfempy fails with CMake Error: source directory does not appear to contain CMakeLists.txt (the PyPI sdist is incomplete). The maintained route is cloning polyfem/polyfem and building manually with Eigen + libigl + ipc-toolkit + suite-sparse — ~25 min build, ~6 GB disk, outside this sandbox's budget. Documented as a reproducer at the bottom of the README so the next pickup can resume cleanly.
  • Stand-in I did get running: NVIDIA Newton 1.1 (pip install newton, built on Warp). Newton is GPU-accelerated, multi-physics (rigid + particle + soft + cloth + MPM), differentiable via Warp autodiff tapes — the exact capability we wanted DiffPD for. New simulations/newton_drop.py builds the prism as an all-particle XPBD network with TPU-85A tendons (and 6 internal payload-suspension tendons in the SUPERball / NASA TBR style) so cables are physically in the impact load path:

newton drop
newton tendon sweep

Tendon Ø Newton peak |payload accel|
1.5 mm ~2,400 g
3.0 mm ~4,200 g
5.0 mm ~11,400 g

Versus the rigid-strut MuJoCo/PyBullet/PyChrono runs where peak g was floor-pinned flat ±2 % across three decades of cable stiffness, here peak g responds monotonically to TPU-85A tendon Ø — the BO objective is no longer degenerate. Absolute values are still high (the soft 12 MPa tendons let the payload free-fall deep before the suspension snaps taut, giving a rope-snap profile); two follow-ups left in the README are (i) add prestrain so suspension is taut at rest, (ii) replace the all-particle struts with rigid bodies via add_body + add_shape_capsule so PETG-spring numerics don't enter the integration. Both are mechanical refinements rather than tooling escalations — the key Tier-C → Tier-B step is delivered. (commit 065cc62)

Copilot AI changed the title Add runnable tensegrity simulation demos (MuJoCo, PyBullet, PyChrono) + Edison survey + regime-aware sweeps + PETG/TPU printable-design model Add runnable tensegrity simulation demos (MuJoCo, PyBullet, PyChrono, Newton) + Edison survey + regime-aware sweeps + PETG/TPU 85A printable-design model May 9, 2026

Copilot AI commented Jun 20, 2026

Copy link
Copy Markdown
Contributor Author

@copilot carry on

Carried on by acting on Edison ff8faab3's review — implemented its priority "is this a setup artifact or real physics?" ablations as simulations/sobol_t3_diagnostics.py (run on 48 feasible PR #35 designs) in 2c85d19:

  1. Base reaction force vs payload accel. Re-measured the vertical floor-reaction force (sum of strut↔floor contact forces — the sensorized-platen observable). Lander floor reaction ≈ 104× static weight (a genuine impact transient); the crutch's large soft cell barely loads the floor in the 25 ms window. Confirms the payload-accel F_peak is a support-load proxy, not an impact peak.
  2. CFC-180 on vs off. Lander raw span (~10%) is ~3× the filtered span (~3%) — the filter does suppress part of the design transient, so the fix is the observable (base reaction), not removing the filter.
  3. Constant-mass strut-diameter sweep. Holding strut mass fixed (PLA density ∝ 1/d²) shrinks the lander strut_d effect ~17×, confirming Edison's L·d² inertia/contact confound. (Reported as effect-size since Spearman stays ≈±1 on a monotonic sweep.)
  4. Twist plumbing audit. Geometry shifts ~20 mm across 40–80° twist when supplied, but Regime has no twist field and run_regimes.build_xml never passes it → the twist≈0 Tier-C result is un-consumed plumbing, not physical irrelevance.

diagnostics

I also narrowed the matching over-claims in sobol_t3_analysis.md (relabel payload-accel F_peak as support-load proxy; demote strut_d from "dominant lever" to inertia confound; frame twist as plumbing), documented the script in simulations/README.md, and refreshed outputs_bundle.zip. Files: sobol_t3_diagnostics.md, outputs/sobol_t3_diag_{base_reaction,cfc,constmass}.csv.

@sgbaird

sgbaird commented Jun 20, 2026

Copy link
Copy Markdown
Collaborator

@copilot run a Bayesian optimization campaign as you see fit using only simulations as the objective functions. Mirror what's in #35 , but using these kinds of simulations instead of real experiments.

Copilot AI commented Jun 20, 2026

Copy link
Copy Markdown
Contributor Author

@copilot run a Bayesian optimization campaign as you see fit using only simulations as the objective functions. Mirror what's in #35 , but using these kinds of simulations instead of real experiments.

Done in 1b5c2e9 (+ 59c48d5). New simulations/sim_bo_campaign.py runs a closed-loop, simulation-only Bayesian optimization — the sim analogue of PR #35's single Sobol hardware batch. Ax (AxClient, default Sobol → BOTORCH_MODULAR qNEHVI) proposes a design over the exact PR #35 box (R_mm∈[25,40], H_mm∈[60,110], twist_deg∈[40,80], strut_d_mm∈[6,12], cable_d_mm∈[3.0,5.5]); the Tier-C MuJoCo regime sim (bo_evaluator.evaluate_design, CFC-180 filtered) scores it on the three PR #30 objectives (min F_peak_N, max SEA_J_per_g, max eta); the result is fed straight back to the surrogate. No printer, no drop-tower — the objective function is the simulation.

I ran 3 seeds (the already-printed PR #35 T3 cells) + 40 closed-loop trials per regime (crutch + lander, 86 simulated evals):

Regime F_peak span SEA span eta span BO-converged max-SEA design
crutch 708–739 N (4.3 %) 2.1e-4–2.7e-3 J/g (13×) 0.92–0.99 R=40, H=60, strut_d=12, cable_d≈4.1 → SEA 2.66e-3, eta 0.99
lander 4632–4784 N (3.3 %) 6.2e-4–4.2e-3 J/g (6.8×) 0.732–0.733 R≈36, H≈63, strut_d≈6.5, cable_d≈4.1 → SEA 4.21e-3

The optimizer behaves exactly as the Tier-C physics predicts: F_peak is near-invariant (so the Pareto fronts are nearly vertical), SEA is the live discriminator, and the running-best SEA climbs then plateaus — classic BO convergence.

Honest caveats carried over from the Sobol sweep + Edison ff8faab3 review (running a real optimizer on the cheap sim doesn't remove them): Tier-C F_peak ≈ static support load not a resolved impact peak; SEA is a peak elastic strain-energy proxy; twist_deg is un-consumed plumbing at Tier-C. Full write-up: simulations/sim_bo_campaign.md. Outputs: outputs/sim_bo_{crutch,lander}.csv (+ *_pareto.csv).

Run with python simulations/sim_bo_campaign.py --n-iter 40.

@sgbaird

sgbaird commented Jun 20, 2026

Copy link
Copy Markdown
Collaborator

@copilot the plotting of both crutch and lander on the same graphs is confusing because of the scale differences. Separate these out. Generate individual plots for each seed. Also, add stdDev bands where applicable for the average behavior plots.

Repeat this for each of the tier methods so we can get a better idea of what the optimization behavior is like. Also, create LOO-CV plots for each seed and model. Ax has a built in method for creating these plots. I want to see if there is predictive signal it's learning from.

Copilot AI commented Jun 20, 2026

Copy link
Copy Markdown
Contributor Author

@copilot the plotting of both crutch and lander on the same graphs is confusing because of the scale differences. Separate these out. Generate individual plots for each seed. Also, add...

Done in 069b3ea. Reworked simulations/sim_bo_campaign.py so the plots address each point:

  • Separated regimes — every figure is now for a single (tier, regime); crutch and lander never share an axis (the previous shared plots were unreadable because their objective scales differ ~6×).
  • Individual plots per seedsim_bo_<tier>_<regime>_seed<k>_{convergence,pareto,cv}.png.
  • Std-dev bandssim_bo_<tier>_<regime>_convergence.png plots the mean running-best with a ±1σ band across seeds (faint per-seed traces behind it). Ran 3 seeds (Tier-C) / 2 seeds (Tier-B) per regime.
  • Repeated across tier methods--tiers C B runs the closed loop on Tier-C MuJoCo (3-objective qNEHVI) and Tier-B Newton/Warp XPBD (single-objective F_peak, since Newton only exposes the payload-accel trace). This is the most interesting result: Tier-C F_peak is near-flat (it's a support-load proxy), but Tier-B's F_peak spans ~2.5× and the BO actually descends — the elastic tendons in Newton resolve a design-dependent impact peak that the rigid-contact tier cannot.
  • LOO-CV per seed and model — via Ax's built-in cross_validate (refits a BoTorch surrogate and predicts each held-out point). The GP has strong, real predictive signal on the discriminating outcomes: Tier-C crutch SEA R²≈0.97/ρ≈0.96, Tier-B F_peak R²≈0.99. Where signal looks weak (Tier-C lander eta) it's because that outcome is itself pinned at 0.732–0.734, not a model failure.

Tier-C crutch — mean running-best ±1σ band (3 seeds):

Tier-B (Newton) lander — single-objective F_peak actually converges (~2.5× drop):

LOO-CV (Tier-C crutch, seed 0) — predictive signal, observed vs CV-predicted with ±1σ bars + y=x:

Run with python simulations/sim_bo_campaign.py --tiers C --seeds 0 1 2 --n-iter 30 (and --tiers B for Newton). Full write-up + numbers in sim_bo_campaign.md.

@sgbaird

sgbaird commented Jun 20, 2026

Copy link
Copy Markdown
Collaborator

@copilot send all of these figures/data to Edison analysis for mock reviewer feedback and analysis of where signal is or isn't and provide recommendations on what this means for incorporating contextual information into the Bayesian optimization campaign. Fetch this session. Report back findings. Implement any follow-up recommendations

@sgbaird

sgbaird commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator

@copilot seems like maybe you timed out

Copilot AI commented Jun 21, 2026

Copy link
Copy Markdown
Contributor Author

@copilot seems like maybe you timed out

The previous session did finish the Edison round but timed out before reporting back — the work landed in f8508ee + e8491d7, and I've now synced the stale docs that the output-refresh left behind.

Sent to Edison ANALYSIS, fetched, committed. Task 491f90ae (status success) — the full campaign (driver, bo_evaluator, per-(tier,regime) CSVs, per-seed/aggregate convergence, Pareto, and LOO-CV figures, plus sim_bo_campaign.md) uploaded as one collection. Submit/fetch scripts: scripts/edison/submit_sim_bo_review.py, scripts/edison/fetch_sim_bo_review.py.

Where Edison found signal vs not:

  • Real signal: Tier-C crutch SEA (LOO-CV R²≈0.97), Tier-C lander F_peak is smooth/learnable despite a 3.5% span (low span ≠ "nothing to learn"), Tier-B F_peak.
  • Near-constant outcomes (not model failure): Tier-C lander eta (pinned 0.732–0.734).
  • Optimizer pathology to surface: Tier-C lander BO collapses/duplicates proposals (45/99 repeats).

Where it pushed back (all addressed):

  • Tier-B was regime-blind — matched crutch/lander F_peak ratio 0.998, a plumbing bug not physics. Fixed: each Newton drop is now seeded with the regime's own impact velocity (crutch 1.4 m/s, lander 9.8 m/s) + a robust start-up-gated peak; crutch/lander now diverge (~1463 N vs ~564 N for the same design).
  • Constraints don't align across fidelities (Tier-C 100% feasible, Tier-B 0%) and Tier-C F_peak ≈ static support load / SEA is an elastic-energy proxy — kept as explicit caveats, and the "feasible Pareto" is not treated as the real constrained front.
  • CV diagnostics were over-trusting — added range-normalized nrmse + constant-mean null_skill to every *_cv_summary.csv (rec. B).

Core recommendation for incorporating context: stop running fully-separate per-(tier,regime) loops; move to a contextual, cost-aware, discrepancy-aware multi-fidelity BO — regime + fidelity as task/context, physical regime descriptors (mass, velocity, energy) and physics features (strut H·d² mass) as inputs, a Kennedy–O'Hagan / autoregressive co-kriging bias model to fuse Tier-C→B→A→bench, peak acceleration in g as the constraint variable, and constrained qNEHVI. First bench prints should target cross-tier disagreement, not the predicted optimum. These are tracked in bo_integration.md.

This last commit only re-syncs sim_bo_campaign.md (Tier-B numbers + CV table) to the regime-aware outputs that the refresh had made stale.

@sgbaird

sgbaird commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator

@copilot each simulation is so cheap that I'm not sure it's even worth doing a cost-aware, multi-fidelity approach. Nevertheless, go ahead and run whatever you'd like in a full scenario. Do your best to find the actual Pareto front within the problem space you've been given. I want to see renders of these Pareto front best ones as well as some renders of the worst performing ones and a few mediocre ones. Maybe call outs with images to an actual Pareto front graph. Or however you'd like to present that

Copilot AI commented Jun 21, 2026

Copy link
Copy Markdown
Contributor Author

@copilot each simulation is so cheap that I'm not sure it's even worth doing a cost-aware, multi-fidelity approach. Nevertheless, go ahead and run whatever you'd like in a full scenari...

Done in bb904cd. Since each Tier-C MuJoCo eval is ~0.15 s, I skipped the cost-aware/multi-fidelity machinery entirely and just densely Sobol-mapped the true Pareto front2048 designs per regime over the exact PR #35 box (R_mm∈[25,40], H_mm∈[60,110], twist_deg∈[40,80], strut_d_mm∈[6,12], cable_d_mm∈[3.0,5.5]), scored on minimize F_peak / maximize SEA / maximize eta (bo_evaluator.evaluate_design, CFC-180 filtered). New script: simulations/pareto_render_campaign.py, writeup: simulations/pareto_render_campaign.md.

Each Pareto-best / worst / mediocre pick is rendered as a 3-D MuJoCo still (strain-coloured tendons) and dropped onto the SEA↔eta Pareto graph as a callout thumbnail with a leader line — exactly what you asked for:

Crutch regime
crutch Pareto front

NASA-lander regime
lander Pareto front

Headline best vs worst drop animations (crutch):

best (max SEA) worst
crutch best drop crutch worst drop

What the front says

regime feasible F_peak span SEA range eta range
crutch 2048/2048 712–739 N (3.7 %) 0.04–2.31 mJ/g 0.922–0.988
lander 2048/2048 4628–4790 N (3.4 %) 0.24–9.53 mJ/g 0.732–0.734

Honest caveats (kept in the writeup)

  • SEA is a peak elastic strain-energy proxy (ranks designs; doesn't predict absolute absorbed joules).
  • twist_deg reads ≈0 at Tier-C because run_regimes builds at the fixed equilibrium twist (the un-consumed-plumbing finding from sobol_t3_diagnostics.md); it only bites at Tier-B/A.

Full artifacts under simulations/outputs/pareto_* (CSVs with the 2048 rows + pareto flag, all stills, both drop GIF/MP4s, pareto_summary.md) and refreshed in outputs_bundle.zip. Reproduce: MUJOCO_GL=osmesa python simulations/pareto_render_campaign.py --n 2048.

@sgbaird

sgbaird commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator

Not sure to what extent any of these are "fair" tasks. I.e., primarily in terms of mass, volume, and contact area.

@copilot suggest ways to make these evaluations for the different objectives fair, especially for the lander problem. I.e., what are the actual design constraints for a scaled up lander module? How would those be relaxed in the campaign here? Would we normalize the objectives ad-hoc or change the way the search space is represented so that certain constraints are always met? E.g., constant mass, fixed contact area, volume, etc.

Send to Edison for mock feedback on the thinking

Copilot AI commented Jun 21, 2026

Copy link
Copy Markdown
Contributor Author

Not sure to what extent any of these are "fair" tasks. I.e., primarily in terms of mass, volume, and contact area.

@copilot suggest ways to make these evaluations for the different...

You're right that the current tasks aren't fair. Wrote up the thinking in simulations/fair_evaluation_analysis.md and sent it to Edison ANALYSIS for mock feedback (commit 19df1ac).

The core problem (quantified): every corner of the PR #35 box is a different-sized object. Sweeping it gives 6.2× cell mass (9.5→59 g), 4.7× envelope volume (118→553 cm³), and 4.0× strut-tip footprint (85→339 mm²). So "fat/short/large-radius wins on SEA" is partly a tautology — those cells just have more material/volume/contact area. Of the three objectives only SEA_J_per_g controls for mass; none control for volume or footprint; and the lander F_peak is a real ~94–98 g transient but base reaction is the better observable. The crutch tolerates this (loose envelope); for the lander, mass and volume are binding budgets, so letting the optimizer "win by getting bigger" is a problem-definition error, not just presentation.

Real scaled-up lander constraints: hard absorber mass budget (~2–5 % of landed mass → ~100–250 g for the 5 kg regime), stowed/deployed envelope volume, footprint/ground-pressure (= base reaction ÷ footprint, a cap and a floor for stability/regolith), and crush stroke (physics floor s ≥ v²/2a_max ≈ 3.3 mm, so H=60–110 mm is mostly a packaging variable, not forced by the 1500 g cap).

Two routes (recommend the hybrid):

  • A — re-parameterize so budgets hold by construction: fix total cell mass m* and solve one axis for it, search in scale-free shape ratios (H/R, H/strut_d, cable_d/strut_d, twist) + one scale variable.
  • B — keep the box, fix the scoring: intensive objectives (SEA_J_per_g and SEA_J_per_cm³, base-reaction peak-g, ground pressure) with mass/volume/footprint + peak-g as Ax outcome constraints under constrained qNEHVI.
  • Hybrid (lander): Route A on the mass budget + dimensionless ratios, Route B for volume/footprint/peak-g.

Edison's verdict (task e43abed6, status success): endorsed the diagnosis and the hybrid, independently reproduced the confound (~6.6× mass / 4.69× vol / 4.0× footprint), and sharpened a few claims I folded back in — reparameterize > outcome-constraints for the mass budget (it's an equality manifold; qNEHVI is for inequalities; Buckingham-π / dimensionless-BO, Senadeera et al. 2025), don't hard-constrain a biased cheap observable (use Tier-C base-reaction only for coarse screening; reserve peak-g acceptance for Tier-B/A/bench), and report fronts at 2–3 fixed mass/envelope budgets rather than one smeared sweep. It also corrected my over-claim that lander F_peak ≈ static load (that's the crutch; lander is a real transient) and noted GEVS/HAVS are requirement proxies, not literal one-number standards.

This is scoped as the analysis + mock review you asked for; the constant-mass-manifold re-parameterization and constrained-qNEHVI wiring are listed as the prioritized follow-on changes.

@sgbaird

sgbaird commented Jun 27, 2026

Copy link
Copy Markdown
Collaborator

@copilot by hybrid, do you mean implement two separate campaigns or do you mean incorporate both into the same campaign?

Copilot AI commented Jun 27, 2026

Copy link
Copy Markdown
Contributor Author

@copilot by hybrid, do you mean implement two separate campaigns or do you mean incorporate both into the same campaign?

Same campaign — not two separate ones. The "hybrid" combines Route A and Route B inside one AxClient campaign per regime, not a second campaign. Route A and Route B are just two mechanisms for removing the size confound, and a single campaign can apply both at once:

  • Route A (structural) fixes the binding budget — for the lander that's mass: re-parameterize onto a constant-mass manifold (search scale-free shape ratios H/R, H/strut_d, cable_d/strut_d, twist + drop one axis to hold m*), so the GP never sees a heavier-than-budget design and SEA's denominator is constant.
  • Route B (scoring) handles the remaining budgets in that same campaign — envelope volume and footprint as Ax outcome constraints under constrained qNEHVI, plus intensive objectives (SEA_J_per_g, SEA_J_per_cm³, base-reaction peak g instead of the payload-accel proxy).

So the structure stays one-campaign-per-regime, exactly like sim_bo_campaign.py / pareto_render_campaign.py run today; the hybrid only changes that campaign's coordinates, objectives, and constraints. Crutch and lander stay separate campaigns from each other because they're different regimes (and the crutch can get by with Route B alone), not because of the hybrid. Clarified this in simulations/fair_evaluation_analysis.md (commit be9 — see the new paragraph under "Recommended hybrid").

@copilot by hybrid, do you mean implement two separate campaigns or do you mean incorporate both into the same campaign?

Correction: the commit is cbcf27b (not be9).

@sgbaird

sgbaird commented Jun 27, 2026

Copy link
Copy Markdown
Collaborator

@copilot update the BO script(s) based on completing the hybrid approach. Refer to honegumi docs as needed (via context7 if you prefer)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Begin exploring state-of-the-art simulations for tensegrity, tensegrity-like structures, and other related methods

4 participants