def generate_BayesNet(root): ''' Generate a BayesNet from a XMLBIF. This method is used internally. Do not call it outside this class. ''' network = BayesNet() bif_nodes = root.getElementsByTagName("BIF") if len(bif_nodes) != 1: raise Exception("More than one or none <BIF>-tag in document.") network_nodes = bif_nodes[0].getElementsByTagName("NETWORK") if len(network_nodes) != 1: raise Exception("More than one or none <NETWORK>-tag in document.") variable_nodes = network_nodes[0].getElementsByTagName("VARIABLE") for variable_node in variable_nodes: name = "Unnamed node" value_range = [] position = (0, 0) for name_node in variable_node.getElementsByTagName("NAME"): name = XMLBIF.get_node_text(name_node.childNodes) break for output_node in variable_node.getElementsByTagName("OUTCOME"): value_range.append(XMLBIF.get_node_text(output_node.childNodes)) for position_node in variable_node.getElementsByTagName("PROPERTY"): position = XMLBIF.get_node_position_from_text(position_node.childNodes) break new_node = DiscreteNode(name, value_range) new_node.position = position network.add_node(new_node) definition_nodes = network_nodes[0].getElementsByTagName("DEFINITION") for definition_node in definition_nodes: node = None for for_node in definition_node.getElementsByTagName("FOR"): name = XMLBIF.get_node_text(for_node.childNodes) node = network.get_node(name) break if node == None: continue for given_node in definition_node.getElementsByTagName("GIVEN"): parent_name = XMLBIF.get_node_text(given_node.childNodes) parent_node = network.get_node(parent_name) node.announce_parent(parent_node) for table_node in definition_node.getElementsByTagName("TABLE"): table = XMLBIF.get_node_table_from_text(table_node.childNodes) node.get_cpd().get_table().T.flat = table break return network