{"id":28324880,"url":"https://github.com/ovitrac/radigen","last_synced_at":"2025-07-17T05:32:45.224Z","repository":{"id":292343958,"uuid":"979572914","full_name":"ovitrac/radigen","owner":"ovitrac","description":"Radigen 🧪⚛️: Python-based chemical kernel for simulating oxidation reactions from prompts","archived":false,"fork":false,"pushed_at":"2025-05-28T21:58:42.000Z","size":13097,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-02T04:39:38.154Z","etag":null,"topics":["biotech","combinatorics","cosmetics","food","fuel","generative-ai","kernel-module","kinetic-modeling","oil","oxidation","pharmaceuticals","polymer","python","radicalar-mechanism"],"latest_commit_sha":null,"homepage":"https://ovitrac.github.io/radigen/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ovitrac.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-07T18:13:38.000Z","updated_at":"2025-05-28T21:58:45.000Z","dependencies_parsed_at":"2025-05-09T12:37:46.673Z","dependency_job_id":"f0c2fa2b-74b2-4262-8505-fb7d7504cbcc","html_url":"https://github.com/ovitrac/radigen","commit_stats":null,"previous_names":["ovitrac/radigen"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ovitrac/radigen","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ovitrac%2Fradigen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ovitrac%2Fradigen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ovitrac%2Fradigen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ovitrac%2Fradigen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ovitrac","download_url":"https://codeload.github.com/ovitrac/radigen/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ovitrac%2Fradigen/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259627299,"owners_count":22886835,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["biotech","combinatorics","cosmetics","food","fuel","generative-ai","kernel-module","kinetic-modeling","oil","oxidation","pharmaceuticals","polymer","python","radicalar-mechanism"],"created_at":"2025-05-25T19:13:24.640Z","updated_at":"2025-06-13T10:33:21.449Z","avatar_url":"https://github.com/ovitrac.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Radigen 🧪⚛️\n\n**Radigen** is a compact Python kernel for simulating radical oxidation mechanisms in complex mixtures such as **edible oils**, **biofuels**, and **polymers**. It supports the **generative construction**, **parameterization**, and **numerical resolution** of complex chemical reaction networks, with full support for **dynamic thermal and oxygenation conditions**.\n\n\u003e  Radigen is part of the **Generative Simulation Initiative**, and is designed for **prompt-based modeling and LLM-driven scientific reasoning**.\n\n\n\n![Radigen Illustration](docs/assets/radigen_banner.png)\n\n\u003csmall\u003e🎨 Credits: Olivier Vitrac\u003c/small\u003e\n\n\n------\n\n\n\n## 📚 Table of Contents\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n- [📚🔬 1 | Scientific Foundation](#-1--scientific-foundation)\n- [🧠🛠️ 2 | Core Capabilities](#-2--core-capabilities)\n- [🤖🧠 3 | LLM Integration](#-3--llm-integration)\n- [🚀📦 4 | Quick Start](#-4--quick-start)\n- [⚗️ 5 | Example Scenarios](#-5--example-scenarios)\n- [♾️⚗️ 6 | Combinatorial Radical Chemistry](#-6--combinatorial-radical-chemistry)\n- [✚⚗️ 7 | Extending Radical Chemistry](#%E2%9C%9A-7--extending-radical-chemistry)\n- [📦📁 8 | Project Structure](#-8--project-structure)\n- [🔧 9 | Installation](#-9--installation)\n- [🧩📘 10 | Core Classes](#-10--core-classes)\n- [🧺🧫 11 | Lumped Species](#-11--lumped-species)\n- [🧬 12 | Chemistry Assumptions](#-12--chemistry-assumptions)\n- [📜 License](#-license)\n- [📣 Contact](#-contact)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n\n\n------\n\n\n\n## 📚🔬 1 | Scientific Foundation\n\nRadigen is based on two peer-reviewed frameworks for oxidation kinetics in unsaturated systems:\n\n1. **Touffet M., Smith P., Vitrac O.**,\n   *A comprehensive two-scale model for predicting the oxidizability of fatty acid methyl ester mixtures*,\n   *Food Research International*, 173, 2023, 113289.\n   https://doi.org/10.1016/j.foodres.2023.113289\n2. **Touffet M., Vitrac O.**,\n   *Temperature-dependent kinetics of unsaturated fatty acid methyl esters: Modeling autoxidation mechanisms*,\n   *Food Chemistry*, 481, 2025, 143952.\n   https://doi.org/10.1016/j.foodchem.2025.143952\n\n------\n\n\n\n## 🧠🛠️ 2 | Core Capabilities\n\n- ✅ Declarative **species and reaction network construction**\n- ✅ **Combinatorial generation** of mono/bimolecular reactions\n- ✅ **Cross-reaction inference** from self-reactions\n- ✅ **Rate constant assignment** from structured fingerprint database\n- ✅ **Temperature + viscosity effects** (Arrhenius \u0026 Smoluchowski)\n- ✅ **Cage ↔ free** hydroperoxide decomposition equilibrium\n- ✅ **O₂ transport** coupling via Henry's law and dissolution kinetics\n- ✅ Dynamic **temperature \u0026 kO₂ cycles** with `TKO2cycle`\n- ✅ **Chained simulations**, physical mixing of partially oxidized systems\n- ✅ High-level **plotting**, **DataFrame output**, and **lumped species**\n- ✅ Built-in support for **LLM prompts**, aiding scientific simulation\n\n------\n\n\n\n## 🤖🧠 3 | LLM Integration\n\nRadigen was designed for **prompt-based simulation** and **LLM-assisted reasoning**. Its modular architecture allows:\n\n- Easy mapping from LLM prompt to chemical simulations\n- Access to symbolic names (e.g., `L1OOH`, `L2•`) and grouped observables\n- High-quality examples showcasing realistic oxidation scenarios\n- Support for mixing, renewal, dynamic profiles, and chemical interrogation\n\n\u003e 💡 **Example Prompts**:\n\u003e\n\u003e - “*Simulate oxidation of linolenic acid at 180°C with oxygen limitation*.”\n\u003e - “*What happens when abused oil is mixed with fresh oil?*”\n\u003e - “*Generate a kinetic profile under cooling from 160°C to 40°C.*”\n\u003e\n\u003e ------\n\u003e\n\n\n\n## 🚀📦 4 | Quick Start\n\n```python\nfrom radigen3.oxidation import mixture, mixtureKinetics\n\noil = mixture()\noil.add(\"L1H\", concentration=3000)\noil.add(\"L1OOH\", concentration=100)\noil.add(\"O2\", concentration=10)\n\noil.addProducts()\noil.addReactions()\noil.populateReactionRates()\n\noilmodel = mixtureKinetics(oil)\noilmodel.solve((10, \"days\"), T=60)\noilmodel.plot([\"L1H\", \"L1OOH\", \"O2\"])\n```\n\n------\n\n\n\n## ⚗️ 5 | Example Scenarios\n\nRadigen includes worked-out examples such as `simulate_oil.py` and `test_oxidation.py`, including:\n\n- **Scenario 1**: Oxidation at 140°C for 1 hour\n- **Scenario 2**: Long-term oxidation at 80°C for 100 hours\n- **Scenario 3**: Dynamic cycle (180°C → 40°C over days)\n- **Scenario 4**: Partial renewal (abused + pristine oil, then storage)\n- **Unit tests**: Oxidation under **anoxia** and with **oxygen excess**\n\n🖼️ Each simulation includes ready-to-use `plot()` methods, with export support via `fig.print(filename, folder)`.\n\n------\n\n\n\n## ♾️⚗️ 6 | Combinatorial Radical Chemistry\n\n### Overview\n\nRadigen generates all reactions and paramaterized them according to combinatorial rules. The following  script spans a reaction scheme involving **27 species** and **60 reactions**.\n\n```\noil = mixture()\noil.add(\"L1H\",concentration=3000)\noil.add(\"L2H\",concentration=1000)\noil.add(\"L3H\",concentration=500)\noil.add(\"L1OOH\",concentration=100)\noil.add(\"O2\",concentration=10)\noil.addProducts()\noil.addReactions()\noil.populateReactionRates()\nprint(\"Considered reaction Scheme\", \"-\"*30, oil.reactionScheme, sep=\"\\n\")\n\noilmodel = mixtureKinetics(oil) # kinetic model\noilmodel.solve((10,\"days\"),60)\noilmodel.plot()\ndf = oilmodel.results_as_dataframe([\"L1H\",\"L2H\",\"L3H\",\"L1OOH\",\"L2OOH\",\"L3OOH\"])\nprint(df)\n```\n\n\u003cdetails\u003e\n\t\u003csummary\u003eClick here to see results\u003c/summary\u003e\n\n\n⏱ **60 reactions** involving **27 species** were generated, including:\n\n```\n *R0: L1H + HO• → L1• + H2O,\n *R1: L1H + L1O• → L1• + L1OH,\n *R2: L1H + L1OO• → L1• + L1OOH,\n *R3: L1H + L2OO• → L1• + L2OOH,\n *R4: L1H + L3OO• → L1• + L3OOH,\n *R5: L1H + L2O• → L1• + L2OH,\n *R6: L1H + L3O• → L1• + L3OH,\n *R7: L2H + HO• → L2• + H2O,\n *R8: L2H + L1O• → L2• + L1OH,\n *R9: L2H + L1OO• → L2• + L1OOH,\n *R10: L2H + L2OO• → L2• + L2OOH,\n *R11: L2H + L3OO• → L2• + L3OOH,\n *R12: L2H + L2O• → L2• + L2OH,\n *R13: L2H + L3O• → L2• + L3OH,\n *R14: L3H + HO• → L3• + H2O,\n *R15: L3H + L1O• → L3• + L1OH,\n *R16: L3H + L1OO• → L3• + L1OOH,\n *R17: L3H + L2OO• → L3• + L2OOH,\n *R18: L3H + L3OO• → L3• + L3OOH,\n *R19: L3H + L2O• → L3• + L2OH,\n *R20: L3H + L3O• → L3• + L3OH,\n *R21: L1OOH → L1O• + HO•,\n *R22: L1OOH + L1OOH → L1O• + L1OO•,\n *R23: L1OOH + L2OOH → L1O• + L2OO•,\n *R24: L1OOH + L2OOH → L2O• + L1OO•,\n *R25: L1OOH + L3OOH → L1O• + L3OO•,\n *R26: L1OOH + L3OOH → L3O• + L1OO•,\n *R27: L1• + O2 → L1OO•,\n *R28: L1• + L1• → L1-polymer + L1-polymer,\n *R29: L1• + L2• → L1-polymer + L2-polymer,\n *R30: L1• + L3• → L1-polymer + L3-polymer,\n *R31: L1• + L1OO• → L1-polymer + L1-polymer,\n *R32: L1• + L2OO• → L1-polymer + L2-polymer,\n *R33: L1• + L3OO• → L1-polymer + L3-polymer,\n *R34: L2• + O2 → L2OO•,\n *R35: L2• + L2• → L2-polymer + L2-polymer,\n *R36: L2• + L3• → L2-polymer + L3-polymer,\n *R37: L2• + L1OO• → L2-polymer + L1-polymer,\n *R38: L2• + L2OO• → L2-polymer + L2-polymer,\n *R39: L2• + L3OO• → L2-polymer + L3-polymer,\n *R40: L3• + O2 → L3OO•,\n *R41: L3• + L3• → L3-polymer + L3-polymer,\n *R42: L3• + L1OO• → L3-polymer + L1-polymer,\n *R43: L3• + L2OO• → L3-polymer + L2-polymer,\n *R44: L3• + L3OO• → L3-polymer + L3-polymer,\n *R45: L1O• → L1=O,\n *R46: L1OO• + L1OO• → L1-polymer + L1-polymer,\n *R47: L1OO• + L2OO• → L1-polymer + L2-polymer,\n *R48: L1OO• + L3OO• → L1-polymer + L3-polymer,\n *R49: L2OO• + L2OO• → L2-polymer + L2-polymer,\n *R50: L2OO• + L3OO• → L2-polymer + L3-polymer,\n *R51: L3OO• + L3OO• → L3-polymer + L3-polymer,\n *R52: L2OOH → L2O• + HO•,\n *R53: L2OOH + L2OOH → L2O• + L2OO•,\n *R54: L2OOH + L3OOH → L2O• + L3OO•,\n *R55: L2OOH + L3OOH → L3O• + L2OO•,\n *R56: L3OOH → L3O• + HO•,\n *R57: L3OOH + L3OOH → L3O• + L3OO•,\n *R58: L2O• → L2=O,\n *R59: L3O• → L3=O\n```\n\n*A star indicates that the reaction has been correctly parameterized*.\n\u003c/details\u003e\n\n\n\n## ✚⚗️ 7 | Extending Radical Chemistry\n\nRadigen **automatically generates all chemically valid reactions** by combining species according to their **reactive functions**, including hydrogen abstraction, radical recombination, and hydroperoxide decomposition. Each species class defines:\n\n* Its **reactive function** (e.g., `\"CH\"` for allylic hydrogen)\n* Which **functions it reacts with** (e.g., `\"HO•\"`, `\"COO•\"`)\n* The **product class** to form (e.g., `monoAllylicC`)\n* A **default name and root**, which are used to infer product names\n* An **optional color and linestyle** for visualization\n\n\n\n### 🧬 7.1 | Example: Hydrogen Abstraction from Oleic Acid (L1H)\n\nThe species `L1H` is defined using a class that encodes its reactivity:\n\n```python\n@species.register\nclass monoAllylicCH(species):\n    \"\"\"Aliphatic (CH) on monoallylic site\"\"\"\n    classAliases = ['C1H', 'R1H', 'L1H', 'P1H']\n    defaultName = \"L1H\"\n    defaultRoot = \"L1\"\n    suffix = \"H\"\n    allylic = 1\n    reactiveFunction = \"CH\"\n    reactWith = ['HO•', 'CO•', 'COO•']\n    product = ['monoAllylicC']\n```\n\nThis declares that:\n\n* `L1H` can lose a hydrogen (H abstraction)\n\n* It reacts with radicals such as `HO•`, `COO•`, etc.\n\n* The product is a `monoAllylicC` radical (usually named `L1•`)\n\n  \n\n### 🔢 7.2 | Reaction Generation\n\nWhen you run:\n\n```python\noil.addProducts()\noil.addReactions()\n```\n\nRadigen:\n\n1. Constructs new species like `L1•` and `L1OH` using registered rules.\n2. Creates all valid reactions like:\n\n```text\nL1H + L1O• → L1• + L1OH\nL1H + HO• → L1• + H2O\n```\n\n3. Assigns reaction rate constants by matching **reaction fingerprints**.\n\n\n\n### 🧾 7.3 | Rate Constant Assignment\n\nReaction rates are assigned from a curated database (`reactionRateDB`) using string-based **fingerprints** such as:\n\n```python\nreactionRateDB(\n    fingerprint=\"L1H + L1O• -\u003e L1• + L1OH\",\n    T0=30,  # reference temperature (°C)\n    k0=3.80e3,  # rate constant at T0 [m³·mol⁻¹·s⁻¹]\n    Ea=14.0e3,  # activation energy [J/mol]\n    source=\"Touffet et al. 2023, Table 2\"\n)\n```\n\n* Fingerprints use canonical formatting and names.\n* Each fingerprint may be associated with multiple entries (e.g., confidence intervals, sources).\n* Cross-reactions inherit rate constants via **geometric mean rules** (from collision theory).\n\n\n\n### 🔄 7.4 | Fingerprint Substitution\n\nRadigen supports **symbolic substitution** to simplify fingerprint management. For instance:\n\n```python\nreactionRateDB.register_fingerprint_substitution(r\"C([123])\", r\"L\\1\")\n```\n\nThis maps `\"C1H\"` → `\"L1H\"`, allowing fingerprints like:\n\n```text\nC1H + C1O• → C1• + C1OH\n```\n\nto reuse existing data for `L1H` reactions.\n\n\n------\n\n\n\n## 📦📁 8 | Project Structure\n\n```\nradigen/\n├── radigen3/\n│   ├── oxidation.py         # main kernel (\u003e4 Klines)\n│   └── ...\n├── simulate_oil.py          # main simulation scenarios\n├── test_oxidation.py\t\t# validation and baseline examples\n├── README.md\n├── images/\t\t\t\t   # printed figures as PNG and PDF images\n├── docs/\t\t\t\t   # code documentation\n└── literature/              # manuscripts and constant tables\n```\n\n------\n\n\n\n## 🔧 9 | Installation\n\nRadigen is a **self-contained kernel** distributed as a single module file:  `radigen3/oxidation.py` (∼4,000+ lines of fully documented code).\n\nNo `pip install` is required.\n\n### 📁 Recommended Project Layout\n\nPlace your scripts in a folder alongside `radigen3/`:\n\n```\nradigen/\n├── radigen3/\n│   └── oxidation.py      # main module (kernel)\n├── yourscript.py         # your example or project scripts\n...\n└── README.md\n```\n\nThis allows **direct usage** of all core classes without installation:\n\n```python\nfrom radigen3.oxidation import mixture, mixtureKinetics, TKO2cycle\n```\n\nThis strategy:\n\n- Enables **version isolation** and multiple coexisting Radigen versions.\n- Avoids `sys.path` manipulation or environment modification.\n- Is ideal for **prompt-driven** or **LLM-assisted scripting** workflows.\n\n\u003e 🚩If you use notebooks (e.g., `Jupyter`), just ensure the notebook is run from the folder containing `radigen3/`.\n\n------\n\n\n\n## 🧩📘 10 | Core Classes\n\n**Module** `radigen3.oxidation`\n\n| Class             | Purpose                                                      |\n| ----------------- | ------------------------------------------------------------ |\n| `species`         | Represents chemical species (radicals, peroxides, stable)    |\n| `reaction`        | Canonical reaction with fingerprint and type inference       |\n| `reactionRateDB`  | Registry of rate constants (k₀, Eₐ) searchable by fingerprint |\n| `mixture`         | Encodes physical/chemical system: species, V, A, T, kO₂, pO₂ |\n| `mixtureKinetics` | Numerical integrator for the chemical system (solve_ivp)     |\n| `lumped`          | Group of species for aggregate observables                   |\n| `TKO2cycle`       | Dynamic temperature and kO₂ definition for advanced scenarios |\n\n**Class Inheritance Diagram** (without species-derived classes)\n\n```mermaid\ngraph TD;\nPrintableFigure\nTKO2cycle\nlumped\nmixture\nmixtureKinetics\nreaction\nreactionRateDB\nspecies\nFigure --\u003e PrintableFigure\nobject --\u003e TKO2cycle\nobject --\u003e mixture\nobject --\u003e mixtureKinetics\nobject --\u003e reaction\nobject --\u003e reactionRateDB\nobject --\u003e species\nspecies --\u003e lumped\n```\n\n\n\n**Class Inheritance Diagram** (with species-derived classes)\n\n```mermaid\ngraph TD;\nH2O\nPrintableFigure\nTKO2cycle\ndiAllylicC\ndiAllylicCH\ndiAllylicCHO\ndiAllylicCO\ndiAllylicCOH\ndiAllylicCOO\ndiAllylicCOOH\ndiAllylicCeqO\nlumped\nmixture\nmixtureKinetics\nmonoAllylicC\nmonoAllylicCH\nmonoAllylicCHO\nmonoAllylicCO\nmonoAllylicCOH\nmonoAllylicCOO\nmonoAllylicCOOH\nmonoAllylicCeqO\noxygen\nperoxyl\nreaction\nreactionRateDB\nspecies\nterminationPolymers\ntriAllylicC\ntriAllylicCH\ntriAllylicCHO\ntriAllylicCO\ntriAllylicCOH\ntriAllylicCOO\ntriAllylicCOOH\ntriAllylicCeqO\nFigure --\u003e PrintableFigure\nobject --\u003e TKO2cycle\nobject --\u003e mixture\nobject --\u003e mixtureKinetics\nobject --\u003e reaction\nobject --\u003e reactionRateDB\nobject --\u003e species\nspecies --\u003e H2O\nspecies --\u003e diAllylicC\nspecies --\u003e diAllylicCH\nspecies --\u003e diAllylicCHO\nspecies --\u003e diAllylicCO\nspecies --\u003e diAllylicCOH\nspecies --\u003e diAllylicCOO\nspecies --\u003e diAllylicCOOH\nspecies --\u003e diAllylicCeqO\nspecies --\u003e lumped\nspecies --\u003e monoAllylicC\nspecies --\u003e monoAllylicCH\nspecies --\u003e monoAllylicCHO\nspecies --\u003e monoAllylicCO\nspecies --\u003e monoAllylicCOH\nspecies --\u003e monoAllylicCOO\nspecies --\u003e monoAllylicCOOH\nspecies --\u003e monoAllylicCeqO\nspecies --\u003e oxygen\nspecies --\u003e peroxyl\nspecies --\u003e terminationPolymers\nspecies --\u003e triAllylicC\nspecies --\u003e triAllylicCH\nspecies --\u003e triAllylicCHO\nspecies --\u003e triAllylicCO\nspecies --\u003e triAllylicCOH\nspecies --\u003e triAllylicCOO\nspecies --\u003e triAllylicCOOH\nspecies --\u003e triAllylicCeqO\n```\n\n\n\n------\n\n\n\n## 🧺🧫 11 | Lumped Species\n\nRadigen offers built-in **grouping functions** to track hydroperoxides, aldehydes, ketones, radicals and polymers:\n\n```python\noilmodel.register_lumped(\"LOOH\", oil.lumped_hydroperoxides())\noilmodel.register_lumped(\"rad_C\", oil.lumped_radicals_on_C())\ndf = oilmodel.results_as_dataframe([\"L1H\", \"LOOH\", \"rad_C\"])\n```\n\nCustom groups by pattern or reactive function:\n\n```python\nperoxyls = oil.get_lumped_by_pattern(r\".*OO•$\")\ncooh_group = oil.get_lumped_by_function(\"COOH\")\n```\n\n------\n\n## 🧬 12 | Chemistry Assumptions\n\n- Allylicity matters: `L1H`, `L2H`, `L3H` represent mono-, di-, and triallylic protons.\n- Glycerol backbone is ignored; triglycerides are **approximated by FAMEs** (fatty methyl esters).\n- O₂ transport modeled via gas-liquid interface (Henry's law + `kO2`)\n- Thermodynamic equilibrium (stability of H-bonds) governs **ROOH cage vs. free** mechanism.\n\n------\n\n\n\n## 📜 License\n\nMIT License – see `LICENSE`.\n\n------\n\n## 📣 Contact\n\nDeveloped under the **Generative Simulation Initiative** 🌱\n Lead: **Olivier Vitrac**\n Contact: *[olivier.vitrac@gmail.com](mailto:olivier.vitrac@gmail.com)*\n\n*Last updated: 2025-05-23*","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fovitrac%2Fradigen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fovitrac%2Fradigen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fovitrac%2Fradigen/lists"}