auto: daily sync

This commit is contained in:
2026-02-20 08:00:17 +00:00
parent 176b75328f
commit c59072eff2
8 changed files with 26072 additions and 53179 deletions

View File

@@ -52,8 +52,8 @@ These directly control rib pattern shape and density. Every trial samples all 8.
| `gamma_stress` | [0.0, 1.5] | Stress feedback gain — how much FEA stress adds density |
| `R_0` | [10, 100] mm | Base influence radius — how far hole influence spreads |
| `R_edge` | [5, 40] mm | Edge influence radius — depth of perimeter reinforcement band |
| `s_min` | [8, 20] mm | Minimum triangle edge length → densest zone spacing |
| `s_max` | [25, 60] mm | Maximum triangle edge length → sparsest zone spacing |
| `s_min` | [15, 35] mm | Minimum triangle edge length → densest zone spacing (manufacturing floor: 15 mm) |
| `s_max` | [40, 60] mm | Maximum triangle edge length → sparsest zone spacing (lower bound 40 guarantees s_min < s_max) |
**Total: 8 continuous variables.** Manageable for Optuna TPE; expect useful signal in 50100 trials, convergence in 200500.
@@ -67,9 +67,8 @@ They can be adjusted between campaigns if the process changes.
| `t_min` | 2.5 mm | Minimum rib thickness: thinner ribs are not machinable and would break | CNC milling minimum land width |
| `t_0` | 3.5 mm | Nominal rib thickness: baseline starting width before density scaling | Design intent |
| `w_frame` | 5.0 mm | Perimeter frame width: solid band around the sandbox boundary | Edge seal, clamping, aesthetics |
| `r_f` | 1.5 mm | Pocket fillet radius: corner radius on each pocket | = tool radius. Smaller → need smaller endmill |
| `r_f` | 1.5 mm | Pocket fillet radius: corner radius on each pocket. **Sole pocket size filter.** | = tool radius. Smaller → need smaller endmill |
| `d_keep` | 1.2× | Hole keepout multiplier: minimum clear distance = 1.2 × hole diameter | Prevents thin walls around bolt holes |
| `min_pocket_radius` | 6.0 mm | Minimum inscribed radius of any pocket | Must fit the drill/endmill for pocket entry |
| `min_triangle_area` | 25.0 mm² | Minimum pocketable triangle area | Below this: too small to machine → skip as solid |
> To change manufacturing constraints for a campaign, edit `MANUFACTURING_CONSTRAINTS` in
@@ -204,8 +203,9 @@ All three were imported to NX using the update-in-place workflow (sketch preserv
| Estimated iteration time | ~90120 sec (NX mesh + Nastran + extract) |
| Total runtime estimate | ~810 hours for 200 trials |
Stress feedback (`gamma_stress`) will be active from trial 1 if OP2 from the previous trial is available.
For trial 1, the optimizer will sample `gamma_stress` but the stress field is loaded from the baseline OP2.
In V1, `gamma_stress` is sampled by TPE but has no effect (no S_prev stress field available).
In V2 (sequential seeding), S_prev is loaded from the globally best previous trial; `gamma_stress`
then actively reshapes the density field toward high-stress zones. No extra FEA per trial.
---

View File

@@ -65,8 +65,8 @@ penalty = 1e4 × ((σ_max / σ_allow) 1)² if σ_max > σ_allow
| `gamma_stress` | 0.0 | 1.5 | — | FEA stress feedback gain |
| `R_0` | 10 | 100 | mm | Base hole influence radius |
| `R_edge` | 5 | 40 | mm | Edge influence radius |
| `s_min` | 8 | 20 | mm | Min cell size (densest) |
| `s_max` | 25 | 60 | mm | Max cell size (sparsest) |
| `s_min` | 15 | 35 | mm | Min cell size (densest) — manufacturing floor: 15 mm |
| `s_max` | 40 | 60 | mm | Max cell size (sparsest) — lower bound 40 guarantees s_min < s_max |
Fixed parameters (manufacturing constraints + math constants): see `optimization_engine/isogrid/study.py`.

View File

@@ -355,7 +355,18 @@ def make_objective(rm: TrialRetentionManager):
print(f" [Brain] Total pockets: {n_pockets_total}")
# ── 3b. Save per-trial figures (density, mesh, rib pattern) ──────────
# ── 3b. Degenerate check — prune near-solid trials early ─────────────
# If fewer than N_MIN_POCKETS are generated, the design is essentially a
# solid plate (likely all triangles rejected by area/fillet filter).
# Return a large penalty immediately — no point burning an NX license.
N_MIN_POCKETS = 8
if n_pockets_total < N_MIN_POCKETS:
print(f" [Brain] Degenerate trial: only {n_pockets_total} pockets "
f"(min={N_MIN_POCKETS}) — pruning before NX")
trial.set_user_attr("error", f"degenerate:{n_pockets_total}_pockets")
return 1e6
# ── 3d. Save per-trial figures (density, mesh, rib pattern) ──────────
t_fig = time.time()
n_figs = len(plot_trial_figures(sb_data, trial_dir))
print(f" [Plot] {n_figs} figures → trial_{trial_number:04d}/ ({time.time()-t_fig:.1f}s)")