Skip to content

Commit

Permalink
More flexible per-input configurations in batches
Browse files Browse the repository at this point in the history
  • Loading branch information
arthur-flam committed Feb 8, 2022
1 parent 02786a3 commit 155fe20
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 11 deletions.
24 changes: 15 additions & 9 deletions qaboard/iterators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
17 changes: 17 additions & 0 deletions tests/test_iterators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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
Expand Down
16 changes: 14 additions & 2 deletions website/docs/batches-running-on-multiple-inputs.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 155fe20

Please sign in to comment.