49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
"""Capture golden scroll event sequences from current torch implementation."""
|
|
from __future__ import annotations
|
|
|
|
import random
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Allow running as `uv run python scripts/build_golden_scroll.py` from project root.
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
|
|
import numpy as np
|
|
import torch
|
|
|
|
from ai_mouse import generate_scroll
|
|
|
|
CASES: list[tuple[int, int, str]] = [
|
|
(0, 1500, "target"),
|
|
(0, 500, "precise"),
|
|
(0, 5000, "fast"),
|
|
(2000, 0, "target"), # upward
|
|
(0, 800, "precise"),
|
|
(0, 3500, "fast"),
|
|
(1000, 1200, "precise"), # tiny scroll
|
|
(0, 10000, "fast"), # very long
|
|
]
|
|
SEEDS = (0, 1, 2, 3)
|
|
|
|
|
|
def main() -> None:
|
|
out: dict[str, np.ndarray] = {}
|
|
for case_idx, (start_y, end_y, mode) in enumerate(CASES):
|
|
for seed in SEEDS:
|
|
random.seed(seed)
|
|
np.random.seed(seed)
|
|
torch.manual_seed(seed)
|
|
events = generate_scroll(start_y, end_y, mode=mode)
|
|
arr = np.array(
|
|
[[e["deltaY"], e["deltaMode"], e["t"]] for e in events],
|
|
dtype=np.int64,
|
|
)
|
|
out[f"case{case_idx}_seed{seed}"] = arr
|
|
out_path = Path("tests/unit/data/golden_scroll.npz")
|
|
np.savez_compressed(out_path, **out)
|
|
print(f"Wrote {len(out)} scroll golden traces to {out_path}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|