
    @i                     n   S r SSKrSSKJrJrJrJr  SSKr\R                  " \
5      rSS\\\4   S\S\R                  4S jjrS\R                  S	\R                  S\4S
 jr SS\R                  S	\R                  S\\   S\4S jjr  SS\\\\4      S	\R                  S\\   S\S\\   4
S jjrg)zAPreference scorer for ranking patterns based on user preferences.    N)ListDictAnyOptionalmemorydimreturnc                    U R                  S/ 5      nU R                  S/ 5      n[        U5      S:X  a%  [        U5      S:X  a  [        R                  " U5      $ [        U5      S:  a,  [        R                  " U5      n[        R
                  " USS9nO[        R                  " U5      n[        U5      S:  a,  [        R                  " U5      n[        R
                  " USS9nO[        R                  " U5      nXW-
  nU$ )a  Build user preference vector from memory.

Formula: u = mean(positive_vectors) - mean(negative_vectors)

Args:
    memory: User memory dictionary with 'positive' and 'negative' lists
    dim: Dimension of the embedding vectors
    
Returns:
    User preference vector (anchor vector)
positivenegativer   )axis)getlennpzerosarraymean)	r   r   r   r   pos_vectorsmean_posneg_vectorsmean_neguser_vectors	            D   /home/ubuntu/codebase/yexijia/保研/iCoLoc/src/preference/scorer.pybuild_user_vectorr   
   s     zz*b)Hzz*b)H
8}c(mq0xx} 8}qhhx(77;Q/88C= 8}qhhx(77;Q/88C= %K    pattern_vecuser_vecc                     [         R                  R                  U 5      n[         R                  R                  U5      nUS:  a#  US:  a  [         R                  " X5      X#-  -  nU$ SnU$ )zScore pattern using baseline method (cosine similarity).

Args:
    pattern_vec: Pattern embedding vector
    user_vec: User preference vector
    
Returns:
    Cosine similarity score
r           )r   linalgnormdot)r   r   pattern_norm	user_norm
similaritys        r   score_with_baseliner&   0   sa     99>>+.L		x(IaIMVVK2l6NO
  
r   modelc                 |   Uc  [        X5      $  SSKnUR                  U 5      R                  S5      nUR                  U5      R                  S5      nUR	                  5          U" U5      nU" U5      nSSS5        UR                  WSS9nUR                  WSS9n	US:  aK  U	S:  aE  UR                  UR                  5       UR                  5       5      X-  -  n
U
R                  5       n
U
$ Sn
U
$ ! , (       d  f       N= f! [         a.  n[        R                  SU S35        [        X5      s SnA$ SnAff = f)a  Score pattern using learned preference encoder model.

Args:
    pattern_vec: Pattern embedding vector
    user_vec: User preference vector
    model: Learned preference encoder model (PyTorch nn.Module)
    
Returns:
    Cosine similarity score after projection
Nr      )r   r   zError in model-based scoring: z, falling back to baseline)r&   torchFloatTensor	unsqueezeno_gradr!   r"   squeezeitem	Exceptionloggerwarning)r   r   r'   r*   pattern_tensoruser_tensorpattern_proj	user_projpattern_proj_normuser_proj_normr%   es               r   score_with_modelr:   E   s9    }";99: **;7AA!D''1;;A> ]]_ 0Lk*I 
 "JJ|J;I15q ^a%7<#7#7#99;L;L;NO!2J $*J  J! _$  :7s:TUV";99:s=   AD $C25A8D .D 2
D <D 
D;#D60D;6D;patternsalphac                     / nU  He  nUR                  S5      nUc  SnOUb  [        XaU5      nO[        Xa5      nUR                  SS5      nX7-  SU-
  U-  -   n	UR                  U	5        Mg     U$ )ab  Score patterns with preference and confidence fusion.

Final score = alpha * preference_score + (1 - alpha) * confidence

Args:
    patterns: List of pattern dictionaries
    user_vec: User preference vector
    model: Optional learned preference encoder model
    alpha: Weight for preference score (default: 0.7)
    
Returns:
    List of final scores
	embeddingr   
confidencer)   )r   r:   r&   append)
r;   r   r'   r<   scorespatternr   preference_scorer?   final_scores
             r   score_patternsrE   t   s    " Fkk+."  #3K5#Q  $7{#M  [[s3
 .!e)z1IIk"+ . Mr   )i  )N)Ngffffff?)__doc__numpyr   typingr   r   r   r   logging	getLogger__name__r1   strintndarrayr   floatr&   r:   rE    r   r   <module>rQ      s    G  , , 			8	$#d38n #3 # #LRZZ 2:: % , -1,:"** ,:

 ,:$SM,:5:,:b *.!$*T$sCx.1 *JJ*!#* * *.e*r   