if FLAGS.svm:
    logging.info("Performing svm classification")
    solver = classifier.SolverMC(
        FLAGS.reg, classifier.Loss.loss_hinge, classifier.Reg.reg_l2, fminargs={"maxfun": 1000}
    )
    w, b = solver.solve(Xtrain, classifier.to_one_of_k_coding(Ytrain, fill=-1))
    pred = np.dot(Xtrain, w) + b
    accu_train = classifier.Evaluator.accuracy(Ytrain, pred)
    pred = np.dot(Xtest, w) + b
    accu_test = classifier.Evaluator.accuracy(Ytest, pred)
    logging.info("Reg %f, train accu %f, test accu %f" % (FLAGS.reg, accu_train, accu_test))
    mpi.root_pickle((w, b, FLAGS.reg, accu_train, accu_test), __file__ + str(FLAGS.reg) + ".svm.pickle")

if gflags.FLAGS.hier:
    logging.info("Performing hierarchical classification")
    utility = np.exp(birdtax.bird_info_gain())
    utility /= utility.sum(axis=1)[:, np.newaxis]
    solver = classifier.SolverMC(
        FLAGS.reg, classifier.Loss.loss_multiclass_logistic, classifier.Reg.reg_l2, fminargs={"maxfun": 1000}
    )
    w, b = solver.solve(Xtrain, np.ascontiguousarray(utility[Ytrain.astype(int)]))
    pred = np.dot(Xtrain, w) + b
    accu_train = classifier.Evaluator.accuracy(Ytrain, pred)
    pred = np.dot(Xtest, w) + b
    accu_test = classifier.Evaluator.accuracy(Ytest, pred)
    logging.info("Reg %f, train accu %f, test accu %f" % (FLAGS.reg, accu_train, accu_test))
    mpi.root_pickle((w, b, FLAGS.reg, accu_train, accu_test), __file__ + str(FLAGS.reg) + ".hier.pickle")

if gflags.FLAGS.hierlog:
    logging.info("Performing hierarchical classification")
    utility = birdtax.bird_info_gain()
                                 classifier.Loss.loss_hinge,
                                 classifier.Reg.reg_l2,
                                 fminargs = {'maxfun': 1000})
    w,b = solver.solve(Xtrain, classifier.to_one_of_k_coding(Ytrain, fill=-1))
    pred = np.dot(Xtrain, w) + b
    accu_train = classifier.Evaluator.accuracy(Ytrain, pred)
    pred = np.dot(Xtest, w) + b
    accu_test = classifier.Evaluator.accuracy(Ytest, pred)
    logging.info("Reg %f, train accu %f, test accu %f" % \
            (FLAGS.reg, accu_train, accu_test))
    mpi.root_pickle((w, b, FLAGS.reg, accu_train, accu_test),
                    __file__ + str(FLAGS.reg) + ".svm.pickle")

if gflags.FLAGS.hier:
    logging.info("Performing hierarchical classification")
    utility = np.exp(birdtax.bird_info_gain())
    utility /= utility.sum(axis=1)[:, np.newaxis]
    solver = classifier.SolverMC(FLAGS.reg,
                                 classifier.Loss.loss_multiclass_logistic,
                                 classifier.Reg.reg_l2,
                                 fminargs = {'maxfun': 1000})
    w,b = solver.solve(Xtrain, 
            np.ascontiguousarray(utility[Ytrain.astype(int)]))
    pred = np.dot(Xtrain, w) + b
    accu_train = classifier.Evaluator.accuracy(Ytrain, pred)
    pred = np.dot(Xtest, w) + b
    accu_test = classifier.Evaluator.accuracy(Ytest, pred)
    logging.info("Reg %f, train accu %f, test accu %f" % \
            (FLAGS.reg, accu_train, accu_test))
    mpi.root_pickle((w, b, FLAGS.reg, accu_train, accu_test),
                    __file__ + str(FLAGS.reg) + ".hier.pickle")
########
# Settings
########

FEATDIR = "/u/vis/ttmp/jiayq/birds/"

########
# Main script
########
if mpi.SIZE > 1:
    raise RuntimeError, "This script runs on single machine only."

Xtest = mpi.load_matrix_multi(os.path.join(FEATDIR,'Xtest'))
Ytest = mpi.load_matrix_multi(os.path.join(FEATDIR,'Ytest')).astype(np.int)
infogain = birdtax.bird_info_gain()

info_mean = infogain.mean(axis=1)
info_max = infogain.max(axis=1)

randguess = sum([info_mean[y] for y in Ytest]) / float(len(Ytest))
bestguess = sum([info_max[y] for y in Ytest]) / float(len(Ytest))

print 'Random guess baseline:', randguess
print 'Best guess baseline:', bestguess

for filename in sys.argv[1:]:
    data = pickle.load(open(filename))
    w, b = data[:2]
    accu_test = data[-1]
    pred = np.argmax(np.dot(Xtest, w) + b, axis=1)