from __future__ import annotations import json from pathlib import Path import numpy as np import torch from physics import gray_scott_step, initial_state PROJECT_DIR = Path(__file__).resolve().parent DATA_DIR = PROJECT_DIR / "data" SIZE = 32 TRAJECTORIES = 36 SAMPLES_PER_TRAJECTORY = 40 def main() -> None: DATA_DIR.mkdir(parents=True, exist_ok=True) rng = np.random.default_rng(2039) states = [] next_states = [] feeds = [] kills = [] trajectory_ids = [] for trajectory in range(TRAJECTORIES): feed = float(rng.uniform(0.025, 0.060)) kill = float(rng.uniform(0.050, 0.072)) feed_tensor = torch.tensor([feed]) kill_tensor = torch.tensor([kill]) state = initial_state(1, SIZE, seed=2039 + trajectory) for step in range(SAMPLES_PER_TRAJECTORY * 2): next_state = gray_scott_step(state, feed_tensor, kill_tensor) if step % 2 == 0: states.append(state[0].numpy()) next_states.append(next_state[0].numpy()) feeds.append(feed) kills.append(kill) trajectory_ids.append(trajectory) state = next_state arrays = { "states": np.stack(states).astype(np.float32), "next_states": np.stack(next_states).astype(np.float32), "feeds": np.asarray(feeds, dtype=np.float32), "kills": np.asarray(kills, dtype=np.float32), "trajectory_ids": np.asarray(trajectory_ids, dtype=np.int64), } np.savez_compressed(DATA_DIR / "gray_scott_trajectories.npz", **arrays) manifest = { "grid_size": SIZE, "trajectories": TRAJECTORIES, "samples": len(states), "samples_per_trajectory": SAMPLES_PER_TRAJECTORY, "train_trajectories": list(range(0, 28)), "validation_trajectories": list(range(28, 32)), "test_trajectories": list(range(32, 36)), "feed_range": [0.025, 0.060], "kill_range": [0.050, 0.072], "path": "gray_scott_trajectories.npz", } (DATA_DIR / "manifest.json").write_text( json.dumps(manifest, indent=2), encoding="utf-8", ) print(json.dumps(manifest, indent=2)) if __name__ == "__main__": main()