
    >)jzQ                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lmZ dd
lmZmZmZ  ed          Z G d d          ZdS )u  World:世界状态机。维护世界状态(谁在哪、对象、时间),承接 agent 的 effects,
做"目击者广播 + 级联",并从世界状态生成每个 agent 的感知。

状态交错变化的关键:一次 SPEECH 效果同时写入受话人与**所有在场目击者**的记忆
(改变他们的状态);被听到的人下一拍据此回应(级联)。World 实现 WorldSink,
agent 的工具通过 ctx.emit → world.apply 把行为落到世界上。
    )annotations)defaultdict)	AgentMind)	Perceived)
MemoryKind)
get_logger)Effect
EffectType)Clock)PlaceWorldMapWorldObjectworldc                      e Zd Zd=d>dZd?dZd@dZdAdZdBdZdCdZdDdZ	dEdZ
dFdZddddGd#ZdHd$ZdHd%ZdId&ZdHd'ZdHd(ZdJd)ZdKdLd.ZdMd4ZdNdOd7ZdPd8ZdId9ZdFd:Zd=dQd<ZdS )RWorldN	world_mapr   clockClock | NonereturnNonec                `   || _         |pt                      | _        i | _        i | _        g | _        d| _        d| _        i | _        t          t                    | _        i | _        g | _        d | _        g | _        t          t                    | _        t          t                    | _        d S )N u   晴朗)mapr   r   agents	positions	event_log
world_goalweatherdeadr   listbodiesaccusationsexecutedkiller_name	narrative_recent_recent_prev)selfr   r   s      ./root/genesis-world/src/genesis/world/world.py__init__zWorld.__init__   s    %egg
,.)+57!$$&	,7,=,=+-#%'+%'-8->->2=d2C2C    mindr   placestrc                    | j                             |          st          d|           |j        j        }|| j        |<   || j        |<   | |_        t          	                    d||           |S )Nu   地点不存在:u   agent 入世:%s @ %s)
r   has
ValueErrormemoryagent_idr   r   r   loggerinfo)r(   r,   r-   aids       r)   	add_agentzWorld.add_agent+   st    x||E"" 	9777888k"C#s
*C777
r+   r6   r   c           	          j                   j                                      pt                    } fdt	           j                                                   D             }d |j        D             }t           j                            g                     }|	                    d 
                                          j                            g           D ]}|                    d| d            j        r]t           j                  t           j                  z   }|                    d| dd	                     j                   d
            j        rd j         g|} j                                      }|dt%          |j        dd          v ri  j                                         D ]4\  }	}
