def main():
    global options
    try:
        longopts   = ["help", "verbose", "load=", "save=", "density", "density-range:"
                      "density-step=", "which=", "epsilon=", "moments=", "prombsTest",
                      "savefig=", "threads=", "stacksize=", "algorithm=",
                      "mgs-samples=", "no-model-posterior", "hmm", "rho="]
        opts, tail = getopt.getopt(sys.argv[1:], "mr:s:k:bhvt", longopts)
    except getopt.GetoptError:
        usage()
        return 2
    output = None
    for o, a in opts:
        if o in ("-v", "--verbose"):
            sys.stderr.write("Verbose mode turned on.\n")
            options["verbose"] = True
        if o in ("-t", "--prombsTest"):
            sys.stderr.write("Testing prombs.\n")
            options["prombsTest"] = True
        if o in ("-m", "--density"):
            options["density"] = True
        if o in ("-r", "--density-range"):
            options['density_range'] = tuple(map(float, a[1:-1].split(',')))
        if o in ("-s", "--density-step"):
            options["density_step"] = float(a)
        if o in ("-k", "--moments"):
            if int(a) >= 2:
                options["n_moments"] = int(a)
            else:
                usage()
                return 0
        if o in ("-h", "--help"):
            usage()
            return 0
        if o == "-b":
            options["bprob"] = True
        if o == "--load":
            options["load"] = a
        if o == "--save":
            options["save"] = a
        if o == "--savefig":
            options["savefig"] = a
        if o == "--which":
            options["which"] = int(a)
        if o == "--epsilon":
            options["epsilon"] = float(a)
        if o == "--threads":
            if int(a) >= 1:
                options["threads"] = int(a)
            else:
                usage()
                return 0
        if o == "--stacksize":
            if int(a) >= 1:
                options["stacksize"] = int(a)
            else:
                usage()
                return 0
        if o == "--algorithm":
            options["algorithm"] = a
        if o == "--mgs-samples":
            options["mgs_samples"] = tuple(map(int, a.split(":")))
        if o == "--no-model-posterior":
            options["model_posterior"] = False
        if o == "--hmm":
            options["hmm"] = True
        if o == "--rho":
            options["rho"] = float(a)
    if len(tail) != 1:
        usage()
        return 1
    interface.init(options['epsilon'])
    parseConfig(tail[0])
    interface.free()
    return 0
def main():
    global options
    try:
        longopts   = ["help", "verbose", "load=", "save=", "density", "density-range=",
                      "density-step=", "which=", "epsilon=", "moments", "look-ahead=",
                      "savefig=", "lapsing=", "port=", "threads=", "stacksize=",
                      "strategy=", "kl-psi", "kl-multibin", "algorithm=", "samples=",
                      "mgs-samples", "no-model-posterior", "video=", "hmm", "rho=",
                      "path-iteration", "distances" ]
        opts, tail = getopt.getopt(sys.argv[1:], "mr:s:k:n:bhvt", longopts)
    except getopt.GetoptError:
        usage()
        return 2
    output = None
    for o, a in opts:
        if o in ("-v", "--verbose"):
            sys.stderr.write("Verbose mode turned on.\n")
            options["verbose"] = True
        if o in ("-t", "--prombsTest"):
            sys.stderr.write("Testing prombs.\n")
            options["prombsTest"] = True
        if o == "--look-ahead":
            options["look_ahead"] = int(a)
        if o in ("-n", "--samples"):
            options["samples"] = int(a)
        if o in ("-m", "--density"):
            options["density"] = True
        if o in ("-r", "--density-range"):
            options['density_range'] = tuple(map(float, a[1:-1].split(',')))
        if o in ("-s", "--density-step"):
            options["density_step"] = float(a)
        if o in ("-k", "--moments"):
            if int(a) >= 2:
                options["n_moments"] = int(a)
            else:
                usage()
                return 0
        if o in ("-h", "--help"):
            usage()
            return 0
        if o == "--distances":
            options["distances"] = True
        if o == "-b":
            options["bprob"] = True
        if o == "--lapsing":
            options["lapsing"] = float(a)
        if o == "--strategy":
            options["strategy"] = a
        if o == "--kl-psi":
            options["kl_psi"] = True
        if o == "--kl-multibin":
            options["kl_multibin"] = True
        if o == "--load":
            options["load"] = a
        if o == "--port":
            options["port"] = int(a)
        if o == "--save":
            options["save"] = a
        if o == "--savefig":
            options["savefig"] = a
        if o == "--which":
            options["which"] = int(a)
        if o == "--epsilon":
            options["epsilon"] = float(a)
        if o == "--threads":
            if int(a) >= 1:
                options["threads"] = int(a)
            else:
                usage()
                return 0
        if o == "--stacksize":
            if int(a) >= 1:
                options["stacksize"] = int(a)
            else:
                usage()
                return 0
        if o == "--algorithm":
            options["algorithm"] = a
        if o == "--mgs-samples":
            options["mgs_samples"] = tuple(map(int, a.split(":")))
        if o == "--no-model-posterior":
            options["model_posterior"] = False
        if o == "--video":
            options["video"] = a
        if o == "--hmm":
            options["hmm"] = True
        if o == "--rho":
            options["rho"] = float(a)
        if o == "--path-iteration":
            options["path_iteration"] = True
    if (options["strategy"] == "kl-divergence" and
        options["kl_psi"]   == False           and
        options["kl_multibin"]  == False):
       # set default kl divergence
       options["kl_psi"]   = True
    if options["strategy"] == "effective-counts":
        options["effective_counts"] = True
    if options["strategy"] == "effective-posterior-counts":
        options["effective_posterior_counts"] = True
    if len(tail) != 1:
        usage()
        return 1
    interface.init(options['epsilon'])
    parseConfig(tail[0])
    interface.free()
    return 0