
    @i                         d Z ddlZddlmZmZ ddlZ	 ddlZddlm	Z	 dZ
ddlmZ  ej                  e      Z G d d	      Z G d
 de
re	j&                        Zye      Zy# e$ r dZ
 ej                  d       Y \w xY w)z5Pattern encoder with learnable preference projection.    N)ListUnionTFz9PyTorch not available, PreferenceEncoder will be disabled)SentenceTransformerc                   R    e Zd ZdZddefdZdeeee   f   dej                  fdZ
y)	PatternEncoderz:Base pattern encoder using sentence transformers (frozen).
model_namec                     t        |      | _        | j                  j                         | _        t        j                  d| j                          y)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     H   /home/ubuntu/codebase/yexijia/保研/colocation_mvp/embedding/encoder.py__init__zPatternEncoder.__init__   s@     )4
!ZZHHJ@ASAS@TUV    textreturnc                     t        |t              r| j                  j                  |      S | j                  j                  |      S )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   zPatternEncoder.encode!   s8     dC ::$$T**::$$T**r   N)z&sentence-transformers/all-MiniLM-L6-v2)__name__
__module____qualname____doc__r   r   r   r   npndarrayr    r   r   r   r      s7    DW3 W+5d3i0 +RZZ +r   r   c                        e Zd ZdZddededef fdZd Zdej                  dej                  fd	Z	de
ej                  ej                  f   dej                  fd
Z xZS )PreferenceEncoderzLearnable preference encoder for projecting embeddings to preference space.
    
    Architecture:
        Linear(dim -> hidden) -> ReLU -> Linear(hidden -> dim) -> Normalize
    	input_dim
hidden_dim
output_dimc                 x   t         st        d      t        t        |           ||}|| _        || _        || _        t        j                  ||      | _
        t        j                         | _        t        j                  ||      | _        | j                          t        j!                  d| d| d|        y)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   zPreferenceEncoder.__init__7   s     IJJ/1"J"$$ 99Y
3GGI	99Z4 	  "5i[ZLPTU_T`abr   c                    t         j                  j                  | j                  j                         t         j                  j                  | j                  j                         t         j                  j                  | j                  j                         t         j                  j                  | j                  j                         y)zInitialize network weights.N)r)   initxavier_uniform_r+   weightzeros_biasr.   )r   s    r   r/   z%PreferenceEncoder._initialize_weightsU   sf    
0
txx}}%
0
txx}}%r   xr   c                     | j                  |      }| j                  |      }| j                  |      }t        j                  j
                  j                  |dd      }|S )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)r+   r-   r.   torchr)   
functional	normalize)r   r7   s     r   forwardzPreferenceEncoder.forward\   sS     HHQKIIaLHHQK HH))!qa)8r   c                    t        |t        j                        rt        j                  |      }t        |j                        dk(  r|j                  d      }| j                          t        j                         5  | j                  |      }ddd       j                  d   dk(  r|j                  d      j                         S |j                         S # 1 sw Y   JxY w)zEncode input to preference space (for inference).
        
        Args:
            x: Input array or tensor
            
        Returns:
            Projected vector as numpy array
        r:   r   N)r   r   r   r=   FloatTensorlenshape	unsqueezeevalno_gradr@   squeezenumpy)r   r7   outputs      r   r   zPreferenceEncoder.encoden   s     a$!!!$Aqww<1AA		]]_\\!_F  <<?a>>!$**,,<<>! _s   =CC!)i     N)r   r   r   r   intr   r/   r=   Tensorr@   r   r   r   r   __classcell__)r0   s   @r   r!   r!   0   sp    c# c cPS c<& %,, $"bjj%,,67 "BJJ "r   r!   )r   rI   r   typingr   r   loggingr=   torch.nnr)   r&   r'   warningsentence_transformersr   	getLoggerr   r   r   Moduleobjectr!   r   r   r   <module>rW      s    ;   QO
 6			8	$+ +8T"_		 T"& T"K  QOGOOOPQs   A! !A=<A=