
    i
                     `    d Z ddlZddlmZmZmZmZ  ej                  e      Z	 G d d      Z
y)zUser simulator for evaluation.    N)DictListSetAnyc                   z    e Zd ZdZ	 ddee   dee   dz  fdZdeeef   de	fdZ
d	eeeef      dee	e	f   fd
Zy)UserSimulatorz-Simulates a user with predefined preferences.Nliked_featuresdisliked_featuresc                     || _         |xs
 t               | _        t        j	                  d| j                    d| j                          y)zInitialize user simulator.
        
        Args:
            liked_features: Set of feature types the user likes
            disliked_features: Set of feature types the user dislikes (optional)
        z!UserSimulator initialized: liked=z, disliked=N)likedsetdislikedloggerinfo)selfr	   r
   s      K   /home/ubuntu/codebase/yexijia/保研/colocation_mvp/experiment/simulator.py__init__zUserSimulator.__init__   s;     $
)2SU7

|;t}}o^_    patternreturnc                      |j                  dg       }t        |t              r|j                  d      }t	         fd|D              }|syt	         fd|D              }|r|sd}|S d}|S )a  Label a pattern based on ground truth preferences.
        
        A pattern is liked iff:
        - contains at least one liked feature
        - does not contain any disliked feature
        
        If a pattern does not contain any liked feature, it is marked as not interested (0).
        
        Args:
            pattern: Pattern dictionary with 'pattern' key containing list of features
            
        Returns:
            1 if pattern is liked, 0 if not interested or disliked
        r   ,c              3   :   K   | ]  }|j                   v   y wN)r   .0featurer   s     r   	<genexpr>z.UserSimulator.label_pattern.<locals>.<genexpr>/   s     N=M'4::-=M   r   c              3   :   K   | ]  }|j                   v   y wr   )r   r   s     r   r   z.UserSimulator.label_pattern.<locals>.<genexpr>6   s     TCS7dmm3CSr      )get
isinstancestrsplitany)r   r   pattern_features	has_likedhas_dislikedlabels   `     r   label_patternzUserSimulator.label_pattern   s|     #;;y"5&,/55c: N=MNN	  TCSTT   <=r   patternsc                     i }t        |      D ]  \  }}| j                  |      ||<    t        d |j                         D              }t        j                  d| dt        |       d       |S )zBuild ground truth labels for all patterns.
        
        Args:
            patterns: List of pattern dictionaries
            
        Returns:
            Dictionary mapping pattern index to label (0 or 1)
        c              3   ,   K   | ]  }|d k(  s	d   yw)r!   N )r   vs     r   r   z3UserSimulator.build_ground_truth.<locals>.<genexpr>I   s     E%:a1f!%:s   
zBuilt ground truth: /z patterns liked)	enumerater+   sumvaluesr   r   len)r   r,   ground_truthidxr   liked_counts         r   build_ground_truthz UserSimulator.build_ground_truth<   sr     %h/LC $ 2 27 ;L 0 E\%8%8%:EE*;-qXWXr   r   )__name__
__module____qualname____doc__r   r$   r   r   r   intr+   r   r9   r/   r   r   r   r   	   st    7
 .2`C` s8d?`T#s(^  B4S#X+? DcN r   r   )r=   loggingtypingr   r   r   r   	getLoggerr:   r   r   r/   r   r   <module>rB      s/    $  ' '			8	$B Br   