|	k    r)                    |
g                               |	           5d                                 D             }d                    d                                 D                       }|r%dd	                    fd|D                        dnd}t           j                  }|dk    rdnd| d}|                    d| | |            t+           j        j         j                                        ||| j                  S )Nnamec                X    g | ]&\  }}|k    |k                         |          'S  )_describe_other).0apr6   
place_namer(   s      r)   
<listcomp>z"World.perceive.<locals>.<listcomp>9   sC    uuudaXY]gXgXglmqtltlt$&&q))ltltltr+   c                t    g | ]5}|j         r%|j         d d                    |j                    dn|j        6S )(/))affordancesr:   joinr>   os     r)   rB   z"World.perceive.<locals>.<listcomp>:   sH    kkkXY!-S1666CHHQ]336666QVkkkr+   r   u   ⚠️ 这里有 u    的尸体,已经断气了!u   【人人自危】今夜原本 u    人,如今    、u    已遇害或失踪,迟迟不见!凶手很可能就在剩下的人当中——留意谁不在场、谁有嫌疑,该追问就追问、该自保就自保。u   【世界目标】u   凶手roler   c                >    g | ]\  }}t          |          d k    |S )   )lenr>   r@   whos      r)   rB   z"World.perceive.<locals>.<listcomp>M   s'    EEE61cs3xx1}}Q}}}r+      ；c              3  P   K   | ]!\  }}| d d                     |           V  "dS ):rK   N)rH   rP   s      r)   	<genexpr>z!World.perceive.<locals>.<genexpr>N   s>      UUFAs!77ejjoo77UUUUUUr+   u    (此刻独自一人的目标在:c              3  @   K   | ]}|         d          dz   |z   V  dS )r   @Nr<   )r>   r@   rosters     r)   rU   z!World.perceive.<locals>.<genexpr>O   s8      @g@g\]1PSASVWAW@g@g@g@g@g@gr+   rF   uz   (众人都凑在一起、无人落单——你可以用 sabotage 砸电闸制造停电混乱,把他们冲散,再寻机会)u   (目前尚无人遇害,众人毫无防备——这是最安全的首杀时机,一旦和某人单独二人、四下无人,就果断动手,别犹豫)u   (已有u   人遇害,众人高度警觉、互相提防——风声正紧,**这时再动手极易暴露,宜按兵不动、装作无辜,等怀疑平息**)u   【你暗中掌握的行踪】)sim_time
time_labellocationnearby_agentsnearby_objectseventsr   )r   r   getr   sorteditemsobjectsr    r'   insert	_ambiencer!   appendr   rO   r   rH   r   getattrpersona
setdefaultr   r   rY   labelr   )r(   r6   r-   othersobjsr^   bodytotalr,   r?   r@   alonelinestipheatcautionrA   rX   s   ``              @@r)   perceivezWorld.perceive6   sj   ^C(
Z((BEz,B,B,BuuuuuufT^=Q=Q=S=S6T6Tuuukk]b]jkkkd'++J;;<<a
C88999KOOJ33 	Q 	QDMMOdOOOPPPP9 	M$$s49~~5EMML% L LUZZPTPYEZEZ L L LM M M ? 	G<4?<<FvFF{s##GDL&",M,M M M+-F,,.. 7 7188%%a,,33A666EEV\\^^EEEEJJUUfllnnUUUUUE^jejj@g@g@g@gaf@g@g@g6g6gjjjj "^ ty>>D qu  yz  qz  qz  m  m u  u  u  u MMP5P#PwPPQQQZ(z'')) L
 
 
 	
r+   rA   c                   | j         j        }||v }|dk    s|dk     r&d| j                                          d}||rdndz   S d|cxk    rdk     r n nd| j                                          d	S d
| j                                          dS )u   按时段+所处位置生成环境框:外部环境(夜深/天明)要真切影响 agent 的取舍。
        深夜本该各自回房安睡——谁还在外游荡、不在自己房间,本身就反常(对悬疑亦是线索)。      u   【夜深】此刻uD   ,万籁俱寂、风雨拍窗,正常人早该回各自房间安睡。ue   你也困了,待在自己房里最安稳——除非有要紧事,否则没理由半夜在外游荡。u   你此刻竟还在外走动而非回房歇息;留意还有谁深夜不在自己房里——这种反常,要么心里有鬼,要么撞上了危险。	   u   【清晨】u   ,天光初亮、风雨稍歇。经过提心吊胆的一夜,该聚到公共区域清点人数、看看谁还安好、谁不见了。u   【白日】u;   ,尚可正常活动,但昨夜的事悬在每个人心头。)r   hourri   )r(   rA   r6   hown_roombases         r)   rd   zWorld._ambience_   s     JO*$77a!ee A
