def build_full(self): for f_ts_node in self.graph['ts'].nodes_iter(): for f_buchi_node in self.graph['buchi'].nodes_iter(): f_prod_node = self.composition(f_ts_node, f_buchi_node) #print 'f_prod_node' , (f_ts_node, f_buchi_node) for t_ts_node in self.graph['ts'].successors_iter(f_ts_node): for t_buchi_node in self.graph['buchi'].successors_iter( f_buchi_node): t_prod_node = self.composition(t_ts_node, t_buchi_node) #print 't_prod_node' , (t_ts_node, t_buchi_node) label = self.graph['ts'].node[f_ts_node]['label'] cost = self.graph['ts'][f_ts_node][t_ts_node]['weight'] truth, dist = check_label_for_buchi_edge( self.graph['buchi'], label, f_buchi_node, t_buchi_node) total_weight = cost + self.graph['alpha'] * dist #print 'label,truth,total_weight', label,truth,total_weight if truth: self.add_edge(f_prod_node, t_prod_node, weight=total_weight, cost=cost, distance=dist) #print 'add edge', (f_prod_node, t_prod_node) print 'full product constructed with %d states and %s transitions' % ( len(self.nodes()), len(self.edges()))
def build_full_margin(self, opt_path): if len(opt_path) >= 2: opt_edges = zip(opt_path[0::2], opt_path[1::2]) for f_ts_node in self.graph['ts'].nodes_iter(): for f_buchi_node in self.graph['buchi'].nodes_iter(): f_prod_node = self.composition(f_ts_node, f_buchi_node) #print 'f_prod_node' , (f_ts_node, f_buchi_node) for t_ts_node in self.graph['ts'].successors_iter(f_ts_node): for t_buchi_node in self.graph['buchi'].successors_iter( f_buchi_node): t_prod_node = self.composition(t_ts_node, t_buchi_node) #print 't_prod_node' , (t_ts_node, t_buchi_node) label = self.graph['ts'].node[f_ts_node]['label'] cost = self.graph['ts'][f_ts_node][t_ts_node]['weight'] truth, dist = check_label_for_buchi_edge( self.graph['buchi'], label, f_buchi_node, t_buchi_node) total_weight = cost + self.graph['alpha'] * dist + 1 #print 'label,truth,total_weight', label,truth,total_weight if (f_prod_node, t_prod_node) in opt_edges: k = 1 else: k = 0 total_weight -= k if truth: self.add_edge(f_prod_node, t_prod_node, weight=total_weight, cost=cost, distance=dist) #print 'add edge', (f_prod_node, t_prod_node) print 'full product constructed with %d states and %s transitions' % ( len(self.nodes()), len(self.edges()))
def fly_successors_iter(self, f_prod_node): f_ts_node, f_buchi_node = self.projection(f_prod_node) # been visited before, and hasn't changed if ((self.node[f_prod_node]['marker'] == 'visited') and (self.graph['ts'].graph['region'].node[self.graph['ts'].node[ self.node[f_prod_node]['ts']]['region']]['status'] == 'confirmed')): for t_prod_node in self.successors_iter(f_prod_node): yield t_prod_node, self.edge[f_prod_node][t_prod_node][ 'weight'] else: self.remove_edges_from(self.out_edges(f_prod_node)) for t_ts_node, cost in self.graph['ts'].fly_successors_iter( f_ts_node): for t_buchi_node in self.graph['buchi'].successors_iter( f_buchi_node): t_prod_node = self.composition(t_ts_node, t_buchi_node) label = self.graph['ts'].node[f_ts_node]['label'] truth, dist = check_label_for_buchi_edge( self.graph['buchi'], label, f_buchi_node, t_buchi_node) total_weight = cost + self.graph['alpha'] * dist if truth: self.add_edge(f_prod_node, t_prod_node, weight=total_weight) yield t_prod_node, total_weight self.node[f_prod_node]['marker'] = 'visited'
def accept_predecessors(self, accept_node): pre_set = set() t_ts_node, t_buchi_node = self.projection(accept_node) for f_ts_node, cost in self.graph['ts'].fly_predecessors_iter(t_ts_node): for f_buchi_node in self.graph['buchi'].predecessors(t_buchi_node): f_prod_node = self.composition(f_ts_node, f_buchi_node) label = self.graph['ts'].node[f_ts_node]['label'] truth, dist = check_label_for_buchi_edge(self.graph['buchi'], label, f_buchi_node, t_buchi_node) total_weight = cost + self.graph['alpha']*dist if truth: pre_set.add(f_prod_node) self.add_edge(f_prod_node, accept_node, weight=total_weight) return pre_set
def accept_predecessors(self, accept_node): pre_set = set() t_ts_node, t_buchi_node = self.projection(accept_node) for f_ts_node, cost in self.graph['ts'].fly_predecessors_iter(t_ts_node): for f_buchi_node in self.graph['buchi'].predecessors_iter(t_buchi_node): f_prod_node = self.composition(f_ts_node, f_buchi_node) label = self.graph['ts'].node[f_ts_node]['label'] truth, dist = check_label_for_buchi_edge(self.graph['buchi'], label, f_buchi_node, t_buchi_node) total_weight = cost + self.graph['alpha']*dist if truth: pre_set.add(f_prod_node) self.add_edge(f_prod_node, accept_node, weight=total_weight) return pre_set
def build_full(self): for f_ts_node in self.graph['ts'].nodes_iter(): for f_buchi_node in self.graph['buchi'].nodes_iter(): f_prod_node = self.composition(f_ts_node, f_buchi_node) for t_ts_node in self.graph['ts'].successors_iter(f_ts_node): for t_buchi_node in self.graph['buchi'].successors_iter(f_buchi_node): t_prod_node = self.composition(t_ts_node, t_buchi_node) label = self.graph['ts'].node[t_ts_node]['label'] cost = self.graph['ts'][f_ts_node][t_ts_node]['weight'] truth, dist = check_label_for_buchi_edge(self.graph['buchi'], label, f_buchi_node, t_buchi_node) total_weight = cost + self.graph['alpha']*dist if truth: self.add_edge(f_prod_node, t_prod_node, weight=total_weight)
def fly_successors_iter(self, f_prod_node): f_ts_node, f_buchi_node = self.projection(f_prod_node) # been visited before, and hasn't changed if ((self.node[f_prod_node]['marker'] == 'visited') and (self.graph['ts'].graph['region'].node[ self.graph['ts'].node[self.node[f_prod_node]['ts']]['region']]['status'] == 'confirmed')): for t_prod_node in self.successors_iter(f_prod_node): yield t_prod_node, self.edge[f_prod_node][t_prod_node]['weight'] else: self.remove_edges_from(self.out_edges(f_prod_node)) for t_ts_node,cost in self.graph['ts'].fly_successors_iter(f_ts_node): for t_buchi_node in self.graph['buchi'].successors_iter(f_buchi_node): t_prod_node = self.composition(t_ts_node, t_buchi_node) label = self.graph['ts'].node[f_ts_node]['label'] truth, dist = check_label_for_buchi_edge(self.graph['buchi'], label, f_buchi_node, t_buchi_node) total_weight = cost + self.graph['alpha']*dist if truth: self.add_edge(f_prod_node, t_prod_node, weight=total_weight) yield t_prod_node, total_weight self.node[f_prod_node]['marker'] = 'visited'
def fts_product(self,fts): result = BA() for f_ts_node in fts.nodes_iter(): for f_buchi_node in self.nodes_iter(): f_prod_node = self.composition(result,fts,f_ts_node, f_buchi_node) for t_ts_node in fts.successors_iter(f_ts_node): for t_buchi_node in self.successors_iter(f_buchi_node): t_prod_node = self.composition(result,fts,t_ts_node, t_buchi_node) if ((t_ts_node in fts.graph['initial']) and (t_buchi_node in self.graph['initial'])): result.graph['initial'].add(t_prod_node) if (t_buchi_node in self.graph['accept']): result.graph['accept'].add(t_prod_node) # Meng one: label = fts.node[f_ts_node]['label'] label = fts.node[t_ts_node]['label'] cost = fts[f_ts_node][t_ts_node]['weight'] truth, dist = check_label_for_buchi_edge(self, label, f_buchi_node, t_buchi_node) total_weight = cost + self.alpha*dist if truth: result.add_edge(f_prod_node, t_prod_node, weight=total_weight) return result
def undeterministic_fts_product(self,fts,verbose=0): result = BA() node_edge_labels = {u:list(set(itertools.chain(*[l['label'] for l in fts[u].values()]))) for u in fts.nodes()} edge_labels = {u:[(l,[v for v,k in fts[u].iteritems() if l in k['label']]) for l in node_edge_labels[u]] for u in fts.nodes()} removed_labels = {} N_nodes = len(fts.nodes()) i_node = 0 for f_ts_node in fts.nodes_iter(): i_node +=1 if verbose: sys.stdout.write(str(i_node)+"/" + str(N_nodes)+'\r') sys.stdout.flush() for f_buchi_node in self.nodes_iter(): f_prod_node = self.composition(result,fts,f_ts_node, f_buchi_node) if f_prod_node not in removed_labels: removed_labels[f_prod_node] = {} for l,successor in edge_labels[f_ts_node]: for t_buchi_node in self.successors_iter(f_buchi_node): all_succ_ok = True for t_ts_node in successor: t_prod_node = self.composition(result,fts,t_ts_node, t_buchi_node) label = fts.node[t_ts_node]['label'] cost = fts[f_ts_node][t_ts_node]['weight'] truth, dist = check_label_for_buchi_edge(self, label, f_buchi_node, t_buchi_node) if truth==False: all_succ_ok = False break if all_succ_ok: for t_ts_node in successor: t_prod_node = self.composition(result,fts,t_ts_node, t_buchi_node) label = fts.node[t_ts_node]['label'] cost = fts[f_ts_node][t_ts_node]['weight'] truth, dist = check_label_for_buchi_edge(self, label, f_buchi_node, t_buchi_node) total_weight = cost + self.alpha*dist if truth: new_label = copy.copy(fts[f_ts_node][t_ts_node]['label']) new_control = copy.copy(fts[f_ts_node][t_ts_node]['control']) if (f_prod_node,t_prod_node) in result.edges(): new_label = new_label.union(result[f_prod_node][t_prod_node]['label']) new_control.update(result[f_prod_node][t_prod_node]['control']) result.add_edge(f_prod_node, t_prod_node, weight=total_weight,label=new_label,control=new_control) if ((t_ts_node in fts.graph['initial']) and (t_buchi_node in self.graph['initial'])): result.graph['initial'].add(t_prod_node) if (t_buchi_node in self.graph['accept']): result.graph['accept'].add(t_prod_node) else: for t_ts_node in successor: t_prod_node = self.composition(result,fts,t_ts_node, t_buchi_node) if t_prod_node not in removed_labels[f_prod_node]: removed_labels[f_prod_node][t_prod_node] = [] removed_labels[f_prod_node][t_prod_node].append(l) for u,v in result.edges(): if u in removed_labels and v in removed_labels[u]: result[u][v]['label'] = result[u][v]['label'].difference(set(removed_labels[u][v])) return result