@@ -451,33 +451,44 @@ def render_markdown(decision: dict[str, Any]) -> str:
451451 return "\n " .join (lines )
452452
453453
454- def evaluate (
454+ def validate_profile_config (
455455 config : dict [str , Any ],
456456 profile_name : str ,
457457 benchmark_specs : list [dict [str , Any ]],
458- aa_pairs : dict [str , list [tuple [float , float ]]],
459- ab_pairs : dict [str , list [tuple [float , float ]]],
460- units : dict [str , str | None ],
461- ) -> dict [str , Any ]:
462- bootstrap = config ["bootstrap" ]
463- aa_results : list [dict [str , Any ]] = []
464- benchmark_results : list [dict [str , Any ]] = []
465- aa_passed = True
466- reasons : list [str ] = []
467-
458+ ) -> tuple [set [str ], int ]:
468459 profile = config ["profiles" ][profile_name ]
469- must_pass = set (profile .get ("must_pass" , []))
470460 configured_ids = [entry ["id" ] for entry in benchmark_specs ]
471461 if len (configured_ids ) != len (set (configured_ids )):
472462 raise ValueError (f"profile { profile_name } contains duplicate benchmark ids" )
473463 primary_ids = {
474464 entry ["id" ] for entry in benchmark_specs if entry .get ("metric" , "primary" ) == "primary"
475465 }
466+ must_pass = set (profile .get ("must_pass" , []))
476467 if not must_pass or not must_pass .issubset (primary_ids ):
477468 raise ValueError (f"profile { profile_name } must_pass must contain only primary metrics" )
478- minimum_passes = int (profile ["minimum_passes" ])
469+ minimum_passes = profile .get ("minimum_passes" )
470+ if isinstance (minimum_passes , bool ) or not isinstance (minimum_passes , int ):
471+ raise ValueError (f"profile { profile_name } has a non-integer primary minimum_passes" )
479472 if not 1 <= minimum_passes <= len (primary_ids ):
480473 raise ValueError (f"profile { profile_name } has an invalid primary minimum_passes" )
474+ return must_pass , minimum_passes
475+
476+
477+ def evaluate (
478+ config : dict [str , Any ],
479+ profile_name : str ,
480+ benchmark_specs : list [dict [str , Any ]],
481+ aa_pairs : dict [str , list [tuple [float , float ]]],
482+ ab_pairs : dict [str , list [tuple [float , float ]]],
483+ units : dict [str , str | None ],
484+ ) -> dict [str , Any ]:
485+ bootstrap = config ["bootstrap" ]
486+ aa_results : list [dict [str , Any ]] = []
487+ benchmark_results : list [dict [str , Any ]] = []
488+ aa_passed = True
489+ reasons : list [str ] = []
490+
491+ must_pass , minimum_passes = validate_profile_config (config , profile_name , benchmark_specs )
481492 for entry in benchmark_specs :
482493 benchmark_id = entry ["id" ]
483494 aa_metrics = paired_statistics (
@@ -583,6 +594,7 @@ def run(args: argparse.Namespace) -> int:
583594 benchmark_specs = [benchmark_index [benchmark_id ] for benchmark_id in profile ["benchmark_ids" ]]
584595 if not benchmark_specs :
585596 raise ValueError ("at least one benchmark metric must be configured" )
597+ validate_profile_config (config , args .profile , benchmark_specs )
586598 config_sha = sha256_file (config_path )
587599 repetitions = int (config ["matrix" ]["repetitions_per_order" ])
588600 aa_pairs , aa_units , aa_run = load_pairs (
0 commit comments