import argparse

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("--gpu", required=False, type=str)
    parser.add_argument("--load", required=False, type=str)
    parser.add_argument("--nr_towers", required=False, type=int)
    parser.add_argument("--train_log_path", required=False, type=str, default="train_log")
    parser.add_argument("--nr_predict_towers", required=False, type=int)
    parser.add_argument("--intra_op_par", required=False, type=int)
    parser.add_argument("--inter_op_par", required=False, type=int)
    parser.add_argument("--cpu_device_count", required=False, type=int)
    parser.add_argument("--predict_batch_size", required=False, type=int, default=16)
    parser.add_argument("--max_steps", required=False, type=int)
    parser.add_argument("--env", required=False, type=str)
    parser.add_argument("--mkl_num_threads", required=False, type=int, default=10)
    parser.add_argument("--threads_to_trace", required=False, type=int, default=0)
    parser.add_argument("--do_train", required=False, type=int, default=1)
    parser.add_argument("--simulator_procs", required=False, type=int, default=20)
    parser.add_argument("--task", required=False, type=str, default="train")
    parser.add_argument("--mkl", required=False, type=int, default=0)
    parser.add_argument("--dummy", required=False, type=int, default=0)
    parser.add_argument("--dummy_predictor", required=False, type=int, default=0)
    parser.add_argument("--sync", required=False, type=int, default=0)
    parser.add_argument("--channels", required=False, type=int, default=3)
    parser.add_argument("--steps_per_epoch", required=False, type=int, default=250)
    parser.add_argument("--cpu", required=False, type=int, default=0)
    parser.add_argument("--artificial_slowdown", required=False, type=float, default=0.0)
    parser.add_argument("--queue_size", required=False, type=int, default=50)
    parser.add_argument("--batch_size", required=False, type=int, default=128)
    parser.add_argument("--my_sim_master_queue", required=False, type=int, default=2048)
    parser.add_argument("--learning_rate", required=False, type=float, default=0.001)
    parser.add_argument("--use_bias", required=False, type=int, default=0)
    parser.add_argument("--gamma", required=False, type=float, default=0.99)
    parser.add_argument("--local_time_max", required=False, type=int, default=5)
    parser.add_argument("--image_size", required=False, type=int, default=84)
    parser.add_argument("--frame_history", required=False, type=int, default=4)
    parser.add_argument("--fc_neurons", required=False, type=int, default=512)
    parser.add_argument("--max_epoch", required=False, type=int, default=1000)
    parser.add_argument("--optimizer", required=False, type=str, default="adam")
    parser.add_argument("--use_sync_opt", required=False, type=int, default=0)
    parser.add_argument("--send_debug_every", required=False, type=int, default=100)
    parser.add_argument("--port", required=True, type=int)
    parser.add_argument("--tf_port", required=True, type=int)
    parser.add_argument("--num_grad", required=True, type=int, )
    parser.add_argument("--early_stopping", required=False, type=str)
    parser.add_argument("--ps", required=True, type=int)
    parser.add_argument("--fc_init", required=True, type=str)
    parser.add_argument("--conv_init", required=True, type=str)
    parser.add_argument("--replace_with_conv", required=False, type=bool, default=True)
    parser.add_argument("--fc_splits", required=False, type=int, default=1)
    parser.add_argument("--debug_charts", required=True, type=bool)
    parser.add_argument("--epsilon", required=True, type=float, default=1e-8)
    parser.add_argument("--beta1", required=True, type=float, default=0.9)
    parser.add_argument("--beta2", required=True, type=float, default=0.999)
    parser.add_argument("--save_every", required=True, type=int)
    parser.add_argument("--models_dir", required=True, type=str)
    parser.add_argument("--experiment_dir", required=True, type=str)
    parser.add_argument("--adam_debug", required=True, type=bool)
    parser.add_argument("--eval_node", required=True, type=bool)
    parser.add_argument("--record_node", required=True, type=bool)
    parser.add_argument("--schedule_hyper", required=True, type=bool)

    return parser.parse_args()
