1---2name: parameter-optimization3description: Explore and optimize simulation parameters via design of experiments (DOE), sensitivity analysis, and optimizer selection — generate Latin Hypercube, quasi-random, or factorial sample plans, rank parameter influence with sensitivity scores, recommend Bayesian optimization, CMA-ES, or gradient- based methods based on dimension and budget, and fit surrogate models for expensive evaluations. Use when calibrating material properties against experimental data, planning a parameter sweep, performing uncertainty quantification, or choosing an optimization strategy for a simulation with a limited evaluation budget, even if the user only says "which parameters matter most" or "how do I calibrate my model."4---56# Parameter Optimization78## Goal910Provide a workflow to design experiments, rank parameter influence, and select optimization strategies for materials simulation calibration.1112## Requirements1314- Python 3.10+15- No external dependencies (uses Python standard library only)1617## Inputs to Gather1819Before running any scripts, collect from the user:2021| Input | Description | Example |22|-------|-------------|---------|23| Parameter bounds | Min/max for each parameter with units | `kappa: [0.1, 10.0] W/mK` |24| Evaluation budget | Max number of simulations allowed | `50 runs` |25| Noise level | Stochasticity of simulation outputs | `low`, `medium`, `high` |26| Constraints | Feasibility rules or forbidden regions | `kappa + mobility < 5` |2728## Decision Guidance2930### Choosing a DOE Method3132```33Is dimension <= 3 AND full coverage needed?34├── YES → Use factorial35└── NO → Is sensitivity analysis the goal?36 ├── YES → Use quasi-random (preferred; "sobol" is accepted but deprecated)37 └── NO → Use lhs (Latin Hypercube)38```3940| Method | Best For | Avoid When |41|--------|----------|------------|42| `lhs` | General exploration, moderate dimensions (3-20) | Need exact grid coverage |43| `quasi-random` | Sensitivity analysis, uniform coverage (preferred) | Very high dimensions (>20) |44| `sobol` | Deprecated alias of `quasi-random` (emits a warning) | New code (use `quasi-random`) |45| `factorial` | Low dimension (<4), need all corners | High dimension (exponential growth) |4647> **Factorial sizing:** the factorial grid is `levels` evenly spaced values per48> parameter, producing exactly `levels ** params` samples. Set the resolution49> explicitly with `--levels` (e.g. `--params 2 --levels 4` -> 16 samples). If you50> use `--budget` instead, the script back-computes `levels = round(budget ** (1/params))`51> and **warns** whenever the realized sample count differs from the requested52> budget (e.g. `--budget 20 --params 2` realizes 16 samples). For an exact design,53> pass a perfect power (`--budget 16`) or, preferably, `--levels`.5455### Choosing an Optimizer5657```58Is dimension <= 10 AND budget <= 100?59├── YES → Bayesian Optimization60└── NO → Is dimension <= 20?61 ├── YES → CMA-ES62 └── NO → Random Search with screening63```6465| Noise Level | Recommendation |66|-------------|----------------|67| Low | Gradient-based if derivatives available, else Bayesian Optimization |68| Medium | Bayesian Optimization with noise model |69| High | Evolutionary algorithms or robust Bayesian Optimization |7071## Script Outputs (JSON Fields)7273| Script | Output Fields |74|--------|---------------|75| `scripts/doe_generator.py` | `samples`, `method`, `coverage` (`count`, `dimension`; plus `levels` and a top-level `requested_budget`/`note` for factorial) |76| `scripts/optimizer_selector.py` | `recommended`, `expected_evals`, `notes` |77| `scripts/sensitivity_summary.py` | `ranking`, `notes` |78| `scripts/surrogate_builder.py` | `model_type`, `metrics` (`mse`, `cv_error`, `output_variance`), `notes` |7980## Workflow81821. **Generate DOE** with `scripts/doe_generator.py`832. **Run simulations** at DOE sample points (user's responsibility)843. **Summarize sensitivity** with `scripts/sensitivity_summary.py`854. **Choose optimizer** using `scripts/optimizer_selector.py`865. **(Optional)** Fit surrogate with `scripts/surrogate_builder.py`8788## CLI Examples8990```bash91# Generate 20 LHS samples for 3 parameters92python3 scripts/doe_generator.py --params 3 --budget 20 --method lhs --json9394# Full factorial with 4 levels per parameter (2 params -> 16 samples)95python3 scripts/doe_generator.py --params 2 --levels 4 --method factorial --json9697# Rank parameters by sensitivity scores98python3 scripts/sensitivity_summary.py --scores 0.2,0.5,0.3 --names kappa,mobility,W --json99100# Get optimizer recommendation for 3D problem with 50 eval budget101python3 scripts/optimizer_selector.py --dim 3 --budget 50 --noise low --json102103# Build surrogate model from simulation data104python3 scripts/surrogate_builder.py --x 0,1,2 --y 10,12,15 --model rbf --json105```106107## Conversational Workflow Example108109**User**: I need to calibrate thermal conductivity and diffusivity for my FEM simulation. I can run about 30 simulations.110111**Agent workflow**:1121. Identify 2 parameters → `--params 2`1132. Budget is 30 → `--budget 30`1143. Use LHS for general exploration:115 ```bash116 python3 scripts/doe_generator.py --params 2 --budget 30 --method lhs --json117 ```1184. After user runs simulations and provides outputs, summarize sensitivity:119 ```bash120 python3 scripts/sensitivity_summary.py --scores 0.7,0.3 --names conductivity,diffusivity --json121 ```1225. Recommend optimizer:123 ```bash124 python3 scripts/optimizer_selector.py --dim 2 --budget 30 --noise low --json125 ```126127## Error Handling128129| Error | Cause | Resolution |130|-------|-------|------------|131| `params must be positive` | Zero or negative dimension | Ask user for valid parameter count |132| `budget must be positive` | Zero or negative budget | Ask user for realistic simulation budget |133| `argument --method: invalid choice: <value> (choose from lhs, sobol, quasi-random, factorial)` | Invalid method (argparse) | Use decision guidance to pick a valid method |134| `could not convert string to float: <token>` | Non-numeric value in `--scores`/`--x`/`--y` | Reformat as `0.1,0.2,0.3` |135| `scores must be a comma-separated list` | Empty `--scores` input | Provide at least one numeric score |136137## Verification checklist138139- [ ] Recorded the exact `doe_generator.py` `coverage.count` and confirmed it matches the intended design — for `factorial`, verified `count == levels ** params` and that no `note`/`requested_budget` mismatch warning was emitted (or that the realized count is acceptable).140- [ ] Confirmed the chosen `--method` matches the Decision Guidance for the actual dimension/goal, and that `quasi-random` was used instead of the deprecated `sobol` alias (no `DeprecationWarning` in output).141- [ ] Recorded the `optimizer_selector.py` `recommended` strategy and `expected_evals`, and verified `expected_evals <= budget` so the plan is feasible within the stated evaluation budget.142- [ ] Logged the `sensitivity_summary.py` `ranking` and checked whether the top sensitivity is `< 0.1` (the "All sensitivities are low" note); if so, did not over-interpret the ranking and revisited the output metric.143- [ ] For surrogate fits, judged quality with `metrics.cv_error` (leave-one-out), NOT in-sample `mse` — especially for `rbf`, where `mse` is near zero by construction — and compared `cv_error` against `metrics.output_variance` to confirm the surrogate beats the constant-mean baseline.144- [ ] Confirmed any reported `cv_error` is a finite number (not `NaN`), i.e. there were enough samples for leave-one-out (`poly`: `n > degree+1`; `rbf`: `n >= 3`).145146## Common pitfalls & rationalizations147148| Tempting shortcut | Why it's wrong / what to do |149|-------------------|------------------------------|150| "RBF surrogate `mse` is ~0, so the model is excellent." | RBF is an exact interpolant — in-sample `mse` is near zero by construction and says nothing about generalization. Judge fit with `metrics.cv_error` and compare it to `output_variance`. |151| "I asked for `--budget 20` factorial, so I got 20 samples." | Factorial honors `levels ** params`, not the budget; `--budget 20 --params 2` realizes 16 samples and emits a `note`/warning. Use `--levels` for an exact, intended design. |152| "`sobol` gives me a true Sobol low-discrepancy sequence." | `sobol` is a deprecated alias that emits a `DeprecationWarning` and uses a simplified golden-ratio additive recurrence, not a true Sobol sequence. Use `quasi-random`; for production Sobol use `scipy.stats.qmc`. |153| "The optimizer recommendation is just advice — budget doesn't matter." | The recommendation is gated on dimension AND budget (BO only for `dim<=10 AND budget<=100`), and `expected_evals` is capped at the budget. Record both and confirm the plan fits the real budget. |154| "One sensitivity score is highest, so that parameter dominates." | The script only sorts the scores you pass in; it computes no sensitivity itself. If the top score is `< 0.1` it flags that all sensitivities are low — get the scores from a real screening/Sobol analysis before trusting the ranking. |155| "It printed JSON without erroring, so the result is valid." | Exit success only means inputs parsed. Verify the design size, `expected_evals <= budget`, a finite `cv_error`, and that the surrogate beats `output_variance` before trusting any output. |156157## Security158159### Input Validation160- `sensitivity_summary.py` validates `--names` against `[a-zA-Z_][a-zA-Z0-9_ .-]*` with a 200-char limit, preventing shell metacharacter injection via crafted parameter names161- All numeric list inputs are validated as finite numbers (`NaN`/`Inf` rejected)162- Comma-separated value lists are capped (10,000 for scores, 100,000 for surrogate data) to prevent resource exhaustion163- `doe_generator.py` caps dimension at 1,000 and budget at 1,000,000; `optimizer_selector.py` caps dimension at 100,000 and budget at 10,000,000164- `--method` is validated against a fixed allowlist (`lhs`, `quasi-random`/`sobol`, `factorial`); `sobol` is an accepted but deprecated alias of `quasi-random`165- `--noise` is validated against a fixed allowlist (`low`, `medium`, `high`)166- `--model` (surrogate type) is validated against a fixed allowlist (`rbf`, `poly`)167- `--levels` (factorial grid resolution) is validated as an integer in `[2, 1000]`168169### File Access170- Scripts read no external files; all inputs are provided via CLI arguments171- Scripts write only to stdout (JSON output); no files are created unless the agent explicitly uses the Write tool172173### Tool Restrictions174- **Read**: Used to inspect script source, references, and user data files175- **Write**: Used to save DOE sample plans, sensitivity rankings, or optimizer recommendations; writes are scoped to the user's working directory176- **Grep/Glob**: Used to locate relevant files and search references177- The skill's `allowed-tools` excludes `Bash` to prevent the agent from executing arbitrary commands when processing user-provided parameter names and constraints178179### Safety Measures180- No `eval()`, `exec()`, or dynamic code generation181- All subprocess calls use explicit argument lists (no `shell=True`)182- Reduced tool surface (no Bash) limits the agent to read/write operations only183- Parameter names are sanitized before use, preventing injection via crafted identifiers184185## Limitations186187- **Not for real-time optimization**: Scripts provide recommendations, not live optimization loops188- **Surrogate is lightweight**: `surrogate_builder.py` fits a real 1-D least-squares polynomial (`poly`) or Gaussian RBF interpolant (`rbf`) using only the standard library and reports honest residual `mse`, leave-one-out `cv_error`, and the data `output_variance`; for production use scipy/scikit-learn/GPyTorch. For `rbf`, in-sample `mse` is near zero by construction (exact interpolation) — judge fit quality with `cv_error`189- **No automatic simulation execution**: User must run simulations externally and provide results190191## References192193- `references/doe_methods.md` - Detailed DOE method comparison194- `references/optimizer_selection.md` - Optimizer algorithm details195- `references/sensitivity_guidelines.md` - Sensitivity analysis interpretation196- `references/surrogate_guidelines.md` - Surrogate model selection197198## Version History199200- **v1.2.2** (2026-06-24): Added Verification checklist and Common pitfalls & rationalizations sections to drive evidence-based use of the DOE, optimizer, sensitivity, and surrogate scripts201- **v1.2.0** (2026-06-23): Real surrogate fits (`poly` least-squares, `rbf` interpolation) with honest `mse`/`cv_error`/`output_variance`; explicit factorial `--levels` with budget-mismatch warnings; BO dimension cutoff harmonized to dim<=10; corrected Security/Error-Handling/output-field docs to match script behavior202- **v1.1.0** (2024-12-24): Enhanced documentation, decision guidance, conversational examples203- **v1.0.0**: Initial release with core scripts