#!/usr/bin/python import argparse import os, glob, sys import json import param_scan import param_scan.parameter_sets as ps import param_scan.simulation_run as si import param_scan.submitters as su import param_scan.io as io import param_scan.dict_comparison as dc from param_scan.custom_json import json_hook default_params_name = "parameters" data_dir_name = "data" last_run_symlink_name = "last.run" parser = argparse.ArgumentParser(description='bla') parser.add_argument('sim', metavar='sim', type=str, help='.sim file describing the simulation') parser.add_argument('prms', metavar='prms', type=str, nargs="*", help="key=value pairs for overriding default parameters or ~key for deleting keys", default=[]) parser.add_argument('-r', '--revision', dest='rev', type=str, help='git revision', default="HEAD") parser.add_argument('-j', '--json-prms', dest='json_prms', type=str, default="{}", help='json string of (additional) parameter overrides') parser.add_argument('-d', '--data-dir', dest='data_dir', type=str, default=data_dir_name) parser.add_argument('-b', '--base-on', dest='base_on', type=str, help='base on params in given .run or parameters file', default=None) #parser.add_argument('-s', '--submitter', dest='submitter', type=str, help='submitter ("condor" or "xargs")', default="condor") parser.add_argument('-s', '--submitter', dest='submitter', type=str, help='submitter ("condor" or "xargs")', default="xargs") parser.add_argument('--dry-run', action='store_true', dest='dry_run', default=False) parser.add_argument('--no-wait', action='store_false', dest='wait', default=True) args = parser.parse_args() sim_path = os.path.realpath(io.find_in_parents(args.sim)) rev = args.rev print "Using simulation \n\t%s\nrevision\n\t%s" % (sim_path, rev) if os.path.exists(args.data_dir) and os.path.isdir(args.data_dir): data_dir = args.data_dir else: try: data_dir = os.path.realpath(io.find_in_parents(args.data_dir)) except IOError: raise IOError("data dir '%s' not found up to file system boundary" % args.data_dir) print "Using data dir\n\t%s" % data_dir prms = {} if args.base_on is None: prmspaths = io.find_all_in_parents(default_params_name) if len(prmspaths) > 0: relprmspaths = [os.path.relpath(p, os.getcwd()) for p in prmspaths] print "Basing on parameters\n\t%s" % " --> ".join(relprmspaths) prms = io.load_parameters_incrementally(prmspaths[0]) else: fn, x = io.load_run(args.base_on) print "Basing parameters on \n\t%s" % fn if x.has_key("parameters"): prms = x["parameters"] else: prms = x oprms = {} delkeys = [] for p in args.prms: if p.startswith("~"): delkeys.append(p[1:]) else: try: k, v = p.split("=") oprms[k.strip()] = param_scan.ureg.parse_expression(v) except ValueError: # too many/few values to unpack raise ValueError("parameter overrides need to be given in [key]=[value] pairs (I'm confused by '%s')" % p) for k in delkeys: del prms[k] if len(delkeys) > 0: print "deleting parameters\n\t%s" % ", ".join(delkeys) oprms.update(json.loads(args.json_prms, object_hook=io.json_hook)) if len(oprms.keys()) > 0: print "adding/overriding parameters\n\t%s" % ", ".join(oprms.keys()) prms.update(oprms) cwd = os.getcwd() try: os.chdir(os.path.dirname(sim_path)) if args.submitter == "condor": submitter = su.condor_submitter elif args.submitter == "xargs": submitter = su.xargs_submitter else: raise ValueError("submitter unknown: '%s'" % args.submitter) r = si.submit(io.load(sim_path), prms, data_dir, rev=rev, submitter=submitter, dry_run=args.dry_run, unique=False, submitter_args={"wait": args.wait}) os.chdir(cwd) prfx = si.get_prefix(r["sim"], r["parameters"], r["uniqueness"], ignore_underscore=False) io.save(r, prfx + ".run") if os.path.exists(last_run_symlink_name): os.remove(last_run_symlink_name) os.symlink(prfx + ".run", last_run_symlink_name) print "---> %s" % (prfx + ".run") finally: os.chdir(cwd)