45 lines
2.1 KiB
Python
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()
|