Learning & research
Open-Endedness Explore open-ended search, changing tasks and an evolving capability landscape.
Code & guide What to expect This directory includes code and documentation. Its guide defines dependencies, execution modes and what the results demonstrate.
Guides & runbooks 3
Registered commands 0 Environment setup ↗ Guided tour Inspect the sources Try it locally Architecture Complete library
A CLOSER LOOK
How do curriculum strategies change what gets explored? For learning researchers: compare uniform, learning-progress and OMNI strategies over the same configurable synthetic task distribution.
01 Set the task landscape Inspect task probabilities, episode count and economic assumptions. A changing task distribution changes the meaning of the score.
demo/Open-Endedness-v0/config.demo.yaml ↗ Inspect this source ↓ 02 Compare three strategies The runner executes uniform, lp and omni and writes distribution, JSON and report artifacts. Follow _run_strategy and _write_artifacts to interpret them.
demo/Open-Endedness-v0/run_demo.py ↗ Inspect this source ↓ 03 Inspect the simulator Trace task sampling and value/cost accumulation. These are simulated outcomes, not measured commercial returns.
demo/Open-Endedness-v0/simulator.py ↗ Inspect this source ↓
REAL REPOSITORY MATERIAL
Inspect. Understand. Reproduce. Reading the exact source at revision 5b4cebb3. This browser inspection does not execute the demo.
demo/Open-Endedness-v0/config.demo.yaml
Select a walkthrough step to explore its source.
Show more fields ↓ Full source text # Turn-key configuration for the Open-Endedness demo.
seed: 1337
episodes: 600
report:
include_plots: true
write_distribution_csv: true
write_telemetry: true
gmvs_target_usd: 250000
omni:
fast_ema_beta: 0.1
slow_ema_beta: 0.01
lp_floor: 1e-6
moi_weight_interesting: 1.0
moi_weight_boring: 0.001
min_probability: 0.001
fallback_strategy: "uniform"
partition_update_interval: 25
exploration_epsilon: 0.08
exploration_decay: 0.995
interestingness:
model: "stub"
stub_profiles:
- name: "conversion"
description: "Conversion funnel heuristics based on OMNI Appendix prompts."
boring_relations:
shortlist_top_candidates:
- shortlist_top_candidates_variant_b
- shortlist_top_candidates_variant_c
offer_discount_email_a:
- offer_discount_email_b
- offer_discount_email_c
onboarding_call_script_a:
- onboarding_call_script_b
- name: "growth"
description: "Aggressive growth heuristics prioritising GMV deltas."
boring_relations:
offer_discount_email_a:
- offer_discount_email_c
thermostat:
roi_target: 4.0
roi_floor: 1.5
fm_cost_per_call: 0.03
max_daily_fm_cost: 300.0
epsilon_range:
min: 0.02
max: 0.25
moi_interval_bounds:
min: 10
max: 120
adjust_every: 12
gmvs_smoothing_beta: 0.2
cost_smoothing_beta: 0.1
sentinels:
roi_task_floor: 1.0
roi_overall_floor: 1.8
moi_qps_max: 0.2
moi_daily_max: 600
min_task_entropy: 0.65
budget_limit: 1000.0
diversity_injection_window: 30
diversity_min_unique: 5
simulation:
cohorts:
enterprise:
value_scale: 1.8
tasks:
- id: shortlist_top_candidates
base_success: 0.18
max_success: 0.72
learning_rate: 0.015
gmv: 1800
- id: offer_discount_email_a
base_success: 0.09
max_success: 0.6
learning_rate: 0.022
gmv: 2200
- id: onboarding_call_script_a
base_success: 0.12
max_success: 0.55
learning_rate: 0.014
gmv: 2600
- id: shortlist_top_candidates_variant_b
base_success: 0.17
max_success: 0.4
learning_rate: 0.018
gmv: 900
- id: shortlist_top_candidates_variant_c
base_success: 0.17
max_success: 0.38
learning_rate: 0.016
gmv: 850
- id: offer_discount_email_b
base_success: 0.1
max_success: 0.42
learning_rate: 0.015
gmv: 950
- id: offer_discount_email_c
base_success: 0.08
max_success: 0.41
learning_rate: 0.013
gmv: 870
- id: onboarding_call_script_b
base_success: 0.1
max_success: 0.43
learning_rate: 0.011
gmv: 940
smb:
value_scale: 1.0
tasks:
- id: shortlist_top_candidates
base_success: 0.12
max_success: 0.55
learning_rate: 0.012
gmv: 950
- id: offer_discount_email_a
base_success: 0.07
max_success: 0.45
learning_rate: 0.017
gmv: 1100
- id: onboarding_call_script_a
base_success: 0.08
max_success: 0.42
learning_rate: 0.01
gmv: 1250
- id: shortlist_top_candidates_variant_b
base_success: 0.11
max_success: 0.28
learning_rate: 0.012
gmv: 450
- id: offer_discount_email_b
base_success: 0.09
max_success: 0.33
learning_rate: 0.009
gmv: 420
- id: onboarding_call_script_b
base_success: 0.09
max_success: 0.36
learning_rate: 0.009
gmv: 400
SHA-256 f9f6a12137a86d82b442345c36349c10146700545768c1ac0f8f9c4770b923f2
The first source is shown in full. All walkthrough source links and the complete document library remain available without JavaScript.
{"revision":"5b4cebb309a83a7a6749d8911d8bf96a1921e042","sources":[{"file":"demo/Open-Endedness-v0/config.demo.yaml","content":"# Turn-key configuration for the Open-Endedness demo.\nseed: 1337\nepisodes: 600\nreport:\n include_plots: true\n write_distribution_csv: true\n write_telemetry: true\n gmvs_target_usd: 250000\n\nomni:\n fast_ema_beta: 0.1\n slow_ema_beta: 0.01\n lp_floor: 1e-6\n moi_weight_interesting: 1.0\n moi_weight_boring: 0.001\n min_probability: 0.001\n fallback_strategy: \"uniform\"\n partition_update_interval: 25\n exploration_epsilon: 0.08\n exploration_decay: 0.995\n\ninterestingness:\n model: \"stub\"\n stub_profiles:\n - name: \"conversion\"\n description: \"Conversion funnel heuristics based on OMNI Appendix prompts.\"\n boring_relations:\n shortlist_top_candidates:\n - shortlist_top_candidates_variant_b\n - shortlist_top_candidates_variant_c\n offer_discount_email_a:\n - offer_discount_email_b\n - offer_discount_email_c\n onboarding_call_script_a:\n - onboarding_call_script_b\n - name: \"growth\"\n description: \"Aggressive growth heuristics prioritising GMV deltas.\"\n boring_relations:\n offer_discount_email_a:\n - offer_discount_email_c\nthermostat:\n roi_target: 4.0\n roi_floor: 1.5\n fm_cost_per_call: 0.03\n max_daily_fm_cost: 300.0\n epsilon_range:\n min: 0.02\n max: 0.25\n moi_interval_bounds:\n min: 10\n max: 120\n adjust_every: 12\n gmvs_smoothing_beta: 0.2\n cost_smoothing_beta: 0.1\n\nsentinels:\n roi_task_floor: 1.0\n roi_overall_floor: 1.8\n moi_qps_max: 0.2\n moi_daily_max: 600\n min_task_entropy: 0.65\n budget_limit: 1000.0\n diversity_injection_window: 30\n diversity_min_unique: 5\n\nsimulation:\n cohorts:\n enterprise:\n value_scale: 1.8\n tasks:\n - id: shortlist_top_candidates\n base_success: 0.18\n max_success: 0.72\n learning_rate: 0.015\n gmv: 1800\n - id: offer_discount_email_a\n base_success: 0.09\n max_success: 0.6\n learning_rate: 0.022\n gmv: 2200\n - id: onboarding_call_script_a\n base_success: 0.12\n max_success: 0.55\n learning_rate: 0.014\n gmv: 2600\n - id: shortlist_top_candidates_variant_b\n base_success: 0.17\n max_success: 0.4\n learning_rate: 0.018\n gmv: 900\n - id: shortlist_top_candidates_variant_c\n base_success: 0.17\n max_success: 0.38\n learning_rate: 0.016\n gmv: 850\n - id: offer_discount_email_b\n base_success: 0.1\n max_success: 0.42\n learning_rate: 0.015\n gmv: 950\n - id: offer_discount_email_c\n base_success: 0.08\n max_success: 0.41\n learning_rate: 0.013\n gmv: 870\n - id: onboarding_call_script_b\n base_success: 0.1\n max_success: 0.43\n learning_rate: 0.011\n gmv: 940\n smb:\n value_scale: 1.0\n tasks:\n - id: shortlist_top_candidates\n base_success: 0.12\n max_success: 0.55\n learning_rate: 0.012\n gmv: 950\n - id: offer_discount_email_a\n base_success: 0.07\n max_success: 0.45\n learning_rate: 0.017\n gmv: 1100\n - id: onboarding_call_script_a\n base_success: 0.08\n max_success: 0.42\n learning_rate: 0.01\n gmv: 1250\n - id: shortlist_top_candidates_variant_b\n base_success: 0.11\n max_success: 0.28\n learning_rate: 0.012\n gmv: 450\n - id: offer_discount_email_b\n base_success: 0.09\n max_success: 0.33\n learning_rate: 0.009\n gmv: 420\n - id: onboarding_call_script_b\n base_success: 0.09\n max_success: 0.36\n learning_rate: 0.009\n gmv: 400\n","format":"text","sha256":"f9f6a12137a86d82b442345c36349c10146700545768c1ac0f8f9c4770b923f2","bytes":3783,"download":"/AGIJobsv0/examples/f9f6a12137a86d82-config.demo.yaml","source":"https://github.com/MontrealAI/AGIJobsv0/blob/5b4cebb309a83a7a6749d8911d8bf96a1921e042/demo/Open-Endedness-v0/config.demo.yaml"},{"file":"demo/Open-Endedness-v0/run_demo.py","content":"\"\"\"CLI entrypoint for the Open-Endedness demo.\"\"\"\nfrom __future__ import annotations\n\nimport argparse\nimport copy\nimport pathlib\nimport sys\nfrom typing import Dict, Mapping\n\nimport yaml\n\nCURRENT_DIR = pathlib.Path(__file__).resolve().parent\nif str(CURRENT_DIR) not in sys.path:\n sys.path.insert(0, str(CURRENT_DIR))\n\nfrom simulator import ( # type: ignore\n FunnelSimulator,\n gmv_series,\n load_simulation_config,\n save_distribution_csv,\n save_json,\n)\n\n\nDEFAULT_CONFIG = CURRENT_DIR / \"config.demo.yaml\"\nDEFAULT_OUTPUT_DIR = CURRENT_DIR / \"reports\" / \"omni_output\"\n\n\ndef _load_config(path: pathlib.Path) -> Mapping[str, object]:\n if not path.exists():\n raise FileNotFoundError(f\"Config file not found: {path}\")\n return yaml.safe_load(path.read_text(encoding=\"utf-8\"))\n\n\ndef _prepare_output_dir(path: pathlib.Path) -> None:\n path.mkdir(parents=True, exist_ok=True)\n\n\ndef _run_strategy(strategy: str, config_dict: Mapping[str, object]) -> Dict[str, object]:\n working_config = copy.deepcopy(config_dict)\n sim_config = load_simulation_config(working_config)\n interestingness_config = working_config.get(\"interestingness\", {})\n if strategy == \"lp\":\n interestingness_config = {\"model\": \"stub\", \"stub_profiles\": []}\n simulator = FunnelSimulator(\n sim_config,\n interestingness_config=interestingness_config,\n strategy=\"uniform\" if strategy == \"uniform\" else \"omni\",\n )\n simulator.run()\n gmv_curve = gmv_series(simulator.episode_results)\n summary = {\n \"strategy\": strategy,\n \"gmv\": simulator.gmv,\n \"cost\": simulator.cost,\n \"roi\": simulator.gmv / max(simulator.cost, 1e-9),\n \"episodes\": len(simulator.episode_results),\n \"distribution_history\": simulator.distribution_timeseries(),\n \"telemetry\": simulator.telemetry_bundle(),\n \"gmv_curve\": gmv_curve,\n }\n if strategy == \"uniform\":\n summary[\"telemetry\"] = {\"gmv\": simulator.gmv, \"cost\": simulator.cost, \"roi\": summary[\"roi\"]}\n return summary\n\n\ndef _write_report(output_dir: pathlib.Path, config: Mapping[str, object], results: Dict[str, Dict[str, object]]) -> None:\n template = pathlib.Path(__file__).with_name(\"report_template.md\").read_text(encoding=\"utf-8\")\n omni = results[\"omni\"]\n lp_only = results[\"lp\"]\n uniform = results[\"uniform\"]\n gmvs_target = float(config[\"report\"][\"gmvs_target_usd\"])\n content = template.format(\n episodes=omni[\"episodes\"],\n omni_gmv=f\"${omni['gmv']:,.2f}\",\n omni_roi=f\"{omni['roi']:.2f}x\",\n lp_gmv=f\"${lp_only['gmv']:,.2f}\",\n lp_roi=f\"{lp_only['roi']:.2f}x\",\n uniform_gmv=f\"${uniform['gmv']:,.2f}\",\n uniform_roi=f\"{uniform['roi']:.2f}x\",\n gmv_lift=f\"{(omni['gmv'] - lp_only['gmv']) / max(lp_only['gmv'], 1e-9) * 100:.1f}%\",\n roi_lift=f\"{(omni['roi'] - lp_only['roi']) / max(lp_only['roi'], 1e-9) * 100:.1f}%\",\n gmv_target=f\"${gmvs_target:,.0f}\",\n )\n output_path = output_dir / \"omni_report.md\"\n output_path.write_text(content, encoding=\"utf-8\")\n\n\ndef _write_artifacts(output_dir: pathlib.Path, config: Mapping[str, object], results: Dict[str, Dict[str, object]]) -> None:\n output_dir.mkdir(parents=True, exist_ok=True)\n if config[\"report\"].get(\"write_distribution_csv\", False):\n for strategy, summary in results.items():\n history = summary[\"distribution_history\"]\n if not history:\n continue\n save_distribution_csv(history, output_dir / f\"{strategy}_distribution.csv\")\n if config[\"report\"].get(\"write_telemetry\", False):\n for strategy, summary in results.items():\n save_json(summary[\"telemetry\"], output_dir / f\"{strategy}_telemetry.json\")\n dashboards_dir = output_dir / \"dashboards\"\n dashboards_dir.mkdir(parents=True, exist_ok=True)\n dashboards_path = dashboards_dir / \"omni_insights.json\"\n save_json(results[\"omni\"][\"telemetry\"], dashboards_path)\n\n\ndef main() -> None:\n parser = argparse.ArgumentParser(description=\"Run the Open-Endedness demo\")\n parser.add_argument(\n \"--config\",\n type=pathlib.Path,\n default=DEFAULT_CONFIG,\n help=f\"Path to YAML config (default: {DEFAULT_CONFIG})\",\n )\n parser.add_argument(\n \"--output\",\n type=pathlib.Path,\n default=DEFAULT_OUTPUT_DIR,\n help=f\"Directory to write artifacts (default: {DEFAULT_OUTPUT_DIR})\",\n )\n args = parser.parse_args()\n\n config_dict = _load_config(args.config)\n _prepare_output_dir(args.output)\n\n results = {\n strategy: _run_strategy(strategy, config_dict)\n for strategy in (\"uniform\", \"lp\", \"omni\")\n }\n\n _write_artifacts(args.output, config_dict, results)\n _write_report(args.output, config_dict, results)\n\n print(\"=== OMNI Demo Complete ===\")\n for strategy, summary in results.items():\n print(f\"{strategy.upper():<8} GMV: ${summary['gmv']:,.2f} | ROI: {summary['roi']:.2f}x | Episodes: {summary['episodes']}\")\n\n\nif __name__ == \"__main__\":\n main()\n","format":"text","sha256":"7e11fab0ede0c6f0a1d09047e9544b45ae1f5eeb94d72252e4f2ea8d34ee116b","bytes":5047,"download":"/AGIJobsv0/examples/7e11fab0ede0c6f0-run_demo.py","source":"https://github.com/MontrealAI/AGIJobsv0/blob/5b4cebb309a83a7a6749d8911d8bf96a1921e042/demo/Open-Endedness-v0/run_demo.py"},{"file":"demo/Open-Endedness-v0/simulator.py","content":"\"\"\"Business funnel simulator used by the Open-Endedness demo.\"\"\"\nfrom __future__ import annotations\n\nimport csv\nimport json\nimport pathlib\nimport random\nimport sys\nfrom collections import defaultdict\nfrom dataclasses import dataclass\nfrom typing import Dict, Iterable, List, Mapping, Sequence\n\nCURRENT_DIR = pathlib.Path(__file__).resolve().parent\nif str(CURRENT_DIR) not in sys.path:\n sys.path.insert(0, str(CURRENT_DIR))\n\nfrom engine import OmniConfig, OmniCurriculumEngine # type: ignore\nfrom interestingness import OracleFactory # type: ignore\nfrom sentinels import SentinelConfig, SentinelController # type: ignore\nfrom thermostat import ThermostatConfig, ThermostatController # type: ignore\n\n\n@dataclass\nclass TaskConfig:\n task_id: str\n base_success: float\n max_success: float\n learning_rate: float\n gmv: float\n\n\n@dataclass\nclass CohortConfig:\n name: str\n value_scale: float\n tasks: List[TaskConfig]\n\n\n@dataclass\nclass SimulationConfig:\n seed: int\n episodes: int\n omni_config: OmniConfig\n thermostat_config: ThermostatConfig\n sentinel_config: SentinelConfig\n cohorts: List[CohortConfig]\n\n\n@dataclass\nclass EpisodeResult:\n task_id: str\n success: bool\n revenue: float\n cost: float\n cohort: str\n\n\ndef _load_cohorts(raw: Mapping[str, object]) -> List[CohortConfig]:\n cohorts: List[CohortConfig] = []\n for name, payload in raw.items():\n tasks_data = payload.get(\"tasks\", [])\n tasks = [\n TaskConfig(\n task_id=str(task[\"id\"]),\n base_success=float(task[\"base_success\"]),\n max_success=float(task[\"max_success\"]),\n learning_rate=float(task[\"learning_rate\"]),\n gmv=float(task[\"gmv\"]),\n )\n for task in tasks_data\n ]\n cohorts.append(CohortConfig(name=str(name), value_scale=float(payload.get(\"value_scale\", 1.0)), tasks=tasks))\n return cohorts\n\n\ndef load_simulation_config(config_dict: Mapping[str, object]) -> SimulationConfig:\n omni = config_dict[\"omni\"]\n thermostat = config_dict[\"thermostat\"]\n sentinels = config_dict[\"sentinels\"]\n simulation = config_dict[\"simulation\"]\n min_moi_interval = thermostat.get(\"min_moi_interval\")\n max_moi_interval = thermostat.get(\"max_moi_interval\")\n if min_moi_interval is None or max_moi_interval is None:\n bounds = thermostat.get(\"moi_interval_bounds\", {})\n min_moi_interval = bounds.get(\"min\")\n max_moi_interval = bounds.get(\"max\")\n return SimulationConfig(\n seed=int(config_dict.get(\"seed\", 0)),\n episodes=int(config_dict.get(\"episodes\", 1)),\n omni_config=OmniConfig(\n fast_ema_beta=float(omni[\"fast_ema_beta\"]),\n slow_ema_beta=float(omni[\"slow_ema_beta\"]),\n lp_floor=float(omni[\"lp_floor\"]),\n moi_weight_interesting=float(omni[\"moi_weight_interesting\"]),\n moi_weight_boring=float(omni[\"moi_weight_boring\"]),\n min_probability=float(omni[\"min_probability\"]),\n fallback_strategy=str(omni[\"fallback_strategy\"]),\n partition_update_interval=int(omni[\"partition_update_interval\"]),\n exploration_epsilon=float(omni[\"exploration_epsilon\"]),\n exploration_decay=float(omni[\"exploration_decay\"]),\n ),\n thermostat_config=ThermostatConfig(\n roi_target=float(thermostat[\"roi_target\"]),\n roi_floor=float(thermostat[\"roi_floor\"]),\n min_moi_interval=int(min_moi_interval),\n max_moi_interval=int(max_moi_interval),\n fm_cost_per_call=float(thermostat[\"fm_cost_per_call\"]),\n max_daily_fm_cost=float(thermostat[\"max_daily_fm_cost\"]),\n epsilon_range=dict(thermostat[\"epsilon_range\"]),\n moi_interval_bounds=dict(thermostat[\"moi_interval_bounds\"]),\n adjust_every=int(thermostat[\"adjust_every\"]),\n gmvs_smoothing_beta=float(thermostat[\"gmvs_smoothing_beta\"]),\n cost_smoothing_beta=float(thermostat[\"cost_smoothing_beta\"]),\n ),\n sentinel_config=SentinelConfig(\n roi_task_floor=float(sentinels[\"roi_task_floor\"]),\n roi_overall_floor=float(sentinels[\"roi_overall_floor\"]),\n moi_qps_max=float(sentinels[\"moi_qps_max\"]),\n moi_daily_max=int(sentinels[\"moi_daily_max\"]),\n min_task_entropy=float(sentinels[\"min_task_entropy\"]),\n budget_limit=float(sentinels[\"budget_limit\"]),\n diversity_injection_window=int(sentinels[\"diversity_injection_window\"]),\n diversity_min_unique=int(sentinels[\"diversity_min_unique\"]),\n ),\n cohorts=_load_cohorts(simulation[\"cohorts\"]),\n )\n\n\ndef _initialise_engine(sim_config: SimulationConfig, interestingness_config: Mapping[str, object]) -> OmniCurriculumEngine:\n rng = random.Random(sim_config.seed)\n tasks = {task.task_id for cohort in sim_config.cohorts for task in cohort.tasks}\n oracle = OracleFactory().build(interestingness_config)\n engine = OmniCurriculumEngine(tasks=tasks, config=sim_config.omni_config, oracle=oracle, rng=rng)\n return engine\n\n\ndef _initialise_thermostat(sim_config: SimulationConfig, engine: OmniCurriculumEngine) -> ThermostatController:\n return ThermostatController(\n engine=engine,\n config=sim_config.thermostat_config,\n )\n\n\ndef _initialise_sentinels(sim_config: SimulationConfig) -> SentinelController:\n return SentinelController(sim_config.sentinel_config)\n\n\nclass FunnelSimulator:\n def __init__(\n self,\n sim_config: SimulationConfig,\n interestingness_config: Mapping[str, object],\n strategy: str = \"omni\",\n ) -> None:\n self._config = sim_config\n self._rng = random.Random(sim_config.seed)\n self._engine = _initialise_engine(sim_config, interestingness_config)\n self._thermostat = _initialise_thermostat(sim_config, self._engine)\n self._sentinels = _initialise_sentinels(sim_config)\n self._strategy = strategy\n self._cohort_map: Dict[str, CohortConfig] = {cohort.name: cohort for cohort in sim_config.cohorts}\n self._task_to_cohorts: Dict[str, List[CohortConfig]] = defaultdict(list)\n self._baselines: Dict[str, float] = {\n task.task_id: task.base_success for cohort in sim_config.cohorts for task in cohort.tasks\n }\n self._success_buffer: Dict[str, float] = {\n task_id: self._baselines[task_id] for task_id in self._baselines\n }\n self._gmv = 0.0\n self._cost = 0.0\n self._fm_calls = 0\n self._episode_results: List[EpisodeResult] = []\n self._task_last_cohort: Dict[str, str] = {}\n for cohort in sim_config.cohorts:\n for task in cohort.tasks:\n self._task_to_cohorts[task.task_id].append(cohort)\n\n @property\n def engine(self) -> OmniCurriculumEngine:\n return self._engine\n\n @property\n def thermostat(self) -> ThermostatController:\n return self._thermostat\n\n @property\n def sentinels(self) -> SentinelController:\n return self._sentinels\n\n @property\n def episode_results(self) -> Sequence[EpisodeResult]:\n return tuple(self._episode_results)\n\n @property\n def gmv(self) -> float:\n return self._gmv\n\n @property\n def cost(self) -> float:\n return self._cost\n\n def run(self) -> None:\n for episode in range(self._config.episodes):\n if episode % self._config.thermostat_config.adjust_every == 0 and episode > 0:\n self._thermostat.ingest_metrics(\n roi=self._gmv / max(self._cost, 1e-9),\n fm_calls_today=self._fm_calls,\n cumulative_gmv=self._gmv,\n cumulative_cost=self._cost,\n )\n adjustments = self._thermostat.adjust()\n self._engine._config.exploration_epsilon = adjustments[\"epsilon\"]\n self._engine._config.partition_update_interval = adjustments[\"moi_interval\"]\n snapshot = self._engine.snapshot()\n diversity_alerts = self._sentinels.enforce_diversity(\n [s.probabilities for s in self._engine.history]\n )\n if self._strategy == \"uniform\":\n task = self._rng.choices(list(self._engine.metrics.keys()), k=1)[0]\n else:\n if episode % max(self._engine._config.partition_update_interval, 1) == 0:\n self._fm_calls += 1\n task = self._engine.sample_task()\n if not self._sentinels.is_task_allowed(task):\n continue\n candidate_cohorts = self._task_to_cohorts.get(task, [])\n if not candidate_cohorts:\n continue\n cohort = self._rng.choices(candidate_cohorts, k=1)[0]\n task_config = next(t for t in cohort.tasks if t.task_id == task)\n success_prob = self._success_buffer[task]\n success = self._rng.random() < success_prob\n revenue = (task_config.gmv * cohort.value_scale) if success else 0.0\n cost = 1.0 # placeholder for intervention cost\n self._gmv += revenue\n self._cost += cost\n self._engine.update_outcome(task, success, revenue, cost)\n self._episode_results.append(\n EpisodeResult(task_id=task, success=success, revenue=revenue, cost=cost, cohort=cohort.name)\n )\n self._task_last_cohort[task] = cohort.name\n if success:\n delta = (task_config.max_success - success_prob) * task_config.learning_rate\n self._success_buffer[task] = min(success_prob + delta, task_config.max_success)\n else:\n self._success_buffer[task] = max(success_prob * (1 - 0.05), task_config.base_success)\n if self._strategy != \"uniform\":\n self._sentinels.enforce_roi(self._engine)\n\n def to_csv(self, output: pathlib.Path) -> None:\n output.parent.mkdir(parents=True, exist_ok=True)\n with output.open(\"w\", newline=\"\") as fp:\n writer = csv.writer(fp)\n writer.writerow([\"episode\", \"task\", \"success\", \"revenue\", \"cost\", \"cohort\"])\n for idx, result in enumerate(self._episode_results):\n writer.writerow([idx, result.task_id, int(result.success), result.revenue, result.cost, result.cohort])\n\n def distribution_timeseries(self) -> List[Dict[str, float]]:\n return [snapshot.probabilities for snapshot in self._engine.history]\n\n def telemetry_bundle(self) -> Dict[str, object]:\n return {\n \"gmv\": self._gmv,\n \"cost\": self._cost,\n \"roi\": self._gmv / max(self._cost, 1e-9),\n \"disabled_tasks\": list(self._sentinels.disable_tasks()),\n \"metrics\": {\n task: {\n \"success_rate\": metrics.success_rate,\n \"lp\": metrics.lp,\n \"roi\": metrics.roi,\n }\n for task, metrics in self._engine.metrics.items()\n },\n }\n\n\ndef save_json(data: Mapping[str, object], path: pathlib.Path) -> None:\n path.parent.mkdir(parents=True, exist_ok=True)\n path.write_text(json.dumps(data, indent=2), encoding=\"utf-8\")\n\n\ndef save_distribution_csv(history: Sequence[Mapping[str, float]], path: pathlib.Path) -> None:\n path.parent.mkdir(parents=True, exist_ok=True)\n tasks = sorted(history[0].keys()) if history else []\n with path.open(\"w\", newline=\"\") as fp:\n writer = csv.writer(fp)\n writer.writerow([\"episode\", *tasks])\n for idx, snapshot in enumerate(history):\n writer.writerow([idx, *[snapshot[task] for task in tasks]])\n\n\ndef gmv_series(results: Sequence[EpisodeResult]) -> List[float]:\n series: List[float] = [0.0] * len(results)\n total = 0.0\n for idx, result in enumerate(results):\n total += result.revenue\n series[idx] = total\n return series\n","format":"text","sha256":"38f0fc95f4ad8ede1e8671b5ae9392ed4bc14b6a9f9d9a2290a2935d4eb398d7","bytes":12011,"download":"/AGIJobsv0/examples/38f0fc95f4ad8ede-simulator.py","source":"https://github.com/MontrealAI/AGIJobsv0/blob/5b4cebb309a83a7a6749d8911d8bf96a1921e042/demo/Open-Endedness-v0/simulator.py"}]}
FROM READING TO A REPRODUCIBLE RUN
Try the selected path. Isolated Python environment Use Python 3.12 in a virtual environment. Install this demo’s tracked requirements file when present, then run python -m pip check. Some variants have additional requirements: follow the selected implementation’s guide, not an unrelated demo’s dependency list.
Copy the environment setup python3.12 -m venv .venv-open-endedness-v0-d6342f78
. .venv-open-endedness-v0-d6342f78/bin/activate
python -m pip install PyYAML==6.0.2
python -m pip checkCopy Complete environment setup ↗ SELECTED EXECUTION PATH Copy
python demo/Open-Endedness-v0/run_demo.py --output /tmp/open-endedness-demoWhat you should observe The terminal compares GMV, ROI and episodes for three strategies; /tmp/open-endedness-demo contains the detailed artifacts.
The source inspector above reads bundled repository material. Local commands run separately on your computer. Recorded examples may contain historical timestamps, placeholders and simulated metrics.
MAKE IT YOUR OWN
One useful experiment. Copy the YAML configuration, change task probabilities, and pass --config. Check whether the same strategy still wins and why.
THE SYSTEM, MADE VISIBLE
Architecture & relationships Architecture diagram · source preserved below
View original Mermaid source flowchart LR
Operators((Mission Owners)) --> demo_Open_Endedness_v0[[Demo → Open Endedness v0]]
demo_Open_Endedness_v0 --> Core[[AGI Jobs v0 (v2) Core Intelligence]]
Core --> Observability[[Unified CI / CD & Observability]]
Core --> Governance[[Owner Control Plane]]
WHEN SOMETHING DOESN’T MATCH
Troubleshooting Import or dependency error Confirm the active virtual environment and the selected demo’s requirements. Run python -m pip check; do not install unrelated demo requirements over a working environment.
Unexpected result or missing file Check the selected entry point, configuration and output argument. Keep the seed and implementation fixed before comparing outcomes.
TRACE THE CHECKS
Verification & next steps 2 tracked test source files are available in this directory. Inspect the tests and their environment before choosing a suite; file counts do not establish test results.
Browse the test sources For live commissioning, consult the production readiness record .
EVERY VARIANT, PRESERVED
Complete document library REPRODUCE & INSPECT
Registered commands Run commands from the repository root after following this demo's guide. Network and owner actions require their documented setup.
No root-level launch command is associated with this source path. Follow the guide or source directory for its own entry point.
Full command catalog and troubleshooting ↗