(8(8(:(:  A  A  AD&q  C  C qr r ::::A::::: z$*"2"2"4"4  z  z  z  zmdj..00mmmmr+   c                4   | j                             |          }||S g }t          |dd          r|                    |j                   t          |dd          r|                    d|j         d           |r| dd                    |           d	n|S )
u^   把在场的人描述成"正在做什么、刚说了什么",让对话/互动能即时接上。Nlast_action_descr   last_speechu
   刚说:「   」rD   ,rF   )r   r_   rf   re   r}   r~   rH   )r(   r6   r,   bitss       r)   r=   zWorld._describe_otherm   s    {s##<J4+R00 	/KK-...4++ 	<KK:T%5:::;;;-1:#))))))s:r+   r   c                J    || _         t                              d|           d S )Nu   天气变为:%s)r   r4   r5   )r(   r   s     r)   set_weatherzWorld.set_weathery   s$    %w/////r+   effectr	   
str | Nonec                   |j         }|j        t          j        k    rmt	          |j                            d          pd          }| j                            |          r|| j	        |<   n9t                              d||           n|j        t          j        k    r|                     |           n|j        t          j        k    r|                     |          S |j        t          j        k    r4|j                            d          dk    r|                     |           n}|j        t          j        k    r4|j                            d          dk    r|                     |           n4|j        t          j        t          j        fv r|                     |           | j                            | j        j        |f           d S )Ntor   u%   %s 想去不存在的地点 %s,忽略actionsabotageaccuse)actortyper
   MOVEr.   payloadr_   r   r0   r   r4   warningSPEECH_route_speechKILL_apply_killCUSTOM_apply_sabotage_apply_accuseSPAWNOBJECT_CHANGE_apply_objectr   re   r   rY   )r(   r   r   dests       r)   applyzWorld.apply~   s   ;*/))v~))$//5266Dx||D!! U(,u%%FtTTTT[J---v&&&&[JO++##F+++[J---&.2D2DX2N2NR\2\2\  (((([J---&.2D2DX2N2NRZ2Z2Zv&&&&[Z-z/GHHHv&&&tz2F;<<<tr+   c                    |j         t          |j                            d          pd          c j        vr dS t           d j                  }|                              |                              k    r dS  fd|                                D             } j        <    j	                 
                                j        =  j                            d            j        
                     j        j        |f           |D ]b} j        |         j                             j                                         d d	 d
 d j        j        t$          j        d           ct)           j                  D ]c}|k    r[||vrW j        |         j                             j                                         d j        j        t$          j        d           d                     d d d|rdd                    |           dndz              t.                              dt3          |                     |rd dd                    |           dS d dS )uj   杀害落地:目标死亡移出世界、留下尸体;同地点的目击者亲眼看到(高冲击记忆)。targetr   u    不在这里,下手未遂。_round_start_posu     不在你身边,无法下手。c                D    g | ]\  }}|k    |fv|j         v |S r<   r   )r>   r?   r@   r   r-   r(   r   s      r)   rB   z%World._apply_kill.<locals>.<listcomp>   sC    ooo41a!u**5RX/AYAY^_cgcn^n^nQ^n^n^nr+   Nu   ,我在u   亲眼目睹 u    杀害了 z!!      ?kind
