diff --git a/qaboard/iterators.py b/qaboard/iterators.py index 65696997..1b9d6d7e 100755 --- a/qaboard/iterators.py +++ b/qaboard/iterators.py @@ -299,17 +299,23 @@ def iter_batch(batch: Dict, default_run_context: RunContext, qatools_config, def return # We also allow each input to have its settings... - if isinstance(locations, list): - locations_as_dict: Dict = {} + if isinstance(locations, dict): # {inputA: config, inputB: config} + locations_and_configs = [(location, config) for location, config in locations.items()] + if isinstance(locations, list): # [inputA, inputA] or [(inputA, configA), (inputB, configB)] or [{inputA: configA, inputB: configB}] + locations_and_configs = [] for l in locations: - if l in locations: - if not isinstance(l, dict): - locations_as_dict[l] = None - else: - locations_as_dict.update(l) - locations = locations_as_dict + if isinstance(l, str): + locations_and_configs.append((l, None)) + elif isinstance(l, list): + location, *location_configurations = l + locations_and_configs.append((location, location_configurations)) + elif isinstance(l, dict): + for location, location_configurations in l.items(): + locations_and_configs.append((location, location_configurations)) + else: + raise ValueError - for location, location_configurations in locations.items(): + for location, location_configurations in locations_and_configs: location_run_context = deepcopy(run_context) location_inputs_settings = inputs_settings if location_configurations: diff --git a/tests/test_iterators.py b/tests/test_iterators.py index 9e45c2f5..e895ff53 100755 --- a/tests/test_iterators.py +++ b/tests/test_iterators.py @@ -111,6 +111,11 @@ def get_batch(batch): self.assertEqual(batches[0].configurations, ['base']) self.assertEqual(batches[1].configurations, ['base', 'low-light', {"cde": ["-DD"]}]) + batches = get_batch('each-input-can-have-its-own-configuration-and-appear-twice') + self.assertEqual(batches[0].configurations, ['base', {"crop": "A"}]) + self.assertEqual(batches[1].configurations, ['base', {"crop": "B"}]) + self.assertEqual(batches[2].configurations, ['base', {"crop": "C"}]) + batches = get_batch('you-can-override-globs') self.assertEqual(len(batches), 1) @@ -214,6 +219,18 @@ def get_batch(batch): - "-DD" #=> configurations == ["base", "low-light", {"cde": ["-DD"]}] +each-input-can-have-its-own-configuration-and-appear-twice: + configurations: + - base + inputs: + - a.txt: {crop: A} + #=> configurations == ["base", {"crop": ["A"]}] + - a.txt: {crop: B} + #=> configurations == ["base", {"crop": ["B"]}] + - [a.txt, {crop: C}] + #=> configurations == ["base", {"crop": ["C"]}] + + expand-lists-to-work-well-with-aliases: configurations: - base diff --git a/website/docs/batches-running-on-multiple-inputs.md b/website/docs/batches-running-on-multiple-inputs.md index 51e7beb8..c05633e6 100755 --- a/website/docs/batches-running-on-multiple-inputs.md +++ b/website/docs/batches-running-on-multiple-inputs.md @@ -93,6 +93,18 @@ each-input-can-have-its-own-configuration: - cde: - "-DD" #=> configs == ["base", "low-light", {"cde": ["-DD"]}] + + +each-input-can-have-its-own-configuration-and-appear-twice: + configurations: + - base + inputs: + - a.txt: {crop: A} + #=> configurations == ["base", {"crop": ["A"]}] + - a.txt: {crop: B} + #=> configurations == ["base", {"crop": ["B"]}] + - [a.txt, {crop: C}] + #=> configurations == ["base", {"crop": ["C"]}] ``` ## Matrix batches @@ -144,8 +156,8 @@ my-batch-multiple-values: mode: ["a", "b"] configs: - base - - block.threshold: $matrix.threshold - - block.mode: $matrix.mode + - block.threshold: ${matrix.threshold} + - block.mode: ${matrix.mode} # => will start 8 runs run with # [base, block.threshold: 1, block.mode: a