{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Advanced multiverse structures\n", "\n", "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.\n", "\n", "Three rule types exist:\n", "\n", "- `\"exclude\"` — keep the universe but set specific keys to `NaN` when conditions match \n", "- `\"remove\"` — drop universes entirely when conditions match \n", "- `\"order\"` — control the generation order of decisions\n", "\n", "There is also an optional flag:\n", "\n", "- `\"deduplicate\"` — collapse identical universes after `exclude`/`order` (defaults to `True`). \n", " Universes are considered identical even if their values are `NaN` (treated as equal).\n", "\n", "\n", "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:\n", "\n", "- Exclude the `value` decision from all universes which contain `function1` being `a` or `b`\n", "- Exclude the `option` decision from all universes with `function2` being `d`\n", "- Remove all universes which contain `function1` `c` and option `False`\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Exclusion summary\n", "-----------------\n", "Total number of universes: 72 (includes ordering permutations)\n", " - Set 'value' to NaN for universes matching {'function1': 'a'} (10 total).\n", " - Set 'option' to NaN for universes matching {'function2': 'd'} (8 total).\n", " - Set 'value' to NaN for universes matching {'function1': 'b'} (10 total).\n", " - Removed 8 out of 40 remaining universes:\n", " Rule [{'function1': 'c'}, {'option': False}] excluded 8 universes:\n", " {'function1': 'c', 'function2': 'e', 'value': 4, 'option': False}\n", " {'function1': 'c', 'function2': 'e', 'value': 5, 'option': False}\n", " {'function1': 'c', 'function2': 'f', 'value': 4, 'option': False}\n", " {'function1': 'c', 'function2': 'f', 'value': 5, 'option': False}\n", " {'function2': 'e', 'function1': 'c', 'value': 4, 'option': False}\n", " {'function2': 'e', 'function1': 'c', 'value': 5, 'option': False}\n", " {'function2': 'f', 'function1': 'c', 'value': 4, 'option': False}\n", " {'function2': 'f', 'function1': 'c', 'value': 5, 'option': False}\n", "\n", "32 universes remain for analysis.\n" ] }, { "data": { "text/html": [ "
| \n", " | Universe | \n", "Decision 1 | \n", "Value 1 | \n", "Decision 2 | \n", "Value 2 | \n", "Decision 3 | \n", "Value 3 | \n", "Decision 4 | \n", "Value 4 | \n", "
|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "Universe_1 | \n", "function1 | \n", "a | \n", "function2 | \n", "d | \n", "value | \n", "NaN | \n", "option | \n", "NaN | \n", "
| 1 | \n", "Universe_2 | \n", "function1 | \n", "a | \n", "function2 | \n", "e | \n", "value | \n", "NaN | \n", "option | \n", "True | \n", "
| 2 | \n", "Universe_3 | \n", "function1 | \n", "a | \n", "function2 | \n", "e | \n", "value | \n", "NaN | \n", "option | \n", "False | \n", "
| 3 | \n", "Universe_4 | \n", "function1 | \n", "a | \n", "function2 | \n", "f | \n", "value | \n", "NaN | \n", "option | \n", "True | \n", "
| 4 | \n", "Universe_5 | \n", "function1 | \n", "a | \n", "function2 | \n", "f | \n", "value | \n", "NaN | \n", "option | \n", "False | \n", "
| 5 | \n", "Universe_6 | \n", "function1 | \n", "b | \n", "function2 | \n", "d | \n", "value | \n", "NaN | \n", "option | \n", "NaN | \n", "
| 6 | \n", "Universe_7 | \n", "function1 | \n", "b | \n", "function2 | \n", "e | \n", "value | \n", "NaN | \n", "option | \n", "True | \n", "
| 7 | \n", "Universe_8 | \n", "function1 | \n", "b | \n", "function2 | \n", "e | \n", "value | \n", "NaN | \n", "option | \n", "False | \n", "
| 8 | \n", "Universe_9 | \n", "function1 | \n", "b | \n", "function2 | \n", "f | \n", "value | \n", "NaN | \n", "option | \n", "True | \n", "
| 9 | \n", "Universe_10 | \n", "function1 | \n", "b | \n", "function2 | \n", "f | \n", "value | \n", "NaN | \n", "option | \n", "False | \n", "
| 10 | \n", "Universe_11 | \n", "function1 | \n", "c | \n", "function2 | \n", "d | \n", "value | \n", "4.0 | \n", "option | \n", "NaN | \n", "
| 11 | \n", "Universe_12 | \n", "function1 | \n", "c | \n", "function2 | \n", "d | \n", "value | \n", "5.0 | \n", "option | \n", "NaN | \n", "
| 12 | \n", "Universe_13 | \n", "function1 | \n", "c | \n", "function2 | \n", "e | \n", "value | \n", "4.0 | \n", "option | \n", "True | \n", "
| 13 | \n", "Universe_14 | \n", "function1 | \n", "c | \n", "function2 | \n", "e | \n", "value | \n", "5.0 | \n", "option | \n", "True | \n", "
| 14 | \n", "Universe_15 | \n", "function1 | \n", "c | \n", "function2 | \n", "f | \n", "value | \n", "4.0 | \n", "option | \n", "True | \n", "
| 15 | \n", "Universe_16 | \n", "function1 | \n", "c | \n", "function2 | \n", "f | \n", "value | \n", "5.0 | \n", "option | \n", "True | \n", "
| 16 | \n", "Universe_17 | \n", "function2 | \n", "d | \n", "function1 | \n", "a | \n", "value | \n", "NaN | \n", "option | \n", "NaN | \n", "
| 17 | \n", "Universe_18 | \n", "function2 | \n", "d | \n", "function1 | \n", "b | \n", "value | \n", "NaN | \n", "option | \n", "NaN | \n", "
| 18 | \n", "Universe_19 | \n", "function2 | \n", "d | \n", "function1 | \n", "c | \n", "value | \n", "4.0 | \n", "option | \n", "NaN | \n", "
| 19 | \n", "Universe_20 | \n", "function2 | \n", "d | \n", "function1 | \n", "c | \n", "value | \n", "5.0 | \n", "option | \n", "NaN | \n", "
| 20 | \n", "Universe_21 | \n", "function2 | \n", "e | \n", "function1 | \n", "a | \n", "value | \n", "NaN | \n", "option | \n", "True | \n", "
| 21 | \n", "Universe_22 | \n", "function2 | \n", "e | \n", "function1 | \n", "a | \n", "value | \n", "NaN | \n", "option | \n", "False | \n", "
| 22 | \n", "Universe_23 | \n", "function2 | \n", "e | \n", "function1 | \n", "b | \n", "value | \n", "NaN | \n", "option | \n", "True | \n", "
| 23 | \n", "Universe_24 | \n", "function2 | \n", "e | \n", "function1 | \n", "b | \n", "value | \n", "NaN | \n", "option | \n", "False | \n", "
| 24 | \n", "Universe_25 | \n", "function2 | \n", "e | \n", "function1 | \n", "c | \n", "value | \n", "4.0 | \n", "option | \n", "True | \n", "
| 25 | \n", "Universe_26 | \n", "function2 | \n", "e | \n", "function1 | \n", "c | \n", "value | \n", "5.0 | \n", "option | \n", "True | \n", "
| 26 | \n", "Universe_27 | \n", "function2 | \n", "f | \n", "function1 | \n", "a | \n", "value | \n", "NaN | \n", "option | \n", "True | \n", "
| 27 | \n", "Universe_28 | \n", "function2 | \n", "f | \n", "function1 | \n", "a | \n", "value | \n", "NaN | \n", "option | \n", "False | \n", "
| 28 | \n", "Universe_29 | \n", "function2 | \n", "f | \n", "function1 | \n", "b | \n", "value | \n", "NaN | \n", "option | \n", "True | \n", "
| 29 | \n", "Universe_30 | \n", "function2 | \n", "f | \n", "function1 | \n", "b | \n", "value | \n", "NaN | \n", "option | \n", "False | \n", "
| 30 | \n", "Universe_31 | \n", "function2 | \n", "f | \n", "function1 | \n", "c | \n", "value | \n", "4.0 | \n", "option | \n", "True | \n", "
| 31 | \n", "Universe_32 | \n", "function2 | \n", "f | \n", "function1 | \n", "c | \n", "value | \n", "5.0 | \n", "option | \n", "True | \n", "