Files
product-vamp/audition/benchmark.py
T
khodowany f234dd6d51 Save
2026-10-04 15:51:18 -05:00

45 lines
2.1 KiB
Python

"""Isolated production-role benchmark. No target discovery or audition capture."""
from __future__ import annotations
import argparse
import cProfile
import hashlib
import json
import os
from pathlib import Path
import platform
import pstats
import time
from generator import production, parts, musicxml, vocabulary
def main():
p=argparse.ArgumentParser(description=__doc__)
p.add_argument('--source',type=Path,required=True)
p.add_argument('--data-dir',type=Path,default=Path('data'))
p.add_argument('--role',choices=production.ROLES,required=True)
p.add_argument('--cache',type=Path)
p.add_argument('--output',type=Path,required=True)
p.add_argument('--profile',action='store_true')
args=p.parse_args();args.output.mkdir(parents=True,exist_ok=True)
start=time.monotonic()
source=production.SourceAnalysis.read(parts.prepare_document(musicxml.load_musicxml(args.source)))
analysis_seconds=time.monotonic()-start
profile=cProfile.Profile() if args.profile else None
if profile:profile.enable()
start=time.monotonic()
result=production.generate_role(source,args.role,args.data_dir,cache_dir=args.cache)
seconds=time.monotonic()-start
if profile:
profile.disable();profile.dump_stats(args.output/'role.prof')
with (args.output/'profile.txt').open('w') as out:pstats.Stats(profile,stream=out).sort_stats('cumulative').print_stats(70)
evidence={'source':str(args.source),'canonical_source':source.musical_key,'role':args.role,
'platform':platform.platform(),'processor':platform.processor(),'cpu_count':os.cpu_count(),'workers':1,
'cache_hit':result['cache_hit'],'analysis_seconds':analysis_seconds,'role_seconds':seconds,
'cprofile_enabled':bool(profile),'musical_document_hash':vocabulary.fingerprint(result['document']),
'input_trace':result['trace'],'observed_reads':result.get('observed_reads',[])}
(args.output/'result.json').write_text(json.dumps(result,sort_keys=True,indent=2))
(args.output/'benchmark.json').write_text(json.dumps(evidence,sort_keys=True,indent=2))
print(json.dumps({k:v for k,v in evidence.items() if k!='input_trace'},indent=2))
if __name__=='__main__':main()