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 setUp(self): self.maxDiff = None edges = [['family-out', 'dog-out'], ['bowel-problem', 'dog-out'], ['family-out', 'light-on'], ['dog-out', 'hear-bark']] cpds = {'bowel-problem': np.array([[0.01], [0.99]]), 'dog-out': np.array([[0.99, 0.01, 0.97, 0.03], [0.9, 0.1, 0.3, 0.7]]), 'family-out': np.array([[0.15], [0.85]]), 'hear-bark': np.array([[0.7, 0.3], [0.01, 0.99]]), 'light-on': np.array([[0.6, 0.4], [0.05, 0.95]])} states = {'bowel-problem': ['true', 'false'], 'dog-out': ['true', 'false'], 'family-out': ['true', 'false'], 'hear-bark': ['true', 'false'], 'light-on': ['true', 'false']} parents = {'bowel-problem': [], 'dog-out': ['bowel-problem', 'family-out'], 'family-out': [], 'hear-bark': ['dog-out'], 'light-on': ['family-out']} self.bayesmodel = BayesianModel(edges) tabular_cpds = [] for var, values in cpds.items(): cpd = TabularCPD(var, len(states[var]), values, evidence=parents[var], evidence_card=[len(states[evidence_var]) for evidence_var in parents[var]]) tabular_cpds.append(cpd) self.bayesmodel.add_cpds(*tabular_cpds) self.bayeswriter = UAIWriter(self.bayesmodel) edges = {('var_0', 'var_1'), ('var_0', 'var_2'), ('var_1', 'var_2')} self.markovmodel = MarkovModel(edges) tables = [(['var_0', 'var_1'], ['4.000', '2.400', '1.000', '0.000']), (['var_0', 'var_1', 'var_2'], ['2.2500', '3.2500', '3.7500', '0.0000', '0.0000', '10.0000', '1.8750', '4.0000', '3.3330', '2.0000', '2.0000', '3.4000'])] domain = {'var_1': '2', 'var_2': '3', 'var_0': '2'} factors = [] for table in tables: variables = table[0] cardinality = [int(domain[var]) for var in variables] values = list(map(float, table[1])) factor = DiscreteFactor(variables, cardinality, values) factors.append(factor) self.markovmodel.add_factors(*factors) self.markovwriter = UAIWriter(self.markovmodel)
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
class TestUAIWriter(unittest.TestCase): def setUp(self): self.maxDiff = None edges = [['family-out', 'dog-out'], ['bowel-problem', 'dog-out'], ['family-out', 'light-on'], ['dog-out', 'hear-bark']] cpds = { 'bowel-problem': np.array([[0.01], [0.99]]), 'dog-out': np.array([[0.99, 0.01, 0.97, 0.03], [0.9, 0.1, 0.3, 0.7]]), 'family-out': np.array([[0.15], [0.85]]), 'hear-bark': np.array([[0.7, 0.3], [0.01, 0.99]]), 'light-on': np.array([[0.6, 0.4], [0.05, 0.95]]) } states = { 'bowel-problem': ['true', 'false'], 'dog-out': ['true', 'false'], 'family-out': ['true', 'false'], 'hear-bark': ['true', 'false'], 'light-on': ['true', 'false'] } parents = { 'bowel-problem': [], 'dog-out': ['bowel-problem', 'family-out'], 'family-out': [], 'hear-bark': ['dog-out'], 'light-on': ['family-out'] } self.bayesmodel = BayesianModel(edges) tabular_cpds = [] for var, values in cpds.items(): cpd = TabularCPD(var, len(states[var]), values, evidence=parents[var], evidence_card=[ len(states[evidence_var]) for evidence_var in parents[var] ]) tabular_cpds.append(cpd) self.bayesmodel.add_cpds(*tabular_cpds) self.bayeswriter = UAIWriter(self.bayesmodel) edges = {('var_0', 'var_1'), ('var_0', 'var_2'), ('var_1', 'var_2')} self.markovmodel = MarkovModel(edges) tables = [(['var_0', 'var_1'], ['4.000', '2.400', '1.000', '0.000']), (['var_0', 'var_1', 'var_2'], [ '2.2500', '3.2500', '3.7500', '0.0000', '0.0000', '10.0000', '1.8750', '4.0000', '3.3330', '2.0000', '2.0000', '3.4000' ])] domain = {'var_1': '2', 'var_2': '3', 'var_0': '2'} factors = [] for table in tables: variables = table[0] cardinality = [int(domain[var]) for var in variables] values = list(map(float, table[1])) factor = Factor(variables, cardinality, values) factors.append(factor) self.markovmodel.add_factors(*factors) self.markovwriter = UAIWriter(self.markovmodel) def test_bayes_model(self): self.expected_bayes_file = """BAYES 5 2 2 2 2 2 5 1 0 3 2 0 1 1 2 2 1 3 2 2 4 2 0.01 0.99 8 0.99 0.01 0.97 0.03 0.9 0.1 0.3 0.7 2 0.15 0.85 4 0.7 0.3 0.01 0.99 4 0.6 0.4 0.05 0.95""" self.assertEqual(str(self.bayeswriter.__str__()), str(self.expected_bayes_file)) def test_markov_model(self): self.expected_markov_file = """MARKOV 3 2 2 3 2 2 0 1 3 0 1 2 4 4.0 2.4 1.0 0.0 12 2.25 3.25 3.75 0.0 0.0 10.0 1.875 4.0 3.333 2.0 2.0 3.4""" self.assertEqual(str(self.markovwriter.__str__()), str(self.expected_markov_file))
class TestUAIWriter(unittest.TestCase): def setUp(self): self.maxDiff = None edges = [['family-out', 'dog-out'], ['bowel-problem', 'dog-out'], ['family-out', 'light-on'], ['dog-out', 'hear-bark']] cpds = {'bowel-problem': np.array([[0.01], [0.99]]), 'dog-out': np.array([[0.99, 0.01, 0.97, 0.03], [0.9, 0.1, 0.3, 0.7]]), 'family-out': np.array([[0.15], [0.85]]), 'hear-bark': np.array([[0.7, 0.3], [0.01, 0.99]]), 'light-on': np.array([[0.6, 0.4], [0.05, 0.95]])} states = {'bowel-problem': ['true', 'false'], 'dog-out': ['true', 'false'], 'family-out': ['true', 'false'], 'hear-bark': ['true', 'false'], 'light-on': ['true', 'false']} parents = {'bowel-problem': [], 'dog-out': ['bowel-problem', 'family-out'], 'family-out': [], 'hear-bark': ['dog-out'], 'light-on': ['family-out']} self.bayesmodel = BayesianModel(edges) tabular_cpds = [] for var, values in cpds.items(): cpd = TabularCPD(var, len(states[var]), values, evidence=parents[var], evidence_card=[len(states[evidence_var]) for evidence_var in parents[var]]) tabular_cpds.append(cpd) self.bayesmodel.add_cpds(*tabular_cpds) self.bayeswriter = UAIWriter(self.bayesmodel) edges = {('var_0', 'var_1'), ('var_0', 'var_2'), ('var_1', 'var_2')} self.markovmodel = MarkovModel(edges) tables = [(['var_0', 'var_1'], ['4.000', '2.400', '1.000', '0.000']), (['var_0', 'var_1', 'var_2'], ['2.2500', '3.2500', '3.7500', '0.0000', '0.0000', '10.0000', '1.8750', '4.0000', '3.3330', '2.0000', '2.0000', '3.4000'])] domain = {'var_1': '2', 'var_2': '3', 'var_0': '2'} factors = [] for table in tables: variables = table[0] cardinality = [int(domain[var]) for var in variables] values = list(map(float, table[1])) factor = DiscreteFactor(variables, cardinality, values) factors.append(factor) self.markovmodel.add_factors(*factors) self.markovwriter = UAIWriter(self.markovmodel) def test_bayes_model(self): self.expected_bayes_file = """BAYES 5 2 2 2 2 2 5 1 0 3 2 0 1 1 2 2 1 3 2 2 4 2 0.01 0.99 8 0.99 0.01 0.97 0.03 0.9 0.1 0.3 0.7 2 0.15 0.85 4 0.7 0.3 0.01 0.99 4 0.6 0.4 0.05 0.95""" self.assertEqual(str(self.bayeswriter.__str__()), str(self.expected_bayes_file)) def test_markov_model(self): self.expected_markov_file = """MARKOV 3 2 2 3 2 2 0 1 3 0 1 2 4 4.0 2.4 1.0 0.0 12 2.25 3.25 3.75 0.0 0.0 10.0 1.875 4.0 3.333 2.0 2.0 3.4""" self.assertEqual(str(self.markovwriter.__str__()), str(self.expected_markov_file))
evidence = model.initial_random_evidence() # evidence = {'differenziazione': 1, 'loss 17': 2, 'FISH': 3, 'c erbB 2': 1, 'ki67': 3, 'morfologia': 1, 'pM': 1} # evidence = {} mpe_pgmpy_ve = model.mpe_query(evidence, algorithm="Variable Elimination") # MPE external solver path = "../export/" # model.export_model_to_uai( path + "my.uai", format="DAOOPT" ) model.export_evidence_to_uai(path + "evidence.uai.evid", evidence, format="pgmpy") from pgmpy.readwrite import UAIWriter, UAIReader writer = UAIWriter(model.model_pgmpy) writer.write_uai(path + "pgmpy.uai") # reader = UAIReader( path + 'pgmpy.uai' ) # model = reader.get_model() # mpe_daoopt_mine = bn.daoopt_solver( path + "my.uai" , path + "my.uai.evid", path + "sol_my.txt", model.node_names, evidence ) mpe_daoopt_pgmpy = bn.daoopt_solver(path + "pgmpy.uai", path + "evidence.uai.evid", path + "sol_pgmpy.txt", model.node_names, evidence, "pgmpy", model.model_pgmpy) print("pgmpy\n", sorted(mpe_pgmpy_ve.items(), key=lambda x: (x[0], x[1]))) # print("DAOOPT my UAI", mpe_daoopt_mine) print("DAOOPT pgmpy UAI\n", sorted(mpe_daoopt_pgmpy.items(), key=lambda x: (x[0], x[1])))
def setUp(self): self.maxDiff = None variables = [ "kid", "bowel-problem", "dog-out", "family-out", "hear-bark", "light-on", ] edges = [ ["family-out", "dog-out"], ["bowel-problem", "dog-out"], ["family-out", "light-on"], ["dog-out", "hear-bark"], ] cpds = { "kid": np.array([[0.3], [0.7]]), "bowel-problem": np.array([[0.01], [0.99]]), "dog-out": np.array([[0.99, 0.01, 0.97, 0.03], [0.9, 0.1, 0.3, 0.7]]), "family-out": np.array([[0.15], [0.85]]), "hear-bark": np.array([[0.7, 0.3], [0.01, 0.99]]), "light-on": np.array([[0.6, 0.4], [0.05, 0.95]]), } states = { "kid": ["true", "false"], "bowel-problem": ["true", "false"], "dog-out": ["true", "false"], "family-out": ["true", "false"], "hear-bark": ["true", "false"], "light-on": ["true", "false"], } parents = { "kid": [], "bowel-problem": [], "dog-out": ["bowel-problem", "family-out"], "family-out": [], "hear-bark": ["dog-out"], "light-on": ["family-out"], } self.bayesmodel = BayesianModel() self.bayesmodel.add_nodes_from(variables) self.bayesmodel.add_edges_from(edges) tabular_cpds = [] for var, values in cpds.items(): cpd = TabularCPD( var, len(states[var]), values, evidence=parents[var], evidence_card=[ len(states[evidence_var]) for evidence_var in parents[var] ], ) tabular_cpds.append(cpd) self.bayesmodel.add_cpds(*tabular_cpds) self.bayeswriter = UAIWriter(self.bayesmodel) edges = {("var_0", "var_1"), ("var_0", "var_2"), ("var_1", "var_2")} self.markovmodel = MarkovModel(edges) tables = [ (["var_0", "var_1"], ["4.000", "2.400", "1.000", "0.000"]), ( ["var_0", "var_1", "var_2"], [ "2.2500", "3.2500", "3.7500", "0.0000", "0.0000", "10.0000", "1.8750", "4.0000", "3.3330", "2.0000", "2.0000", "3.4000", ], ), ] domain = {"var_1": "2", "var_2": "3", "var_0": "2"} factors = [] for table in tables: variables = table[0] cardinality = [int(domain[var]) for var in variables] values = list(map(float, table[1])) factor = DiscreteFactor(variables, cardinality, values) factors.append(factor) self.markovmodel.add_factors(*factors) self.markovwriter = UAIWriter(self.markovmodel)
class TestUAIWriter(unittest.TestCase): def setUp(self): self.maxDiff = None variables = [ "kid", "bowel-problem", "dog-out", "family-out", "hear-bark", "light-on", ] edges = [ ["family-out", "dog-out"], ["bowel-problem", "dog-out"], ["family-out", "light-on"], ["dog-out", "hear-bark"], ] cpds = { "kid": np.array([[0.3], [0.7]]), "bowel-problem": np.array([[0.01], [0.99]]), "dog-out": np.array([[0.99, 0.01, 0.97, 0.03], [0.9, 0.1, 0.3, 0.7]]), "family-out": np.array([[0.15], [0.85]]), "hear-bark": np.array([[0.7, 0.3], [0.01, 0.99]]), "light-on": np.array([[0.6, 0.4], [0.05, 0.95]]), } states = { "kid": ["true", "false"], "bowel-problem": ["true", "false"], "dog-out": ["true", "false"], "family-out": ["true", "false"], "hear-bark": ["true", "false"], "light-on": ["true", "false"], } parents = { "kid": [], "bowel-problem": [], "dog-out": ["bowel-problem", "family-out"], "family-out": [], "hear-bark": ["dog-out"], "light-on": ["family-out"], } self.bayesmodel = BayesianModel() self.bayesmodel.add_nodes_from(variables) self.bayesmodel.add_edges_from(edges) tabular_cpds = [] for var, values in cpds.items(): cpd = TabularCPD( var, len(states[var]), values, evidence=parents[var], evidence_card=[ len(states[evidence_var]) for evidence_var in parents[var] ], ) tabular_cpds.append(cpd) self.bayesmodel.add_cpds(*tabular_cpds) self.bayeswriter = UAIWriter(self.bayesmodel) edges = {("var_0", "var_1"), ("var_0", "var_2"), ("var_1", "var_2")} self.markovmodel = MarkovModel(edges) tables = [ (["var_0", "var_1"], ["4.000", "2.400", "1.000", "0.000"]), ( ["var_0", "var_1", "var_2"], [ "2.2500", "3.2500", "3.7500", "0.0000", "0.0000", "10.0000", "1.8750", "4.0000", "3.3330", "2.0000", "2.0000", "3.4000", ], ), ] domain = {"var_1": "2", "var_2": "3", "var_0": "2"} factors = [] for table in tables: variables = table[0] cardinality = [int(domain[var]) for var in variables] values = list(map(float, table[1])) factor = DiscreteFactor(variables, cardinality, values) factors.append(factor) self.markovmodel.add_factors(*factors) self.markovwriter = UAIWriter(self.markovmodel) def test_bayes_model(self): self.expected_bayes_file = """BAYES 6 2 2 2 2 2 2 6 1 0 3 2 0 1 1 2 2 1 3 1 4 2 2 5 2 0.01 0.99 8 0.99 0.01 0.97 0.03 0.9 0.1 0.3 0.7 2 0.15 0.85 4 0.7 0.3 0.01 0.99 2 0.3 0.7 4 0.6 0.4 0.05 0.95""" self.assertEqual(str(self.bayeswriter.__str__()), str(self.expected_bayes_file)) def test_markov_model(self): self.expected_markov_file = """MARKOV 3 2 2 3 2 2 0 1 3 0 1 2 4 4.0 2.4 1.0 0.0 12 2.25 3.25 3.75 0.0 0.0 10.0 1.875 4.0 3.333 2.0 2.0 3.4""" self.assertEqual( str(self.markovwriter.__str__()), str(self.expected_markov_file) )