
    -ji1                        S SK Jr  S SKJr  S SKrS SKJr  S SKr\(       a  S SK	r
 " S S5      rS
S jrSS jr          SS	 jrg)    )annotations)	lru_cacheN)TYPE_CHECKINGc                     \ rS rSrSS jr\SS j5       rSS jrSS jrSS jr	  SS jr
SS jrSS	 jr\S S
 j5       r\S S j5       r\" SS9S!S j5       r\" SS9S"S j5       r\" SS9S"S j5       r\" SS9S#S j5       r\" SS9S$S j5       r\" SS9S$S j5       r\" SS9S"S j5       r      S%S jr      S%S jr      S&S jrSrg)'_FanovaTree   c                &   UR                   S   UR                  :X  d   eUR                   S   S:X  d   eXl        X l        U R	                  5       nU R                  5       u  pEU R                  5       nX0l        X@l        XPl	        X`l
        S U l        g )Nr         )shape
n_features_tree_search_spaces_precompute_statistics%_precompute_split_midpoints_and_sizes#_precompute_subtree_active_features_statistics_split_midpoints_split_sizes_subtree_active_features	_variance)selftreesearch_spaces
statisticssplit_midpointssplit_sizessubtree_active_featuress          Y/home/james-whalen/.local/lib/python3.13/site-packages/optuna/importance/_fanova/_tree.py__init___FanovaTree.__init__   s    ""1%888""1%***
+002
'+'Q'Q'S$"&"J"J"L% /'(?%    c                   U R                   c  [        R                  " [        R                  " U R                  R
                  5      S:  5      S   nU R                  U   nUS S 2S4   nUS S 2S4   n[        R                  " X4S9n[        R                  " X5-
  S-  US9nX`l         U R                   c   eU R                   $ )Nr   r
   weightsr   )r   npnonzeroarrayr   featurer   average)r   leaf_node_indicesr   valuesr%   average_valuesvariances          r   r.   _FanovaTree.variance    s    >>! "

288DJJ4F4F+G!+K LQ O))*;<J1%F A&GZZ@Nzz6#:q"@'RH%N~~)))~~r"   c                `   UR                   S:  d   eU Vs/ s H  o R                  U   PM     nnU Vs/ s H  o R                  U   PM     nn[        R                  " U6 n[        R                  " U6 n[
        R                  " U R                  [
        R                  [
        R                  S9n/ n/ n	[        XV5       H~  u  p[
        R                  " U
5      Xq'   U R                  U5      u  pU[        [
        R                  " U5      5      -  n[
        R                  " X5      n[
        R                  " X5      n	M     [
        R                   " U	5      n	[
        R                   " U5      n[
        R"                  " XS9n[
        R"                  " X-
  S-  U	S9nUS:  d   eU$ s  snf s  snf )Nr   )
fill_valuedtyper$   r           )sizer   r   	itertoolsproductr&   full_n_featuresnanfloat64zipr(   _get_marginalized_statisticsfloatprodappendasarrayr*   )r   featuresfselected_midpointsselected_sizesproduct_midpointsproduct_sizessampler,   r%   	midpointssizesvalueweightr-   r.   s                   r   get_marginal_variance!_FanovaTree.get_marginal_variance/   sg   }}q    AII133A6I8@A1++A.A%--/AB!))>:))bffBJJO+-,. #$5 EI!xx	2F ==fEMEeBGGEN++FYYv-Fii0G !F **W%F#F<::v61<gN35 JAs
   F&F+c                z   UR                   U R                  :X  d   e[        R                  " U5      nU) nU R                  R                  5       nSS/XB'   S/nU/n/ n/ n[        U5      S:  Gas  UR                  5       n	UR                  5       nU R                  U	5      n
U
S:  Ga  X   n[        R                  " U5      (       d}  XR                  U	5      ::  a#  U R                  U	5      nU R                  X5      nO"U R                  U	5      nU R                  X5      nUR                  U5        UR                  U5        M  [        U R                   U	   U   R#                  5       5      (       a=  U R%                  U	5       H%  nUR                  U5        UR                  U5        M'     GMO  UR                  U	5        UR                  U5        [        U5      S:  a  GMs  U R&                  U   nUS S 2S4   nUS S 2S4   n[)        U5      nUU-  n[        R*                  " UUS9nUR-                  5       nUU4$ )Nr3   g      ?r   r
   r$   )r4   r8   r&   isnanr   copylenpop_get_node_split_feature_get_node_split_threshold_get_node_left_child_get_node_left_child_subspaces_get_node_right_child_get_node_right_child_subspacesr?   anyr   tolist_get_node_childrenr   _get_cardinality_batchedr*   sum)r   feature_vectormarginalized_featuresactive_featuresr   active_nodesactive_search_spacesnode_indicesactive_leaf_search_spaces
node_indexr)   responsenext_node_indexnext_subspacechild_node_indexr   r,   r%   active_features_cardinalitiesrJ   rK   s                        r   r<   (_FanovaTree._get_marginalized_statisticsP   s:   ""d&6&6666 " 800 ++00203Sz, s -$&!,!#%))+J0446M22:>G!|)2xx))#A#A*#MM*.*C*CJ*O(,(K(K&) +/*D*DZ*P(,(L(L&) !''8(//> t44Z@QXXZ[[,0,C,CJ,O($++,<=,33MB -P  
+%,,];E ,!#H %%l3
AqD!QT"(@AZ([%99

