コード例 #1
0
ファイル: product.py プロジェクト: RBinsonB/mix_initiative
    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()))
コード例 #2
0
ファイル: product.py プロジェクト: RBinsonB/mix_initiative
 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()))
コード例 #3
0
ファイル: product.py プロジェクト: RBinsonB/mix_initiative
 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'
コード例 #4
0
 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
コード例 #5
0
ファイル: product.py プロジェクト: roussePaul/pwa
	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
コード例 #6
0
	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)
コード例 #7
0
ファイル: product.py プロジェクト: roussePaul/pwa
	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'
コード例 #8
0
ファイル: automata.py プロジェクト: roussePaul/pwa
	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
コード例 #9
0
ファイル: automata.py プロジェクト: roussePaul/pwa
	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