def setup()

in utils.py [0:0]


def setup(parser, fn_args=None):
    # NOTE: If you change the defaults, you better go change mark what changed
    # in the results in the README.md too
    parser.add_argument('-i', '--input', default=datadir,
                        help="Input directory for input files. Must have a "
                        "${prefix}train.list, ${prefix}valid.list, and "
                        "${prefix}test.list files")
    parser.add_argument('--load', default=False,
                        help="Whether to load the model")
    parser.add_argument('--finetune', type=str, default="",
                        help="Whether to load a model if it doesn't exist")
    parser.add_argument('--save', default=False,
                        help="Whether to save the model")
    parser.add_argument('--io', default=False,
                        help="Shorthand for --load and --save to the same file")
    parser.add_argument('--small', default=False, action='store_true',
                        help="Whether to use smalltrain.list, ... instead")
    parser.add_argument('--check_dims', default=False, action='store_true',
                        help="Whether to show all dims (features, model)")
    parser.add_argument('--data_threads', default=10, type=int,
                        help="Number of threads to use for dataloader")
    parser.add_argument('--skip_frames', default=80, type=int,
                        help="Number of skip frames (multiply by 3 to get true #)")
    parser.add_argument('--combine_frames', default=80, type=int,
                        help="Number of combine frames. (multiply by 3)")
    parser.add_argument('--debug', default=3, type=int,
                        help="Choices for debug, can be 1-5, with 1 most verbose")
    parser.add_argument('-k', '--kernel_size', default=64, type=int,
                        help="featurizer kernel size")
    parser.add_argument('-s', '--stride', default=0, type=int,
                        help="featurizer stride size, secretly defaults to kernel size")
    parser.add_argument('--divide_by', default=100, type=int,
                        help="divide features by this number; special values: 0 -> normalize features by their sum space, per timestep; negative -> do nothing")
    parser.add_argument('-g', '--gpu', default=-1, type=int,
                        help="which GPU to use, -1 for CPU")
    parser.add_argument('--reduced', default=False, action='store_true',
                        help='data is in featurizer-specific reduced format')
    parser.add_argument('--predict', default='defog',
                        help="what prediction mode to use, between: {'defog', 'only_us', 'full_info', 'only_defog'}")
    parser.add_argument('--predict_delta', default=False, action='store_true',
                        help="predict the delta between t and t+1")
    parser.add_argument('--class_prob_thresh', default=0.5, type=float,
                        help="Existence when p[building] is greater than this flag")
    parser.add_argument('--until_time', default=0, type=int,
                        help="predict until time (in minutes), 0 for full game")
    parser.add_argument('--from_time', default=0, type=int,
                        help="predict from time (in minutes), 0 for full game")
    parser.add_argument('-e', '--epochs', default=100, type=int,
                        help="# epochs")
    parser.add_argument('--check_nan', default=False, action='store_true',
                        help="Check nan values during training, very very slow")
    parser.add_argument('--just_valid', default=False, action='store_true',
                        help="Just do a validation run")
    parser.add_argument('--use_true_visibility', default=False, action='store_true',
                        help="Use Jonas's visibility map, which is strictly more visible than reality. Default is strictly less visible")
    parser.add_argument('--n_unit_thresh', default=0.1, type=float,
                        help="If model predicts > n_unit_thresh, round it to the next whole number")
    parser.add_argument('--regr_slope_scalar', default=1.0, type=float,
                        help="If model predict K units, return K*regr_slope_scalar units")

    args = parser.parse_args() if fn_args is None else parser.parse_args(fn_args)
    if ((args.save is not False or args.load is not False)
            and args.io is not False):
        raise RuntimeError("Cannot have save or load with --io option")
    if args.io is not False:
        args.save = args.io
        args.load = args.io
    if args.save is not False:
        args.save = os.path.abspath(args.save)
        os.makedirs(args.save, exist_ok=True)
    if args.check_dims:
        args.debug = min(args.debug, 2)

    logFormatter = logging.Formatter("[%(asctime)s %(filename)s:%(lineno)-4d] | %(levelname)8s | %(message)s", "%m-%d %H:%M:%S")
    rootLogger = logging.getLogger()
    rootLogger.setLevel(0)

    if args.save is not False:
        fileHandler = logging.FileHandler(os.path.join(args.save, "defogger.log"))
        fileHandler.setFormatter(logFormatter)
        fileHandler.setLevel(40)
        rootLogger.addHandler(fileHandler)

    consoleHandler = logging.StreamHandler()
    consoleHandler.setFormatter(logFormatter)
    consoleHandler.setLevel(args.debug*10)
    rootLogger.addHandler(consoleHandler)

    if args.debug <= 1:
        th.backends.cudnn.enabled = False
    else:
        th.backends.cudnn.enabled = True

    # TODO skip_frames >= combine_frames
    assert args.skip_frames >= args.combine_frames, ("Not yet supported, need "
        "to implement predict forward more than 1 skip frame.")
    args.stride = args.kernel_size if args.stride == 0 else args.stride

    args.from_time = convert_minutes_to_repframes(args.from_time, args.combine_frames)
    args.until_time = convert_minutes_to_repframes(args.until_time, args.combine_frames)

    if 'SLURM_JOBID' in os.environ:
        logging.log(42, "slurm_info {} {} {}".format(
            os.environ.get('SLURM_JOBID', -1),
            os.environ.get('SLURM_ARRAY_JOB_ID', -1),
            os.environ.get('SLURM_ARRAY_TASK_ID', -1),
        ))
    logging.log(42, "git_commit {}".format(subprocess.check_output(
        ['git', 'rev-parse', '--short', 'HEAD']).decode().strip()))
    logging.log(42, "process_pid {}".format(os.getpid()))
    for a, b in sorted(vars(args).items()):
        logging.log(42, "argument {} {}".format(a, b))

    featurizer = _ext.CoarseConvFeaturizerUnitTypes(
        args.kernel_size, args.kernel_size, args.stride, args.stride,
        args.from_time, args.until_time)
    args.featurizer = featurizer
    args.n_inp_feats = args.featurizer.feature_size
    # Finds the breakoff for units and buildings
    ind2unit = {Constants.unittypes._dict[i] : v for i, v in
                   enumerate(featurizer.typemapper) if v != featurizer.feature_size - 1}
    args.unit_range = (0, ind2unit['Zerg_Lurker'] + 1)
    args.bldg_range = (ind2unit['Terran_Command_Center'], ind2unit['Protoss_Shield_Battery'] + 1)
    # everything after cutoff is a building inclusive, except for the last,
    # which is unknown
    return args