importanceuT   ,你听见远处传来一声凄厉的惨叫,随即归于死寂——有人出事了!gffffff?u   ☠ u    在u   遇害u   ,被 rK   u    当场撞见!u)   ,无人在场目击,只剩一具尸体。u)   ☠ %s 在 %s 被 %s 杀害(目击者 %d)u   你对 u    下了手——但被 u    撞见了!u   你趁四下无人对 u-    下了手,无人目击,只剩一具尸体。)r   r.   r   r_   r   rf   r   ra   r   r!   re   popr   r   rY   r2   observeri   r   OBSERVATIONr    _narrrH   r4   r   rO   )	r(   r   pos	witnesseswr?   r   r-   r   s	   `     @@@r)   r   zWorld._apply_kill   s   c&.*<*<X*F*F*L"&M&Mv$$;;;;d.??776??e##>>>>ooooooo399;;ooo	!	&E!!&)))K64(((tz2F;<<< 	 	AKN!)):##%%^^e^^%^^TZ^^^
#**@S *    
 dk"" 	 	AEzzay00A%--z''))J'j.DQU .    	

3&33e333hq  8c7duzz)?T?T7d7d7d7d  xc  d  	e  	e  	eBFESXZ]^gZhZhiii 	_^V^^EJJy<Q<Q^^^^]]]]]r+   textc                n    | j                             | j                                        |d           dS )u<   记一笔剧情主线(关键事件),供左侧实时展示。)tr   N)r%   re   r   ri   r(   r   s     r)   r   zWorld._narr   s4    DJ$4$4$6$6EEFFFFFr+   r   ?)excluder   r   r   floatc                  t          | j                  D ]a}||k    rY| j        |         j                            | j                                         d| | j        j        t          j        |           bt          | j
                                                  D ]"}| j        |                             |           #dS )ug   把一条事件写进所有(除 exclude 外)在世 agent 的记忆,并散到各地点的即时事件。r   r   N)r    r   r2   r   r   ri   rY   r   r   setr   valuesr&   re   )r(   r   r   r   r6   r@   s         r)   _broadcast_allzWorld._broadcast_all   s    $$ 	H 	HCg~~C '//z''))22D22DJ4G#/J 0 H H H T^**,,-- 	) 	)ALO""4((((	) 	)r+   c                &   |                      d|j                   |                     d           | j                            | j        j        |f           t                              d|j        |j	        
                    d                     d S )NuX   灯光骤灭、一片漆黑骚乱——有人在搞破坏!众人惊呼着四散摸索。r   uF   💥 有人破坏电闸,全庄骤然陷入黑暗混乱,众人四散。u   %s 制造混乱:%smethod)r   r   r   r   re   r   rY   r4   r5   r   r_   )r(   r   s     r)   r   zWorld._apply_sabotage   s    v  AG  AM  	N  	N  	N

[\\\tz2F;<<<(&,8J8J88T8TUUUUUr+   c           
        |j         t          |j                            d          pd          }}t          |j                            d          pd          }| j                            |t                                                    |           |                     | d| d| |           | 	                    d| d| d|d d	                     | j
                            | j        j        |f           d S )
Nr   r   reasonu    当众指认 u    就是凶手!理由:r   u   🗣 u    是凶手:   )r   r.   r   r_   r"   rh   r   addr   r   r   re   r   rY   )r(   r   r   r   r   s        r)   r   zWorld._apply_accuse   s   c&.*<*<X*F*F*L"&M&MvV^''117R88##FCEE2266u===uYYFYYQWYYchiii

P5PPPP6#2#;PPQQQtz2F;<<<<<r+   c                    t           j                  }t          dt          |          dz  dz             } j                                        D ]\  }} fd|D             }| j        v rt          |          |k    r j                            |d           j        |<    j	        
                    |            j        |=  j                            |d                                d| dd	                                d
| d           t                              d|t          |                      dS dS )ue   过半在世者指认同一人 → 众人合力将其制服处决(可能误杀好人=囚徒困境)。   rN   c                &    g | ]}|j         v |S r<   r   )r>   r?   r(   s     r)   rB   z.World._resolve_accusations.<locals>.<listcomp>   s%    <<<!1+;+;A+;+;+;r+   ?Nu   众人一致认定 u'    是凶手,合力将其制服、处决!r   )r   u#   ⚖ 众人一致指认并处决了 !u#   ⚖ %s 被群体处决(指认者%d))r    r   maxrO   r"   ra   r   r_   r   r#   re   r   r   r   r4   r   )r(   alive	thresholdr   accuserslives   `     r)   _resolve_accusationszWorld._resolve_accusations   sS   T[!!3u::?Q.//	 $ 0 6 6 8 8 
	 
	FH<<<<x<<<D$$Ti)?)?$(N$6$6vs$C$C	&!$$V,,,K'""64000##$i&$i$i$ivy#zzz

JJJJKKKDfcRViiXXX
	 
	r+   c                D   |j         }t          |j                            d          pd          }t          |j                            d          pd          }|j                            dd          }| d| d| d}|d	k    r|                     |d
|            d S | j                            |          }| j                                        D ]'\  }}	||k    r|	|k    r|                     ||           (|"| j        |                             |           d S d S )Nr   r   contentchannelfaceu   对u   说:「r   phoneu   (电话))	r   r.   r   r_   _deliverr   ra   r&   re   )
r(   r   r   r   r   r   liner-   r?   r@   s
             r)   r   zWorld._route_speech   s=   ##D))/R00fn((339r::.$$Y7733B33w333gMM"///00000 N&&u--E,,.. + +1::!u**MM!T*** U#**400000 ! r+   c                   | j                             |j                  }t          |j                            d          pd          }|rs| j                            |          r[|r[|j        t          j	        k    rH| j                            |          j
                            t          |                     d S d S d S d S d S )Nitemr   r9   )r   r_   r   r.   r   r   r0   r   r
   r   rb   re   r   )r(   r   r-   r   s       r)   r   zWorld._apply_object   s    ""6<006>%%f--344 	GTX\\%(( 	GT 	GfkZEU6U6UHLL'..{/E/E/EFFFFF	G 	G 	G 	G 	G 	G6U6Ur+   c                    | j                             |          }|dS |j                            | j                                         d| | j        j        t          j                   dS )uL   把一条目击/收到的事件写进某 agent 的记忆(改变其状态)。Nr   )r   )	r   r_   r2   r   r   ri   rY   r   r   )r(   r6   r   r,   s       r)   r   zWorld._deliver   sg    {s##<Ftz//11::D::DJ<OV`Vlmmmmmr+   r   dtorderlist[str] | Nonec           	          j          _        t          t                     _         i  _        |pt           j                  } j        j        }|D ]'} j        |         j        	                    |           ( fd|D             } 
                    |||          }t           j                   _        |D ]}| j        vr j        |                             ||         ||         |          }	t                              d j        j         j        j        |||         j                   | ||||         |	                                              j                            |           dS )u   推进一步:同一轮所有 agent **并发**决策(基于同一时刻的环境快照),全部返回后
        **串行结算**(改世界/记忆),立刻可进下一轮。on_tick(aid, call, result) 供录制采集。c                <    i | ]}|                     |          S r<   )rs   )r>   r6   r(   s     r)   
