Product documentation — installation, licensing, and integration guides.
SolvJump Configurator
Examples
03 First YAML study

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.yaml
  • solvjump run study.yaml --json
  • solvjump.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 --quiet

Act-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.

FieldValueNotes
product_jsonsolvjump run examples/brusselator_study.yaml --json
product_quietsolvjump run examples/brusselator_study.yaml --quiet

Study definition

FieldValueNotes
model<product-root>\python\examples\brusselator_model.py:make_rhs
dynamics_paramsa in [0.8, 1.2], b in [2.5, 3.5]
y0[1.0, 3.0]
t_span[0.0, 10.0]
modeauto
calibration_seeds12
jump_lags[0.1, 0.5, 1.0]
safety_margin1.5

Operator routing, calibration & sweep (3 steps)

FieldValueNotes
model<product-root>\python\examples\brusselator_model.py:make_rhs
dim2
stiffness_nomS1
horizon[0.0, 10.0]
problem_set_operators256kepler
  • Jump recommendation: confidence=exact, cache_ref=<operator_id>, mode=auto
FieldValueNotes
seeds12
reasonno exact cache match for this modelCollecting 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>)

FieldValueNotes
methodgrid
grid_points9
steps20
dt0.25
compare_brute_srkTrue
finalists0Sweep 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)

FieldValueNotes
! Degeneracy guard tripped on 1 grid point(s) - sweep modejump_anchored
srk_sample_n9
full_grid_truthTrue
min_spearman0.85Full-grid SRK truth: 9/9 rankable in 0.7 s

SRK ground truth (authoritative top-N)

FieldValueNotes
grid_points9
srk_ranked9
exportfinalists_ground_truth_top9.csv
srk_best_jump_rank4SRK 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)

FieldValueNotes
verified_rows9/9 jump-ranked rows
spearman_rho0.817 (gate >= 0.85)
srk_verify_time0.6 s
best_srk_jump_rank#4 (regret 3)
verdictFAIL — do not cite ranking to clientstop-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.
FieldValueNotes
accuracy_checkacceptable quality
operator_id<operator_id>
fit_time1.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

FieldValueNotes
completed9 parameter sets
skipped0Low: 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?

FieldValueNotes
search_methodfast jump sweep
grid_size9
operator_fit1.9 s
fast_sweep42 ms
this_run_total2.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.csv

Run 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.yaml

What 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 →