def main():
    import argparse
    import os
    import pickle
    import sys

    key_names = KEYS.keys()

    # set up arguments
    parser = argparse.ArgumentParser()

    parser.add_argument('--latent-d', '-D', type=int, default=5)
    parser.add_argument('--steps', '-s', type=int, default=None)

    parser.add_argument('--discrete', action='store_true', default=None)
    parser.add_argument('--no-discrete', action='store_false', dest='discrete')

    parser.add_argument('--subtract-mean', action='store_true', default=True)
    parser.add_argument('--no-subtract-mean',
                        action='store_false',
                        dest='subtract_mean')

    parser.add_argument('--fit', default='batch')
    parser.add_argument('--lookahead-fit', default='batch')

    parser.add_argument('--samps', '-S', type=int, default=128)
    parser.add_argument('--lookahead-samps', type=int, default=128)

    parser.add_argument('--threaded', action='store_true', default=True)
    parser.add_argument('--unthreaded', action='store_false', dest='threaded')
    parser.add_argument('--procs', '-P', type=int, default=None)

    parser.add_argument('--test-set', default='all')

    parser.add_argument('--load-data', required='True', metavar='FILE')
    parser.add_argument('--save-results',
                        nargs='?',
                        default=True,
                        const=True,
                        metavar='FILE')
    parser.add_argument('--no-save-results',
                        action='store_false',
                        dest='save_results')

    parser.add_argument(
        '--note',
        action='append',
        help="Doesn't do anything, just there to save any notes you'd like "
        "in the results file.")

    parser.add_argument('keys',
                        nargs='*',
                        help="Choices: {}.".format(', '.join(
                            sorted(key_names))))

    args = parser.parse_args()

    # check that args.keys are valid
    for k in args.keys:
        if k not in key_names:
            sys.stderr.write("Invalid key name %s; options are %s.\n" %
                             (k, ', '.join(sorted(key_names))))
            sys.exit(1)

    if not args.keys:
        args.keys = sorted(key_names)

    # make directories to save results if necessary
    if args.save_results is True:
        args.save_results = 'results.pkl'
    elif args.save_results:
        dirname = os.path.dirname(args.save_results)
        if dirname and not os.path.exists(dirname):
            os.makedirs(dirname)

    # load data
    with open(args.load_data, 'rb') as f:
        data = np.load(f)

        if isinstance(data, np.ndarray):
            data = {'_real': data}

        real = data['_real']
        ratings = data['_ratings']
        rating_vals = data['_rating_vals'] if '_rating_vals' in data else None

    if args.discrete is None:
        args.discrete = rating_vals is not None

    # do the comparison
    try:
        results = compare_active(key_names=args.keys,
                                 latent_d=args.latent_d,
                                 real=real,
                                 ratings=ratings,
                                 rating_vals=rating_vals,
                                 test_set=args.test_set,
                                 num_steps=args.steps,
                                 discrete=args.discrete,
                                 subtract_mean=args.subtract_mean,
                                 fit_type=parse_fit_type(args.fit),
                                 lookahead_fit=args.lookahead_fit,
                                 num_samps=args.samps,
                                 lookahead_samps=args.lookahead_samps,
                                 procs=args.procs,
                                 threaded=args.threaded)
    except Exception:
        import traceback
        print()
        traceback.print_exc()

        import pdb
        print()
        pdb.post_mortem()

        sys.exit(1)

    # save the results file
    if args.save_results:
        print("\nsaving results in '{}'".format(args.save_results))

        results['_args'] = args

        with open(args.save_results, 'wb') as f:
            pickle.dump(results, f)
