Skip to content

Edison literature briefs: objectives / outcomes per drop-test data source + cross-modality ANALYSIS synthesis#60

Draft
sgbaird with Copilot wants to merge 3 commits into
mainfrom
copilot/explore-objective-functions
Draft

Edison literature briefs: objectives / outcomes per drop-test data source + cross-modality ANALYSIS synthesis#60
sgbaird with Copilot wants to merge 3 commits into
mainfrom
copilot/explore-objective-functions

Conversation

Copilot AI commented May 21, 2026

Copy link
Copy Markdown
Contributor

Per #36 comment 4509305026, one LITERATURE_HIGH Edison query per measurement modality, tying raw signal → BO objectives / constraints / characterization settings for the PETG+TPU 85A H2D campaign (PRs #30 / #33). Per PR #60 comment 4511245383, a follow-up ANALYSIS task synthesizes those 5 briefs into a single cohesive recommendation and answers the normalization-by-mass/volume question raised against the PR #35 design space.

Changes

  • scripts/edison/submit_objective_functions.py — driver that submits 5 queries non-blocking, then polls get_task(task_id=…) to terminal status. Idempotent via <slug>-SUBMITTED.json placeholders so re-runs resume polling instead of re-billing. Mirrors EDISON_API_KEYEDISON_PLATFORM_API_KEY per repo convention.
  • edison-trajectories/objective-functions/0{1..5}-*.{md,json} — verbatim formatted_answer + full model_dump_json for each of:
    1. Accelerometer on M23 (200 ms shock + ~10 s ringdown) — cfd30f3e
    2. High-speed / slow-mo phone video — 7d6b43bf
    3. Electrodynamic shaker transmissibility — 31126ee7
    4. Pneumatic slug-firing / gas gun — 9d74ab2e
    5. Polytec VibroFlex QTec LDV — f40e41a7
  • Uniform (a–g) skeleton in every brief so they diff side-by-side when wiring bo/tensegrity_campaign.py: raw observables → BO objectives (g_max, SEA, eta, epsilon_d, transmissibility, zeta, N_reuse, …) → constraints → characterization settings (rate / mount / ASTM-ISO-JEDEC standard) → BO-campaign integration (Ax Metric shape, noise model, fidelity tier) → gotchas → numbered DOI refs.
  • scripts/edison/submit_objective_functions_synthesis.py — follow-up driver that uploads every per-modality .md / .json artifact via client.upload_file()data_entry:uuid and attaches the full set to a single JobNames.ANALYSIS create_task(files=[...]) call. Idempotent via a synthesis-SUBMITTED.json placeholder. The prompt asks for: (1) a master cross-modality objective/constraint matrix, (2) a concrete Ax MultiObjective / ObjectiveThreshold / OutcomeConstraint recipe with per-metric noise model, (3) multifidelity slotting into the MuJoCo → Newton → PolyFEM+IPC ladder from PR 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, (4) a dedicated normalization section comparing SEA (J/g), VEA (MJ/m³), Pajunen 2019 W_min = C_min · ρ_rel, ASTM cushion-curve g_max(ρ_T), and Gibson-Ashby ρ_rel^n scaling under 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 design space that couples m_specimen and V_bb on every trial, (5) cross-modality sanity equalities, and (6) ranked open gaps for further queries. ANALYSIS task id 789de8ab-9c68-4782-a70c-0a5a4e10e268 submitted; fetch next session and write synthesis-789de8ab-*.{md,json}.
  • edison-trajectories/objective-functions/README.md — index table, (a–g) recap, and a cross-modality picture assigning each sensor a BO role (destructive primary objectives / ground-truth scoring / cheap pre-screen / strain-rate extension / non-contact cross-check), with links to equipment/, bo/, and simulations/validation_experiments.md. Now also lists the synthesis row + run command for the new driver.

Driver shape

# scripts/edison/submit_objective_functions.py — idempotent resume
placeholder = OUT_DIR / f"{q['slug']}-SUBMITTED.json"
if placeholder.exists():
    task_id = json.loads(placeholder.read_text())["task_id"]
else:
    task_id = client.create_task({"name": JobNames.LITERATURE_HIGH,
                                  "query": build_prompt(q)})
    placeholder.write_text(json.dumps({"task_id": task_id, ...}))
# poll until status in {success, failed, cancelled, error, crashed}
while time.time() < deadline:
    res = client.get_task(task_id=task_id)
    if (res.status or "").lower() in TERMINAL: break
    time.sleep(30)
# scripts/edison/submit_objective_functions_synthesis.py — upload + ANALYSIS
file_uris = [client.upload_file(file_path=p, name=p.name, tags=[...])
             for p in sorted(per_modality_briefs)]   # "data_entry:{uuid}"
task_id = client.create_task({"name": JobNames.ANALYSIS,
                              "query": SYNTHESIS_PROMPT},
                             files=file_uris)
PLACEHOLDER.write_text(json.dumps({"task_id": task_id,
                                   "uploaded_files": [...], ...}))

Note: run_tasks_until_done() cannot resume by task_idTaskRequest rejects it as extra_forbidden — so polling is the correct primitive here.

