
    yj0                     z    d Z ddlmZmZ ddlZddlmZmZ e G d de                      Z	 G d d	e          Z
dS )
z
Cover Tree implementation.
    )	dataclassfieldN   )SurprisalTreeTreeNodec                   n    e Zd ZU dZdZej        dz  ed<   dZe	ed<    e
e          Zed          ed<   dS )	CoverNodez4Node for Cover Tree with point, scale, and children.Npoint        scale)default_factorychildren)__name__
__module____qualname____doc__r
   npndarray__annotations__r   floatr   listr        C/DATA/AppData/hermes/projects/honcho/src/dreamer/trees/covertree.pyr	   r	      sa         >>#E2:###E5"'%"="="=Hd;=====r   r	   c                        e Zd ZU dZeed<   edz  ed<   eed<   ddeded	df fd
Zde	j
        d	dfdZdede	j
        ded	dfdZde	j
        d	efdZ xZS )	CoverTreezm
    Cover Tree implementation with surprisal computation.
    Organizes points hierarchically by scale.
    baseNroottotal_points       @
   max_leaf_sizereturnc                 f    t                                          |           || _        d | _        d S )N)super__init__r   r   )selfr   r"   	__class__s      r   r&   zCoverTree.__init__   s-    '''				r   r
   c                     | j         t          |dd          | _         n&|                     | j         || j         j                   | xj        dz  c_        d S )Nr   r   r
   r   count)r   r	   _insert_recursiver   r   )r'   r
   s     r   insertzCoverTree.insert$   sZ    9!SBBBDII""49eTY_EEEQr   noder   c                    |xj         dz  c_         t          t          j                            |j        |z
                      }| j        |z  }||k    r|j        D ]f}t          t          j                            |j        |z
                      }| j        |dz
  z  }||k    r|                     |||dz
              dS gt          ||dz
  d          }	|j        
                    |	           dS |dz   }
t          |j        |
|j         dz             }|g|_        t          ||d          }|j        
                    |           || _        dS )z{
        Insert point into cover tree recursively.
        Fixed to ensure proper tree structure and varied paths.
        r   Nr*   )r+   r   r   linalgnormr
   r   r   r,   r	   appendr   )r'   r.   r
   r   distcover_radiuschild
child_distchild_radius	new_child	new_scalenew_rootnew_siblings                r   r,   zCoverTree._insert_recursive+   sf    	

a

RY^^DJ$67788y%'<  "29>>%+2E#F#FGG
#yUQY7--**5%CCCFF . "UQYaHHHIM  +++++	I j	a  H "&H#%uAFFFK$$[111 DIIIr   c                 R   | j         t          d          S d}| j         }|j        rd}t          d          }|j        D ]@}t          t          j                            |j        |z
                      }||k     r|}|}A|n7|j        }|j        }	|	|z  }
|t          j        |
dz              z  }|}|j        t          t          j                            |j        |z
                      }t          |          }|t          j        |dz             z  }t          ||z             S )z
        Compute surprisal based on path through cover tree.
        Uses combination of branch probabilities and distance to final node.
        Ninfr   g|=g{Gz?)
r   r   r   r   r0   r1   r
   r+   loglen)r'   r
   surprisal_valuer.   
best_child	best_distr5   r3   parent_countchild_countp_branchdist_to_repdimdistance_surprisals                 r   	surprisalzCoverTree.surprisalM   s3   
 9<<)m 	+/JeI ' 'RY^^EK%,?@@AA)## $I!&J!:L$*K"\1Hx%'7 8 888OD' m 	* BINN4:+=>>??%jj 26+*<#=#==_'99:::r   )r    r!   )r   r   r   r   r   r   r	   intr&   r   r   r-   r,   rI   __classcell__)r(   s   @r   r   r      s
         
 KKK
d
 U  d      
BJ 4     ! !&(j !9> !	 !  !  !  !D%;rz %;e %; %; %; %; %; %; %; %;r   r   )r   dataclassesr   r   numpyr   r   r   r   r	   r   r   r   r   <module>rN      s     ) ( ( ( ( ( ( (     ) ) ) ) ) ) ) ) > > > > > > > >]; ]; ]; ]; ]; ]; ]; ]; ]; ];r   