
    yjQ
                     j    d Z ddlmZmZ ddlZddlmZ ddlm	Z	 erddl
mZmZ  G d d	e	          ZdS )
z,
Wrapper for sklearn's KDTree and BallTree.
    )TYPE_CHECKINGAnyN)NDArray   )SurprisalTreeBallTreeKDTreec            	            e Zd ZU dZeed<   eed<   eee	j
        e                           ed<   ded<   eed<   	 ddedededdf fdZde	j        ddfdZde	j        ddfdZddZde	j        defdZ xZS )SklearnTreeWrapperz
    Wrapper for sklearn's KDTree and BallTree with surprisal computation.
    Uses density estimation via k-nearest neighbors.
    	tree_typekpointszKDTree | BallTree | Nonetreetotal_pointskd   
   max_leaf_sizereturnNc                     t                                          |           || _        || _        g | _        d | _        d S )N)super__init__r   r   r   r   )selfr   r   r   	__class__s       I/DATA/AppData/hermes/projects/honcho/src/dreamer/trees/sklearn_wrapper.pyr   zSklearnTreeWrapper.__init__   s=     	'''"			    pointc                     | j                             |           | xj        dz  c_        |                                  d S )Nr   )r   appendr   _rebuild_tree)r   r   s     r   insertzSklearnTreeWrapper.insert(   sD    5!!!Qr   c                     | j                             |           | xj        t          |          z  c_        |                                  dS )zMore efficient batch insertion.N)r   extendr   lenr!   )r   r   s     r   batch_insertzSklearnTreeWrapper.batch_insert-   sJ    6"""S[[(r   c                    t          | j                  dk    rd S ddlm}m} t          j        | j                  }| j        dk    r ||          | _        d S | j        dk    r ||          | _        d S t          d| j                   )Nr   r   r   ballzUnknown tree type: )
r%   r   sklearn.neighborsr	   r
   nparrayr   r   
ValueError)r   r	   r
   points_arrays       r   r!   z SklearnTreeWrapper._rebuild_tree3   s    t{q  F	
 	
 	
 	
 	
 	
 	
 	

 35(4;2G2G>T!!|,,DIII^v%% ..DIIIC4>CCDDDr   c                    | j         t          | j                  | j        k     rt	          d          S t          | j        t          | j                            }| j                             |g|          \  }}t	          t          j        |d                             }|j	        d         }|t          j
        |dz             z  }|S )u   
        Compute surprisal using k-NN density estimation.
        S(e) ≈ log(V_k(e)) where V_k is the volume of k-ball
        Ninf)r   r   g|=)r   r%   r   r   floatminqueryr*   meanshapelog)r   r   k_actual	distances_indicesavg_distancedimsurprisal_values           r   	surprisalzSklearnTreeWrapper.surprisalD   s    
 9DK 0 046 9 9<<tvs4;//00"ioougoBB	8#BGIaL$9$9::k!n!$rvlU.B'C'C!Cr   )r   r   r   )r   N)__name__
__module____qualname____doc__str__annotations__intlistr   r*   floatingr   r   ndarrayr"   r&   r!   r0   r<   __classcell__)r   s   @r   r   r      sB         
 NNN
FFFS)*++++
$$$$ GI (+@C	     BJ 4    
2: $    E E E E"rz e        r   r   )r@   typingr   r   numpyr*   numpy.typingr   baser   r)   r	   r
   r    r   r   <module>rM      s     & % % % % % % %                              A A A A A A A A A Ar   