673f}r"   c                l   U R                   n[        R                  " US4[        R                  S9n[        R                  " [        U5       Vs/ s H  nS PM     sn5      nU R                  US'   [        U5       H~  nXE   nU R                  U5      (       a#  U R                  U5      n[        U5      nXx/X%'   M@  [        U R                  U5      U R                  XV5      5       H  u  pXI   b   eXU	'   M     M     [        [        U5      5       H  nU R                  U5      (       a  M  / n/ nU R                  U5       H-  n	UR                  X)S4   5        UR                  X)S4   5        M/     [        R                  " XS9n[!        [        R"                  " U5      5      nXx/X%'   M     U$ s  snf )Nr   r2   r   r
   r$   )_n_nodesr&   emptyr:   r(   ranger   _is_node_leaf_get_node_value_get_cardinalityr;   r[   _get_node_children_subspacesreversedr?   r*   r=   r]   )r   n_nodesr   _	subspacesre   subspacerJ   rK   ri   child_subspacechild_valueschild_weightss                r   r   "_FanovaTree._precompute_statistics   s   -- XXwl"**=
HHE'N;NqdN;<	**	!  .J ,H!!*--,,Z8)(3*/
&8;++J755jK94$ %6>>>2@./9 )  #5>2J%%j11! "(,(?(?
(K$ ''
Q3F(GH!((a4G)HI )L 

<Grvvm45*/
& 3 ? <s   F1c           
     t   / n/ nU R                   n[        U R                  5       5       H  u  pE[        R                  " [        R
                  " X4S4   5      U[        R
                  " X4S4   5      45      nSUSS  US S -   -  nUSS  US S -
  nUR                  U5        UR                  U5        M     X4$ )Nr   r
   g      ?)r   	enumerate_compute_features_split_valuesr&   concatenate
atleast_1dr?   )r   rH   rI   r   r)   feature_split_valuesmidpointr4   s           r   r   1_FanovaTree._precompute_split_midpoints_and_sizes   s     	++-6t7Z7Z7\-])G#%>>MM-
";<(MM-
";<$  21269Mcr9RRSH'+.B3B.GGDX&LL .^ r"   c                   [        U R                  5       Vs/ s H  n[        5       PM     nn[        U R                  5       H@  nU R	                  U5      nUS:  d  M  U R                  U5      nX$   R                  U5        MB     / nU HP  n[        R                  " [        U5      [        R                  S9nUR                  5         UR                  U5        MR     U$ s  snf )Nr   rm   )rp   r8   setrn   rS   rT   addr&   r(   listr:   sortr?   )	r   rw   all_split_valuesre   r)   	thresholdsorted_all_split_valuessplit_valuessplit_values_arrays	            r   r   *_FanovaTree._compute_features_split_values   s    =B4CSCS=T-U=Tce=T-U.J22:>G!| :::F	 )--i8	 / 57,L!#$|*<BJJ!O##%#**+=> -
 '& .Vs   C!c                2   [         R                  " U R                  U R                  4SS9n[	        [        U R                  5      5       HI  nU R                  U5      nUS:  d  M  SXU4'   U R                  U5       H  nX==   UU   -  ss'   M     MK     U$ )NF)r1   r   T)r&   r7   rn   r8   ru   rp   rS   r[   )r   r   re   r)   ri   s        r   r   /_FanovaTree._precompute_subtree_active_features   s    "$''4==$:J:J*KX]"^"5#78J22:>G!|?C'G(;<(,(?(?
(K$+7;R(< 7 )L	 9 '&r"   c                ,    [        U R                  5      $ N)rQ   r   r   s    r   r8   _FanovaTree._n_features   s    4&&''r"   c                .    U R                   R                  $ r   )r   
node_countr   s    r   rn   _FanovaTree._n_nodes   s    zz$$$r"   N)maxsizec                :    U R                   R                  U   S:  $ )Nr   r   r)   r   re   s     r   rq   _FanovaTree._is_node_leaf   s    zz!!*-11r"   c                4    U R                   R                  U   $ r   )r   children_leftr   s     r   rU    _FanovaTree._get_node_left_child   s    zz''
33r"   c                4    U R                   R                  U   $ r   )r   children_rightr   s     r   rW   !_FanovaTree._get_node_right_child   s    zz((44r"   c                F    U R                  U5      U R                  U5      4$ r   )rU   rW   r   s     r   r[   _FanovaTree._get_node_children  s$    ((4d6P6PQ[6\\\r"   c                j    [        U R                  R                  U   R                  S5      S   5      $ )Nr   r   )r=   r   rJ   reshaper   s     r   rr   _FanovaTree._get_node_value  s.     TZZ%%j199"=a@AAr"   c                4    U R                   R                  U   $ r   )r   r   r   s     r   rT   %_FanovaTree._get_node_split_threshold  s    zz##J//r"   c                4    U R                   R                  U   $ r   r   r   s     r   rS   #_FanovaTree._get_node_split_feature  s    zz!!*--r"   c                V    [        USU R                  U5      U R                  U5      S9$ )Nr
   search_spaces_columnr)   r   _get_subspacesrS   rT   r   re   r   s      r   rV   *_FanovaTree._get_node_left_child_subspaces  3     !"00<44Z@	
 	
r"   c                V    [        USU R                  U5      U R                  U5      S9$ )Nr   r   r   r   s      r   rX   +_FanovaTree._get_node_right_child_subspaces  r   r"   c                F    U R                  X5      U R                  X5      4$ r   )rV   rX   r   s      r   rt   (_FanovaTree._get_node_children_subspaces(  s*     //
J00K
 	
r"   )r   r   r   r   r   r   r   )r   z'sklearn.tree._tree.Tree'r   
np.ndarrayreturnNone)r   r=   )rA   r   r   r=   )r^   r   r   ztuple[float, float])r   r   )r   z)tuple[list[np.ndarray], list[np.ndarray]])r   list[np.ndarray])r   int)re   r   r   bool)re   r   r   r   )re   r   r   ztuple[int, int])re   r   r   r=   )re   r   r   r   r   r   )re   r   r   r   r   ztuple[np.ndarray, np.ndarray])__name__
__module____qualname____firstlineno__r    propertyr.   rL   r<   r   r   r   r   r8   rn   r   rq   rU   rW   r[   rr   rT   rS   rV   rX   rt   __static_attributes__ r"   r   r   r      sv   "  B>@%N 	2 .'$' ( ( % % t2 2 t4 4 t5 5 t] ] tB B
 t0 0 t. .

.8
	


.8
	


.8
	&
r"   r   c                P    [         R                  " U S S 2S4   U S S 2S4   -
  5      $ )Nr
   r   )r&   r>   )r   s    r   rs   rs   1  s(    77=A&q!t)<<==r"   c                    [         R                  " U 5      n[         R                  " US S 2S S 2S4   US S 2S S 2S4   -
  SS9$ )Nr
   r   )axis)r&   r@   r>   )search_spaces_listr   s     r   r\   r\   5  s=    JJ12M77=Aq)M!Q',BBKKr"   c               <    [         R                  " U 5      nX4X!4'   U$ r   )r&   rP   )r   r   r)   r   search_spaces_subspaces        r   r   r   :  s$      WW]3<E789!!r"   )r   r   r   r=   )r   r   r   r=   )
r   r   r   r   r)   r   r   r=   r   r   )
__future__r   	functoolsr   r5   typingr   numpyr&   sklearn.treesklearnr   rs   r\   r   r   r"   r   <module>r      sa    "      `
 `
F	>L
""8;"FI"V[""r"   