
JPQc           @   s  d  d l  Z  d  d l Z d  d l m Z d  d l m Z e   Z d  d l m Z d  d l	 m
 Z
 d  d l m Z m Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l	 Z	 d  d l Z e Z d e f d     YZ d	 e f d
     YZ d   Z d d d  Z d e f d     YZ d e f d     YZ d e  j f d     YZ d e  j f d     YZ  d  d l! Z! d  d l" m# Z# d e  j f d     YZ$ d S(   iN(   t   defaultdict(   t   PrettyPrinter(   t   Agent(   t	   GameState(   t   RandomGhostt   DirectionalGhostt   MultiagentTreeStatec           B   sJ   e  Z d    Z d   Z d   Z d d  Z d   Z d   Z d   Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   problemt   state(   t   selfR   R   (    (    s   multiagentTestClasses.pyt   __init__%   s    	c         C   sl   t  r2 d |  j | | |  j j |  j | f GHn  |  j j |  j | } |  j j j |  t |  j |  S(   Ns#   generateSuccessor(%s, %s, %s) -> %s(   t   VERBOSER   R   t   stateToSuccessorMapt   generatedStatest   addR   (   R	   t
   agentIndext   actiont	   successor(    (    s   multiagentTestClasses.pyt   generateSuccessor)   s
    ,c         C   sc   t  r( d |  j |  j j |  j f GHn  |  j |  j j k rL t d   n  t |  j j |  j  S(   Ns   getScore(%s) -> %ssI   getScore() called on non-terminal state or before maximum depth achieved.(   R   R   R   t
   evaluationt	   Exceptiont   float(   R	   (    (    s   multiagentTestClasses.pyt   getScore0   s
    "i    c         C   s?   t  r( d |  j |  j j |  j f GHn  t |  j j |  j  S(   Ns   getLegalActions(%s) -> %s(   R   R   R   t   stateToActionst   list(   R	   R   (    (    s   multiagentTestClasses.pyt   getLegalActions7   s    "c         C   s=   t  r* d |  j |  j |  j j k f GHn  |  j |  j j k S(   Ns   isWin(%s) -> %s(   R   R   R   t	   winStates(   R	   (    (    s   multiagentTestClasses.pyt   isWin>   s    $c         C   s=   t  r* d |  j |  j |  j j k f GHn  |  j |  j j k S(   Ns   isLose(%s) -> %s(   R   R   R   t
   loseStates(   R	   (    (    s   multiagentTestClasses.pyt   isLoseC   s    $c         C   s+   t  r! d |  j |  j j f GHn  |  j j S(   Ns   getNumAgents(%s) -> %s(   R   R   R   t	   numAgents(   R	   (    (    s   multiagentTestClasses.pyt   getNumAgentsH   s    (	   t   __name__t
   __module__R
   R   R   R   R   R   R   (    (    (    s   multiagentTestClasses.pyR   $   s   					t   MultiagentTreeProblemc           B   s   e  Z d    Z d   Z RS(   c   
      C   s   t  |  |  |  _ | |  _ | |  _ | |  _ | |  _ | |  _ |  j   t t	  |  _
 t t  |  _ x< | D]4 \ } } }	 |  j | j |  |	 |  j
 | | <qn Wd  S(   N(   R   t
   startStateR   R   R   R   t
   successorst   resetR    t   dictR   R   R   t   append(
   R	   R   R#   R   R   R$   R   R   R   t	   nextState(    (    s   multiagentTestClasses.pyR
   O   s    					
c         C   s   t  |  j j g  |  _ d  S(   N(   t   setR#   R   R   (   R	   (    (    s   multiagentTestClasses.pyR%   `   s    (   R    R!   R
   R%   (    (    (    s   multiagentTestClasses.pyR"   N   s   	c         C   sP  t  |  d  } |  d } t |  d j d   } t |  d j d   } g  } i  } xh |  d j d  D]S } | j   } t |  d k r | \ }	 }
 t |
  | |	 <ql t d	 | f  ql Wxq |  d
 j d  D]\ } | j   } t |  d k r#| \ }	 } } | j |	 | | f  q t d | f  q Wt | | | | | |  S(   Nt
   num_agentst   start_statet
   win_statest    t   lose_statesR   s   
i   s%   [parseTree] Bad evaluation line: |%s|R$   i   s$   [parseTree] Bad successor line: |%s|(   t   intR)   t   splitt   lenR   R   R'   R"   (   t   testDictR   R#   R   R   R$   R   t   linet   tokensR   t   valueR   R(   (    (    s   multiagentTestClasses.pyt   parseTreeProblemd   s&    
i   t   gamesc         C   s[  t  j    } d | G| Gd | GHt j |  | | | | t d t d d } d | G| Gd t  j    | GHi t  j    | d 6g  | D] }	 |	 j j   ^ q j t  d	 6| d
 6g  | D] }	 |	 j j   ^ q d 6g  | D] }	 |	 j	 ^ q j t  d 6g  | D] }	 |	 j
 ^ qj t  d 6}
 d |
 d	 t |  t |
 d  d t |  f GH|
 S(   s8   
    Runs a few games and outputs their statistics.
    s   *** Running %s ons   %d time(s).t   catchExceptionst   timeoutix   s   *** Finished running %s ons   after %d seconds.t   timet   winsR7   t   scorest   timeoutst   crashess1   *** Won %d out of %d games. Average score: %f ***g      ?(   R:   t   pacmant   runGamest   Falset   TrueR   R   t   countR   t   agentTimeoutt   agentCrashedR1   t   sum(   t   layt   layNamet   pact   ghostst   dispt   nGamest   namet	   starttimeR7   t   gt   stats(    (    s   multiagentTestClasses.pyt   run   s    *jO4t   GradingAgentc           B   s>   e  Z d    Z d   Z d   Z d   Z d   Z d   Z RS(   c         C   s   | |  _  | |  _ | |  _ | |  _ g  |  _ d |  _ g  t t | d   D] } t ^ qM |  _	 g  t t | d   D] } t ^ qy |  _
 g  t t | d   D] } t ^ q |  _ d |  _ | |  _ d  S(   Nii    (   t   studentAgentt   optimalActionst   altDepthActionst   partialPlyBugActionst   suboptimalMovest   wrongStatesExploredt   rangeR1   RB   t   actionsConsistentWithOptimalt%   actionsConsistentWithAlternativeDeptht"   actionsConsistentWithPartialPlyBugt	   stepCountt   seed(   R	   R^   RS   RT   RU   RV   t   i(    (    s   multiagentTestClasses.pyR
      s    						,,,	c         C   s<   d t  |  j  k r( |  j j |  n  t j |  j  d  S(   Nt   registerInitialState(   t   dirRS   R`   t   randomR^   (   R	   R   (    (    s   multiagentTestClasses.pyR`      s    c   	      C   s  t  j   |  j j |  t t  j    f } |  j |  j } |  j |  j } |  j |  j } t	 } t	 } xo t
 t |   D][ } | d | | d k r t } n t	 |  j | <| d t | | d  k r} t } q} q} W| r |  j d k  r d |  _ n  x> t
 t |   D]* } | d | | k rt	 |  j | <qqWx> t
 t |   D]* } | d | | k rRt	 |  j | <qRqRW| s|  j j | | d | d d d f  n  |  j d 7_ t j |  j |  j  | d d d S(   Ni    i   (   R   t   getAndResetExploredRS   t	   getActionR1   RT   R]   RU   RV   RA   RY   RB   RZ   R/   RX   R[   R\   RW   R'   Rb   R^   (	   R	   R   t   studentActionRT   RU   RV   t   studentOptimalActiont   curRightStatesExploredR_   (    (    s   multiagentTestClasses.pyRd      s4    
$	,c         C   s   |  j  S(   N(   RW   (   R	   (    (    s   multiagentTestClasses.pyt   getSuboptimalMoves   s    c         C   s   |  j  S(   N(   RX   (   R	   (    (    s   multiagentTestClasses.pyt   getWrongStatesExplored   s    c         C   sx   |  j  d k r d S|  j j t  d k r/ d S|  j j t  d k rK d S|  j j t  d k rg d St |  j  Sd S(   s   
        Return +n if have n suboptimal moves.
        Return -1 if have only off by one depth moves.
        Return 0 otherwise.
        i    iiiN(   RX   RZ   RC   RB   R\   R[   R1   RW   (   R	   (    (    s   multiagentTestClasses.pyt   checkFailure   s    (   R    R!   R
   R`   Rd   Rh   Ri   Rj   (    (    (    s   multiagentTestClasses.pyRR      s   					t	   PolyAgentc           B   s>   e  Z d    Z d   Z d   Z d   Z d   Z d   Z RS(   c   	      C   s   |  j  | |  \ } } } x | D] } | | _ q" Wx | D] } | | _ q< Wx( | d  D] } t d | d  | _ qZ Wx | d D] } | d | _ q W| |  _ | |  _ | |  _ g  |  _ g  |  _ g  |  _ | |  _	 d |  _
 d  S(   Ni   i   i    (   t   construct_our_pacst   deptht   maxt   solutionAgentst   alternativeDepthAgentst   partialPlyBugAgentst   optimalActionListst   alternativeDepthListst   partialPlyBugListsR^   R]   (	   R	   R^   t   multiAgentst   ourPacOptionsRm   Ro   Rp   Rq   t   p(    (    s   multiagentTestClasses.pyR
      s"    							c         C   s   g  | D] } | | ^ q S(   sH   
        Return a sublist of elements given by indices in list.
        (    (   R	   R   t   indicesR_   (    (    s   multiagentTestClasses.pyt   select   s    c   
      C   s   g  t  d  D] } | j |   ^ q } d | d <g  t  d  D] } | j |   ^ q? } d | d <| j |   g } d | d <| | j |   g } x | | | D] } t | _ q W| d | d g } |  j | | d d d	 d
 g  }	 | |	 | f S(   Ni   RB   t   keepStopt   usePartialPlyBugRA   i    i   i   i   i   (   RY   t   StaffMultiAgentSearchAgentRA   t   verboseRy   (
   R	   Ru   t   keyword_dictR_   t   pacs_without_stopt   pacs_with_stopt   partial_ply_bug_pacsRI   t   ourpact   alternative_depth_pacs(    (    s   multiagentTestClasses.pyRl      s    (
(

"c         C   sQ   x: |  j  |  j D]( } d t |  k r | j |  q q Wt j |  j  d  S(   NR`   (   Ro   Rp   Ra   R`   Rb   R^   (   R	   R   t   agent(    (    s   multiagentTestClasses.pyR`     s    c         C   s  t  j   g  } x= |  j D]2 } | j | j |  d t t  j    f  q Wg  |  j D] } | j |  d ^ qZ } g  |  j D] } | j |  d ^ q } |  j j |  |  j	 j |  |  j
 j |  |  j d 7_ t j |  j |  j  | d d d S(   Ni    i   (   R   Rc   Ro   R'   t   getBestPacmanActionsR1   Rp   Rq   Rr   Rs   Rt   R]   Rb   R^   (   R	   R   Rr   R   Rs   Rt   (    (    s   multiagentTestClasses.pyRd   	  s    
0))c         C   s   |  j  |  j |  j f S(   N(   Rr   Rs   Rt   (   R	   (    (    s   multiagentTestClasses.pyt	   getTraces  s    (   R    R!   R
   Ry   Rl   R`   Rd   R   (    (    (    s   multiagentTestClasses.pyRk      s   					t   PacmanGameTreeTestc           B   s,   e  Z d    Z d   Z d   Z d   Z RS(   c         C   s   t  t |   j | |  t |  j d  |  _ |  j d |  _ |  j d |  _ |  j d |  _ t |  j d  |  _	 t |  j d  |  _
 d  S(   NR^   t   algt   layoutt
   layoutNameRm   t
   max_points(   t   superR   R
   R/   R2   R^   R   t   layout_textt   layout_nameRm   R   (   R	   t   questionR2   (    (    s   multiagentTestClasses.pyR
     s    c      	   C   s  | d } t  | |  j  d |  j  } t d   | d j d   } t d   | d j d   } t d   | d	 j d   } t j |  j  t j g  |  j	 j d  D] }	 |	 j
   ^ q  }
 t |  j | | | |  } |  j j   } t |
 |  j | g  t d
  D] } t | d  ^ q| d |  j } | d d k rd|  j d  |  j |  S| d d k r|  j d  |  j |  S| j   } | d k r|  j |  S| d k r| j   d k r|  j d  |  j |  S|  j |  Sn | d k r!|  j d  |  j |  S| d k rG|  j d  |  j |  S| d k r| j   } t j |  \ } } } |  j d  |  j d | | | f  |  j |  Sd  S(   NRu   Rm   c         S   s   t  j |   S(   N(   t   jsont   loads(   t   x(    (    s   multiagentTestClasses.pyt   <lambda>,  s    RT   s   
c         S   s   t  j |   S(   N(   R   R   (   R   (    (    s   multiagentTestClasses.pyR   -  s    RU   c         S   s   t  j |   S(   N(   R   R   (   R   (    (    s   multiagentTestClasses.pyR   .  s    RV   i   i   RM   R=   i    s+   Agent timed out on smallClassic.  No creditR>   s)   Agent crashed on smallClassic.  No creditis%   Bug: Wrong number of states expanded.is   Bug: Partial Ply Bugis   Bug: Search depth off by 1s   Bug: Suboptimal movess(   State:%s
Student Move:%s
Optimal Move:%s(   t   getattrR   Rm   t   mapR0   Rb   R^   R   t   LayoutR   t   stripRR   R   t
   getDisplayRQ   R   RY   R   t
   addMessaget   testFailRj   t   testPassRi   Rh   t   choice(   R	   t   gradest
   moduleDictt   solutionDictRu   RS   t
   allActionsRU   RV   t   lRG   RI   RK   R_   RP   t   codet   movesR   t   studentMovet   optMove(    (    s   multiagentTestClasses.pyt   execute(  sH    
4Gc         C   sM   | j  d |  x( | D]  } | j  d t j |   q W| j  d  d  S(   Ns   %s: """
s   %s
s   """
(   t   writeR   t   dumps(   R	   t   handleRM   R   R   (    (    s   multiagentTestClasses.pyt	   writeListR  s    c      	   C   sl  | d } t  j |  j  t j g  |  j j d  D] } | j   ^ q3  } |  j d k rm i d d 6} n% |  j d k r i d d 6} n i  } t |  j | | |  j	  } |  j
 j   } t | |  j | g  t d  D] }	 t |	 d	  ^ q | d
 |  j | j   \ }
 } } t | d  } |  j | d |
  |  j | d |  |  j | d |  | j   d  S(   NRu   s   
t   ExpectimaxAgentRB   t
   expectimaxt   AlphaBetaAgentt	   alphabetai   i   RM   t   wRT   RU   RV   (   Rb   R^   R   R   R   R0   R   R   Rk   Rm   R   R   RQ   R   RY   R   R   t   openR   t   close(   R	   R   t   filePathRu   R   RG   Rv   RI   RK   R_   RT   RU   RV   R   (    (    s   multiagentTestClasses.pyt   writeSolutionX  s"    
4E(   R    R!   R
   R   R   R   (    (    (    s   multiagentTestClasses.pyR     s   			*	t   GraphGameTreeTestc           B   s5   e  Z d    Z d   Z d   Z d   Z d   Z RS(   c         C   sk   t  t |   j | |  t |  |  _ |  j d |  _ |  j d j d  |  _ t	 |  j d  |  _
 d  S(   NR   t   diagrams   
Rm   (   R   R   R
   R6   R   R2   R   R0   R   R/   Rm   (   R	   R   R2   (    (    s   multiagentTestClasses.pyR
   r  s
    c         C   s~   |  j  j   t | |  j  d |  j  } | j |  j  j  } |  j  j } | d j g  t	 |  D] } t
 |  ^ qb  f S(   NRm   R-   (   R   R%   R   R   Rm   Rd   R#   R   t   joint   sortedt   str(   R	   Ru   RS   R   t	   generatedt   s(    (    s   multiagentTestClasses.pyt   solveProblemy  s
    c         C   s2   |  j  d  x |  j D] } |  j  |  q Wd  S(   Ns   Tree:(   R   R   (   R	   R3   (    (    s   multiagentTestClasses.pyt
   addDiagram  s    c   
      C   s   | d } | d } | d } |  j  |  \ } } t }	 | | k r| |  j d |  j f  |  j d | | f  t }	 n  | | k r |  j d |  j f  |  j d | | f  t }	 n  |	 r |  j   |  j |  S|  j |  Sd  S(   NRu   R   R   s   Incorrect move for depth=%ss)       Student move: %s
    Optimal move: %ss&   Incorrect generated nodes for depth=%ss?       Student generated nodes: %s
    Correct generated nodes: %s(   R   RA   R   Rm   RB   R   R   R   (
   R	   R   R   R   Ru   t
   goldActiont   goldGeneratedR   R   t   fail(    (    s   multiagentTestClasses.pyR     s"    


		
c         C   sw   | d } |  j  |  \ } } t | d  C } | j d |  j  | j d | f  | j d | f  Wd  QXt S(   NRu   R   s$   # This is the solution file for %s.
s   action: "%s"
s   generated: "%s"
(   R   R   R   t   pathRB   (   R	   R   R   Ru   R   R   R   (    (    s   multiagentTestClasses.pyR     s    
(   R    R!   R
   R   R   R   R   (    (    (    s   multiagentTestClasses.pyR   p  s
   				(   t   TimeoutFunctiont   EvalAgentTestc           B   s#   e  Z d    Z d   Z d   Z RS(   c         C   s  t  t |   j | |  | d |  _ | d |  _ t | d  |  _ t | d  |  _ t | d  |  _	 t | d  |  _
 d | k r t | d  n d  |  _ d | k r t | d  n d  |  _ d	 | k r t | d	  n d  |  _ g  | j d
 d  j   D] } t |  ^ q|  _ g  | j d d  j   D] } t |  ^ q;|  _ g  | j d d  j   D] } t |  ^ qo|  _ t g  |  j |  j |  j g D] } t |  ^ q |  _ | j d d  |  _ d  S(   NR   t	   agentNameRJ   t   maxTimet
   randomSeedt   numGamest   scoreMinimumt   nonTimeoutMinimumt   winsMinimumt   scoreThresholdst    t   nonTimeoutThresholdst   winsThresholdst	   agentArgs(   R   R   R
   R   R   t   evalRJ   R/   R   R^   R   t   NoneR   R   R   t   getR0   R   R   R   RF   R1   t	   maxPointsR   (   R	   R   R2   R   t   t(    (    s   multiagentTestClasses.pyR
     s    %%%444:c         C   s$  t  j    } t | d |  j  } |  j d k rC t j |  j  n i  } | |   } t j |  j d  } |  j	 j
   }	 t j |  j  t j | | |  j |	 |  j t d t d |  j }
 t  j    | } i | d 6g  |
 D] } | j j   ^ q j t  d 6|
 d 6g  |
 D] } | j j   ^ qd	 6g  |
 D] } | j ^ q3j t  d
 6g  |
 D] } | j ^ qYj t  d 6} t | d	  t t | d	   } |  j | d
 } | d } d   } | | |  j |  j d  | | |  j |  j d  | | |  j  |  j! d  g } d } x| D]\ } } } } } } | d  k rZt |  d k rZqn  | | 7} | s| d k s|t#  |  j$ d | | | f  n# |  j$ d | | | t |  f  | d  k r]|  j$ d  |  j$ d | f  t |  d k s| | d k r"|  j$ d | f  n  x t% |  D]' \ } } |  j$ d | | d f  q/Wqt |  d k r|  j$ d  |  j$ d | d f  x8 t% |  D]' \ } } |  j$ d | | d f  qWqqWt& g  | D] \ } } } } } } | ^ q rd } n  |  j' | | |  j(  S(   NRu   R   i   R8   R9   R:   R;   R7   R<   R=   R>   c         S   sg   d } | d  k p |  | k } | rQ x* | D] } |  | k r+ | d 7} q+ q+ Wn  | | |  | | | f S(   Ni    i   (   R   (   R5   t   minimumt
   thresholdsRM   t   pointst   passedR   (    (    s   multiagentTestClasses.pyt   gradeThreshold  s    s   average scores   games not timed outi    s$   %s %s (fail: below minimum value %s)s   %s %s (%s of %s points)s       Grading scheme:s        < %s:  fails       >= %s:  0 pointss       >= %s:  %s pointsi   s        < %s:  0 points()   R:   R   R   R   R?   t   parseAgentArgsR   t	   getLayoutR   R   R   Rb   R^   R@   RJ   R   RA   RB   R   R   R   RC   R   RD   RE   RF   R   R1   R   R   R   R   R   R   R   t   AssertionErrorR   t	   enumeratet   anyt   testPartialR   (   R	   R   R   R   t	   startTimet	   agentTypet	   agentOptsR   RG   RK   R7   t	   totalTimeRO   RP   t   averageScoret   nonTimeoutsR;   R   t   resultst   totalPointsR   R   R5   R   R   RM   t   idxt	   thresholdt   _(    (    s   multiagentTestClasses.pyR     sV    '36*O$
		
#""&2	c         C   s>   t  | d  } | j d |  j  | j d  | j   t S(   NR   s$   # This is the solution file for %s.
s   # File intentionally blank.
(   R   R   R   R   RB   (   R	   R   R   R   (    (    s   multiagentTestClasses.pyR     s
    
(   R    R!   R
   R   R   (    (    (    s   multiagentTestClasses.pyR     s   		C(%   t   testClassesR   t   collectionsR    t   pprintR   t   ppt   gameR   R?   R   t   ghostAgentsR   R   Rb   t   matht	   tracebackt   syst   osR   t
   autograderRA   R   t   objectR   R"   R6   RQ   RR   Rk   t   TestCaseR   R   R:   t   utilR   R   (    (    (    s   multiagentTestClasses.pyt   <module>   s,   	<*	LDS6