def export_evidence_to_uai(self, path, evidence, format):
        f = open(path, "w+")

        if format == "pomegranate":
            import json

            # representation of the BN
            model_dict = json.loads(self.model.to_json())

            # immutable index of variables
            index = {k: v for v, k in enumerate(self.node_names)}
            inverse_index = {k: v for k, v in enumerate(self.node_names)}

        if format == "pgmpy":
            from pgmpy.readwrite import UAIWriter

            writer = UAIWriter(self.model_pgmpy)
            domain = writer.get_domain()
            domain = sorted(domain.items(), key=lambda x: (x[1], x[0]))

        # number of variables in the sample
        f.write(str(len(evidence)) + "\n")

        # state/value pairs
        for state in evidence:
            if format == "pomegranate":
                f.write(" " + str(index[state]) + " " + str(evidence[state]) +
                        "\n")

            if format == "pgmpy":
                f.write(" " + str([x[0] for x in domain].index(state)) + " " +
                        str(evidence[state]) + "\n")

        return
def daoopt_solver(uai_path, evid_path, export_path, nodes, evidence, format,
                  model_pgmpy):
    import subprocess, os

    if format == "pomegranate":
        # immutable index of variables
        index = {k: v for v, k in enumerate(nodes)}
        inverse_index = {k: v for k, v in enumerate(nodes)}

    if format == "pgmpy":
        from pgmpy.readwrite import UAIWriter

        writer = UAIWriter(model_pgmpy)
        domain = writer.get_domain()
        domain = sorted(domain.items(), key=lambda x: (x[1], x[0]))

    f = open(export_path, "w")

    # call DAOOPT and capture its output from file
    mydir = os.getcwd()
    cmd = [mydir + "/daoopt", "-f", uai_path, "-e", evid_path]
    FNULL = open(os.devnull, 'w')
    result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=FNULL)
    f.write(result.stdout.decode('utf-8'))

    f = open(export_path, "r")
    # f = open( os.getcwd() + "/pomegranate.uai.MPE", "r" )
    # For example, an input model with 3 binary variables may have a solution line: 3 0 1 0
    try:
        assignments = [
            int(i)
            for i in [i for i in f.read().split('\n') if i][-1].split()[3:None]
        ]
        if len(assignments) != len(nodes):
            return -1
    except ValueError:
        return -1

    result = {}
    for i, v in enumerate(assignments):
        if format == "pomegranate":
            result[inverse_index[i]] = v

        if format == "pgmpy":
            result[domain[i][0]] = v

    # remove keys in evidence from solution
    for k in evidence.keys():
        result.pop(k, None)

    # return sorted( result.items(), key=lambda x: (x[0], x[1]) )
    return result