LawSynthGitHub

Python

The Python SDK wraps the same native engine as the CLI. Build the native extension in place from python/lawsynth:

python -m pip install maturin
maturin develop
python -m pytest -q tests

The pure-Python data and configuration classes import without a native build; discovery, simulation, and bundle IO resolve lawsynth._native lazily and raise a clear error if it is missing.

Study — the whole loop, fluently

Study collapses observe → discover → understand → use → compare → share into a few lines. Every returned object renders richly in a Jupyter notebook.

import lawsynth

# 1. Ingest observations into a validated dataset and build a study
study = lawsynth.Study.from_csv("observations.csv", time="time", state=["x", "y"])

# 2. Discover the executable world
result = study.discover()                 # -> DiscoveryResult

# 3. Understand
print(result.explain())                   # -> Explanation (readable laws, fit, deps, assumptions)

# 4. Use: simulate and what-if forecast
traj = study.simulate(horizon=20, step=0.05)
forecast = study.forecast({"x": 1.5}, horizon=20)   # baseline vs. counterfactual + divergence

# 5. Compare scenarios
study.add_scenario("hot", interventions={"x": 2.0})
study.add_scenario("cold", interventions={"x": 0.5})
comparison = study.compare_scenarios()    # -> ScenarioComparison

# 6. Share
study.report("report.html")               # self-contained HTML report
study.save("world.lsworld")               # portable bundle the CLI/Studio also read

Construct a study from other inputs with Study.from_dataset(...), Study.from_columns(...), or Study.load(path, dataset=..., state=...) to rebind a persisted world. Tune discovery by passing a DiscoveryConfig or keyword overrides to discover() (polynomial_degree, threshold, solver, include_trigonometric, include_rational, smoothing_radius, derivative_method, symbolic_depth).

Importing from external sources

Study.from_source(...) (and the lower-level lawsynth.load_source(...)) bring in observations through the lawsynth-connectors package — filesystem, http, s3, postgres, and sqlite connectors — coercing records to finite floats at the SDK boundary:

study = lawsynth.Study.from_source(
    "filesystem", "obs.csv",
    time="t", state=["x", "y"], options={"root": "."},
)
study.discover().explain()

Lower-level API

For direct control, call lawsynth.discover(...) on aligned columns:

from lawsynth import discover

world = discover(
    time=[0.0, 0.05, 0.10],
    columns={"x": [1.0, 0.998, 0.990], "y": [0.0, 0.099, 0.197]},
    state=["x", "y"],
)
print(world.equations())

Notebook dashboard

With the optional lawsynth-notebook package installed, study.dashboard() (and result.dashboard()) renders a cohesive StudyDashboard — equations, dependency graph, trajectory, uncertainty, and any registered scenarios folded together.

Use only finite numeric observations and valid identifiers throughout.