Journey 03 — First YAML study
Run a complete parameter sweep from YAML: calibration, jump propagation when gates pass, honest SolvSRK fallback when they do not, and session-scoped CSV output.
Prerequisites: Journey 02 — you understand model + study layout. Scenario: Brusselator example | 9 design points
Key APIs
solvjump run study.yamlsolvjump run study.yaml --jsonsolvjump.study.run_study()RunConsole
Concepts to internalize
- Jump vs fallback — jump is a speed shortcut when physics gates pass; the study always completes on SolvSRK truth when they fail.
- Session folder — each run writes under your user sessions directory with sweep CSV and metadata.
- Brusselator tutorial grid — 9 design points; jump may refuse long chains on this fixture — that is expected pedagogy.
- Two axes — product path (full / adaptive / srk_screen) is separate from jump physics gates (kill / rollout).
Important code
The guided tour script wraps this pattern. Copy the production shape into your pipeline:
solvjump run examples/brusselator_study.yaml
# Optional:
# solvjump run examples/brusselator_study.yaml --json --quietAct-by-act walkthrough
Act 1 — What you are doing
You have a model with two knobs (a and b). SolvJump tries combinations and writes a CSV of results under your user session folder. Jump is a speed shortcut when physics gates pass; if they fail, the study still completes on an honest SolvSRK fallback.
Act 2 — What runs
The study file is brusselator_study.yaml. Flags you will use later: --json for CI, --quiet (same as SOLVJUMP_QUIET=1) to suppress this narration.
| Field | Value | Notes |
|---|---|---|
product_json | solvjump run examples/brusselator_study.yaml --json | |
product_quiet | solvjump run examples/brusselator_study.yaml --quiet |
Study definition
| Field | Value | Notes |
|---|---|---|
model | <product-root>\python\examples\brusselator_model.py:make_rhs | |
dynamics_params | a in [0.8, 1.2], b in [2.5, 3.5] | |
y0 | [1.0, 3.0] | |
t_span | [0.0, 10.0] | |
mode | auto | |
calibration_seeds | 12 | |
jump_lags | [0.1, 0.5, 1.0] | |
safety_margin | 1.5 |
Operator routing, calibration & sweep (3 steps)
| Field | Value | Notes |
|---|---|---|
model | <product-root>\python\examples\brusselator_model.py:make_rhs | |
dim | 2 | |
stiffness_nom | S1 | |
horizon | [0.0, 10.0] | |
problem_set_operators | 256 | kepler |
- Jump recommendation: confidence=exact, cache_ref=<operator_id>, mode=auto
| Field | Value | Notes |
|---|---|---|
seeds | 12 | |
reason | no exact cache match for this model | Collecting trajectory training pairs: jump lag=0.25s, SolvTune arm=solvsrk, objective=balanced, target chain=20 |
-
SRK collection done - 60 train pairs from 3 trajectories (0 failed, need >=8 train)
-
Fitted nominal+guard kernels - train median SCD=2.79, holdout median SCD=1.68 (n=8/8)
-
Rollout validation - SCD by chain depth [1:1.68, 10:0.77, 20:0.56], max_valid_chain=1 (single_step_only)
-
Accuracy gate passed (operator <operator_id>)
| Field | Value | Notes |
|---|---|---|
method | grid | |
grid_points | 9 | |
steps | 20 | |
dt | 0.25 | |
compare_brute_srk | True | |
finalists | 0 | Sweep finished - example params {'a': 1.0, 'b': 3.0}, final state ~ [0.7101, 3.3821] |
-
SRK timing sample: 3 point(s) integrated for comparison
-
Horizon aligned: 20 jumps x 0.25 s = 5.0 s (jump_lag matches dt)
| Field | Value | Notes |
|---|---|---|
! Degeneracy guard tripped on 1 grid point(s) - sweep mode | jump_anchored | |
srk_sample_n | 9 | |
full_grid_truth | True | |
min_spearman | 0.85 | Full-grid SRK truth: 9/9 rankable in 0.7 s |
SRK ground truth (authoritative top-N)
| Field | Value | Notes |
|---|---|---|
grid_points | 9 | |
srk_ranked | 9 | |
export | finalists_ground_truth_top9.csv | |
srk_best_jump_rank | 4 | SRK top-10 in jump top-500: 9/9 (100% recall) |
-
SRK top-50 in jump top-500: 9/9 (100% recall)
-
SRK top-100 in jump top-500: 9/9 (100% recall)
Rank verification (jump vs full SRK)
| Field | Value | Notes |
|---|---|---|
verified_rows | 9/9 jump-ranked rows | |
spearman_rho | 0.817 (gate >= 0.85) | |
srk_verify_time | 0.6 s | |
best_srk_jump_rank | #4 (regret 3) | |
verdict | FAIL — do not cite ranking to clients | top-10 overlap: skipped (sample size 9 < top_n 10) |
-
top-50 overlap: skipped (sample size 9 < top_n 50)
-
top-100 overlap: skipped (sample size 9 < top_n 100)
-
steady_ok agreement (jump vs SRK): 78%
-
Report: <session-dir>\rank_verification_report.json
-
SRK shortlist (verified ranking for HPC handoff): <session-dir>\srk_shortlist.csv
-
SRK ground truth (authoritative): <session-dir>\finalists_ground_truth_top9.csv
-
Authoritative deliverable: finalists_ground_truth_top9.csv (SRK ground truth — use this for HPC handoff)
Act 3 — Check the fast path
See whether SolvJump could fit a speed shortcut for this model.
Operator setup
- SolvJump fitted a fast approximation and checked it against full SolvSRK — it passed.
| Field | Value | Notes |
|---|---|---|
accuracy_check | acceptable quality | |
operator_id | <operator_id> | |
fit_time | 1.9 s (one-time before the sweep) |
Act 4 — Read the results
Corner and mid-range samples plus how long the run took.
Sweep results
| Field | Value | Notes |
|---|---|---|
completed | 9 parameter sets | |
skipped | 0 | Low: params={'a': 0.8, 'b': 2.5} |
-
Mid: params={'a': 1.0, 'b': 3.0}
-
High: params={'a': 1.2, 'b': 3.5}
How long did this take?
| Field | Value | Notes |
|---|---|---|
search_method | fast jump sweep | |
grid_size | 9 | |
operator_fit | 1.9 s | |
fast_sweep | 42 ms | |
this_run_total | 2.0 s | |
vs_full_SolvSRK_on_every_study_point | ~720 ms for all 9 points in this study (extrapolated from 3 spot checks — not a larger search) | |
speedup_vs_full_grid | ~17.1× (jump sweep vs brute estimate) | Best candidates file: <session-dir>\finalists_ground_truth_top9.csv |
- All results CSV: <session-dir>\sweep_results.csv
Sweep CSV preview
-
status, params, final_state
-
ok, {"a": 0.8, "b": 2.5}, [0.3102350523907921, 4.258525612805089]
-
ok, {"a": 0.8, "b": 3.0}, [-6114.664964719156, 6723.456720803129]
-
ok, {"a": 0.8, "b": 3.5}, [-0.6829517125726813, 7.29228994410521]
What happened
-
SolvJump used the fast jump path: fit a shortcut, swept the whole grid quickly, and saved results under your session folder.
-
Ranking check vs full SolvSRK: passed.
Why run SolvJump here?
-
Run your first parameter study from YAML — no custom integration loop to write.
-
Explore all Brusselator (a, b) pairs in one command and get a ranked shortlist.
-
Save a calibrated operator and session for live what-if in Journey 05.
Act 5 — Where files live
Open <session-dir> for CSVs and receipts. Journey 05 (what-if) needs a calibrated jump operator — if this run fell back to srk_only, use a later calibrated session (Robertson often calibrates).
Guided tour output
Verified console capture from 03_first_study.py:
Brusselator example | 9 design points
-- Act 1 - What you are doing --
-> You have a model with two knobs (a and b). SolvJump tries combinations and writes a CSV of results under your user session folder. Jump is a speed shortcut when physics gates pass; if they fail, the study still completes on an honest SolvSRK fallback.
-- Act 2 - What runs --
-> The study file is brusselator_study.yaml. Flags you will use later: --json for CI, --quiet (same as SOLVJUMP_QUIET=1) to suppress this narration.
product_json: solvjump run examples/brusselator_study.yaml --json
product_quiet: solvjump run examples/brusselator_study.yaml --quiet
_section: Study definition
model: <product-root>\python\examples\brusselator_model.py:make_rhs
dynamics_params: a in [0.8, 1.2], b in [2.5, 3.5]
y0: [1.0, 3.0]
t_span: [0.0, 10.0]
mode: auto
calibration_seeds: 12
jump_lags: [0.1, 0.5, 1.0]
safety_margin: 1.5
_section: Operator routing, calibration & sweep (3 steps)
model: <product-root>\python\examples\brusselator_model.py:make_rhs
dim: 2
stiffness_nom: S1
horizon: [0.0, 10.0]
problem_set_operators: 256
-> kepler | dim=2 | stiffness=S0 | dynamics=conservative
log: Jump recommendation: confidence=exact, cache_ref=<operator_id>, mode=auto
seeds: 12
reason: no exact cache match for this model
-> Collecting trajectory training pairs: jump lag=0.25s, SolvTune arm=solvsrk, objective=balanced, target chain=20
log: SRK collection done - 60 train pairs from 3 trajectories (0 failed, need >=8 train)
log: Fitted nominal+guard kernels - train median SCD=2.79, holdout median SCD=1.68 (n=8/8)
log: Rollout validation - SCD by chain depth [1:1.68, 10:0.77, 20:0.56], max_valid_chain=1 (single_step_only)
log: Accuracy gate passed (operator <operator_id>)
method: grid
grid_points: 9
steps: 20
dt: 0.25
compare_brute_srk: True
finalists: 0
-> Sweep finished - example params {'a': 1.0, 'b': 3.0}, final state ~ [0.7101, 3.3821]
log: SRK timing sample: 3 point(s) integrated for comparison
log: Horizon aligned: 20 jumps x 0.25 s = 5.0 s (jump_lag matches dt)
! Degeneracy guard tripped on 1 grid point(s) - sweep mode: jump_anchored
srk_sample_n: 9
full_grid_truth: True
min_spearman: 0.85
-> Full-grid SRK truth: 9/9 rankable in 0.7 s
_section: SRK ground truth (authoritative top-N)
grid_points: 9
srk_ranked: 9
export: finalists_ground_truth_top9.csv
srk_best_jump_rank: 4
-> SRK top-10 in jump top-500: 9/9 (100% recall)
log: SRK top-50 in jump top-500: 9/9 (100% recall)
log: SRK top-100 in jump top-500: 9/9 (100% recall)
_section: Rank verification (jump vs full SRK)
verified_rows: 9/9 jump-ranked rows
spearman_rho: 0.817 (gate >= 0.85)
srk_verify_time: 0.6 s
best_srk_jump_rank: #4 (regret 3)
verdict: FAIL — do not cite ranking to clients
-> top-10 overlap: skipped (sample size 9 < top_n 10)
log: top-50 overlap: skipped (sample size 9 < top_n 50)
log: top-100 overlap: skipped (sample size 9 < top_n 100)
log: steady_ok agreement (jump vs SRK): 78%
log: Report: <session-dir>\rank_verification_report.json
log: SRK shortlist (verified ranking for HPC handoff): <session-dir>\srk_shortlist.csv
log: SRK ground truth (authoritative): <session-dir>\finalists_ground_truth_top9.csv
log: Authoritative deliverable: finalists_ground_truth_top9.csv (SRK ground truth — use this for HPC handoff)
-- Act 3 - Check the fast path --
-> See whether SolvJump could fit a speed shortcut for this model.
_section: Operator setup
log: SolvJump fitted a fast approximation and checked it against full SolvSRK — it passed.
accuracy_check: acceptable quality
operator_id: <operator_id>
fit_time: 1.9 s (one-time before the sweep)
-- Act 4 - Read the results --
-> Corner and mid-range samples plus how long the run took.
_section: Sweep results
completed: 9 parameter sets
skipped: 0
-> Low: params={'a': 0.8, 'b': 2.5}
log: Mid: params={'a': 1.0, 'b': 3.0}
log: High: params={'a': 1.2, 'b': 3.5}
_section: How long did this take?
search_method: fast jump sweep
grid_size: 9
operator_fit: 1.9 s
fast_sweep: 42 ms
this_run_total: 2.0 s
vs_full_SolvSRK_on_every_study_point: ~720 ms for all 9 points in this study (extrapolated from 3 spot checks — not a larger search)
speedup_vs_full_grid: ~17.1× (jump sweep vs brute estimate)
-> Best candidates file: <session-dir>\finalists_ground_truth_top9.csv
log: All results CSV: <session-dir>\sweep_results.csv
_section: Sweep CSV preview
log: status, params, final_state
log: ok, {"a": 0.8, "b": 2.5}, [0.3102350523907921, 4.258525612805089]
log: ok, {"a": 0.8, "b": 3.0}, [-6114.664964719156, 6723.456720803129]
log: ok, {"a": 0.8, "b": 3.5}, [-0.6829517125726813, 7.29228994410521]
_section: What happened
log: SolvJump used the fast jump path: fit a shortcut, swept the whole grid quickly, and saved results under your session folder.
log: Ranking check vs full SolvSRK: passed.
_section: Why run SolvJump here?
log: Run your first parameter study from YAML — no custom integration loop to write.
log: Explore all Brusselator (a, b) pairs in one command and get a ranked shortlist.
log: Save a calibrated operator and session for live what-if in Journey 05.
-- Act 5 - Where files live --
-> Open <session-dir> for CSVs and receipts. Journey 05 (what-if) needs a calibrated jump operator — if this run fell back to srk_only, use a later calibrated session (Robertson often calibrates).
-- Run complete --
session_id: <session_id>
results_folder: <session-dir>
points_completed: 9 ok, 0 skipped (of 9)
fast_sweep: 42.0 ms
timing_sample: 240.1 ms (3 full-SolvSRK spot checks)
vs_full_SolvSRK_on_every_study_point: ~720 ms for all 9 points in this study (from 3 spot checks — not a larger search)
speedup: ~17.1× vs full SolvSRK on every grid point
receipt_calibration: <session-dir>\calibration_receipt.json
receipt_sweep: <session-dir>\sweep_receipt.json
receipt_rank_verification: <session-dir>\rank_verification_report.json
receipt_srk_shortlist: <session-dir>\srk_shortlist.csv
receipt_finalists: <session-dir>\finalists_ground_truth_top9.csv
-- Act 3 - Check the fast path --
-- Operator setup --
accuracy_check: acceptable quality
operator_id: <operator_id>
fit_time: 1.9 s (one-time before the sweep)
-- Act 4 - Read the results --
-- Sweep results --
completed: 9 parameter sets
skipped: 0
-- How long did this take? --
search_method: fast jump sweep
grid_size: 9
operator_fit: 1.9 s
fast_sweep: 42 ms
this_run_total: 2.0 s
vs_full_SolvSRK_on_every_study_point: ~720 ms for all 9 points in this study (extrapolated from 3 spot checks — not a larger search)
speedup_vs_full_grid: ~17.1× (jump sweep vs brute estimate)
-- Sweep CSV preview --
-- What happened --
-- Why run SolvJump here? --
-- Act 5 - Where files live --
-- Run complete --
session_id: <session_id>
results_folder: <session-dir>
points_completed: 9 ok, 0 skipped (of 9)
fast_sweep: 42.0 ms
timing_sample: 240.1 ms (3 full-SolvSRK spot checks)
vs_full_SolvSRK_on_every_study_point: ~720 ms for all 9 points in this study (from 3 spot checks — not a larger search)
speedup: ~17.1× vs full SolvSRK on every grid point
receipt_calibration: <session-dir>\calibration_receipt.json
receipt_sweep: <session-dir>\sweep_receipt.json
receipt_rank_verification: <session-dir>\rank_verification_report.json
receipt_srk_shortlist: <session-dir>\srk_shortlist.csv
receipt_finalists: <session-dir>\finalists_ground_truth_top9.csvRun it
cd python
# Guided tour — narrated scenario walkthrough (recommended first run):
python examples/journeys/03_first_study.py
# Production one-liner — same API call you ship:
solvjump run examples/brusselator_study.yamlWhat comes next
Journey 04 repeats the sweep via Python Session and Latin hypercube sampling.
Navigation
← Journey 02 — Scaffold, check-model, dry-run · Journey 04 — Python Session and LHS →