Copilot AI changed the title [WIP] Explore objective functions and outcome measurements of interest Edison literature briefs: objectives / outcomes per drop-test data source May 21, 2026
Copilot AI requested a review from sgbaird May 21, 2026 15:20
@sgbaird

sgbaird commented May 21, 2026

Copy link
Copy Markdown
Collaborator

@copilot send another edison query (analysis mode) to synthesize the findings from the previous trajectories into a cohesive file, making sure to upload all of the previous artifacts. Fetch next session.

In tandem with that, I have a question: based on these results, would it make more sense during the optimization campaign to try to normalize by mass/volume, etc.? I.e., how do we normalize the results since changing the parameters in #35 changes both the mass and bounding volume. I think there might be another PR commentary somewhere that touches on this, but you might have to do a pretty in-depth, one-by-one search to find it.

Copilot AI commented May 21, 2026

Copy link
Copy Markdown
Contributor Author

@sgbaird Unfortunately I hit an unexpected error while processing your comment. I've automatically reported this to GitHub.

You can ask me to try again later by mentioning me in a new comment.

If you want to contact GitHub about this error, please mention the following identifier so they can better serve you: 69483478-be78-490d-bf47-8f9f24088f90

Sorry for the inconvenience!

@sgbaird

sgbaird commented May 21, 2026

Copy link
Copy Markdown
Collaborator

@copilot send another edison query (analysis mode) to synthesize the findings from the previous trajectories into a cohesive file, making sure to upload all of the previous artifacts. Fetch next session.

In tandem with that, I have a question: based on these results, would it make more sense during the optimization campaign to try to normalize by mass/volume, etc.? I.e., how do we normalize the results since changing the parameters in #35 changes both the mass and bounding volume. I think there might be another PR commentary somewhere that touches on this, but you might have to do a pretty in-depth, one-by-one search to find it.

Copilot AI commented May 21, 2026

Copy link
Copy Markdown
Contributor Author

@copilot send another edison query (analysis mode) to synthesize the findings from the previous trajectories into a cohesive file, making sure to upload all of the previous artifacts. ...

Submitted Edison ANALYSIS task 789de8ab-9c68-4782-a70c-0a5a4e10e268 in c8e1ade — all 10 prior .md + .json artifacts uploaded via client.upload_file()data_entry:… and attached to the task (see synthesis-SUBMITTED.json for the full upload manifest). Will fetch next session.

Normalization (short answer, pending the synthesis): I searched issues/PRs/branches for a prior commentary thread on this and didn't find a dedicated one; the existing per-modality briefs do discuss it implicitly, so here's the working position the synthesis prompt asks Edison to confirm against the literature.

The five PR #35 design variables (R_mm, H_mm, twist_deg, strut_d_mm, cable_d_mm, plus tiling/infill) couple both m_specimen and the bounding-cylinder V_bb on every trial, so raw (unnormalized) BO outcomes silently confound "this architecture is better" with "this cell happens to be bigger / heavier". Three commonly-cited normalizations from the briefs:

  • Mass-normalize (SEA = E_abs / m, J/g) — what brief 01 already calls out as a primary objective. Defensible for the crutch-tip and lander-payload framings (mass is the budgeted resource). Bias: rewards low-mass cells even when per-unit-volume crush is worse.
  • Volume-normalize (VEA = E_abs / V_bb, MJ/m³, or σ–ε integrated to ε_d) — brief 04. Right denominator when packaging volume is the budgeted resource (egg-drop bounding sphere ≤200 mm). Bias: rewards filling the box even if mass-inefficient.
  • Relative-density composite — Pajunen 2019 W_min = C_min · ρ_rel (brief 04 directly cites the polymer-tensegrity target W_min < 0.21 at ρ_rel < 0.1). Gibson-Ashby E*/E_s ~ ρ_rel^n, σ_pl*/σ_ys ~ C·ρ_rel^m. Right denominator for cross-architecture comparison at fixed parent solid (PETG strut + TPU 85A tendon stays constant across 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 trials, so this works).
  • Cushion-curve (ASTM D1596 / D5276 / D4168) g_max vs static stress ρ_T = m_payload·g / A_footprint — collapses thickness + footprint into one curve.

Working recommendation for bo/tensegrity_campaign.py (subject to the synthesis reply):

  1. Primary objectives (2–3 for qNEHVI): maximize SEA_J_per_g, minimize g_max (already intensive — m_top·a_top is independent of specimen mass), maximize eta = F_mean / F_peak (intensive by construction).
  2. Promote m_specimen ≤ 500 g and V_bb ≤ V_bb_max to constraints rather than ratios, so the Pareto front isn't artificially flattered by trivially shrinking the cell.
  3. As a secondary cross-architecture FoM, log Pajunen's W_min as an auxiliary Metric (Ax can carry it without it driving acquisition) so we can compare against the published W_min < 0.21 envelope.
  4. For modality 4 (gas gun) explicitly do not mass-pool with modality 1 (M23) — different strain-rate regime; use a MultiTaskGP per the multifidelity section.

Re measurement cost: m_specimen is a single weigh-in (cheap, do it for every trial), and V_bb falls out of the BO parameterization directly without any post-print measurement. So normalization can be computed at every trial with one extra line. The synthesis task is asked to confirm/refine all of the above with primary citations.

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.

Explore objective functions and outcome measurements of interest

2 participants