
    (j	                        d Z ddlmZ ddlmZ ddlmZ e G d d                      Ze G d d                      Ze G d	 d
                      Z	d#d$dZ
d%dZd&dZ	 d'ddd(d"ZdS ))ux  Stanford 式记忆检索打分:relevance × recency × importance 加权后排序。

为什么三者都要:只按相关性会忽略"刚发生的小事"和"一生大事";recency 用指数衰减
模拟遗忘,importance 让里程碑事件不被淹没。三个分量先各自 min-max 归一再加权,
与原论文一致。权重/衰减是可调旋钮(PRD §12 TODO 待校准)。
    )annotations)	dataclass)Anyc                  :    e Zd ZU dZded<   dZded<   dZded<   dS )RetrievalWeights      ?float	relevancerecency
importanceN)__name__
__module____qualname__r
   __annotations__r   r        3/root/genesis-world/src/genesis/memory/retrieval.pyr   r      sE         IGJr   r   c                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )	Candidater   itemr	   r
   r   r   Nr   r   r   r   r   r   r   r   r      s<         IIINNNr   r   c                  $    e Zd ZU ded<   ded<   dS )Rankedr   r   r	   totalNr   r   r   r   r   r      s"         IIILLLLLr   r   Gz?elapsed_hoursr	   decayreturnc                    | dk    rdS || z  S )uM   指数衰减:距上次访问越久分越低。elapsed<=0 视为最新(1.0)。r   r   r   )r   r   s     r   recency_scorer    #   s    s-r   valueslist[float]c                    t          |           t          |           cz
  dk     rd | D             S fd| D             S )Ng&.>c                    g | ]}d S )r   r   ).0_s     r   
<listcomp>z_minmax.<locals>.<listcomp>-   s    $$$$$$r   c                &    g | ]}|z
  z
  z  S r   r   )r%   vhilos     r   r'   z_minmax.<locals>.<listcomp>.   s&    111QQVR 111r   )minmax)r!   r*   r+   s    @@r   _minmaxr.   *   sY    [[#f++FB	Bw~~$$V$$$$11111&1111r   r
   r   r   weightsc                B    |j         | z  |j        |z  z   |j        |z  z   S N)r
   r   r   )r
   r   r   r/   s       r   combiner2   1   s3     	I%
/G
#	$

z
)	*r   NT)	normalize
candidateslist[Candidate]RetrievalWeights | Noner3   boollist[Ranked]c               B   | sg S pt                      d | D             }d | D             }d | D             }|r-t          |          t          |          t          |          }}}fdt          | |||          D             }|                    d d           |S )ua   对候选记忆打分排序(降序)。normalize=False 时跳过 min-max(便于精确测分量)。c                    g | ]	}|j         
S r   )r
   r%   cs     r   r'   zrank.<locals>.<listcomp>E   s    ,,,AAK,,,r   c                    g | ]	}|j         
S r   )r   r;   s     r   r'   zrank.<locals>.<listcomp>F   s    ***!AI***r   c                    g | ]	}|j         
S r   )r   r;   s     r   r'   zrank.<locals>.<listcomp>G   s    ---QAL---r   c                d    g | ],\  }}}}t          |j        t          |||                    -S r   )r   r   r2   )r%   r<   rrcimr/   s        r   r'   zrank.<locals>.<listcomp>J   sK       Aq"b 	qvwq"b'2233  r   c                    | j         S r1   )r   )xs    r   <lambda>zrank.<locals>.<lambda>N   s    ag r   T)keyreverse)r   r.   zipsort)r4   r/   r3   relsrecsimpsrankeds    `     r   rankrN   ;   s      	+)++G,,,,,D**z***D--*---D G"4=='$--Dd   
D$==  F KK%%tK444Mr   )r   )r   r	   r   r	   r   r	   )r!   r"   r   r"   )
r
   r	   r   r	   r   r	   r/   r   r   r	   r1   )r4   r5   r/   r6   r3   r7   r   r8   )__doc__
__future__r   dataclassesr   typingr   r   r   r   r    r.   r2   rN   r   r   r   <module>rS      s[    # " " " " " ! ! ! ! ! !                              
         2 2 2 2    (, 	       r   