def main():
    import argparse
    import os
    import pickle
    import sys

    key_names = set(KEY_FUNCS.keys())
    types = {'float', 'int', 'int-bounds', 'binary'}

    parser = argparse.ArgumentParser()

    model = parser.add_argument_group("Model Options")
    model.add_argument('--latent-d', '-D', type=int, default=5)
    model.add_argument('--discrete-integration',
                       nargs='?',
                       const=True,
                       default=False)
    model.add_argument('--continuous-integration',
                       action='store_false',
                       dest='discrete_integration')
    add_bool_opt(model, 'fit-sigmas', default=False)

    add_bool_opt(model, 'refit-lookahead', default=False)

    model.add_argument('--fit', default='batch')
    model.add_argument('--sig-u-mean', type=float, default=0)
    model.add_argument('--sig-u-var', type=float, default=-1)
    model.add_argument('--sig-v-mean', type=float, default=0)
    model.add_argument('--sig-v-var', type=float, default=-1)

    model.add_argument('keys',
                       nargs='*',
                       help="Choices: {}.".format(', '.join(
                           sorted(key_names))))

    problem_def = parser.add_argument_group("Problem Definiton")
    problem_def.add_argument('--load-data', default=None, metavar='FILE')
    add_bool_opt(problem_def, 'load-model', default=False)
    problem_def.add_argument('--gen-rank', '-R', type=int, default=5)
    problem_def.add_argument(
        '--type',
        default='float',
        help="An integer (meaning values are from 0 to that integer) or "
        "one of {}".format(', '.join(sorted(types))))

    problem_def.add_argument('--u-mean', type=float, default=0)
    problem_def.add_argument('--u-std', type=float, default=2)
    problem_def.add_argument('--v-mean', type=float, default=0)
    problem_def.add_argument('--v-std', type=float, default=2)

    problem_def.add_argument('--noise', '-n', type=float, default=.25)
    problem_def.add_argument('--num-users', '-N', type=int, default=10)
    problem_def.add_argument('--num-items', '-M', type=int, default=10)
    problem_def.add_argument('--mask', '-m', default=0)

    running = parser.add_argument_group("Running")
    running.add_argument('--processes', '-P', type=int, default=None)
    add_bool_opt(running, 'threading', True)
    running.add_argument('--steps', '-s', type=int, default=None)

    results = parser.add_argument_group("Results")
    results.add_argument('--save-results',
                         nargs='?',
                         default=None,
                         const=True,
                         metavar='FILE')
    results.add_argument('--no-save-results',
                         action='store_false',
                         dest='save_results')
    results.add_argument(
        '--note',
        action='append',
        help="Doesn't do anything, just there to save any notes you'd like "
        "in the results file.")

    args = parser.parse_args()

    # is args.mask supposed to be a float?
    try:
        args.mask = float(args.mask)
    except ValueError:
        pass

    # check args.type
    try:
        args.type = int(args.type)
    except ValueError:
        if args.type not in types:
            raise ValueError("--type must be integer or one of {}".format(
                ', '.join(sorted(types))))

    # check that args.keys are valid
    for k in args.keys:
        if k not in key_names:
            sys.stderr.write("Invalid key name %s; options are %s.\n" %
                             (k, ', '.join(sorted(key_names))))
            sys.exit(1)

    if not args.keys:
        args.keys = sorted(key_names)

    # make directories to save results if necessary
    if args.save_results is True:
        args.save_results = 'results.pkl'
    elif args.save_results:
        dirname = os.path.dirname(args.save_results)
        if dirname and not os.path.exists(dirname):
            os.makedirs(dirname)

    # load previous data, if we're doing that
    real_ratings_vals = None
    apmf = None
    knowable = None
    if args.load_data:
        with open(args.load_data, 'rb') as f:
            data = np.load(f)

            if isinstance(data, np.ndarray):
                data = {'_real': data}

            real = data['_real']
            real_ratings_vals = (
                real,
                data['_ratings'] if '_ratings' in data else get_ratings(
                    real, args.mask),
                data['_rating_vals'] if '_rating_vals' in data else None,
            )
            if args.load_model:
                apmf = data['_initial_apmf']

        knowable = np.isfinite(real)
        knowable[real == 0] = 0
        knowable = zip(*knowable.nonzero())

    # get results
    try:
        results = compare(args.keys,
                          num_users=args.num_users,
                          num_items=args.num_items,
                          real_ratings_vals=real_ratings_vals,
                          apmf=apmf,
                          u_mean=args.u_mean,
                          u_std=args.u_std,
                          v_mean=args.v_mean,
                          v_std=args.v_std,
                          noise=args.noise,
                          mask_type=args.mask,
                          rank=args.gen_rank,
                          latent_d=args.latent_d,
                          discrete_exp=args.discrete_integration,
                          refit_lookahead=args.refit_lookahead,
                          fit_sigmas=args.fit_sigmas,
                          sig_u_mean=args.sig_u_mean,
                          sig_u_var=args.sig_u_var,
                          sig_v_mean=args.sig_v_mean,
                          sig_v_var=args.sig_v_var,
                          data_type=args.type,
                          steps=args.steps,
                          fit_type=parse_fit_type(args.fit),
                          processes=args.processes,
                          do_threading=args.threading)
    except Exception:
        import traceback
        print()
        traceback.print_exc()

        import pdb
        print()
        pdb.post_mortem()

        sys.exit(1)

    # save the results file
    if args.save_results:
        print("saving results in '{}'".format(args.save_results))

        results['_args'] = args

        with open(args.save_results, 'wb') as f:
            pickle.dump(results, f)
