"""Run all declared noise experiments, reusing only deterministic optical templates."""
import argparse
import importlib.util
import json
from pathlib import Path

spec = importlib.util.spec_from_file_location('noise_validation', Path(__file__).with_name('validate-noise-coverage.py'))
validation = importlib.util.module_from_spec(spec)
spec.loader.exec_module(validation)
original_templates = validation.source_templates
original_star = validation.stellar_expectation
saved_templates, saved_stars = {}, {}

def key(settings, angles, wavelengths, *coordinates):
    return (json.dumps(settings, sort_keys=True), tuple(angles), tuple(wavelengths), *coordinates)

def templates(settings, angles, wavelengths, x, y):
    index = key(settings, angles, wavelengths, x, y)
    if index not in saved_templates:
        saved_templates[index] = original_templates(settings, angles, wavelengths, x, y)
    return saved_templates[index]

def star(settings, angles, wavelengths):
    index = key(settings, angles, wavelengths)
    if index not in saved_stars:
        saved_stars[index] = original_star(settings, angles, wavelengths)
    return saved_stars[index]

validation.source_templates, validation.stellar_expectation = templates, star
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('--materials', type=Path, default=Path('.'))
    parser.add_argument('--output', type=Path, default=Path('noise-rerun'))
    args = parser.parse_args(); args.output.mkdir(parents=True, exist_ok=True)
    for algorithm, draws in [('adi', 64), ('asdi', 64), ('klip', 24)]:
        validation.validate(args.materials, args.output / f'noise-coverage-{algorithm}.json', draws, algorithm, .002)