<dictcomp>zWorld.step.<locals>.<dictcomp>  s'    ???3sDMM#..???r+   z[step d%d %.1fh] %s -> %sN)r&   r'   r   r    r"   r   r   rY   state
tick_needs_decide_alldictr   r   actr4   r5   dayrx   toolr   advance)
r(   r   r   on_tickaidsnowr6   perceptionscallsresults
   `         r)   stepz
World.step  sw    !L"4(()T[))j! 	2 	2CK"--b1111????$???  {C88 $T^ 4 4 	1 	1C$+%%[%))%*k#6FLLFKK3TZ^TZ_VY[`ad[e[jkkk"U3Z000!!###
2r+   r   	list[str]r   r   r   c                n   	
 ddl m	 	fdt          |          dk    rQ	  fd|D             S # t          $ r3}t                              d|           fd|D             cY d }~S d }~ww xY wddlm}  |t          d	t          |                    
          5 

 fd|D             }i }|D ]b}	 ||         	                    d          ||<   ## t          $ r3}t                              d||                        ||<   Y d }~[d }~ww xY w|cd d d            S # 1 swxY w Y   d S )Nr   ToolCallc                        ddd          S )Nwaitu   (一时走神/决策超时)u   (一时走神,没回过神来))r   r   thoughtr<   r   s   r)   <lambda>z#World._decide_all.<locals>.<lambda>  s#    888U,LN N N r+   rN   c                `    i | ]*}|j         |                             |                   +S r<   )r   decide)r>   r6   r   r   r(   s     r)   r   z%World._decide_all.<locals>.<dictcomp>!  s8    \\\PST[-44[5EsKK\\\r+   u   决策失败,降级发呆: %sc                &    i | ]}|             S r<   r<   )r>   r6   fallbacks     r)   r   z%World._decide_all.<locals>.<dictcomp>$  s!    888CXXZZ888r+   ThreadPoolExecutor   max_workersc                l    i | ]0}|                     j        |         j        |                   1S r<   )submitr   r   )r>   r6   exr   r   r(   s     r)   r   z%World._decide_all.<locals>.<dictcomp>'  s;    cccWZC4;s#3#:K<LcRRcccr+   Z   )timeoutu/   [%s] 决策超时/失败,本拍降级发呆: %s)
genesis.tools.baser   rO   	Exceptionr4   r   concurrent.futuresr   minr   )r(   r   r   r   er   futsoutr6   r   r   r   s   ` ``     @@@r)   r   zWorld._decide_all  s   //////N N N Nt99>>9\\\\\\W[\\\\ 9 9 9>BBB888848888888889 	:99999CCII,>,>??? 		2ccccccc^bcccDC * **#Cy///;;CHH  * * *NN#TVY[\]]]'xzzCHHHHHH* 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		sW   6 
A3 (A.(A3.A3#D*<CD*
D&)DD*DD**D.1D.stepsintc                T    t          |          D ]}|                     |           d S N)ranger   )r(   r  r   _s       r)   runz	World.run1  s2    u 	 	AIIbMMMM	 	r+   c                ,   g }| j                                         D ]d}| j                             |          }|j        p%d                    d |j        D                       pd}|                    | d| d           ed                    |          S )ur   共享世界认知:城里有哪些地方、能干嘛。所有 agent 都知道,据此把目标落到具体地点。rK   c              3  $   K   | ]}|j         V  d S r  r9   rI   s     r)   rU   zWorld.atlas.<locals>.<genexpr>:  s$      1L1LQ!&1L1L1L1L1L1Lr+   u   公共场所rD   rF   rR   )r   namesr_   descriptionrH   rb   re   )r(   partsr:   r@   purposes        r)   atlaszWorld.atlas5  s    HNN$$ 	/ 	/DT""Am^uzz1L1L!)1L1L1L'L'L^P^GLLD--7---....zz%   r+   c                    d                                   d fd}t           j                                                  }t	          |          dk    r|D ]} ||           dS ddlm}  |t          dt	          |                    	          5 }t          |                    ||                     ddd           dS # 1 swxY w Y   dS )
u^   每日清晨:确立人生目标(首次)+ 规划当天日程(L3),并发进行以加快启动。u(   这座城市里有这些可去的地点:u*   。安排日程时地点请从中选择。c                    | j         |                                  |                     j        j                   d S )N)context)ambitionset_ambitionplan_dayr   r   )r,   r  r(   s    r)   _planzWorld.plan_all.<locals>._planB  s=    }$!!###MM$*.'M:::::r+   rN   Nr   r   r   r   )	r  r    r   r   rO   r   r   r  r   )r(   r  mindsmr   r   r  s   `     @r)   plan_allzWorld.plan_all>  s<   uTZZ\\uuu	; 	; 	; 	; 	; 	;
 T[''))**u::??  aF999999CCJJ,?,?@@@ 	'Bu%%&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   $C