def main():
    import argparse
    import os
    import pickle
    import sys

    key_names = KEYS.keys()

    # set up arguments
    parser = argparse.ArgumentParser()

    parser.add_argument('--latent-d', '-D', type=int, default=5)
    parser.add_argument('--steps', '-s', type=int, default=None)

    parser.add_argument('--discrete', action='store_true', default=None)
    parser.add_argument('--no-discrete', action='store_false', dest='discrete')

    parser.add_argument('--subtract-mean', action='store_true', default=True)
    parser.add_argument('--no-subtract-mean',
            action='store_false', dest='subtract_mean')

    parser.add_argument('--fit', default='batch')
    parser.add_argument('--lookahead-fit', default='batch')

    parser.add_argument('--samps', '-S', type=int, default=128)
    parser.add_argument('--lookahead-samps', type=int, default=128)

    parser.add_argument('--threaded', action='store_true', default=True)
    parser.add_argument('--unthreaded', action='store_false', dest='threaded')
    parser.add_argument('--procs', '-P', type=int, default=None)

    parser.add_argument('--test-set', default='all')

    parser.add_argument('--load-data', required='True', metavar='FILE')
    parser.add_argument('--save-results', nargs='?', default=True, const=True,
            metavar='FILE')
    parser.add_argument('--no-save-results',
            action='store_false', dest='save_results')

    parser.add_argument('--note', action='append',
        help="Doesn't do anything, just there to save any notes you'd like "
             "in the results file.")

    parser.add_argument('keys', nargs='*',
            help="Choices: {}.".format(', '.join(sorted(key_names))))

    args = parser.parse_args()

    # check that args.keys are valid
    for k in args.keys:
        if k not in key_names:
            sys.stderr.write("Invalid key name %s; options are %s.\n" % (
                k, ', '.join(sorted(key_names))))
            sys.exit(1)

    if not args.keys:
        args.keys = sorted(key_names)

    # make directories to save results if necessary
    if args.save_results is True:
        args.save_results = 'results.pkl'
    elif args.save_results:
        dirname = os.path.dirname(args.save_results)
        if dirname and not os.path.exists(dirname):
            os.makedirs(dirname)

    # load data
    with open(args.load_data, 'rb') as f:
        data = np.load(f)

        if isinstance(data, np.ndarray):
            data = { '_real': data }

        real = data['_real']
        ratings = data['_ratings']
        rating_vals = data['_rating_vals'] if '_rating_vals' in data else None

    if args.discrete is None:
        args.discrete = rating_vals is not None

    # do the comparison
    try:
        results = compare_active(
                key_names=args.keys,
                latent_d=args.latent_d,
                real=real, ratings=ratings, rating_vals=rating_vals,
                test_set=args.test_set, num_steps=args.steps,
                discrete=args.discrete, subtract_mean=args.subtract_mean,
                fit_type=parse_fit_type(args.fit),
                lookahead_fit=args.lookahead_fit,
                num_samps=args.samps, lookahead_samps=args.lookahead_samps,
                procs=args.procs, threaded=args.threaded)
    except Exception:
        import traceback
        print()
        traceback.print_exc()

        import pdb
        print()
        pdb.post_mortem()

        sys.exit(1)

    # save the results file
    if args.save_results:
        print("\nsaving results in '{}'".format(args.save_results))

        results['_args'] = args

        with open(args.save_results, 'wb') as f:
            pickle.dump(results, f)
