
    @i                     `   d Z ddlZddlmZmZmZmZ ddlZ ej                  e
      Zddeeef   dedej                  fdZdej                  d	ej                  defd
Z	 ddej                  d	ej                  dee   defdZ	 	 ddeeeef      d	ej                  dee   dedee   f
dZy)zAPreference scorer for ranking patterns based on user preferences.    N)ListDictAnyOptionalmemorydimreturnc                    | j                  dg       }| j                  dg       }t        |      dk(  r#t        |      dk(  rt        j                  |      S t        |      dkD  r-t        j                  |      }t        j
                  |d      }nt        j                  |      }t        |      dkD  r-t        j                  |      }t        j
                  |d      }nt        j                  |      }||z
  }|S )aD  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	            H   /home/ubuntu/codebase/yexijia/保研/colocation_mvp/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= X%K    pattern_vecuser_vecc                     t         j                  j                  |       }t         j                  j                  |      }|dkD  r#|dkD  rt        j                  | |      ||z  z  }|S d}|S )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   se     99>>+.L		x(IaIMVVK2lY6NO
  
r   modelc                 |   |t        | |      S 	 ddl}|j                  |       j                  d      }|j                  |      j                  d      }|j	                         5   ||      } ||      }ddd       |j                  d      }|j                  d      }	|dkD  rK|	dkD  rF|j                  |j                         |j                               ||	z  z  }
|
j                         }
|
S d}
|
S # 1 sw Y   xY w# t        $ r/}t        j                  d| d       t        | |      cY d}~S d}~ww xY w)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   s?    }";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!N2J $*J  J! _$  :7s:TUV";99:s=   AD $C75A=D 3D 7D <D 	D;$D60D;6D;patternsalphac                     g }| D ]e  }|j                  d      }|d}n|t        |||      }nt        ||      }|j                  dd      }||z  d|z
  |z  z   }	|j                  |	       g |S )a  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+."  #3K5#Q  $7{H#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   