def policyActionToState(self, actionPolicy, prodTransitions): '''Convert action policy to policy with end states''' # Get the lookup table for traversing transitions stateActionToTargetLookup, _ = generateLookupDictsForTransitions(prodTransitions) statePolicy = {} for key in actionPolicy.keys(): if actionPolicy[key] and actionPolicy[key] is not 'xx0': statePolicy[key] = traverseTransitions(key, [actionPolicy[key]], stateActionToTargetLookup) else: # print 'key:',key statePolicy[key] = None return statePolicy
def computeGrammarProduct(self, initState, currState, stateNonGrammarInd=1, stateGrammarInd=0, performStateTrace=False): '''Get the product automaton of grammar and transition graph''' # Get fsa parameters _ , _, self.fsaTransitions, _ = self.getFSA() gameTransitions = set([tuple(i) for i in self.fsaTransitions]) # Get adversary ID for i in xrange(self.numAgents): if self.agents[i].agentType == 'UNKNOWN': advID = i break # Get adversary parameters advGrammarObj = self.agents[advID].grammarObj advAlphabet = self.agentAlphabet[advID] advName = self.agents[advID].agentName advPrevGrammar = self.agents[advID].prevGrammar # Get the move sequence list moveSeqList = [] for i in xrange(self.numAgents): for j in xrange(self.numAgents): # Check if agent name matches with the move order before extracting the corresponding moves if self.moveOrder[i] == self.agents[j].agentName: moveSeqList.append(self.agents[j].agentWord) # Convert list of move sequences of each agent into a contiguous sequence moveSeq = list(itertools.izip_longest(*moveSeqList)) moveSeq = funcy.flatten(moveSeq) moveSeq = [i for i in moveSeq if i is not None] # Check if adversary's grammar has changed if advGrammarObj.grammar == advPrevGrammar: # Do not not need to recalculate product automaton prodStates = self.prodAutomaton.outStates prodTransitions = self.prodAutomaton.outTransitions transitionsUpdated = False else: # Update product automaton and get product transitions prodStates, prodTransitions = self.prodAutomaton.computeFsaProductTransitions(self.gameStates, gameTransitions, advGrammarObj, advAlphabet, advName, self.numAgents) transitionsUpdated = True # Update the previous grammar on record self.agents[advID].prevGrammar = deepcopy(advGrammarObj.grammar) # Sanity check to see if transitions are lost # if self.prevProdTransitions.difference(prodTransitions): # t1 = self.prevProdTransitions.difference(prodTransitions) # t2 = prodTransitions.difference(self.prevProdTransitions) # pass # assert not self.prevProdTransitions.difference(prodTransitions), "Some transitions are lost!" # Get the new transitions newTransitions = prodTransitions.difference(self.prevProdTransitions) if performStateTrace: # Get init product state initProdState = (list(self.prodAutomaton.grammarFsa.initStates)[0], initState) # for state in self.prodAutomaton.productFsa.initStates: # if state[stateNonGrammarInd] == initState: # initProdState = state # Sanity check to see if initial state is found in product assert initProdState in prodStates, "Product initial state cannot be identified, too bad!" # Get the lookup table for traversing transitions stateActionToTargetLookup, _ = generateLookupDictsForTransitions(prodTransitions) # Traverse fsa to get current state currProdState = traverseTransitions(initProdState, moveSeq, stateActionToTargetLookup) # currProdState = traverseTransitions(initProdState, moveSeq, prodTransitions) else: currProdState = None self.prevProdTransitions = prodTransitions return prodStates, prodTransitions, newTransitions, currProdState, transitionsUpdated
def computeGrammarProduct(self, initState, currState, stateNonGrammarInd=1, stateGrammarInd=0, performStateTrace=False): '''Get the product automaton of grammar and transition graph''' # Get fsa parameters _, _, self.fsaTransitions, _ = self.getFSA() gameTransitions = set([tuple(i) for i in self.fsaTransitions]) # Get adversary ID for i in xrange(self.numAgents): if self.agents[i].agentType == 'UNKNOWN': advID = i break # Get adversary parameters advGrammarObj = self.agents[advID].grammarObj advAlphabet = self.agentAlphabet[advID] advName = self.agents[advID].agentName advPrevGrammar = self.agents[advID].prevGrammar # Get the move sequence list moveSeqList = [] for i in xrange(self.numAgents): for j in xrange(self.numAgents): # Check if agent name matches with the move order before extracting the corresponding moves if self.moveOrder[i] == self.agents[j].agentName: moveSeqList.append(self.agents[j].agentWord) # Convert list of move sequences of each agent into a contiguous sequence moveSeq = list(itertools.izip_longest(*moveSeqList)) moveSeq = funcy.flatten(moveSeq) moveSeq = [i for i in moveSeq if i is not None] # Check if adversary's grammar has changed if advGrammarObj.grammar == advPrevGrammar: # Do not not need to recalculate product automaton prodStates = self.prodAutomaton.outStates prodTransitions = self.prodAutomaton.outTransitions transitionsUpdated = False else: # Update product automaton and get product transitions prodStates, prodTransitions = self.prodAutomaton.computeFsaProductTransitions( self.gameStates, gameTransitions, advGrammarObj, advAlphabet, advName, self.numAgents) transitionsUpdated = True # Update the previous grammar on record self.agents[advID].prevGrammar = deepcopy(advGrammarObj.grammar) # Sanity check to see if transitions are lost # if self.prevProdTransitions.difference(prodTransitions): # t1 = self.prevProdTransitions.difference(prodTransitions) # t2 = prodTransitions.difference(self.prevProdTransitions) # pass # assert not self.prevProdTransitions.difference(prodTransitions), "Some transitions are lost!" # Get the new transitions newTransitions = prodTransitions.difference(self.prevProdTransitions) if performStateTrace: # Get init product state initProdState = (list(self.prodAutomaton.grammarFsa.initStates)[0], initState) # for state in self.prodAutomaton.productFsa.initStates: # if state[stateNonGrammarInd] == initState: # initProdState = state # Sanity check to see if initial state is found in product assert initProdState in prodStates, "Product initial state cannot be identified, too bad!" # Get the lookup table for traversing transitions stateActionToTargetLookup, _ = generateLookupDictsForTransitions( prodTransitions) # Traverse fsa to get current state currProdState = traverseTransitions(initProdState, moveSeq, stateActionToTargetLookup) # currProdState = traverseTransitions(initProdState, moveSeq, prodTransitions) else: currProdState = None self.prevProdTransitions = prodTransitions return prodStates, prodTransitions, newTransitions, currProdState, transitionsUpdated