CCc                J    || _         t                              d|           d S )Nu   设定世界目标:%s)r   r4   r5   r   s     r)   set_world_goalzWorld.set_world_goalQ  s$    +T22222r+   r  c           
        fd| j                                         D             }|D ]\}| j        |         j                            | j                                         d| d| j        j        t          j	        d           ]rgn| j
                                        }|D ]%}| j        |                             d|            &|                     d|dd	                     | j                            | j        j        t!          t"          j        d
|d          f           t&                              d|pdt+          |                     t+          |          S )ut   注入一个世界事件(海啸/节日/内卷…),触达指定地点或全局的所有 agent。返回触达人数。c                *    g | ]\  }}|k    |S r  r<   )r>   r?   r@   r-   s      r)   rB   z)World.broadcast_event.<locals>.<listcomp>W  s'    WWWA5=AQVJJ1JJJr+   u   ,(世界事件)“u   ”r   r   u   (世界事件)u   〔事件〕N*   	__world__)eventr-   )r   r   u(   注入世界事件:%s @ %s,触达 %d 人u   全局)r   ra   r   r2   r   r   ri   rY   r   r   r   r  r&   re   r   r   r	   r
   r   r4   r5   rO   )r(   r  r-   targetsr6   placesr@   s     `    r)   broadcast_eventzWorld.broadcast_eventU  s   WWWW!5!5!7!7WWW 	 	CK#++:##%%IIIII
#+	 ,     "7%tx~~'7'7 	C 	CALO""#AK#A#ABBBB

4+crc"244555Z &):+;FQV1W1W#Y #Y #Y Z	
 	
 	
 	>UM^V^`cdk`l`lmmm7||r+   r  )r   r   r   r   r   r   )r,   r   r-   r.   r   r.   )r6   r.   r   r   )rA   r.   r6   r.   r   r.   )r6   r.   r   r.   )r   r.   r   r   )r   r	   r   r   )r   r	   r   r.   )r   r.   r   r   )r   r.   r   r.   r   r   r   r   )r   r	   r   r   )r   r   )r6   r.   r   r.   r   r   )r   NN)r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )r   )r  r  r   r   r   r   )r   r.   )r  r.   r-   r   r   r  )__name__
__module____qualname__r*   r7   rs   rd   r=   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r&  r<   r+   r)   r   r      s%       D D D D D$   '
 '
 '
 '
Rn n n n
; 
; 
; 
;0 0 0 0
   * ^  ^  ^  ^DG G G G ;=RU ) ) ) ) ) )V V V V= = = =    1 1 1 1$G G G Gn n n n    2   .    ! ! ! !' ' ' '&3 3 3 3      r+   r   N)__doc__
__future__r   collectionsr   genesis.agent.mindr   genesis.agent.perceptionr   genesis.memory.recordr   genesis.obs.logging_setupr   r   r	   r
   genesis.world.clockr   genesis.world.placer   r   r   r4   r   r<   r+   r)   <module>r3     s    # " " " " " # # # # # # ( ( ( ( ( ( . . . . . . , , , , , , 0 0 0 0 0 0 1 1 1 1 1 1 1 1 % % % % % % < < < < < < < < < <	G		P P P P P P P P P Pr+   