Journey 09 — SolvTune objective
Pass SolvTune objectives (balanced, precision, survival, efficiency) into solvjump run --objective so SRK verification arms match your program goal.
Prerequisites: Journey 03 — YAML study path; SolvSRK licensed for verification arms. Scenario: balanced | precision | survival | efficiency — same ODE, different SRK config
Key APIs
solvjump run study.yaml --objective precisionstudy YAML objective fieldSolvTune objective routing
Concepts to internalize
- Objective-aware verification — SRK arms selected for precision vs survival vs efficiency.
- Requires SolvSRK seat — no
SOLVSRK_LICENSE_OKbypass; use a real solvsrk.lic. - Accmode — continuation backends may warn if wheel lacks accmode capability.
- Same study, different goal — objective changes which SRK config verifies finalists.
Important code
The guided tour script wraps this pattern. Copy the production shape into your pipeline:
solvjump run examples/brusselator_study.yaml --objective precision
# YAML equivalent: examples/brusselator_study_objective.yamlAct-by-act walkthrough
Act 1 — Why objective matters
SolvTune's flat corpus is keyed by objective × noise. Calibration and golden runs use the matching SolvSRK backend. CLI --objective overrides YAML solvtune_objective.
Act 2 — Noise and horizon hints
YAML: noise_type (gaussian|fixed_path), deployment_noise_sigma, horizon_multiplier_hint. Same fields exist on Session.from_model.
Act 3 — Accmode
SolvTune may recommend continuation_backend=acmode. That needs an accmode-capable SolvSRK wheel. Without it, Jump warns and continues with the mapped fields the installed wheel supports — it does not silently invent a backend.
Act 4 — Run precision
Equivalent YAML: brusselator_study_objective.yaml
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=precision, 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.4 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.4 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 5 — Takeaway
Pick the objective that matches the question (precision vs survival vs cost). Do not mix objectives when comparing two studies.
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.
Guided tour output
Verified console capture from 09_solvtune_objective.py:
balanced | precision | survival | efficiency — same ODE, different SRK config
-- Act 1 - Why objective matters --
-> SolvTune's flat corpus is keyed by objective × noise. Calibration and golden runs use the matching SolvSRK backend. CLI --objective overrides YAML solvtune_objective.
-- Act 2 - Noise and horizon hints --
-> YAML: noise_type (gaussian|fixed_path), deployment_noise_sigma, horizon_multiplier_hint. Same fields exist on Session.from_model.
-- Act 3 - Accmode --
-> SolvTune may recommend continuation_backend=acmode. That needs an accmode-capable SolvSRK wheel. Without it, Jump warns and continues with the mapped fields the installed wheel supports — it does not silently invent a backend.
-- Act 4 - Run precision --
-> Equivalent YAML: brusselator_study_objective.yaml
_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=precision, 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.4 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.4 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 5 - Takeaway --
-> Pick the objective that matches the question (precision vs survival vs cost). Do not mix objectives when comparing two studies.
_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.
-- Run complete --
session_id: <session_id>
results_folder: <session-dir>
points_completed: 9 ok, 0 skipped (of 9)
fast_sweep: 38.7 ms
timing_sample: 114.6 ms (3 full-SolvSRK spot checks)
vs_full_SolvSRK_on_every_study_point: ~344 ms for all 9 points in this study (from 3 spot checks — not a larger search)
speedup: ~8.9× 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
-- Operator setup --
accuracy_check: acceptable quality
operator_id: <operator_id>
fit_time: 1.1 s (one-time before the sweep)
-- Sweep results --
completed: 9 parameter sets
skipped: 0
-- How long did this take? --
search_method: fast jump sweep
grid_size: 9
operator_fit: 1.1 s
fast_sweep: 39 ms
this_run_total: 1.1 s
vs_full_SolvSRK_on_every_study_point: ~344 ms for all 9 points in this study (extrapolated from 3 spot checks — not a larger search)
speedup_vs_full_grid: ~8.9× (jump sweep vs brute estimate)
-- What happened --
solvtune_objective: precision
noise_type: gaussian
-- Act 5 - Takeaway --
-- Why run SolvJump here? --
-- Run complete --
session_id: <session_id>
results_folder: <session-dir>
points_completed: 9 ok, 0 skipped (of 9)
fast_sweep: 38.7 ms
timing_sample: 114.6 ms (3 full-SolvSRK spot checks)
vs_full_SolvSRK_on_every_study_point: ~344 ms for all 9 points in this study (from 3 spot checks — not a larger search)
speedup: ~8.9× 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/09_solvtune_objective.py
# Production one-liner — same API call you ship:
solvjump run examples/brusselator_study.yaml --objective precisionWhat comes next
Journey 10 demonstrates kill-gate refusal and automatic adaptive fallback.
Navigation
← Journey 08 — Adaptive search and evidence · Journey 10 — When jump refuses →