@@ -304,6 +304,8 @@ def walk_forward_complete(
304304 * ,
305305 horizon_tag_value : str ,
306306 repo_root : Path ,
307+ base_seed : int = 42 ,
308+ total_repetitions : int | None = None ,
307309) -> tuple [bool , str ]:
308310 run_dir = _latest_run (
309311 baselines_dir ,
@@ -316,10 +318,20 @@ def walk_forward_complete(
316318 )
317319 if run_dir is None :
318320 return False , "no walk-forward run"
319- seeds = discover_run_seeds (run_dir )
320- if not seeds :
321+ existing = set ( discover_run_seeds (run_dir ) )
322+ if not existing :
321323 return False , "no walk-forward predictions"
322- for seed in seeds :
324+ if total_repetitions is not None :
325+ targets = target_walk_forward_seeds (
326+ base_seed = base_seed , total_repetitions = total_repetitions
327+ )
328+ missing = [seed for seed in targets if seed not in existing ]
329+ if missing :
330+ return False , f"missing walk-forward seeds { missing } in { run_dir .name } "
331+ check_seeds = targets
332+ else :
333+ check_seeds = sorted (existing )
334+ for seed in check_seeds :
323335 try :
324336 load_pooled_predictions (run_dir , model_slug = job .model , seed = seed )
325337 except ValueError as exc :
@@ -336,6 +348,8 @@ def assess_job(
336348 data_dir : Path | None = None ,
337349 min_year : int = DEFAULT_MIN_YEAR ,
338350 max_year : int = DEFAULT_MAX_YEAR ,
351+ wf_repetitions : int | None = None ,
352+ wf_base_seed : int = 42 ,
339353) -> JobAssessment :
340354 hz_tag = horizon_tag (horizon )
341355 years = load_yield_years (
@@ -362,7 +376,12 @@ def assess_job(
362376 baselines_dir , job , horizon_tag_value = hz_tag , repo_root = repo_root
363377 )
364378 wf_ok , wf_reason = walk_forward_complete (
365- baselines_dir , job , horizon_tag_value = hz_tag , repo_root = repo_root
379+ baselines_dir ,
380+ job ,
381+ horizon_tag_value = hz_tag ,
382+ repo_root = repo_root ,
383+ base_seed = wf_base_seed ,
384+ total_repetitions = wf_repetitions ,
366385 )
367386 if not scr_ok :
368387 wf_reason = "waiting for screening"
@@ -385,6 +404,8 @@ def assess_manifest(
385404 horizon : str ,
386405 repo_root : Path ,
387406 data_dir : Path | None = None ,
407+ wf_repetitions : int | None = None ,
408+ wf_base_seed : int = 42 ,
388409) -> list [JobAssessment ]:
389410 return [
390411 assess_job (
@@ -393,6 +414,8 @@ def assess_manifest(
393414 horizon = horizon ,
394415 repo_root = repo_root ,
395416 data_dir = data_dir ,
417+ wf_repetitions = wf_repetitions ,
418+ wf_base_seed = wf_base_seed ,
396419 )
397420 for job in jobs
398421 ]
0 commit comments