diff --git a/docs/examples/examples/evolution-of-trust.md b/docs/examples/examples/evolution-of-trust.md index df425bd..05d44b6 100644 --- a/docs/examples/examples/evolution-of-trust.md +++ b/docs/examples/examples/evolution-of-trust.md @@ -22,13 +22,13 @@ system = pipeline.feedback([payoff -> decisions]) ```mermaid flowchart TD - subgraph Simultaneous Decisions + subgraph Decisions[Simultaneous Decisions] Alice[Alice Decision] Bob[Bob Decision] end - Simultaneous Decisions --> Payoff[[Payoff Computation]] - Payoff -.Alice Payoff.-> Alice - Payoff -.Bob Payoff.-> Bob + Decisions --> Payoff[[Payoff Computation]] + Payoff -. Alice Payoff .-> Alice + Payoff -. Bob Payoff .-> Bob ``` ## What You'll Learn diff --git a/docs/guides/dsl-roadmap.md b/docs/guides/dsl-roadmap.md index dbbca60..85d98d4 100644 --- a/docs/guides/dsl-roadmap.md +++ b/docs/guides/dsl-roadmap.md @@ -27,7 +27,7 @@ All three compile to `GDSSpec` / `SystemIR` and produce clean canonical decompos ## DSL Contract Checklist -Every new DSL must answer the [Semantic Layer Contract](../framework/guide/architecture.md#4-the-semantic-layer-contract) — eight questions that fully specify how a domain maps onto the composition algebra: +Every new DSL must answer the **Semantic Layer Contract** — eight questions that fully specify how a domain maps onto the [composition algebra](../framework/guide/architecture.md): 1. **Block semantics** — what does a block represent? 2. **Sequential (`>>`)** — what operation is induced? @@ -65,7 +65,7 @@ Before the first external release of a new DSL: ## Potential Future DSLs -These formalisms are in-scope per the [architecture scope boundary](../framework/guide/architecture.md#5-scope-boundary) and should compile to the existing substrate without architectural changes: +These formalisms are in-scope per the [architecture](../framework/guide/architecture.md) scope boundary and should compile to the existing substrate without architectural changes: | Formalism | Expected Mapping | Complexity | |---|---|---| diff --git a/docs/index.md b/docs/index.md index 23d93f1..e999bd4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,24 +2,59 @@ **Typed compositional specifications for complex systems**, grounded in [Generalized Dynamical Systems](https://doi.org/10.57938/e8d456ea-d975-4111-ac41-052ce73cb0cc) theory (Zargham & Shorish, 2022). -## Installation +GDS gives you a composition algebra for modeling complex systems — from epidemics and control loops to game theory and software architecture — with built-in verification, visualization, and a shared formal foundation. -Install individual packages from PyPI as needed: +## Where to Start -```bash -pip install gds-framework # Core library -pip install gds-viz # Visualization -pip install gds-stockflow # Stock-flow DSL -pip install gds-control # Control systems DSL -pip install gds-games # Game theory DSL -pip install gds-software # Software architecture DSL -pip install gds-business # Business dynamics DSL -pip install gds-examples # Tutorial models -``` +
+ +- :material-rocket-launch:{ .lg .middle } **New to GDS?** + + --- + + Follow the hands-on tutorial to build your first model in minutes. + + [:octicons-arrow-right-24: Start Here](tutorials/getting-started.md) + +- :material-map-marker-path:{ .lg .middle } **Guided Learning Path** + + --- + + Work through seven example models in recommended order, from simple to complex. + + [:octicons-arrow-right-24: Learning Path](examples/learning-path.md) + +- :material-swap-horizontal:{ .lg .middle } **Which DSL Should I Use?** + + --- + + Compare all seven domain DSLs and pick the right one for your problem. + + [:octicons-arrow-right-24: Choosing a DSL](guides/choosing-a-dsl.md) + +- :material-translate:{ .lg .middle } **Rosetta Stone** + + --- + + See the same problem modeled with stockflow, control, and game theory DSLs side by side. -!!! note "PyPI names differ from import names" - Each package's PyPI name (what you `pip install`) differs from its Python import name. - Use the table below as a reference. + [:octicons-arrow-right-24: Rosetta Stone](guides/rosetta-stone.md) + +
+ +## Interactive Notebooks + +Key guides include embedded [marimo](https://marimo.io) notebooks — run code, tweak parameters, and see results directly in the docs. No local setup required. + +| Guide | What You'll Explore | +|-------|---------------------| +| **[Getting Started](guides/getting-started.md)** | Build a thermostat model in 5 progressive stages | +| **[Rosetta Stone](guides/rosetta-stone.md)** | Same problem modeled with three different DSLs | +| **[Verification](guides/verification.md)** | All 3 verification layers with deliberately broken models | +| **[Visualization](guides/visualization.md)** | 6 view types, 5 themes, cross-DSL rendering | +| **[Interoperability](guides/interoperability.md)** | Cross-DSL composition and data exchange | + +## Packages | PyPI Package | Import Name | Description | |---|---|---| @@ -32,50 +67,29 @@ pip install gds-examples # Tutorial models | `gds-business` | `gds_business` | Business dynamics DSL (CLD, supply chain, value stream map) | | `gds-examples` | — | Tutorial models demonstrating framework features | -### For developers +## Installation -To work on the monorepo with all packages linked locally: +Install individual packages from PyPI as needed: ```bash -git clone https://github.com/BlockScience/gds-core.git -cd gds-core -uv sync --all-packages +pip install gds-framework # Core library +pip install gds-viz # Visualization +pip install gds-stockflow # Stock-flow DSL +pip install gds-control # Control systems DSL +pip install gds-games # Game theory DSL +pip install gds-software # Software architecture DSL +pip install gds-business # Business dynamics DSL +pip install gds-examples # Tutorial models ``` -## Quick Start +For development (all packages linked locally): -```python -from gds import ( - BoundaryAction, Policy, Mechanism, - GDSSpec, compile_system, verify, - typedef, entity, state_var, space, interface, -) +```bash +git clone https://github.com/BlockScience/gds-core.git +cd gds-core +uv sync --all-packages ``` -## Packages - -| Package | Docs | -|---------|------| -| **[gds-framework](framework/index.md)** | Core engine — blocks, composition algebra, compiler, verification | -| **[gds-viz](viz/index.md)** | Mermaid diagram renderers for GDS specifications | -| **gds-stockflow** | Declarative stock-flow DSL over GDS semantics | -| **gds-control** | State-space control DSL over GDS semantics | -| **[gds-games](games/index.md)** | Typed DSL for compositional game theory (Open Games) | -| **gds-software** | Software architecture DSL — DFD, state machine, component, C4, ERD, dependency | -| **[gds-business](business/index.md)** | Business dynamics DSL — CLD, supply chain, value stream map | -| **[gds-examples](examples/index.md)** | Six tutorial models demonstrating every framework feature | - -## Guides - -Interactive tutorials with code, diagrams, and runnable marimo notebooks: - -| Guide | What You'll Learn | -|-------|-------------------| -| **[Getting Started](guides/getting-started.md)** | Build a thermostat model in 5 progressive stages — from raw blocks to DSL to verification | -| **[Rosetta Stone](guides/rosetta-stone.md)** | Same resource-pool problem modeled with stockflow, control, and game theory DSLs | -| **[Verification](guides/verification.md)** | All 3 verification layers demonstrated with deliberately broken models | -| **[Visualization](guides/visualization.md)** | 6 view types, 5 themes, and cross-DSL rendering with gds-viz | - ## Architecture ``` diff --git a/mkdocs.yml b/mkdocs.yml index ab08042..335b5b0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -21,8 +21,11 @@ theme: name: Switch to light mode features: - content.code.copy + - navigation.tabs - navigation.sections - - navigation.expand + - navigation.indexes + - navigation.instant + - navigation.top - toc.follow plugins: @@ -129,163 +132,11 @@ markdown_extensions: nav: - Home: index.md - - Framework: - - Overview: framework/index.md - - Quick Reference: framework/quick-reference.md - - Getting Started: - - Installation: framework/getting-started/install.md - - Quick Start: framework/getting-started/quickstart.md - - User Guide: - - Architecture: framework/guide/architecture.md - - Type System: framework/guide/types.md - - Spaces: framework/guide/spaces.md - - State & Entities: framework/guide/state.md - - Blocks & Roles: framework/guide/blocks.md - - Composition Algebra: framework/guide/composition.md - - Specification: framework/guide/spec.md - - Pipeline: framework/guide/pipeline.md - - Verification: framework/guide/verification.md - - Glossary: framework/guide/glossary.md - - API Reference: - - Overview: framework/api/index.md - - gds: framework/api/init.md - - gds.blocks: framework/api/blocks.md - - gds.types: framework/api/types.md - - gds.state: framework/api/state.md - - gds.spaces: framework/api/spaces.md - - gds.spec: framework/api/spec.md - - gds.canonical: framework/api/canonical.md - - gds.compiler: framework/api/compiler.md - - gds.ir: framework/api/ir.md - - gds.verification: framework/api/verification.md - - gds.query: framework/api/query.md - - gds.parameters: framework/api/parameters.md - - gds.serialize: framework/api/serialize.md - - Visualization: - - Overview: viz/index.md - - Getting Started: viz/getting-started.md - - User Guide: - - Views: viz/guide/views.md - - Theming: viz/guide/theming.md - - API Reference: - - gds_viz: viz/api/init.md - - gds_viz.canonical: viz/api/canonical.md - - gds_viz.architecture: viz/api/architecture.md - - gds_viz.traceability: viz/api/traceability.md - - gds_viz.mermaid: viz/api/mermaid.md - - Games: - - Overview: games/index.md - - Getting Started: games/getting-started.md - - User Guide: - - Architecture: games/guide/architecture.md - - Game Types: games/guide/game-types.md - - Patterns & Composition: games/guide/patterns.md - - Verification: games/guide/verification.md - - Reports: games/guide/reports.md - - Visualization: games/guide/visualization.md - - CLI: games/guide/cli.md - - Design: - - Architecture Overview: games/design/architecture-overview.md - - API Reference: - - ogs: games/api/init.md - - ogs.dsl.types: games/api/dsl-types.md - - ogs.dsl.base: games/api/dsl-base.md - - ogs.dsl.games: games/api/dsl-games.md - - ogs.dsl.composition: games/api/dsl-composition.md - - ogs.dsl.pattern: games/api/dsl-pattern.md - - ogs.dsl.compile: games/api/dsl-compile.md - - ogs.dsl.library: games/api/dsl-library.md - - ogs.ir: games/api/ir.md - - ogs.verification: games/api/verification.md - - ogs.viz: games/api/viz.md - - ogs.reports: games/api/reports.md - - ogs.cli: games/api/cli.md - - Business: - - Overview: business/index.md - - Getting Started: business/getting-started.md - - User Guide: - - Diagram Types: business/guide/diagram-types.md - - Verification: business/guide/verification.md - - API Reference: - - Overview: business/api/index.md - - gds_business: business/api/init.md - - gds_business.common: business/api/common.md - - gds_business.cld.elements: business/api/cld-elements.md - - gds_business.cld.model: business/api/cld-model.md - - gds_business.cld.compile: business/api/cld-compile.md - - gds_business.cld.checks: business/api/cld-checks.md - - gds_business.supplychain.elements: business/api/scn-elements.md - - gds_business.supplychain.model: business/api/scn-model.md - - gds_business.supplychain.compile: business/api/scn-compile.md - - gds_business.supplychain.checks: business/api/scn-checks.md - - gds_business.vsm.elements: business/api/vsm-elements.md - - gds_business.vsm.model: business/api/vsm-model.md - - gds_business.vsm.compile: business/api/vsm-compile.md - - gds_business.vsm.checks: business/api/vsm-checks.md - - gds_business.verification: business/api/verification.md - - Stock-Flow: - - Overview: stockflow/index.md - - Getting Started: stockflow/getting-started.md - - User Guide: - - Elements & GDS Mapping: stockflow/guide/elements.md - - Verification: stockflow/guide/verification.md - - API Reference: - - stockflow: stockflow/api/init.md - - stockflow.dsl.elements: stockflow/api/elements.md - - stockflow.dsl.model: stockflow/api/model.md - - stockflow.dsl.compile: stockflow/api/compile.md - - stockflow.verification.checks: stockflow/api/checks.md - - stockflow.verification: stockflow/api/verification.md - - Control: - - Overview: control/index.md - - Getting Started: control/getting-started.md - - User Guide: - - Elements & GDS Mapping: control/guide/elements.md - - Verification: control/guide/verification.md - - API Reference: - - gds_control: control/api/init.md - - gds_control.dsl.elements: control/api/elements.md - - gds_control.dsl.model: control/api/model.md - - gds_control.dsl.compile: control/api/compile.md - - gds_control.verification.checks: control/api/checks.md - - gds_control.verification: control/api/verification.md - - Software: - - Overview: software/index.md - - Getting Started: software/getting-started.md - - User Guide: - - Diagram Types: software/guide/diagram-types.md - - Verification: software/guide/verification.md - - API Reference: - - Overview: software/api/index.md - - gds_software: software/api/init.md - - gds_software.common: software/api/common.md - - gds_software.dfd.elements: software/api/dfd-elements.md - - gds_software.dfd.model: software/api/dfd-model.md - - gds_software.dfd.compile: software/api/dfd-compile.md - - gds_software.dfd.checks: software/api/dfd-checks.md - - gds_software.statemachine.elements: software/api/sm-elements.md - - gds_software.statemachine.model: software/api/sm-model.md - - gds_software.statemachine.compile: software/api/sm-compile.md - - gds_software.statemachine.checks: software/api/sm-checks.md - - gds_software.component.elements: software/api/cp-elements.md - - gds_software.component.model: software/api/cp-model.md - - gds_software.component.compile: software/api/cp-compile.md - - gds_software.component.checks: software/api/cp-checks.md - - gds_software.c4.elements: software/api/c4-elements.md - - gds_software.c4.model: software/api/c4-model.md - - gds_software.c4.compile: software/api/c4-compile.md - - gds_software.c4.checks: software/api/c4-checks.md - - gds_software.erd.elements: software/api/erd-elements.md - - gds_software.erd.model: software/api/erd-model.md - - gds_software.erd.compile: software/api/erd-compile.md - - gds_software.erd.checks: software/api/erd-checks.md - - gds_software.dependency.elements: software/api/dep-elements.md - - gds_software.dependency.model: software/api/dep-model.md - - gds_software.dependency.compile: software/api/dep-compile.md - - gds_software.dependency.checks: software/api/dep-checks.md - - gds_software.verification: software/api/verification.md - - Examples: - - Overview: examples/index.md + - Learn: + - Start Here: tutorials/getting-started.md + - Getting Started Guide: guides/getting-started.md + - Choosing a DSL: guides/choosing-a-dsl.md + - Rosetta Stone: guides/rosetta-stone.md - Learning Path: examples/learning-path.md - Models: - SIR Epidemic: examples/examples/sir-epidemic.md @@ -297,21 +148,173 @@ nav: - Evolution of Trust: examples/examples/evolution-of-trust.md - Building Models: examples/building-models.md - Feature Matrix: examples/feature-matrix.md - - Tutorials: - - Start Here: tutorials/getting-started.md - - Guides: - - Getting Started: guides/getting-started.md - - Choosing a DSL: guides/choosing-a-dsl.md - - Best Practices: guides/best-practices.md - - Real-World Patterns: guides/real-world-patterns.md - - Rosetta Stone: guides/rosetta-stone.md + - How-To Guides: - Verification: guides/verification.md - Visualization: guides/visualization.md - - Troubleshooting: guides/troubleshooting.md - Interoperability: guides/interoperability.md - - Design Notes: - - Layer 0 Milestone: guides/architecture-milestone-layer0.md - - DSL Roadmap: guides/dsl-roadmap.md - - Research Boundaries: guides/research-boundaries.md - - View Stratification: guides/view-stratification.md - - Ecosystem: framework/ecosystem.md + - Best Practices: guides/best-practices.md + - Real-World Patterns: guides/real-world-patterns.md + - Troubleshooting: guides/troubleshooting.md + - Reference: + - Framework: + - Overview: framework/index.md + - Quick Reference: framework/quick-reference.md + - Getting Started: + - Installation: framework/getting-started/install.md + - Quick Start: framework/getting-started/quickstart.md + - User Guide: + - Architecture: framework/guide/architecture.md + - Type System: framework/guide/types.md + - Spaces: framework/guide/spaces.md + - State & Entities: framework/guide/state.md + - Blocks & Roles: framework/guide/blocks.md + - Composition Algebra: framework/guide/composition.md + - Specification: framework/guide/spec.md + - Pipeline: framework/guide/pipeline.md + - Verification: framework/guide/verification.md + - Glossary: framework/guide/glossary.md + - API Reference: + - Overview: framework/api/index.md + - gds: framework/api/init.md + - gds.blocks: framework/api/blocks.md + - gds.types: framework/api/types.md + - gds.state: framework/api/state.md + - gds.spaces: framework/api/spaces.md + - gds.spec: framework/api/spec.md + - gds.canonical: framework/api/canonical.md + - gds.compiler: framework/api/compiler.md + - gds.ir: framework/api/ir.md + - gds.verification: framework/api/verification.md + - gds.query: framework/api/query.md + - gds.parameters: framework/api/parameters.md + - gds.serialize: framework/api/serialize.md + - Visualization: + - Overview: viz/index.md + - Getting Started: viz/getting-started.md + - User Guide: + - Views: viz/guide/views.md + - Theming: viz/guide/theming.md + - API Reference: + - gds_viz: viz/api/init.md + - gds_viz.canonical: viz/api/canonical.md + - gds_viz.architecture: viz/api/architecture.md + - gds_viz.traceability: viz/api/traceability.md + - gds_viz.mermaid: viz/api/mermaid.md + - Games: + - Overview: games/index.md + - Getting Started: games/getting-started.md + - User Guide: + - Architecture: games/guide/architecture.md + - Game Types: games/guide/game-types.md + - Patterns & Composition: games/guide/patterns.md + - Verification: games/guide/verification.md + - Reports: games/guide/reports.md + - Visualization: games/guide/visualization.md + - CLI: games/guide/cli.md + - Design: + - Architecture Overview: games/design/architecture-overview.md + - API Reference: + - ogs: games/api/init.md + - ogs.dsl.types: games/api/dsl-types.md + - ogs.dsl.base: games/api/dsl-base.md + - ogs.dsl.games: games/api/dsl-games.md + - ogs.dsl.composition: games/api/dsl-composition.md + - ogs.dsl.pattern: games/api/dsl-pattern.md + - ogs.dsl.compile: games/api/dsl-compile.md + - ogs.dsl.library: games/api/dsl-library.md + - ogs.ir: games/api/ir.md + - ogs.verification: games/api/verification.md + - ogs.viz: games/api/viz.md + - ogs.reports: games/api/reports.md + - ogs.cli: games/api/cli.md + - Business: + - Overview: business/index.md + - Getting Started: business/getting-started.md + - User Guide: + - Diagram Types: business/guide/diagram-types.md + - Verification: business/guide/verification.md + - API Reference: + - Overview: business/api/index.md + - gds_business: business/api/init.md + - gds_business.common: business/api/common.md + - gds_business.cld.elements: business/api/cld-elements.md + - gds_business.cld.model: business/api/cld-model.md + - gds_business.cld.compile: business/api/cld-compile.md + - gds_business.cld.checks: business/api/cld-checks.md + - gds_business.supplychain.elements: business/api/scn-elements.md + - gds_business.supplychain.model: business/api/scn-model.md + - gds_business.supplychain.compile: business/api/scn-compile.md + - gds_business.supplychain.checks: business/api/scn-checks.md + - gds_business.vsm.elements: business/api/vsm-elements.md + - gds_business.vsm.model: business/api/vsm-model.md + - gds_business.vsm.compile: business/api/vsm-compile.md + - gds_business.vsm.checks: business/api/vsm-checks.md + - gds_business.verification: business/api/verification.md + - Stock-Flow: + - Overview: stockflow/index.md + - Getting Started: stockflow/getting-started.md + - User Guide: + - Elements & GDS Mapping: stockflow/guide/elements.md + - Verification: stockflow/guide/verification.md + - API Reference: + - stockflow: stockflow/api/init.md + - stockflow.dsl.elements: stockflow/api/elements.md + - stockflow.dsl.model: stockflow/api/model.md + - stockflow.dsl.compile: stockflow/api/compile.md + - stockflow.verification.checks: stockflow/api/checks.md + - stockflow.verification: stockflow/api/verification.md + - Control: + - Overview: control/index.md + - Getting Started: control/getting-started.md + - User Guide: + - Elements & GDS Mapping: control/guide/elements.md + - Verification: control/guide/verification.md + - API Reference: + - gds_control: control/api/init.md + - gds_control.dsl.elements: control/api/elements.md + - gds_control.dsl.model: control/api/model.md + - gds_control.dsl.compile: control/api/compile.md + - gds_control.verification.checks: control/api/checks.md + - gds_control.verification: control/api/verification.md + - Software: + - Overview: software/index.md + - Getting Started: software/getting-started.md + - User Guide: + - Diagram Types: software/guide/diagram-types.md + - Verification: software/guide/verification.md + - API Reference: + - Overview: software/api/index.md + - gds_software: software/api/init.md + - gds_software.common: software/api/common.md + - gds_software.dfd.elements: software/api/dfd-elements.md + - gds_software.dfd.model: software/api/dfd-model.md + - gds_software.dfd.compile: software/api/dfd-compile.md + - gds_software.dfd.checks: software/api/dfd-checks.md + - gds_software.statemachine.elements: software/api/sm-elements.md + - gds_software.statemachine.model: software/api/sm-model.md + - gds_software.statemachine.compile: software/api/sm-compile.md + - gds_software.statemachine.checks: software/api/sm-checks.md + - gds_software.component.elements: software/api/cp-elements.md + - gds_software.component.model: software/api/cp-model.md + - gds_software.component.compile: software/api/cp-compile.md + - gds_software.component.checks: software/api/cp-checks.md + - gds_software.c4.elements: software/api/c4-elements.md + - gds_software.c4.model: software/api/c4-model.md + - gds_software.c4.compile: software/api/c4-compile.md + - gds_software.c4.checks: software/api/c4-checks.md + - gds_software.erd.elements: software/api/erd-elements.md + - gds_software.erd.model: software/api/erd-model.md + - gds_software.erd.compile: software/api/erd-compile.md + - gds_software.erd.checks: software/api/erd-checks.md + - gds_software.dependency.elements: software/api/dep-elements.md + - gds_software.dependency.model: software/api/dep-model.md + - gds_software.dependency.compile: software/api/dep-compile.md + - gds_software.dependency.checks: software/api/dep-checks.md + - gds_software.verification: software/api/verification.md + - Ecosystem: framework/ecosystem.md + - Design & Research: + - Layer 0 Milestone: guides/architecture-milestone-layer0.md + - DSL Roadmap: guides/dsl-roadmap.md + - Research Boundaries: guides/research-boundaries.md + - View Stratification: guides/view-stratification.md + - Examples Overview: examples/index.md diff --git a/packages/gds-sim/gds_sim/parallel.py b/packages/gds-sim/gds_sim/parallel.py index 3732c42..0278675 100644 --- a/packages/gds-sim/gds_sim/parallel.py +++ b/packages/gds-sim/gds_sim/parallel.py @@ -2,6 +2,7 @@ from __future__ import annotations +import multiprocessing as mp from concurrent.futures import ProcessPoolExecutor from typing import TYPE_CHECKING @@ -38,7 +39,8 @@ def _parallel_simulation(sim: Simulation, max_workers: int | None) -> Results: ] partial_results: list[Results] = [] - with ProcessPoolExecutor(max_workers=max_workers) as pool: + ctx = mp.get_context("fork") + with ProcessPoolExecutor(max_workers=max_workers, mp_context=ctx) as pool: futures = [pool.submit(_run_single, *job) for job in jobs] for f in futures: partial_results.append(f.result()) diff --git a/packages/gds-sim/tests/test_results.py b/packages/gds-sim/tests/test_results.py index db83595..54a3c04 100644 --- a/packages/gds-sim/tests/test_results.py +++ b/packages/gds-sim/tests/test_results.py @@ -37,7 +37,7 @@ def test_preallocated_overflow_to_append(self) -> None: assert len(r) == 4 def test_to_dataframe(self) -> None: - import pandas as pd + pd = __import__("pytest").importorskip("pandas") r = gds_sim.Results(["val"]) r.append({"val": 100}, timestep=0, substep=0, run=0, subset=0) @@ -74,7 +74,7 @@ def test_merge_single(self) -> None: class TestResultsFromSimulation: def test_to_dataframe_from_sim(self, simple_model: gds_sim.Model) -> None: - import pandas as pd + pd = __import__("pytest").importorskip("pandas") sim = gds_sim.Simulation(model=simple_model, timesteps=5) df = sim.run().to_dataframe()