From 5e1e726c5a8b722045461691be08bf8fef6b6632 Mon Sep 17 00:00:00 2001 From: rafaelborges5 Date: Wed, 1 Jul 2026 07:00:39 +0000 Subject: [PATCH] feat: add skidpad score sensitivity experiment OAT (one-at-a-time) +-15% sensitivity of the average timed-lap score (skidpad_score_s) to the four-wheel model and solver parameters. Builds the skidpad track once, re-solves the OCP per perturbation in parallel, and ranks parameters by lap-time swing and elasticity. Outputs a tornado plot, per-solve CSV, and JSON summary. Findings (baseline score 4.740 s, all solves converged): rear tyre peak grip D_rear dominates (0.64 s over +-15%), then front grip, mass, and downforce C_l (~0.2 s each); margin, drag, reg_u_l2, CG height, and Iz are negligible (<0.02 s). --- data/sensitivity/README.md | 67 +++ data/sensitivity/skidpad_sensitivity.csv | 20 + data/sensitivity/skidpad_sensitivity.png | Bin 0 -> 105573 bytes .../skidpad_sensitivity_summary.json | 88 +++ src/experiments/skidpad_sensitivity.py | 506 ++++++++++++++++++ 5 files changed, 681 insertions(+) create mode 100644 data/sensitivity/README.md create mode 100644 data/sensitivity/skidpad_sensitivity.csv create mode 100644 data/sensitivity/skidpad_sensitivity.png create mode 100644 data/sensitivity/skidpad_sensitivity_summary.json create mode 100644 src/experiments/skidpad_sensitivity.py diff --git a/data/sensitivity/README.md b/data/sensitivity/README.md new file mode 100644 index 0000000..1714b05 --- /dev/null +++ b/data/sensitivity/README.md @@ -0,0 +1,67 @@ +# Skidpad score sensitivity study + +One-at-a-time (OAT) local sensitivity of the **average timed-lap time** (the FS +*score*, `profiling.skidpad_score_s` = mean of the two timed laps) to the +four-wheel vehicle/solver parameters. + +Reproduce with: + +```bash +OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 \ +PYTHONPATH=src python src/experiments/skidpad_sensitivity.py \ + --config configs/skidpad.yaml --delta 0.15 --jobs 4 +``` + +## Method + +- Skidpad track is built once from `configs/skidpad.yaml`; the four-wheel OCP is + then re-solved for each perturbation (IPOPT, euler integrator, identical + `time_weights`/`terminal_speed`). +- Each parameter is moved **±15 %** around the baseline, one at a time. Knobs + that group several params (`D_rear` = `D_rr` & `D_rl`, `D_front` = `D_fl` & + `D_fr`) scale all of them together. +- **Elasticity** `E = (Δscore/score) / (Δp/p)` is a dimensionless slope: `E=-0.45` + means a +1 % parameter increase lowers the average lap by 0.45 %. The ranking + uses the absolute lap-time **swing** (seconds) over the ±15 % window. +- Baseline average timed-lap score: **4.740 s**. All 19 solves returned + `Solve_Succeeded`. + +## Results (ranked by influence) + +| Rank | Parameter | Base | −15 % | +15 % | swing [s] | elasticity | +|-----:|-----------|-----:|------:|------:|----------:|-----------:| +| 1 | rear grip `D_rear` | 1.20 | 5.095 | 4.457 | **0.638** | −0.449 | +| 2 | front grip `D_front` | 1.20 | 4.902 | 4.629 | 0.273 | −0.192 | +| 3 | mass `m` | 170 | 4.615 | 4.835 | 0.219 | +0.154 | +| 4 | downforce `C_l` | 5.54 | 4.844 | 4.634 | 0.210 | −0.148 | +| 5 | margin `boundary_margin` | 0.20 | 4.732 | 4.748 | 0.016 | +0.011 | +| 6 | drag `C_d` | 1.58 | 4.733 | 4.748 | 0.015 | +0.011 | +| 7 | `reg_u_l2` | 0.015 | 4.734 | 4.748 | 0.014 | +0.010 | +| 8 | CG height `h` | 0.246 | 4.737 | 4.744 | 0.007 | +0.005 | +| 9 | yaw inertia `Iz` | 250 | 4.738 | 4.742 | 0.004 | +0.003 | + +See `skidpad_sensitivity.png` (tornado plot), `skidpad_sensitivity.csv` (every +raw solve), and `skidpad_sensitivity_summary.json` (machine-readable summary). + +## Takeaways + +- **Tyre peak grip dominates.** Rear grip `D_rear` is the single biggest lever + (~3× the next parameter); front grip is second. Skidpad is a steady-state, + grip-limited corner, so peak `D` maps almost directly into corner speed, and + the rear-biased static load (`lf > lr`) makes the rear tyres the limiting + pair. This is also the least free parameter physically — it reflects the tyre + model, not something you tune. +- Of the *tunable / design* knobs, **mass** and **aero downforce `C_l`** are the + meaningful ones (~0.21–0.22 s over ±15 %, elasticity ≈ 0.15). They trade off + in opposite directions, as expected. Note `C_l` only enters through downforce, + so its grip benefit scales with v² and is modest at skidpad speeds (~12 m/s). +- **Solver / corridor knobs are negligible**: `reg_u_l2`, `boundary_margin`, + `C_d`, `h`, and `Iz` each move the score by <0.02 s (elasticity ≤ 0.01). The + L2 regularisation is well below the level where it distorts the lap, and yaw + inertia barely matters in this near-steady manoeuvre — both reassuring for the + current setup. + +> Caveat: these are *local* ±15 % OAT sensitivities about one operating point. +> Interactions between parameters and larger excursions (e.g. big margin or grip +> changes) can be non-linear; widen `--delta` or run a coupled sweep to probe +> those. diff --git a/data/sensitivity/skidpad_sensitivity.csv b/data/sensitivity/skidpad_sensitivity.csv new file mode 100644 index 0000000..814ace1 --- /dev/null +++ b/data/sensitivity/skidpad_sensitivity.csv @@ -0,0 +1,20 @@ +knob,tag,multiplier,param_value,score_s,timed_time_s,full_time_s,status,solve_time_s,iters +baseline,baseline,1.0,nan,4.740072009101534,9.480144018203069,24.408978411789178,Solve_Succeeded,103.158144795,36 +m,m_x0p85,0.85,144.5,4.615329978661124,9.230659957322247,23.733437263235718,Solve_Succeeded,103.07811617699997,37 +m,m_x1p15,1.15,195.49999999999997,4.834693092402854,9.669386184805708,24.93276289268389,Solve_Succeeded,86.61417656799995,35 +Iz,Iz_x0p85,0.85,212.5,4.737568582217398,9.475137164434797,24.37953623746616,Solve_Succeeded,91.54032464400007,38 +Iz,Iz_x1p15,1.15,287.5,4.742002966935889,9.484005933871778,24.433947555840923,Solve_Succeeded,90.80592223899998,34 +reg_u_l2,reg_u_l2_x0p85,0.85,0.01275,4.733660775527216,9.467321551054432,24.316874679803124,Solve_Succeeded,90.239864238,38 +reg_u_l2,reg_u_l2_x1p15,1.15,0.017249999999999998,4.747747794848977,9.495495589697954,24.495904367233393,Solve_Succeeded,77.98857451999993,35 +D_rear,D_rear_x0p85,0.85,1.02,5.094813913837953,10.189627827675906,26.049556440109733,Solve_Succeeded,83.41913291800006,40 +D_rear,D_rear_x1p15,1.15,1.38,4.456787934473439,8.913575868946879,23.101462714559105,Solve_Succeeded,91.38867170399999,35 +boundary_margin,boundary_margin_x0p85,0.85,0.17,4.732085539416261,9.464171078832521,24.387458259898395,Solve_Succeeded,77.02125245299999,36 +boundary_margin,boundary_margin_x1p15,1.15,0.22999999999999998,4.7480569541913695,9.496113908382739,24.434465704566502,Solve_Succeeded,93.01054706900004,37 +C_l,C_l_x0p85,0.85,4.709,4.8439512656554555,9.687902531310911,24.881045259787204,Solve_Succeeded,77.36289373099999,36 +C_l,C_l_x1p15,1.15,6.3709999999999996,4.633963737301138,9.267927474602276,23.921053788576025,Solve_Succeeded,75.75866207400009,35 +D_front,D_front_x0p85,0.85,1.02,4.90179078112475,9.8035815622495,25.11281055420629,Solve_Succeeded,76.651006639,36 +D_front,D_front_x1p15,1.15,1.38,4.629125252379634,9.258250504759268,23.929064563227428,Solve_Succeeded,114.6799860220001,51 +C_d,C_d_x0p85,0.85,1.343,4.732673846625645,9.46534769325129,24.373709527780054,Solve_Succeeded,91.18542284300008,36 +C_d,C_d_x1p15,1.15,1.817,4.747695161405053,9.495390322810106,24.442892572842457,Solve_Succeeded,75.72656160200006,35 +h,h_x0p85,0.85,0.20909999999999998,4.736617700377183,9.473235400754366,24.388892039984515,Solve_Succeeded,76.00479720299995,36 +h,h_x1p15,1.15,0.2829,4.743668823804108,9.487337647608216,24.426229710426636,Solve_Succeeded,90.405708581,36 diff --git a/data/sensitivity/skidpad_sensitivity.png b/data/sensitivity/skidpad_sensitivity.png new file mode 100644 index 0000000000000000000000000000000000000000..0faa09ff08efe2171cc7a0e0402b89bb546bf90e GIT binary patch literal 105573 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 literal 0 HcmV?d00001 diff --git a/data/sensitivity/skidpad_sensitivity_summary.json b/data/sensitivity/skidpad_sensitivity_summary.json new file mode 100644 index 0000000..246de59 --- /dev/null +++ b/data/sensitivity/skidpad_sensitivity_summary.json @@ -0,0 +1,88 @@ +{ + "config": "configs/skidpad.yaml", + "delta": 0.15, + "score_base_s": 4.740072009101534, + "knobs": [ + { + "knob": "m", + "label": "mass m", + "base_value": 170.0, + "score_lo": 4.615329978661124, + "score_hi": 4.834693092402854, + "swing_s": 0.21936311374173023, + "elasticity": 0.1542614495592229 + }, + { + "knob": "Iz", + "label": "yaw inertia Iz", + "base_value": 250.0, + "score_lo": 4.737568582217398, + "score_hi": 4.742002966935889, + "swing_s": 0.004434384718490669, + "elasticity": 0.0031183666337952203 + }, + { + "knob": "reg_u_l2", + "label": "reg_u_l2", + "base_value": 0.015, + "score_lo": 4.733660775527216, + "score_hi": 4.747747794848977, + "swing_s": 0.01408701932176104, + "elasticity": 0.009906332853672681 + }, + { + "knob": "D_rear", + "label": "rear grip D_rear", + "base_value": 1.2, + "score_lo": 5.094813913837953, + "score_hi": 4.456787934473439, + "swing_s": -0.6380259793645138, + "elasticity": -0.4486753071397957 + }, + { + "knob": "boundary_margin", + "label": "margin", + "base_value": 0.2, + "score_lo": 4.732085539416261, + "score_hi": 4.7480569541913695, + "swing_s": 0.015971414775108883, + "elasticity": 0.011231485333585482 + }, + { + "knob": "C_l", + "label": "downforce C_l", + "base_value": 5.54, + "score_lo": 4.8439512656554555, + "score_hi": 4.633963737301138, + "swing_s": -0.20998752835431755, + "elasticity": -0.14766831105175554 + }, + { + "knob": "D_front", + "label": "front grip D_front", + "base_value": 1.2, + "score_lo": 4.90179078112475, + "score_hi": 4.629125252379634, + "swing_s": -0.27266552874511607, + "elasticity": -0.19174499755950541 + }, + { + "knob": "C_d", + "label": "drag C_d", + "base_value": 1.58, + "score_lo": 4.732673846625645, + "score_hi": 4.747695161405053, + "swing_s": 0.015021314779407824, + "elasticity": 0.010563352026836309 + }, + { + "knob": "h", + "label": "CG height h", + "base_value": 0.246, + "score_lo": 4.736617700377183, + "score_hi": 4.743668823804108, + "swing_s": 0.007051123426925265, + "elasticity": 0.004958520611350927 + } + ] +} \ No newline at end of file diff --git a/src/experiments/skidpad_sensitivity.py b/src/experiments/skidpad_sensitivity.py new file mode 100644 index 0000000..4fb3220 --- /dev/null +++ b/src/experiments/skidpad_sensitivity.py @@ -0,0 +1,506 @@ +from __future__ import annotations + +""" +One-at-a-time (OAT) sensitivity study for the skidpad LTO. + +The objective of interest is the FS *score*: the average of the two timed-lap +times (``profiling.skidpad_score_s``). We perturb each parameter individually +by a fixed relative amount around the baseline config, re-solve the four-wheel +OCP, and measure how the score moves. Cross-parameter ranking uses the +dimensionless *elasticity* + + E = (dscore / score_base) / (dp / p_base) + +estimated from a centred low/high pair, so a value of e.g. ``-0.8`` means a ++1% increase in the parameter lowers the average lap time by 0.8%. + +Parameters studied (four-wheel model only): + m mass + Iz yaw inertia + reg_u_l2 L2 input-magnitude regularisation weight + D_rear rear tyre peak-grip (D_rr and D_rl scaled together) + boundary_margin corridor shrink margin on each side + C_l aero downforce coefficient (baseline 5.54) + D_front front tyre peak-grip (D_fl and D_fr) -- for front/rear contrast + C_d aero drag coefficient + h CG height (drives longitudinal/lateral load transfer) + +Usage (from repo root): + PYTHONPATH=src python src/experiments/skidpad_sensitivity.py \ + --config configs/skidpad.yaml --delta 0.15 --jobs 4 + +Outputs (under data/sensitivity/ by default): + skidpad_sensitivity.csv one row per solve (baseline + perturbations) + skidpad_sensitivity.png tornado plot ranked by |elasticity| +""" + +import argparse +import csv +import json +from concurrent.futures import ProcessPoolExecutor +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import numpy as np + +if __name__ == "__main__": + import sys + + sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from config import RunConfig +from optimization.global_ocp import solve_ocp_and_save +from optimization.integrators import EulerIntegrator, RK4Integrator +from pipeline import _resolve_path, PipelineConfig +from vehicle_models.four_wheel import FourWheelModel + + +def _repo_root() -> Path: + return Path(__file__).resolve().parents[2] + + +# --------------------------------------------------------------------------- +# Parameter definitions +# --------------------------------------------------------------------------- +# +# A "knob" describes how a single perturbation is applied. ``kind`` selects +# where the value lives: +# "model" -> override one or more keys in the four-wheel params dict +# "solve" -> override a keyword argument to solve_ocp_and_save +# ``keys`` lists every param the knob scales together (e.g. both rear D's). + + +@dataclass(frozen=True) +class Knob: + name: str + kind: str # "model" | "solve" + keys: Tuple[str, ...] + label: str + + +KNOBS: List[Knob] = [ + Knob("m", "model", ("m",), "mass m"), + Knob("Iz", "model", ("Iz",), "yaw inertia Iz"), + Knob("reg_u_l2", "solve", ("reg_u_l2",), "reg_u_l2"), + Knob("D_rear", "model", ("D_rr", "D_rl"), "rear grip D_rear"), + Knob("boundary_margin", "solve", ("boundary_margin",), "margin"), + Knob("C_l", "model", ("C_l",), "downforce C_l"), + Knob("D_front", "model", ("D_fl", "D_fr"), "front grip D_front"), + Knob("C_d", "model", ("C_d",), "drag C_d"), + Knob("h", "model", ("h",), "CG height h"), +] + + +# --------------------------------------------------------------------------- +# Baseline / shared inputs +# --------------------------------------------------------------------------- + + +@dataclass +class Baseline: + track: Dict[str, Any] + time_weights: np.ndarray + model_params: Dict[str, Any] + integrator_name: str + initial_speed: float + reg_du: Any + reg_u_l2: Optional[float] + boundary_margin: float + terminal_speed: Optional[float] + normalize: bool + + +def _build_baseline(config_path: Path) -> Baseline: + """Build the skidpad track once and gather all baseline solve inputs.""" + from tracks.skidpad import build_skidpad_track + + rc = RunConfig.from_yaml(config_path) + rc.validate_for_model() + pc: PipelineConfig = rc.to_pipeline_config() + pc.repo_root = _repo_root() + pc.__post_init__() + + map_csv = _resolve_path(pc.repo_root, pc.skidpad_map_csv) + ref_csv = _resolve_path(pc.repo_root, pc.skidpad_reference_csv) + track = build_skidpad_track( + map_csv=map_csv, + ref_csv=ref_csv, + ds_m=pc.ds_m, + entry_exit_halfwidth=pc.entry_exit_halfwidth, + kappa_blend_m=pc.kappa_blend_m, + ) + + mask = np.asarray(track["timed_mask"], dtype=float) + decel = np.asarray(track.get("decel_mask", np.zeros_like(mask)), dtype=float) + time_weights = np.where(mask > 0.5, 1.0, float(pc.eps_time)) + time_weights = np.where(decel > 0.5, 0.0, time_weights) + + model_params = rc.vehicle.build_model_params("four_wheel") + + return Baseline( + track=track, + time_weights=time_weights, + model_params=model_params, + integrator_name=pc.integrator_name, + initial_speed=float(pc.initial_speed), + reg_du=pc.reg_u, + reg_u_l2=pc.reg_u_l2, + boundary_margin=float(pc.boundary_margin), + terminal_speed=pc.terminal_speed, + normalize=bool(pc.normalize_states_and_inputs), + ) + + +# --------------------------------------------------------------------------- +# Single solve +# --------------------------------------------------------------------------- + + +def _make_integrator(name: str): + return RK4Integrator() if name == "rk4" else EulerIntegrator() + + +def _solve_one(job: Dict[str, Any]) -> Dict[str, Any]: + """Solve one perturbed configuration and return the score + metadata. + + ``job`` carries the baseline payload plus the model/solve overrides for this + run. Runs as a worker process, so everything in it must be picklable. + """ + base: Baseline = job["baseline"] + model_overrides: Dict[str, Any] = job["model_overrides"] + reg_u_l2 = job["reg_u_l2"] + boundary_margin = job["boundary_margin"] + tag = job["tag"] + + params = dict(base.model_params) + params.update(model_overrides) + model = FourWheelModel(params=params) + integrator = _make_integrator(base.integrator_name) + + sol_path = Path(job["scratch_dir"]) / f"sol_{tag}.json" + + try: + sol = solve_ocp_and_save( + track=base.track, + model=model, + solution_path=sol_path, + integrator=integrator, + initial_speed=base.initial_speed, + reg_du=base.reg_du, + reg_u_l2=reg_u_l2, + run_config={"tag": tag}, + use_normalization=base.normalize, + solver_verbose=False, + boundary_margin=boundary_margin, + mode="skidpad", + time_weights=base.time_weights, + terminal_speed=base.terminal_speed, + ) + prof = sol.get("profiling", {}) + result = { + "score_s": prof.get("skidpad_score_s"), + "timed_time_s": prof.get("pure_timed_time_s"), + "full_time_s": prof.get("lap_time_s"), + "status": prof.get("return_status"), + "solve_time_s": prof.get("solve_time_s"), + "iters": prof.get("iter_count"), + } + except Exception as exc: # keep the sweep alive on a single failure + result = { + "score_s": None, + "timed_time_s": None, + "full_time_s": None, + "status": f"ERROR: {type(exc).__name__}: {exc}", + "solve_time_s": None, + "iters": None, + } + finally: + try: + sol_path.unlink() + except OSError: + pass + + result.update( + { + "tag": tag, + "knob": job["knob"], + "param_value": job["param_value"], + "multiplier": job["multiplier"], + } + ) + return result + + +# --------------------------------------------------------------------------- +# Job construction +# --------------------------------------------------------------------------- + + +def _baseline_value(base: Baseline, knob: Knob) -> float: + if knob.kind == "model": + return float(base.model_params[knob.keys[0]]) + if knob.name == "reg_u_l2": + return float(base.reg_u_l2 if base.reg_u_l2 is not None else 0.0) + if knob.name == "boundary_margin": + return float(base.boundary_margin) + raise ValueError(f"Unhandled knob {knob.name}") + + +def _make_job( + base: Baseline, + knob: Knob, + multiplier: float, + scratch_dir: Path, +) -> Dict[str, Any]: + base_val = _baseline_value(base, knob) + new_val = base_val * multiplier + + model_overrides: Dict[str, Any] = {} + reg_u_l2 = base.reg_u_l2 + boundary_margin = base.boundary_margin + + if knob.kind == "model": + for k in knob.keys: + model_overrides[k] = float(base.model_params[k]) * multiplier + elif knob.name == "reg_u_l2": + reg_u_l2 = new_val + elif knob.name == "boundary_margin": + boundary_margin = new_val + + tag = f"{knob.name}_x{multiplier:.2f}".replace(".", "p") + return { + "baseline": base, + "knob": knob.name, + "param_value": new_val, + "multiplier": multiplier, + "model_overrides": model_overrides, + "reg_u_l2": reg_u_l2, + "boundary_margin": boundary_margin, + "scratch_dir": str(scratch_dir), + "tag": tag, + } + + +def _baseline_job(base: Baseline, scratch_dir: Path) -> Dict[str, Any]: + return { + "baseline": base, + "knob": "baseline", + "param_value": float("nan"), + "multiplier": 1.0, + "model_overrides": {}, + "reg_u_l2": base.reg_u_l2, + "boundary_margin": base.boundary_margin, + "scratch_dir": str(scratch_dir), + "tag": "baseline", + } + + +# --------------------------------------------------------------------------- +# Analysis / output +# --------------------------------------------------------------------------- + + +def _elasticity(score_lo: float, score_hi: float, score_base: float, delta: float) -> float: + """Centred elasticity over a +-delta multiplicative perturbation.""" + if score_base in (None, 0) or score_lo is None or score_hi is None: + return float("nan") + return ((score_hi - score_lo) / score_base) / (2.0 * delta) + + +def _write_csv(path: Path, rows: List[Dict[str, Any]]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + cols = [ + "knob", "tag", "multiplier", "param_value", + "score_s", "timed_time_s", "full_time_s", + "status", "solve_time_s", "iters", + ] + with path.open("w", newline="") as f: + w = csv.DictWriter(f, fieldnames=cols) + w.writeheader() + for r in rows: + w.writerow({c: r.get(c) for c in cols}) + + +def _tornado_plot( + path: Path, + summary: List[Dict[str, Any]], + score_base: float, + delta: float, +) -> None: + # Rank by absolute lap-time swing (seconds), most influential at the top. + summary = sorted(summary, key=lambda d: abs(d["swing_s"]), reverse=True) + labels = [d["label"] for d in summary] + lo = [d["score_lo"] - score_base for d in summary] + hi = [d["score_hi"] - score_base for d in summary] + y = np.arange(len(labels)) + + fig, ax = plt.subplots(figsize=(10, 0.7 * len(labels) + 2)) + for yi, l, h in zip(y, lo, hi): + ax.plot([l, h], [yi, yi], color="0.7", lw=2, zorder=1) + ax.scatter(lo, y, color="tab:blue", zorder=3, label=f"-{delta*100:.0f}%") + ax.scatter(hi, y, color="tab:red", zorder=3, label=f"+{delta*100:.0f}%") + for yi, d in zip(y, summary): + ax.annotate( + f"E={d['elasticity']:+.2f}", + xy=(0, yi), + xytext=(0, yi + 0.18), + ha="center", + fontsize=8, + color="0.25", + ) + ax.axvline(0.0, color="k", lw=1) + ax.set_yticks(y) + ax.set_yticklabels(labels) + ax.invert_yaxis() + ax.set_xlabel(f"change in average timed-lap score [s] (baseline = {score_base:.3f} s)") + ax.set_title( + f"Skidpad score sensitivity (OAT, +-{delta*100:.0f}% per parameter)\n" + "annotation E = elasticity (dscore%/dparam%); |swing| sets the ranking" + ) + ax.legend(loc="lower right") + ax.grid(True, axis="x", ls="--", alpha=0.3) + fig.tight_layout() + path.parent.mkdir(parents=True, exist_ok=True) + fig.savefig(path, dpi=160) + plt.close(fig) + + +def run(config_path: Path, delta: float, jobs: int, out_dir: Path) -> None: + scratch_dir = out_dir / "_scratch" + scratch_dir.mkdir(parents=True, exist_ok=True) + + print(f"Building skidpad track and baseline from {config_path} ...") + base = _build_baseline(config_path) + + multipliers = (1.0 - delta, 1.0 + delta) + all_jobs: List[Dict[str, Any]] = [_baseline_job(base, scratch_dir)] + for knob in KNOBS: + for m in multipliers: + all_jobs.append(_make_job(base, knob, m, scratch_dir)) + + print( + f"Submitting {len(all_jobs)} solves " + f"({len(KNOBS)} knobs x2 + baseline) on {jobs} worker(s) ..." + ) + + results: List[Dict[str, Any]] = [] + if jobs <= 1: + for j in all_jobs: + r = _solve_one(j) + print(f" [{r['tag']:>22}] score={r['score_s']} status={r['status']}") + results.append(r) + else: + with ProcessPoolExecutor(max_workers=jobs) as ex: + for r in ex.map(_solve_one, all_jobs): + print(f" [{r['tag']:>22}] score={r['score_s']} status={r['status']}") + results.append(r) + + by_tag = {r["tag"]: r for r in results} + score_base = by_tag["baseline"]["score_s"] + if score_base is None: + raise RuntimeError("Baseline solve failed; cannot compute sensitivities.") + + # Build per-knob summary. + summary: List[Dict[str, Any]] = [] + for knob in KNOBS: + lo_tag = f"{knob.name}_x{multipliers[0]:.2f}".replace(".", "p") + hi_tag = f"{knob.name}_x{multipliers[1]:.2f}".replace(".", "p") + s_lo = by_tag[lo_tag]["score_s"] + s_hi = by_tag[hi_tag]["score_s"] + base_val = _baseline_value(base, knob) + elast = _elasticity(s_lo, s_hi, score_base, delta) + swing = (s_hi - s_lo) if (s_lo is not None and s_hi is not None) else float("nan") + summary.append( + { + "knob": knob.name, + "label": knob.label, + "base_value": base_val, + "score_lo": s_lo, + "score_hi": s_hi, + "swing_s": swing, + "elasticity": elast, + } + ) + + # CSV with every raw solve. + csv_path = out_dir / "skidpad_sensitivity.csv" + _write_csv(csv_path, results) + + # Tornado plot. + png_path = out_dir / "skidpad_sensitivity.png" + _tornado_plot(png_path, summary, score_base, delta) + + # JSON summary for programmatic use. + json_path = out_dir / "skidpad_sensitivity_summary.json" + with json_path.open("w") as f: + json.dump( + { + "config": str(config_path), + "delta": delta, + "score_base_s": score_base, + "knobs": summary, + }, + f, + indent=2, + ) + + # Console ranking. + ranked = sorted(summary, key=lambda d: abs(d["swing_s"]), reverse=True) + print("\n" + "=" * 78) + print(f"Baseline average timed-lap score: {score_base:.4f} s (+-{delta*100:.0f}% OAT)") + print("=" * 78) + hdr = f"{'parameter':<18}{'base':>10}{'score-':>10}{'score+':>10}{'swing[s]':>11}{'elasticity':>12}" + print(hdr) + print("-" * 78) + for d in ranked: + slo = f"{d['score_lo']:.3f}" if d["score_lo"] is not None else " fail" + shi = f"{d['score_hi']:.3f}" if d["score_hi"] is not None else " fail" + print( + f"{d['label']:<18}{d['base_value']:>10.3f}{slo:>10}{shi:>10}" + f"{d['swing_s']:>11.4f}{d['elasticity']:>12.3f}" + ) + print("-" * 78) + top = ranked[0] + print( + f"\nMost influential parameter: {top['label']} " + f"(|swing| = {abs(top['swing_s']):.4f} s over +-{delta*100:.0f}%, " + f"elasticity = {top['elasticity']:+.3f})." + ) + print(f"\nWrote:\n {csv_path}\n {png_path}\n {json_path}") + + # Tidy scratch. + try: + for p in scratch_dir.glob("*"): + p.unlink() + scratch_dir.rmdir() + except OSError: + pass + + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--config", type=Path, default=_repo_root() / "configs" / "skidpad.yaml") + ap.add_argument( + "--delta", + type=float, + default=0.15, + help="Relative one-at-a-time perturbation (fraction). Default 0.15 (+-15%%).", + ) + ap.add_argument("--jobs", type=int, default=4, help="Parallel solve workers.") + ap.add_argument( + "--out-dir", + type=Path, + default=_repo_root() / "data" / "sensitivity", + help="Output directory for CSV/PNG/JSON.", + ) + args = ap.parse_args() + run(args.config, args.delta, args.jobs, args.out_dir) + + +if __name__ == "__main__": + main()