示例#1
0
    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