def set_structure(self, edge_dict, value_dict=None): """ Set the structure of a BayesNet object. This function is mostly used to instantiate a BN skeleton after structure learning algorithms. See "structure_learn" folder & algorithms Arguments --------- *edge_dict* : a dictionary, where key = rv, value = list of rv's children NOTE: THIS MUST BE DIRECTED ALREADY! *value_dict* : a dictionary, where key = rv, value = list of rv's possible values Returns ------- None Effects ------- - sets self.V in topsort order from edge_dict - sets self.E - creates self.F structure and sets the parents Notes ----- """ self.V = topsort(edge_dict) self.E = edge_dict self.F = dict([(rv, {}) for rv in self.nodes()]) for rv in self.nodes(): self.F[rv] = { 'parents': [p for p in self.nodes() if rv in self.children(p)], 'cpt': [], 'values': [] } if value_dict is not None: self.F[rv]['values'] = value_dict[rv]
def set_structure(self, edge_dict, value_dict=None): """ Set the structure of a BayesNet object. This function is mostly used to instantiate a BN skeleton after structure learning algorithms. See "structure_learn" folder & algorithms Arguments --------- *edge_dict* : a dictionary, where key = rv, value = list of rv's children NOTE: THIS MUST BE DIRECTED ALREADY! *value_dict* : a dictionary, where key = rv, value = list of rv's possible values Returns ------- None Effects ------- - sets self.V in topsort order from edge_dict - sets self.E - creates self.F structure and sets the parents Notes ----- """ self.V = topsort(edge_dict) self.E = edge_dict self.F = dict([(rv,{}) for rv in self.nodes()]) for rv in self.nodes(): self.F[rv] = { 'parents':[p for p in self.nodes() if rv in self.children(p)], 'cpt': [], 'values': [] } if value_dict is not None: self.F[rv]['values'] = value_dict[rv]
def read_bif(path): """ This function reads a .bif file into a BayesNet object. It's probably not the fastest or prettiest but it gets the job done. Arguments --------- *path* : a string The path Returns ------- *bn* : a BayesNet object Effects ------- None Notes ----- *V* : a list of strings *E* : a dict, where key = vertex, val = list of its children *F* : a dict, where key = rv, val = another dict with keys = 'parents', 'values', cpt' """ _parents = {} # key = vertex, value = list of vertices in the scope (includind itself) _cpt = {} # key = vertex, value = list (then numpy array) _vals = {} # key=vertex, val=list of its possible values with open(path, 'r') as f: while True: line = f.readline() if 'variable' in line: new_vertex = line.split()[1] _parents[new_vertex] = [] _cpt[new_vertex] = [] #_vals[new_vertex] = [] new_line = f.readline() new_vals = new_line.replace(',', ' ').split()[6:-1] # list of vals _vals[new_vertex] = new_vals num_outcomes = len(new_vals) elif 'probability' in line: line = line.replace(',', ' ') child_rv = line.split()[2] parent_rvs = line.split()[4:-2] if len(parent_rvs) == 0: # prior new_line = f.readline().replace(';', ' ').replace(',',' ').split() prob_values = new_line[1:] _cpt[child_rv].append(map(float,prob_values)) #_cpt[child_rv] = map(float,prob_values) else: # not a prior _parents[child_rv].extend(list(parent_rvs)) while True: new_line = f.readline() if '}' in new_line: break new_line = new_line.replace(',',' ').replace(';',' ').replace('(', ' ').replace(')', ' ').split() prob_values = new_line[-(len(_vals[new_vertex])):] prob_values = map(float,prob_values) _cpt[child_rv].append(prob_values) if line == '': break # CREATE FACTORS _F = {} _E = {} for rv in _vals.keys(): _E[rv] = [c for c in _vals.keys() if rv in _parents[c]] f = { 'parents' : _parents[rv], 'values' : _vals[rv], 'cpt' : [item for sublist in _cpt[rv] for item in sublist] } _F[rv] = f bn = BayesNet() bn.F = _F bn.E = _E bn.V = list(topsort(_E)) return bn
def read_json(path): """ Read a BayesNet object from the json format. This format has the ".bn" extension and is completely unique to pyBN. Arguments --------- *path* : a string The file path Returns ------- None Effects ------- - Instantiates and sets a new BayesNet object Notes ----- This function reads in a libpgm-style format into a bn object File Format: { "V": ["Letter", "Grade", "Intelligence", "SAT", "Difficulty"], "E": [["Intelligence", "Grade"], ["Difficulty", "Grade"], ["Intelligence", "SAT"], ["Grade", "Letter"]], "Vdata": { "Letter": { "ord": 4, "numoutcomes": 2, "vals": ["weak", "strong"], "parents": ["Grade"], "children": None, "cprob": [[.1, .9],[.4, .6],[.99, .01]] }, ... } """ def byteify(input): if isinstance(input, dict): return {byteify(key):byteify(value) for key,value in input.iteritems()} elif isinstance(input, list): return [byteify(element) for element in input] elif isinstance(input, unicode): return input.encode('utf-8') else: return input bn = BayesNet() f = open(path,'r') ftxt = f.read() success=False try: data = byteify(json.loads(ftxt)) bn.V = data['V'] bn.E = data['E'] bn.F = data['F'] success = True except ValueError: print "Could not read file - check format" bn.V = topsort(bn.E) return bn
def read_bif(path): """ This function reads a .bif file into a BayesNet object. It's probably not the fastest or prettiest but it gets the job done. Arguments --------- *path* : a string The path Returns ------- *bn* : a BayesNet object Effects ------- None Notes ----- *V* : a list of strings *E* : a dict, where key = vertex, val = list of its children *F* : a dict, where key = rv, val = another dict with keys = 'parents', 'values', cpt' """ _parents = { } # key = vertex, value = list of vertices in the scope (includind itself) _cpt = {} # key = vertex, value = list (then numpy array) _vals = {} # key=vertex, val=list of its possible values with open(path, 'r') as f: while True: line = f.readline() if 'variable' in line: new_vertex = line.split()[1] _parents[new_vertex] = [] _cpt[new_vertex] = [] #_vals[new_vertex] = [] new_line = f.readline() new_vals = new_line.replace(',', ' ').split()[6:-1] # list of vals _vals[new_vertex] = new_vals num_outcomes = len(new_vals) elif 'probability' in line: line = line.replace(',', ' ') child_rv = line.split()[2] parent_rvs = line.split()[4:-2] if len(parent_rvs) == 0: # prior new_line = f.readline().replace(';', ' ').replace(',', ' ').split() prob_values = new_line[1:] _cpt[child_rv].append(map(float, prob_values)) #_cpt[child_rv] = map(float,prob_values) else: # not a prior _parents[child_rv].extend(list(parent_rvs)) while True: new_line = f.readline() if '}' in new_line: break new_line = new_line.replace(',', ' ').replace( ';', ' ').replace('(', ' ').replace(')', ' ').split() prob_values = new_line[-(len(_vals[new_vertex])):] prob_values = map(float, prob_values) _cpt[child_rv].append(prob_values) if line == '': break # CREATE FACTORS _F = {} _E = {} for rv in _vals.keys(): _E[rv] = [c for c in _vals.keys() if rv in _parents[c]] f = { 'parents': _parents[rv], 'values': _vals[rv], 'cpt': [item for sublist in _cpt[rv] for item in sublist] } _F[rv] = f bn = BayesNet() bn.F = _F bn.E = _E bn.V = list(topsort(_E)) return bn
def read_json(path): """ Read a BayesNet object from the json format. This format has the ".bn" extension and is completely unique to pyBN. Arguments --------- *path* : a string The file path Returns ------- None Effects ------- - Instantiates and sets a new BayesNet object Notes ----- This function reads in a libpgm-style format into a bn object File Format: { "V": ["Letter", "Grade", "Intelligence", "SAT", "Difficulty"], "E": [["Intelligence", "Grade"], ["Difficulty", "Grade"], ["Intelligence", "SAT"], ["Grade", "Letter"]], "Vdata": { "Letter": { "ord": 4, "numoutcomes": 2, "vals": ["weak", "strong"], "parents": ["Grade"], "children": None, "cprob": [[.1, .9],[.4, .6],[.99, .01]] }, ... } """ def byteify(input): if isinstance(input, dict): return { byteify(key): byteify(value) for key, value in input.iteritems() } elif isinstance(input, list): return [byteify(element) for element in input] elif isinstance(input, unicode): return input.encode('utf-8') else: return input bn = BayesNet() f = open(path, 'r') ftxt = f.read() success = False try: data = byteify(json.loads(ftxt)) bn.V = data['V'] bn.E = data['E'] bn.F = data['F'] success = True except ValueError: print("Could not read file - check format") bn.V = topsort(bn.E) return bn