def main():
    import argparse
    import os
    import pickle
    import sys

    key_names = set(KEY_FUNCS.keys())
    types = {'float', 'int', 'int-bounds', 'binary'}

    parser = argparse.ArgumentParser()
    parser.add_argument('--load-data', default=None, metavar='FILE')

    model = parser.add_argument_group("Model Options")
    model.add_argument('--latent-d', '-D', type=int, default=5)
    model.add_argument('--discrete-integration',
                       nargs='?',
                       const=True,
                       default=False)
    model.add_argument('--continuous-integration',
                       action='store_false',
                       dest='discrete_integration')
    add_bool_opt(model, 'fit-sigmas', default=False)

    add_bool_opt(model, 'refit-lookahead', default=False)

    model.add_argument('--fit', default='batch')
    model.add_argument('--sig-u-mean', type=float, default=0)
    model.add_argument('--sig-u-var', type=float, default=-1)
    model.add_argument('--sig-v-mean', type=float, default=0)
    model.add_argument('--sig-v-var', type=float, default=-1)

    model.add_argument('keys',
                       nargs='*',
                       help="Choices: {}.".format(', '.join(
                           sorted(key_names))))

    running = parser.add_argument_group("Running")
    running.add_argument('--processes', '-P', type=int, default=None)
    add_bool_opt(running, 'threading', True)
    running.add_argument('--steps', '-s', type=int, default=None)

    results = parser.add_argument_group("Results")
    results.add_argument('--save-results', default=True, metavar='FILE')
    results.add_argument('--no-save-results',
                         action='store_false',
                         dest='save_results')
    results.add_argument(
        '--note',
        action='append',
        help="Doesn't do anything, just there to save any notes you'd like "
        "in the results file.")

    args = parser.parse_args()

    # check that args.keys are valid
    for k in args.keys:
        if k not in key_names:
            sys.stderr.write("Invalid key name %s; options are %s.\n" %
                             (k, ', '.join(sorted(key_names))))
            sys.exit(1)

    if not args.keys:
        args.keys = sorted(key_names)

    # make directories to save results if necessary
    if args.save_results is True:
        args.save_results = 'results.pkl'
    elif args.save_results:
        dirname = os.path.dirname(args.save_results)
        if dirname and not os.path.exists(dirname):
            os.makedirs(dirname)

    # load previous data
    with open(args.load_data, 'rb') as f:
        data = np.load(f)

        if isinstance(data, np.ndarray):
            data = {'_real': data}

        real = data['_real']
        ratings = data['_ratings']
        rating_vals = data['_rating_vals'] if '_rating_vals' in data else None
        test_on = data['_test_on'] if '_test_on' in data else None
        is_new_item = data['_is_new_item'] if '_is_new_item' in data else None
        # XXX handle is_new_item

    knowable = np.isfinite(real)
    knowable[real == 0] = False
    if test_on is not None:
        print("using test set from file")
        knowable[test_on] = False
    knowable = zip(*knowable.nonzero())

    # get results
    try:
        results = compare(args.keys,
                          real=real,
                          ratings=ratings,
                          rating_vals=rating_vals,
                          knowable=knowable,
                          test_on=test_on,
                          latent_d=args.latent_d,
                          discrete_exp=args.discrete_integration,
                          refit_lookahead=args.refit_lookahead,
                          fit_sigmas=args.fit_sigmas,
                          sig_u_mean=args.sig_u_mean,
                          sig_u_var=args.sig_u_var,
                          sig_v_mean=args.sig_v_mean,
                          sig_v_var=args.sig_v_var,
                          steps=args.steps,
                          fit_type=parse_fit_type(args.fit),
                          processes=args.processes,
                          do_threading=args.threading)
    except Exception:
        import traceback
        print()
        traceback.print_exc()

        import pdb
        print()
        pdb.post_mortem()

        sys.exit(1)

    # save the results file
    if args.save_results:
        print("saving results in '{}'".format(args.save_results))

        results['_args'] = args

        with open(args.save_results, 'wb') as f:
            pickle.dump(results, f)
