def read_bif(path, is_quantum): """ Reads a bif file using our stand-alone class BifTool and returns a BayesNet. bif and dot files complement each other. bif: graphical info No, pot info Yes. dot: graphical info Yes, pot info No. By pots I mean potentials, the transition matrices of the nodes. (aka CPTs, etc.) Parameters ---------- path : str is_quantum : bool Returns ------- BayesNet """ bt = BifTool(is_quantum) bt.read_bif(path) nodes = set() name_to_nd = {} for k, nd_name in enumerate(bt.nd_sizes.keys()): node = BayesNode(k, nd_name) node.state_names = bt.states[nd_name] node.size = len(node.state_names) node.forget_all_evidence() nodes |= {node} name_to_nd[nd_name] = node for nd_name, pa_name_list in bt.parents.items(): node = name_to_nd[nd_name] for pa_name in pa_name_list: pa = name_to_nd[pa_name] node.add_parent(pa) for nd_name, parent_names in bt.parents.items(): node = name_to_nd[nd_name] num_pa = len(parent_names) parents = [name_to_nd[pa_name] for pa_name in parent_names] if num_pa == 0: node.potential = DiscreteUniPot(is_quantum, node) else: node.potential = DiscreteCondPot( is_quantum, parents + [node]) node.potential.pot_arr = bt.pot_arrays[nd_name] return BayesNet(nodes)
def write_bif(self, path, is_quantum): """ Writes a bif file using BifTool class. Complements read_bif(). Parameters ---------- path : str is_quantum : bool Returns ------- """ bt = BifTool(is_quantum) for node in self.nodes: bt.nd_sizes[node.name] = node.size bt.states[node.name] = node.state_names parent_names = \ [nd.name for nd in node.potential.ord_nodes[:-1]] bt.parents[node.name] = parent_names bt.pot_arrays[node.name] = node.potential.pot_arr bt.write_bif(path)