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