Xlbully's picture
Add CLI and example output
bdfcde8
---
library_name: staticplay-curiodynamics
license: mit
tags:
- physics
- symbolic-regression
- curiosity
- dynamics
- discovery
- scientific-ml
---
# Staticplay CurioDynamics
Curiosity-driven symbolic physics discovery from raw trajectories (position, velocity, time). The agent observes only state and learns a sparse symbolic model that recovers hidden dynamics such as gravity, drag, and wind.
## What It Does
- Generates a hidden physics world (projectile motion with drag + wind).
- Observes only `position`, `velocity`, and `time`.
- Learns a symbolic acceleration model via sparse regression.
- Recovers interpretable formulas like:
- `ax = wind βˆ’ k * vx * |vx|`
- `ay = βˆ’g βˆ’ k * vy * |vy|`
## Quick Start
Requires Python 3.10+.
```powershell
python .\physics_world.py
```
## CLI Usage
```powershell
python .\physics_world.py --episodes 50 --steps 200 --g 9.81 --drag 0.12 --wind 0.4 --drag_power 2.0 --dt 0.1 --seed 123
```
## How It Works
1. Simulates a hidden world with gravity + drag + wind.
2. Collects state transitions only (no equations given).
3. Fits a sparse symbolic model over a small feature library.
4. Interprets the recovered constants as wind and gravity.
## Latest Test Results
Hidden world: quadratic drag + wind
```
g_true = 9.81
drag_true = 0.12
wind_true = 0.4
model_ax: ax = 0.4 βˆ’ 0.12 * vx|vx|
model_ay: ay = βˆ’9.81 βˆ’ 0.12 * vy|vy|
wind_est = 0.4
g_est = 9.81
```
## Example Output
```text
{'g_true': 9.81, 'drag_true': 0.12, 'wind_true': 0.4, 'drag_power_true': 2.0,
'model_ax': {'vx_abs_vx': -0.12, '1': -2.209},
'model_ay': {'vy_abs_vy': -0.12, '1': -13.034},
'wind_est': 0.4, 'g_est': 9.81, 'samples': 634}
```
## Install
No external dependencies beyond standard library.
If you want a virtual environment:
```powershell
python -m venv .venv
.\.venv\Scripts\activate
python .\physics_world.py
```
## Files
- `physics_world.py`: hidden physics world + curiosity agent + symbolic regression
## How To Run Different Scenarios
Edit `run_stress_test(...)` in `physics_world.py`:
- `wind`
- `drag`
- `drag_power`
- `episodes`
- `steps`
Example:
```python
result = run_stress_test(
episodes=50,
steps=200,
g=9.81,
drag=0.12,
wind=0.4,
drag_power=2.0,
dt=0.1
)
print(result)
```
## Notes
This is intentionally minimal and deterministic to highlight discovery mechanics. The feature library is constrained to keep the model interpretable.
## Acknowledgements
- teliov/symcat-to-synthea
## Links
- https://staticplay.co.uk