def main():
    import argparse
    import os
    import pickle
    import sys

    key_names = set(KEY_FUNCS.keys())
    types = {'float', 'int', 'int-bounds', 'binary'}

    parser = argparse.ArgumentParser()

    model = parser.add_argument_group("Model Options")
    model.add_argument('--latent-d', '-D', type=int, default=5)
    model.add_argument('--discrete-integration',
            nargs='?', const=True, default=False)
    model.add_argument('--continuous-integration',
            action='store_false', dest='discrete_integration')
    add_bool_opt(model, 'fit-sigmas', default=False)

    add_bool_opt(model, 'refit-lookahead', default=False)

    model.add_argument('--fit', default='batch')
    model.add_argument('--sig-u-mean', type=float, default=0)
    model.add_argument('--sig-u-var', type=float, default=-1)
    model.add_argument('--sig-v-mean', type=float, default=0)
    model.add_argument('--sig-v-var', type=float, default=-1)

    model.add_argument('keys', nargs='*',
            help="Choices: {}.".format(', '.join(sorted(key_names))))

    problem_def = parser.add_argument_group("Problem Definiton")
    problem_def.add_argument('--load-data', default=None, metavar='FILE')
    add_bool_opt(problem_def, 'load-model', default=False)
    problem_def.add_argument('--gen-rank', '-R', type=int, default=5)
    problem_def.add_argument('--type', default='float',
            help="An integer (meaning values are from 0 to that integer) or "
                 "one of {}".format(', '.join(sorted(types))))

    problem_def.add_argument('--u-mean', type=float, default=0)
    problem_def.add_argument('--u-std', type=float, default=2)
    problem_def.add_argument('--v-mean', type=float, default=0)
    problem_def.add_argument('--v-std', type=float, default=2)

    problem_def.add_argument('--noise', '-n', type=float, default=.25)
    problem_def.add_argument('--num-users', '-N', type=int, default=10)
    problem_def.add_argument('--num-items', '-M', type=int, default=10)
    problem_def.add_argument('--mask', '-m', default=0)

    running = parser.add_argument_group("Running")
    running.add_argument('--processes', '-P', type=int, default=None)
    add_bool_opt(running, 'threading', True)
    running.add_argument('--steps', '-s', type=int, default=None)

    results = parser.add_argument_group("Results")
    results.add_argument('--save-results', nargs='?', default=None, const=True,
            metavar='FILE')
    results.add_argument('--no-save-results',
            action='store_false', dest='save_results')
    results.add_argument('--note', action='append',
        help="Doesn't do anything, just there to save any notes you'd like "
             "in the results file.")

    args = parser.parse_args()

    # is args.mask supposed to be a float?
    try:
        args.mask = float(args.mask)
    except ValueError:
        pass

    # check args.type
    try:
        args.type = int(args.type)
    except ValueError:
        if args.type not in types:
            raise ValueError("--type must be integer or one of {}".format(
                ', '.join(sorted(types))))

    # check that args.keys are valid
    for k in args.keys:
        if k not in key_names:
            sys.stderr.write("Invalid key name %s; options are %s.\n" % (
                k, ', '.join(sorted(key_names))))
            sys.exit(1)

    if not args.keys:
        args.keys = sorted(key_names)

    # make directories to save results if necessary
    if args.save_results is True:
        args.save_results = 'results.pkl'
    elif args.save_results:
        dirname = os.path.dirname(args.save_results)
        if dirname and not os.path.exists(dirname):
            os.makedirs(dirname)

    # load previous data, if we're doing that
    real_ratings_vals = None
    apmf = None
    knowable = None
    if args.load_data:
        with open(args.load_data, 'rb') as f:
            data = np.load(f)

            if isinstance(data, np.ndarray):
                data = {'_real': data}

            real = data['_real']
            real_ratings_vals = (
                real,
                data['_ratings'] if '_ratings' in data
                    else get_ratings(real, args.mask),
                data['_rating_vals'] if '_rating_vals' in data else None,
            )
            if args.load_model:
                apmf = data['_initial_apmf']

        knowable = np.isfinite(real)
        knowable[real == 0] = 0
        knowable = zip(*knowable.nonzero())

    # get results
    try:
        results = compare(args.keys,
                num_users=args.num_users, num_items=args.num_items,
                real_ratings_vals=real_ratings_vals, apmf=apmf,
                u_mean=args.u_mean, u_std=args.u_std,
                v_mean=args.v_mean, v_std=args.v_std,
                noise=args.noise, mask_type=args.mask,
                rank=args.gen_rank, latent_d=args.latent_d,
                discrete_exp=args.discrete_integration,
                refit_lookahead=args.refit_lookahead,
                fit_sigmas=args.fit_sigmas,
                sig_u_mean=args.sig_u_mean, sig_u_var=args.sig_u_var,
                sig_v_mean=args.sig_v_mean, sig_v_var=args.sig_v_var,
                data_type=args.type,
                steps=args.steps,
                fit_type=parse_fit_type(args.fit),
                processes=args.processes, do_threading=args.threading)
    except Exception:
        import traceback
        print()
        traceback.print_exc()

        import pdb
        print()
        pdb.post_mortem()

        sys.exit(1)

    # save the results file
    if args.save_results:
        print("saving results in '{}'".format(args.save_results))

        results['_args'] = args

        with open(args.save_results, 'wb') as f:
            pickle.dump(results, f)