diff --git a/lib/benchpark/cmd/info.py b/lib/benchpark/cmd/info.py index 8be1963f8..ecb043b1e 100644 --- a/lib/benchpark/cmd/info.py +++ b/lib/benchpark/cmd/info.py @@ -1,3 +1,4 @@ +import argparse import os import subprocess import textwrap @@ -138,20 +139,26 @@ def _info_ramble_name(experiment_class): ) ) - experiment_spec = benchpark.spec.ExperimentSpec(args.name) + experiment_spec_str = " ".join(args.name) + experiment_spec = benchpark.spec.ExperimentSpec(experiment_spec_str) conc = experiment_spec.concretize() - experiment_class = conc.experiment + try: + experiment = conc.experiment + except Exception as e: + msg = ( + f"'{experiment_spec_str}' must be a valid experiment spec;" + " some experiments require specifying additional variants" + " (e.g. experiments not inheriting MpiOnlyExperiment must" + " set +rocm or +cuda)." + ) + raise ValueError(msg) from e if args.spack: subprocess.run( [ "spack", "info", - ( - experiment_class.spack_name - if experiment_class.spack_name - else experiment_class.name - ), + (experiment.spack_name if experiment.spack_name else experiment.name), ] ) return @@ -160,20 +167,16 @@ def _info_ramble_name(experiment_class): [ "ramble", "info", - ( - experiment_class.ramble_name - if experiment_class.ramble_name - else experiment_class.name - ), + (experiment.ramble_name if experiment.ramble_name else experiment.name), ] ) return else: actions = { - "maintainers": (info_maintainers, [experiment_class]), - "ramble_name": (_info_ramble_name, [experiment_class]), - "spack_name": (_info_spack_name, [experiment_class]), - "variants": (info_variants, [experiment_class]), + "maintainers": (info_maintainers, [experiment]), + "ramble_name": (_info_ramble_name, [experiment]), + "spack_name": (_info_spack_name, [experiment]), + "variants": (info_variants, [experiment]), } # Call functions for enabled options, or all if no flag is set @@ -218,7 +221,9 @@ def setup_parser(root_parser): experiment_parser.add_argument( "--maintainers", action="store_true", help="Maintainers" ) - experiment_parser.add_argument("name", help="Experiment name") + experiment_parser.add_argument( + "name", nargs=argparse.REMAINDER, help="Experiment name" + ) def command(args): diff --git a/lib/benchpark/spec.py b/lib/benchpark/spec.py index b0f017805..dc933398a 100644 --- a/lib/benchpark/spec.py +++ b/lib/benchpark/spec.py @@ -323,14 +323,19 @@ def _concretize(self): name, values = variants_to_check.pop() checked.add((name, values)) - conditions = [ - w - for w, v_by_n in self.object_class.variants.items() - for n, v in v_by_n.items() - if n == name and v.validate_values_bool(values) - ] - - if not conditions: + conditions = [] + possible_variants = set() + for when, v_by_n in self.object_class.variants.items(): + possible_variants.update(v_by_n.keys()) + for n, v in v_by_n.items(): + if n == name: + if not v.validate_values_bool(values): + raise Exception( + f"'{values}' is not valid for variant '{name}' on {self.name}" + ) + conditions.append(when) + + if name not in possible_variants: raise Exception(f"{name} is not a valid variant of {self.name}") # This variant is already valid on self