
    @i                        S r SSKrSSKJrJr  SSKr SSKrSSKJ	r	  Sr
SSKJr  \R                  " \5      r " S S	5      r " S
 S\
(       a  \	R&                  5      rg\5      rg! \ a    Sr
\R                  " S5         Nbf = f)z5Pattern encoder with learnable preference projection.    N)ListUnionTFz9PyTorch not available, PreferenceEncoder will be disabled)SentenceTransformerc                   `    \ rS rSrSrS
S\4S jjrS\\\\   4   S\	R                  4S jrSrg	)PatternEncoder   z:Base pattern encoder using sentence transformers (frozen).
model_namec                     [        U5      U l        U R                  R                  5       U l        [        R                  SU R                   35        g)zZInitialize pattern encoder.

Args:
    model_name: Name of the sentence transformer model
z*PatternEncoder initialized with dimension N)r   model get_sentence_embedding_dimensionembedding_dimloggerinfo)selfr	   s     D   /home/ubuntu/codebase/yexijia/保研/iCoLoc/src/embedding/encoder.py__init__PatternEncoder.__init__   s@     )4
!ZZHHJ@ASAS@TUV    textreturnc                     [        U[        5      (       a  U R                  R                  U5      $ U R                  R                  U5      $ )zEncode pattern text to vector.

Args:
    text: Pattern text (e.g., "Park Zoo") or list of patterns
    
Returns:
    Vector representation(s)
)
isinstancestrr   encode)r   r   s     r   r   PatternEncoder.encode!   s;     dC  ::$$T**::$$T**r   )r   r   N)z&sentence-transformers/all-MiniLM-L6-v2)__name__
__module____qualname____firstlineno____doc__r   r   r   r   npndarrayr   __static_attributes__ r   r   r   r      s7    DW3 W+5d3i0 +RZZ +r   r   c                      ^  \ rS rSrSrSS\S\S\4U 4S jjjrS rS\R                  S	\R                  4S
 jr
S\\R                  \R                  4   S	\R                  4S jrSrU =r$ )PreferenceEncoder0   zLearnable preference encoder for projecting embeddings to preference space.

Architecture:
    Linear(dim -> hidden) -> ReLU -> Linear(hidden -> dim) -> Normalize
	input_dim
hidden_dim
output_dimc                   > [         (       d  [        S5      e[        [        U ]  5         Uc  UnXl        X l        X0l        [        R                  " X5      U l
        [        R                  " 5       U l        [        R                  " X#5      U l        U R                  5         [        R!                  SU SU SU 35        g)zInitialize preference encoder.

Args:
    input_dim: Input embedding dimension
    hidden_dim: Hidden layer dimension
    output_dim: Output dimension (default: same as input_dim)
z)PyTorch is required for PreferenceEncoderNzPreferenceEncoder initialized: z -> )TORCH_AVAILABLEImportErrorsuperr&   r   r(   r)   r*   nnLinearfc1ReLUrelufc2_initialize_weightsr   r   )r   r(   r)   r*   	__class__s       r   r   PreferenceEncoder.__init__7   s     IJJ/1"J"$$ 99Y3GGI	99Z4 	  "5i[ZLPTU_T`abr   c                    [         R                  R                  U R                  R                  5        [         R                  R                  U R                  R                  5        [         R                  R                  U R                  R                  5        [         R                  R                  U R                  R                  5        g)zInitialize network weights.N)r/   initxavier_uniform_r1   weightzeros_biasr4   )r   s    r   r5   %PreferenceEncoder._initialize_weightsU   sf    
0
txx}}%
0
txx}}%r   xr   c                     U R                  U5      nU R                  U5      nU R                  U5      n[        R                  R
                  R                  USSS9nU$ )zForward pass.

Args:
    x: Input tensor of shape (batch_size, input_dim)
    
Returns:
    Projected and normalized tensor of shape (batch_size, output_dim)
      )pdim)r1   r3   r4   torchr/   
functional	normalize)r   r?   s     r   forwardPreferenceEncoder.forward\   sS     HHQKIIaLHHQK HH))!qa)8r   c                    [        U[        R                  5      (       a  [        R                  " U5      n[        UR                  5      S:X  a  UR                  S5      nU R                  5         [        R                  " 5          U R                  U5      nSSS5        WR                  S   S:X  a  UR                  S5      R                  5       $ UR                  5       $ ! , (       d  f       NP= f)zEncode input to preference space (for inference).

Args:
    x: Input array or tensor
    
Returns:
    Projected vector as numpy array
rB   r   N)r   r!   r"   rE   FloatTensorlenshape	unsqueezeevalno_gradrH   squeezenumpy)r   r?   outputs      r   r   PreferenceEncoder.encoden   s     a$$!!!$Aqww<1AA		]]_\\!_F  <<?a>>!$**,,<<>! _s   C!!
C/)r1   r4   r)   r(   r*   r3   )i     N)r   r   r   r   r    intr   r5   rE   TensorrH   r   r!   r"   r   r#   __classcell__)r6   s   @r   r&   r&   0   s{    c# c cPS c c<& %,, $"bjj%,,67 "BJJ " "r   r&   )r    rR   r!   typingr   r   loggingrE   torch.nnr/   r,   r-   warningsentence_transformersr   	getLoggerr   r   r   Moduleobjectr&   r$   r   r   <module>ra      s    ;   QO
 6			8	$+ +8T"_		 T"& T"K  QOOOOPQs   A& &BB