Files
d4r/tools/windows/m_temporal_validate.py

54 lines
2.3 KiB
Python

"""Validate every captured M launch and spatial block; all allocations stay private."""
import argparse
import contextlib
import json
import pathlib
import sys
import traceback
from m_replay_validate import LAYERS, validate
def main(args):
args.output_dir.mkdir(parents=True, exist_ok=True)
summary = {'passed': False, 'captured_outputs': True, 'exact': args.exact, 'launches': []}
status = 1
try:
captures = sorted(args.capture_dir.glob('replay-*-rrlite_*_4x4'))
if not captures:
raise RuntimeError('No audited M captures were found')
for capture in captures:
layer = capture.name.split('rrlite_', 1)[1][:-4]
if layer not in LAYERS:
raise RuntimeError(f'Unknown captured M layer: {layer}')
logfile = args.output_dir / (capture.name + '.log')
with logfile.open('w', encoding='utf-8') as output, contextlib.redirect_stdout(output):
validate(layer, capture, capture / 'gpu-output', args.blocks, True, args.exact)
print(capture.name + ' ' + logfile.read_text().splitlines()[0], flush=True)
summary['launches'].append({'capture': capture.name, 'layer': layer, 'passed': True})
present = {item['layer'] for item in summary['launches']}
if present != set(LAYERS):
raise RuntimeError('Capture set does not contain all five M layers')
summary['passed'] = True
print(f'PASS M_TEMPORAL_REFERENCE launches={len(captures)} blocks={args.blocks} exact={int(args.exact)}', flush=True)
status = 0
except Exception as error:
summary['error'] = str(error)
summary['failed_capture'] = capture.name if 'capture' in locals() else None
traceback.print_exc()
finally:
(args.output_dir / 'summary.json').write_text(json.dumps(summary, indent=2) + '\n', encoding='utf-8')
return status
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--capture-dir', type=pathlib.Path, required=True)
parser.add_argument('--output-dir', type=pathlib.Path, required=True)
parser.add_argument('--blocks', type=int, default=10000)
parser.add_argument('--exact', action='store_true')
args = parser.parse_args()
if args.blocks < 1:
parser.error('--blocks must be positive')
sys.exit(main(args))