from __future__ import annotations import os import sys from pathlib import Path import numpy as np ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT)) os.chdir(ROOT) from onescience.utils.YParams import YParams def make_edges(num_nodes: int) -> np.ndarray: src = np.arange(num_nodes, dtype=np.int64) dst = (src + 1) % num_nodes edges = np.stack( [np.concatenate([src, dst]), np.concatenate([dst, src])], axis=0, ) return edges def write_placeholder_training_files(param_dir: Path, rng: np.random.Generator) -> None: param_dir.mkdir(parents=True, exist_ok=True) np.save(param_dir / "Cd.npy", rng.normal(size=(1,)).astype(np.float32)) np.save(param_dir / "I1.npy", rng.normal(size=(8, 3)).astype(np.float32)) np.save(param_dir / "I2.npy", rng.normal(size=(8, 3)).astype(np.float32)) np.save(param_dir / "Press.npy", rng.normal(size=(8, 1)).astype(np.float32)) np.save(param_dir / "Velo.npy", rng.normal(size=(8, 3)).astype(np.float32)) def write_sample(sample_dir: Path, num_nodes: int, rng: np.random.Generator) -> tuple[np.ndarray, np.ndarray]: sample_dir.mkdir(parents=True, exist_ok=True) pos = rng.uniform(low=-1.0, high=1.0, size=(num_nodes, 3)).astype(np.float32) sdf = rng.uniform(low=0.0, high=0.2, size=(num_nodes, 1)).astype(np.float32) normals = rng.normal(size=(num_nodes, 3)).astype(np.float32) normals /= np.linalg.norm(normals, axis=1, keepdims=True) + 1e-6 x = np.concatenate([pos, sdf, normals], axis=1).astype(np.float32) y = np.concatenate( [ 0.1 * pos + rng.normal(scale=0.01, size=(num_nodes, 3)), rng.normal(scale=0.05, size=(num_nodes, 1)), ], axis=1, ).astype(np.float32) surf = np.zeros((num_nodes,), dtype=np.bool_) surf[num_nodes // 2 :] = True edge_index = make_edges(num_nodes) np.save(sample_dir / "x.npy", x) np.save(sample_dir / "y.npy", y) np.save(sample_dir / "pos.npy", pos) np.save(sample_dir / "surf.npy", surf) np.save(sample_dir / "edge_index.npy", edge_index) return x, y def main() -> None: cfg = YParams(str(ROOT / "conf/config.yaml"), "datapipe") data_dir = ROOT / cfg.source.data_dir preprocessed_dir = ROOT / cfg.source.preprocessed_save_dir stats_dir = ROOT / cfg.source.stats_dir stats_dir.mkdir(parents=True, exist_ok=True) rng = np.random.default_rng(42) all_x: list[np.ndarray] = [] all_y: list[np.ndarray] = [] for fold_id in range(9): param_name = f"param{fold_id}" param_dir = data_dir / param_name write_placeholder_training_files(param_dir, rng) sample_name = "sample_000" (param_dir / sample_name).mkdir(parents=True, exist_ok=True) x, y = write_sample(preprocessed_dir / param_name / sample_name, num_nodes=8, rng=rng) all_x.append(x) all_y.append(y) x_all = np.concatenate(all_x, axis=0) y_all = np.concatenate(all_y, axis=0) np.save(stats_dir / "mean_in.npy", x_all.mean(axis=0).astype(np.float32)) np.save(stats_dir / "std_in.npy", (x_all.std(axis=0) + 1e-6).astype(np.float32)) np.save(stats_dir / "mean_out.npy", y_all.mean(axis=0).astype(np.float32)) np.save(stats_dir / "std_out.npy", (y_all.std(axis=0) + 1e-6).astype(np.float32)) print(f"Fake ShapeNetCar data generated under {ROOT / 'data/mlcfd_data'}") if __name__ == "__main__": main()