Advanced multiverse structures
Sometimes a multiverse is more complex than a fully connected grid of options. To express dependencies and constraints, you can add rules in the config dictionary.
Three rule types exist:
"exclude"— keep the universe but set specific keys toNaNwhen conditions match"remove"— drop universes entirely when conditions match"order"— control the generation order of decisions
There is also an optional flag:
"deduplicate"— collapse identical universes afterexclude/order(defaults toTrue). Universes are considered identical even if their values areNaN(treated as equal).
Have a look at the following example, which would result in 36 universes for a fully connected multiverse (3 * 3 * 2 * 2). However, we decide to:
Exclude the
valuedecision from all universes which containfunction1beingaorbExclude the
optiondecision from all universes withfunction2beingdRemove all universes which contain
function1cand optionFalse
[2]:
from comet.multiverse import Multiverse
forking_paths = {
"function1": ["a", "b", "c"],
"function2": ["d", "e", "f"],
"value": [4, 5],
"option": [True, False]
}
config = {
"order":
# Have universes for different ordering of functions
[["function1", "function2", "value", "option"],
["function2", "function1", "value", "option"]],
"exclude": [
# Value is irrelevant for all function1 options
[{"function1": "a"}, "value"],
[{"function1": "b"}, "value"],
# Function b never has any option → ignore it (set to NaN)
[{"function2": "d"}, "option"],
],
"remove": [
# Function c only allowed with option == True → drop the False ones
[{"function1": "c"}, {"option": False}],
],
# Optional (True by default): make a/b/c + multiple values/options collapse cleanly
"deduplicate": True
}
def analysis_template():
function1 = {{function1}}
function2 = {{function2}}
value = {{value}}
option = {{option}}
mverse = Multiverse(name="example_mv_structure")
mverse.create(analysis_template, forking_paths, config)
mverse.summary()
Exclusion summary
-----------------
Total number of universes: 72 (includes ordering permutations)
- Set 'value' to NaN for universes matching {'function1': 'a'} (10 total).
- Set 'option' to NaN for universes matching {'function2': 'd'} (8 total).
- Set 'value' to NaN for universes matching {'function1': 'b'} (10 total).
- Removed 8 out of 40 remaining universes:
Rule [{'function1': 'c'}, {'option': False}] excluded 8 universes:
{'function1': 'c', 'function2': 'e', 'value': 4, 'option': False}
{'function1': 'c', 'function2': 'e', 'value': 5, 'option': False}
{'function1': 'c', 'function2': 'f', 'value': 4, 'option': False}
{'function1': 'c', 'function2': 'f', 'value': 5, 'option': False}
{'function2': 'e', 'function1': 'c', 'value': 4, 'option': False}
{'function2': 'e', 'function1': 'c', 'value': 5, 'option': False}
{'function2': 'f', 'function1': 'c', 'value': 4, 'option': False}
{'function2': 'f', 'function1': 'c', 'value': 5, 'option': False}
32 universes remain for analysis.
| Universe | Decision 1 | Value 1 | Decision 2 | Value 2 | Decision 3 | Value 3 | Decision 4 | Value 4 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Universe_1 | function1 | a | function2 | d | value | NaN | option | NaN |
| 1 | Universe_2 | function1 | a | function2 | e | value | NaN | option | True |
| 2 | Universe_3 | function1 | a | function2 | e | value | NaN | option | False |
| 3 | Universe_4 | function1 | a | function2 | f | value | NaN | option | True |
| 4 | Universe_5 | function1 | a | function2 | f | value | NaN | option | False |
| 5 | Universe_6 | function1 | b | function2 | d | value | NaN | option | NaN |
| 6 | Universe_7 | function1 | b | function2 | e | value | NaN | option | True |
| 7 | Universe_8 | function1 | b | function2 | e | value | NaN | option | False |
| 8 | Universe_9 | function1 | b | function2 | f | value | NaN | option | True |
| 9 | Universe_10 | function1 | b | function2 | f | value | NaN | option | False |
| 10 | Universe_11 | function1 | c | function2 | d | value | 4.0 | option | NaN |
| 11 | Universe_12 | function1 | c | function2 | d | value | 5.0 | option | NaN |
| 12 | Universe_13 | function1 | c | function2 | e | value | 4.0 | option | True |
| 13 | Universe_14 | function1 | c | function2 | e | value | 5.0 | option | True |
| 14 | Universe_15 | function1 | c | function2 | f | value | 4.0 | option | True |
| 15 | Universe_16 | function1 | c | function2 | f | value | 5.0 | option | True |
| 16 | Universe_17 | function2 | d | function1 | a | value | NaN | option | NaN |
| 17 | Universe_18 | function2 | d | function1 | b | value | NaN | option | NaN |
| 18 | Universe_19 | function2 | d | function1 | c | value | 4.0 | option | NaN |
| 19 | Universe_20 | function2 | d | function1 | c | value | 5.0 | option | NaN |
| 20 | Universe_21 | function2 | e | function1 | a | value | NaN | option | True |
| 21 | Universe_22 | function2 | e | function1 | a | value | NaN | option | False |
| 22 | Universe_23 | function2 | e | function1 | b | value | NaN | option | True |
| 23 | Universe_24 | function2 | e | function1 | b | value | NaN | option | False |
| 24 | Universe_25 | function2 | e | function1 | c | value | 4.0 | option | True |
| 25 | Universe_26 | function2 | e | function1 | c | value | 5.0 | option | True |
| 26 | Universe_27 | function2 | f | function1 | a | value | NaN | option | True |
| 27 | Universe_28 | function2 | f | function1 | a | value | NaN | option | False |
| 28 | Universe_29 | function2 | f | function1 | b | value | NaN | option | True |
| 29 | Universe_30 | function2 | f | function1 | b | value | NaN | option | False |
| 30 | Universe_31 | function2 | f | function1 | c | value | 4.0 | option | True |
| 31 | Universe_32 | function2 | f | function1 | c | value | 5.0 | option | True |