import json
import os
import subprocess
import sys
import time
DATA_DIR = os.path.join(os.path.dirname(__file__), "data")
RESULTS_DIR = os.path.join(os.path.dirname(__file__), "results", "rust")
PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__))
def build_runner():
print(" Building motif-rs validation runner...")
result = subprocess.run(
["cargo", "build", "--release", "--example", "validation_runner", "--features", "validation"],
cwd=PROJECT_ROOT,
capture_output=True,
text=True,
)
if result.returncode != 0:
print(f" Warning: Could not build validation runner: {result.stderr}")
return False
return True
def run_via_binary(name: str, data: dict) -> dict | None:
binary = os.path.join(PROJECT_ROOT, "target", "release", "examples", "validation_runner")
if not os.path.exists(binary):
return None
input_json = json.dumps(data)
start = time.perf_counter()
result = subprocess.run(
[binary],
input=input_json,
capture_output=True,
text=True,
timeout=120,
)
elapsed = time.perf_counter() - start
if result.returncode != 0:
print(f" Warning: validation_runner failed for {name}: {result.stderr}")
return None
out = json.loads(result.stdout)
out["elapsed_s"] = elapsed
return out
def run_via_cargo_test(name: str) -> dict | None:
golden_map = {
"sine_wave": "sine_wave_mp.json",
"square_wave": "square_wave_mp.json",
"mixed_signal": "mixed_signal_mp.json",
"streaming_sine": "streaming_sine_mp.json",
}
golden_file = golden_map.get(name)
if not golden_file:
return None
golden_path = os.path.join(PROJECT_ROOT, "tests", "golden_data", golden_file)
if not os.path.exists(golden_path):
return None
return None
def run_via_recompute(name: str) -> dict | None:
data_path = os.path.join(DATA_DIR, f"{name}.json")
if not os.path.exists(data_path):
return None
with open(data_path) as f:
data = json.load(f)
result = run_via_binary(name, data)
if result:
return result
return None
def run_batch(name: str):
data_path = os.path.join(DATA_DIR, f"{name}.json")
with open(data_path) as f:
data = json.load(f)
result = run_via_binary(name, data)
if result is None:
print(f" {name}: skipped (no validation_runner binary)")
print(f" To enable: create examples/validation_runner.rs")
return
os.makedirs(RESULTS_DIR, exist_ok=True)
out_path = os.path.join(RESULTS_DIR, f"{name}.json")
with open(out_path, "w") as f:
json.dump(result, f)
print(f" {name}: motif-rs in {result['elapsed_s']:.3f}s")
def run_streaming(name: str):
data_path = os.path.join(DATA_DIR, f"{name}.json")
with open(data_path) as f:
data = json.load(f)
result = run_via_binary(name, data)
if result is None:
print(f" {name}: skipped (no validation_runner binary)")
return
os.makedirs(RESULTS_DIR, exist_ok=True)
out_path = os.path.join(RESULTS_DIR, f"{name}.json")
with open(out_path, "w") as f:
json.dump(result, f)
print(f" {name}: motif-rs streaming in {result['elapsed_s']:.3f}s")
def run_all():
print("Running motif-rs implementation...\n")
build_runner()
for name in ["sine_wave", "square_wave", "mixed_signal"]:
run_batch(name)
run_streaming("streaming_sine")
print("\nDone.")
if __name__ == "__main__":
run_all()