
    ӆhȒ                    J   S SK Jr  S SKrS SKrS SKJrJr  S SKJrJ	r	J
r
  S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJrJr  SSKJr  SSKJr  SS	KJr  \" S
5      r\ " S S5      5       r " S S\ 5      r! " S S\!S9r"SS jr#SS jr$S r%SS jr& " S S5      r'SS jr(S r)g)    )annotationsN)	dataclassfield)AnyCallablecast)AliasObjSlicer   )hclust_ordering)DimensionError)OpChainzshap.Explanationc                  `    \ rS rSr% SrS\S'   S\S'   SrS\S	'   \" \S
9r	S\S'   Sr
S\S'   Srg)OpHistoryItem   z<An operation that has been applied to an Explanation object.strnametuple[int, ...]
prev_shape ztuple[Any, ...]args)default_factoryzdict[str, Any]kwargsFboolcollapsed_instancesN)__name__
__module____qualname____firstlineno____doc____annotations__r   r   dictr   r   __static_attributes__r       dC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\shap/_explanation.pyr   r      s4    F
ID/"48FN8 %%r%   r   c                      \ rS rSrSrS r\SS j5       r\SS j5       r\SS j5       r	\SS j5       r
\SS j5       r\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       r\SS j5       rSrg)MetaExplanation"   z^This metaclass exposes the Explanation object's class methods for creating template op chains.c                ,    [         R                  U5      $ N)op_chain_root__getitem__)clsitems     r&   r-   MetaExplanation.__getitem__%   s    ((..r%   c                "    [         R                  $ )zElement-wise absolute value op.)r,   absr.   s    r&   r2   MetaExplanation.abs(           r%   c                "    [         R                  $ )zA no-op.)r,   identityr3   s    r&   r7   MetaExplanation.identity-   s     %%%r%   c                "    [         R                  $ )zNumpy style argsort.)r,   argsortr3   s    r&   r:   MetaExplanation.argsort2   s     $$$r%   c                "    [         R                  $ )zNumpy style flip.)r,   flipr3   s    r&   r=   MetaExplanation.flip7        !!!r%   c                "    [         R                  $ )zNumpy style sum.)r,   sumr3   s    r&   rA   MetaExplanation.sum<   r5   r%   c                "    [         R                  $ )zNumpy style max.)r,   maxr3   s    r&   rD   MetaExplanation.maxA   r5   r%   c                "    [         R                  $ )zNumpy style min.)r,   minr3   s    r&   rG   MetaExplanation.minF   r5   r%   c                "    [         R                  $ )zNumpy style mean.)r,   meanr3   s    r&   rJ   MetaExplanation.meanK   r?   r%   c                "    [         R                  $ )zNumpy style sample.)r,   sampler3   s    r&   rM   MetaExplanation.sampleP        ###r%   c                "    [         R                  $ )zHierarchical clustering op.)r,   hclustr3   s    r&   rQ   MetaExplanation.hclustU   rO   r%   r   N)returnr   )r   r   r   r    r!   r-   propertyr2   r7   r:   r=   rA   rD   rG   rJ   rM   rQ   r$   r   r%   r&   r(   r(   "   s    h/ ! ! & & % % " " ! ! ! ! ! ! " " $ $ $ $r%   r(   c                     \ rS rSrSr              S:S jr\S 5       r\R                  S 5       r\S 5       r	\	R                  S 5       r	\S	 5       r
\
R                  S
 5       r
\S 5       r\R                  S 5       r\S 5       r\S 5       r\R                  S 5       r\S 5       r\S 5       r\R                  S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\R                  S 5       r\S 5       r\R                  S 5       r\S 5       r\R                  S 5       rS rS;S jr\S<S j5       rS rS;S  jrS! rS" rS# rS$ rS% rS& r S' r!S( r"S) r#\S* 5       r$\S+ 5       r%\S, 5       r&\S- 5       r'S=S. jr(S=S/ jr)S=S0 jr*S>S?S1 jjr+S@S;S2 jjr,SASBS3 jjr-SCSDS4 jjr.SES5 jr/SFS6 jr0SGS7 jr1S8 r2S9r3g)HExplanation[   aH  A sliceable set of parallel arrays representing a SHAP explanation.

Notes
-----
The *instance* methods such as `.max()` return new Explanation objects with the
operation applied.

The *class* methods such as `Explanation.max` return OpChain objects that represent
a set of dot chained operations without actually running them.
Nc                :   / U l         Xl        [        U[        5      (       a&  UnUR                  nUR
                  nUR                  n[        XX75      U l        [        U5      nUcS  [        U R                  5      S:X  a:  UU R                  S      nUc   S5       e[        U5       Vs/ s H  nSU 3PM
     nn[        [        U5      5      S:X  am  [        U5      S:  a(  [        U5      US   :X  a  [        [        U5      S5      nO6[        U5      S:  a'  [        U5      US   :X  a  [        [        U5      S5      n[        [        U5      5      S:X  a"  [        [        U5      U R                  S   5      nUb  [        U[        5      (       dl  [        [        U5      5      nUS:X  a  OQUS:X  a  [        XpR                  5      nO5US:X  a$  [        US/[        U R                  5      -   5      nO[        S5      e[!        US5      (       a  [        U5      S:X  a  On[        [        U5      5      [        U R                  5      :X  a   [        U[        U R                  5      5      nO#[        US/[        U R                  5      -   5      n[#        UU[%        U5      [%        U5      Uc  S O[        US5      UUUc  S OU R                  U4[%        U	5      [%        U
5      [%        U5      [%        U5      [%        U5      Uc  S O[        US/5      S9U l        g s  snf )	Nr   r   zUnexpected shape of valueszOutput    zKshap.Explanation does not yet support output_names of order greater than 3!__len__valuesbase_valuesdatadisplay_datainstance_namesfeature_namesoutput_namesoutput_indexeslower_boundsupper_bounds	error_stdmain_effectshierarchical_values
clustering)
op_historycompute_time
isinstancerV   r\   r]   r^   compute_output_dimsoutput_dims_compute_shapelenranger	   listr
   
ValueErrorhasattrr   	list_wrap_s)selfr\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rk   evalues_shape	num_namesioutput_names_orders                        r&   __init__Explanation.__init__g   s   $ 02( fk**AXXF--K66D.vDW%f-C(8(8$9Q$>$T%5%5a%89I(F*FF(383CD3CagaSM3CLD }-.!3< A%#m*<Q*O %d=&91 =\"a'C,>,q/,Q %d=&91 = |,-2 l!3T5E5Ea5HIL #J|U,K,K!$^L%A!B!Q&#q("<1A1AB#q("<!tD<L<L7M1MN !noo{I..#k2Ba2G,-T5E5E1FFk40@0@+ABKkA3d6F6F1G+GHK#4"<0#1#94u^UV?W'%#1#94@P@PR`?a"<0"<0	*"<0 )*= >)1ts:s7K
K Es   *Lc                .    U R                   R                  $ z/Pass-through from the underlying slicer object.rv   r\   rw   s    r&   r\   Explanation.values   s     ww~~r%   c                $    XR                   l        g r+   r   )rw   
new_valuess     r&   r\   r      s    #r%   c                .    U R                   R                  $ r   rv   r]   r   s    r&   r]   Explanation.base_values   s     ww"""r%   c                $    XR                   l        g r+   r   )rw   new_base_valuess     r&   r]   r      s    -r%   c                .    U R                   R                  $ r   rv   r^   r   s    r&   r^   Explanation.data   s     ww||r%   c                $    XR                   l        g r+   r   )rw   new_datas     r&   r^   r      s    r%   c                .    U R                   R                  $ r   )rv   r_   r   s    r&   r_   Explanation.display_data        ww###r%   c                z    [        U[        R                  5      (       a  UR                  nXR                  l        g r+   )rl   pd	DataFramer\   rv   r_   )rw   new_display_datas     r&   r_   r      s*    &55/66/r%   c                .    U R                   R                  $ r   )rv   r`   r   s    r&   r`   Explanation.instance_names        ww%%%r%   c                .    U R                   R                  $ r   rv   rb   r   s    r&   rb   Explanation.output_names   r   r%   c                $    XR                   l        g r+   r   )rw   new_output_namess     r&   rb   r          /r%   c                .    U R                   R                  $ r   )rv   rc   r   s    r&   rc   Explanation.output_indexes   r   r%   c                .    U R                   R                  $ r   rv   ra   r   s    r&   ra   Explanation.feature_names   s     ww$$$r%   c                $    XR                   l        g r+   r   )rw   new_feature_namess     r&   ra   r      s     1r%   c                .    U R                   R                  $ r   )rv   rd   r   s    r&   rd   Explanation.lower_bounds  r   r%   c                .    U R                   R                  $ r   )rv   re   r   s    r&   re   Explanation.upper_bounds	  r   r%   c                .    U R                   R                  $ r   )rv   rf   r   s    r&   rf   Explanation.error_std  s     ww   r%   c                .    U R                   R                  $ r   rv   rg   r   s    r&   rg   Explanation.main_effects  r   r%   c                $    XR                   l        g r+   r   )rw   new_main_effectss     r&   rg   r     r   r%   c                .    U R                   R                  $ r   rv   rh   r   s    r&   rh   Explanation.hierarchical_values  s     ww***r%   c                $    XR                   l        g r+   r   )rw   new_hierarchical_valuess     r&   rh   r   !  s    &=#r%   c                .    U R                   R                  $ r   rv   ri   r   s    r&   ri   Explanation.clustering%  s     ww!!!r%   c                $    XR                   l        g r+   r   )rw   new_clusterings     r&   ri   r   *  s    +r%   c                    SU R                   < 3nU R                  b  USU R                  < 3-  nU R                  b  USU R                  < 3-  nU$ )z6Display some basic printable info, but not everything.z
.values =
z

.base_values =
z


.data =
)r\   r]   r^   )rw   outs     r&   __repr__Explanation.__repr__/  s[    DKK?+')$*:*:)=>>C99 ]499-00C
r%   c                   Sn[        U[        5      (       d  U4nSnU GH<  nUS-  nU[        L a&  U[        U R                  5      [        U5      -
  -  nM8  Un[        U[
        5      (       a  UR                  U 5      n[        U[        R                  [        R                  45      (       a  [        U5      nGO&[        U[        R                  5      (       a  U Vs/ s H  n[        U5      PM     nnGO[        U[        5      (       a  UR                  nGO[        U[        5      (       Ga  / nSU R                  R                   ;   a$  U R                  R                   S   R"                  nO=SU R                  R$                  ;   a#  U R                  R$                  S   R"                  nUS:w  Ga*  X7;   Ga$  [        U5      S:X  a?  [        R&                  " [        R(                  " U R*                  5      U:H  5      S   S   nGO[        U5      S:X  Ga  / n/ n	/ n
[,        R.                  " U 5      n[1        U R                  5       H  u  p[1        U R*                  U   5       H  u  pX:X  d  M  UR3                  [        R(                  " USS2U4   5      5        U
R3                  [        R(                  " U R4                  U   5      5        U	R3                  U R6                  U   U   5        M     M     [        [        R(                  " U5      [        R(                  " U	5      [        R(                  " U
5      U R8                  U R:                  [        R(                  " U
5      UU R<                  U R>                  U R@                  U RB                  U RD                  U RF                  U RH                  S9n[,        R,                  " U RJ                  5      Ul%        / nSU R                  R                   ;   a#  U R                  R                   S   R"                  nUS:w  a  X>;   a  [        U5      S:X  a  / n/ n
[1        U R                  5       H^  u  p[M        U RN                  U   XR4                  U   5       H/  u  pnX:X  d  M  UR3                  U5        U
R3                  U5        M1     M`     [,        R.                  " U 5      nXl        Xl        XBl'        SUl$        [        U[        RP                  [        RR                  [        R                  [        R                  45      (       a  [        U5      nXELd  GM!  [U        U5      nUUU'   [        U5      nGM?     [        S	 U 5       5      n[        U5      S:X  a  U$ Uc  [,        R,                  " U 5      nUR                  RW                  U5      Ul        URJ                  R3                  [Y        S
U4U R                  S95        U$ s  snf )z'This adds support for OpChain indexing.Nr   rb   r   rY   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   ra   c              3  $   #    U  H  ov   M     g 7fr+   r   ).0vs     r&   	<genexpr>*Explanation.__getitem__.<locals>.<genexpr>  s     %1Qs   r-   r   r   r   )-rl   tupleEllipsisrp   shaper   applynpint64int32intndarrayrV   r\   r   rv   _objectsdim_aliasesargwherearrayrb   copydeepcopy	enumerateappendr^   r]   r_   r`   rc   rd   re   rf   rg   rh   ri   rj   zipra   int8int16rr   r-   r   )rw   r/   new_selfpostorig_tr   output_names_dimsr   r   r   r{   jsfeature_names_dimsval_idtmps                     r&   r-   Explanation.__getitem__8  s   $&&7D A1HC H}s4::T22F!W%%GGDMa"((BHH!566AA2::..)*+AQA+A{++HHAs##$&!!TWW%5%55(,(8(8(H(L(L%#tww'7'77(,(8(8(H(L(L%!8 8,-2KK1B1B(Cq(HI!LQO./14%'
*,#%#'==#6$-dkk$:DA(1$2C2CA2F(G#$6$.$5$5bhhqAw6G$H$,OOBHHTYYq\4J$K$3$:$:4;K;KA;Nq;Q$R	 )H %; $/HHZ0(*(A!#(!3)-):):+/+>+>*,((8*<)*+/+>+>)-):):)-):):&*nn)-):):040H0H'+$  /3ii.H+ &(""dgg&6&66)-)9)9/)J)N)N&!8 9cBT>UYZ>Z!#J!H$-dkk$:'*4+=+=a+@%ST'VGA! v * 1 1! 4 ( 2 (W %;
  $}}T2H&0O$,M-.**.H' !bggrxx288DEEF4jCSzs x %%%t9>OyyHkk--d3""=m4'^b^h^h#ijm ,s   W-c                X    [        U R                  R                  5      n[        SU5      $ )z8Compute the shape over potentially complex data nesting.r   )ro   rv   r\   r   )rw   shap_values_shapes     r&   r   Explanation.shape  s(     +477>>: %'899r%   c                     U R                   S   $ Nr   )r   r   s    r&   rZ   Explanation.__len__  s    zz!}r%   c                   [        U R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  S9n[        R                  " U R                   5      Ul        U$ )Nr   )rV   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   r   rj   )rw   new_exps     r&   __copy__Explanation.__copy__  s    KK((**..,,**..****nn** $ 8 8
  "YYt7r%   c                t   U R                  5       nUR                  R                  [        X14U R                  S95        [        U[        5      (       a  U" UR                  UR                  5      Ul        UR                  b"  U" UR                  UR                  5      Ul        UR                  b"  U" UR                  UR                  5      Ul	        U$ U" UR                  U5      Ul        UR                  b  U" UR                  U5      Ul        UR                  b  U" UR                  U5      Ul	        U$ )Nr   )
r   rj   r   r   r   rl   rV   r\   r^   r]   )rw   other	binary_opop_namer   s        r&   _apply_binary_operator"Explanation._apply_binary_operator  s    --/!!-W8X\XbXb"cde[))&w~~u||DGN||'(uzzB"".&/0C0CUEVEV&W#  'w~~u=GN||'(u="".&/0C0CU&K#r%   c                D    U R                  U[        R                  S5      $ N__add__r   operatoraddrw   r   s     r&   r   Explanation.__add__      **5(,,	JJr%   c                D    U R                  U[        R                  S5      $ r   r   r   s     r&   __radd__Explanation.__radd__  r  r%   c                D    U R                  U[        R                  S5      $ N__sub__r   r   subr   s     r&   r  Explanation.__sub__  r  r%   c                D    U R                  U[        R                  S5      $ r  r	  r   s     r&   __rsub__Explanation.__rsub__  r  r%   c                D    U R                  U[        R                  S5      $ N__mul__r   r   mulr   s     r&   r  Explanation.__mul__  r  r%   c                D    U R                  U[        R                  S5      $ r  r  r   s     r&   __rmul__Explanation.__rmul__  r  r%   c                D    U R                  U[        R                  S5      $ )N__truediv__)r   r   truedivr   s     r&   r  Explanation.__truediv__  s    **5(2B2BMRRr%   c           	        [         R                   " U 5      nUR                  SS5      nUS;   a  X4   nUR                  SS Ul        U R                  b  [	        U R                  5      (       d  US:X  a  U R                  5       n[        R                  " [        UR                  5       5      5      Ul        [        R                  " UR                  5        Vs/ s H  n[        [        U5      " US5      PM     sn5      Ul
        SUl        GO
[        [        U5      " [        R                  " U R                  5      40 UD6Ul
        UR                  b;   [        [        U5      " [        R                  " U R                  5      40 UD6Ul        UR                  b_  [!        U["        5      (       aJ  [%        U R                  R&                  5      U:  a'  [        [        U5      " U R                  40 UD6Ul        O[!        U["        5      (       a  SUl        US:X  ay  U R                  bl  [%        U R                  R&                  5      S:X  aI  U R                  R)                  S5      R+                  5       S:  a  U R                  S   Ul        OSUl        UR                  R-                  [/        UUU R&                  US:H  S95        U$ s  snf ! [         a    SUl         GNTf = f)	z1Apply a numpy-style function to this Explanation.axisN)r   r   rY   r   r      g:0yE>)r   r   r   r   )r   getrj   ra   is_1d_flatten_feature_namesr   r   rr   keysr\   getattrri   r^   	Exceptionr]   rl   r   rp   r   stdrA   r   r   )rw   fnamer   r   r  r   r   s          r&   _numpy_funcExplanation._numpy_func  sK   99T?zz&$' 9~H"*"5"5cr":H)%8J8J2K2KPTXYPY446J%'XXd:??3D.E%FH" hh*J[J[J]'^J]QE(:1a(@J]'^_HO"&H%b%0$++1FQ&QHO}}()$+B$6rxx		7J$Uf$UHM ##/JtS4I4IcRVRbRbRhRhNilpNp'.r5'9$:J:J'Uf'U$D#&&'+$194T__=R=R9SWX9X""1%))+d2&*ooa&8#&*#""::$(AI		
 ; (_ ! )$(HM)s   !K:K K%$K%c                $    U R                  S5      $ )Nr2   r'  r   s    r&   r2   Explanation.abs  s    &&r%   c                    U $ r+   r   r   s    r&   r7   Explanation.identity  s    r%   c                $    U R                  S5      $ )Nr:   r*  r   s    r&   r:   Explanation.argsort"  s    	**r%   c                $    U R                  S5      $ )Nr=   r*  r   s    r&   r=   Explanation.flip&  s    ''r%   c                "    U R                  SUS9$ )Numpy-style mean function.rJ   r  r*  rw   r  s     r&   rJ   Explanation.mean*  s    T22r%   c                "    U R                  SUS9$ )r3  rD   r4  r*  r5  s     r&   rD   Explanation.max.      D11r%   c                "    U R                  SUS9$ )r3  rG   r4  r*  r5  s     r&   rG   Explanation.min2  r9  r%   c                    Uc  U R                  SUS9$ US:X  d  [        U R                  5      S:X  a  [        X5      $ [	        S5      e)zNumpy-style sum function.rA   r4  r   z4Only axis = 1 is supported for grouping right now...)r'  rp   r   group_featuresr   )rw   r  groupings      r&   rA   Explanation.sum6  sK    ##E#5519DJJ1,!$11STTr%   c           	        [         R                  " U 5      nU R                  b  [        U R                  5      (       d  US:X  a  U R	                  5       n[
        R                  " [        UR                  5       5      5      Ul        [
        R                  " UR                  5        Vs/ s H  n[
        R                  " XQ5      PM     sn5      Ul	        S Ul        OL[
        R                  " UR                  X5      Ul	        [
        R                  " UR                  X5      Ul        UR                  R                  [        SU4U R                   US:H  S95        U$ s  snf )Nr   
percentile)r   r   r   r   )r   r   ra   r   r!  r   r   rr   r"  r\   rA  ri   r^   rj   r   r   r   )rw   qr  r   r   r   s         r&   rA  Explanation.percentile>  s   ==&)%8J8J2K2KPTXYPY446J%'XXd:??3D.E%FH" hhZEVEVEX'YEXa(;EX'YZHO"&H mmHOOQEHOMM(--AHM""!W::$(AI		
  (Zs   ( Ec                    [         R                  R                  U5      nU R                  S   nUc   eUR	                  U[        X5      US9nU [        U5         $ )a  Randomly samples the instances (rows) of the Explanation object.

Parameters
----------
max_samples : int
    The number of rows to sample. Note that if ``replace=False``, then
    fewer than max_samples will be drawn if ``len(explanation) < max_samples``.

replace : bool
    Sample with or without replacement.

random_state : int
    Random seed to use for sampling, defaults to 0.

r   )sizereplace)r   randomRandomStater   choicerG   rr   )rw   max_samplesrF  random_staternglengthindss          r&   rM   Explanation.sampleS  sY      ii##L1A!!!zz&s;'?zQDJr%   c                    U R                   n[        UR                  5      S:w  a  [        S5      eUS:X  a  UR                  n[        X1S9$ )zComputes an optimal leaf ordering sort order using hclustering.

hclust(metric="sqeuclidean")

Parameters
----------
metric : str
    A metric supported by scipy clustering. Defaults to "sqeuclidean".

axis : int
    The axis to cluster along.

rY   z3The hclust order only supports 2D arrays right now!r   )Xmetric)r\   rp   r   r   Tr   )rw   rR  r  r\   s       r&   rQ   Explanation.hclusti  sE     v||! !VWW19XXF77r%   c                L   U R                   S   UR                   S   :X  d   S5       e[        R                  " U R                  UR                  SS9(       d  [	        S5      e[        [        R                  " U R                  UR                  /5      U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                   U R"                  U R$                  U R&                  S9nU$ )zStack two explanations column-wise.

Parameters
----------
other : shap.Explanation
    The other Explanation object to stack with.

Returns
-------
exp : shap.Explanation
    A new Explanation object representing the stacked explanations.

r   z9Can't hstack explanations with different numbers of rows!gư>)atolz5Can't hstack explanations with different base values!r[   )r   r   allcloser]   rs   rV   hstackr\   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   )rw   r   r   s      r&   rX  Explanation.hstack  s     zz!}A.k0kk.{{4++U->->TJTUU99dkk5<<89((**..,,**..****nn** $ 8 8
  r%   c                   U R                   R                  S:  a  [        S5      e[        U[        5      (       a	  [        XS9$ [        U[        [        [        R                  45      (       aK  [        R                  " U5      n[        S0 [        R                  " U5       Vs0 s H
  o"XU:H     _M     snD6$ [        S5      es  snf )a0  Split this explanation into several cohorts.

Parameters
----------
cohorts : int or array
    If this is an integer then we auto build that many cohorts using a decision tree. If this is
    an array then we treat that as an array of cohort names/ids for each instance.

Returns
-------
Cohorts object

rY   zCohorts cannot be calculated on multiple outputs at once. Please make sure to specify the output index on which cohorts should be build, e.g. for a multi-class output shap_values[..., cohort_class].cohorts(2).)max_cohortszRThe given set of cohort indicators is not recognized! Please give an array or int.r   )r\   ndimrs   rl   r   _auto_cohortsrr   r   r   r   r   Cohortsunique	TypeError)rw   cohortsr   s      r&   ra  Explanation.cohorts  s     ;;a= 
 gs## ;;geRZZ899hhw'GZbiiPWFXYFXdDD$99FXYZZlmm Zs   #Cc                    0 n[        [        U R                  5      5       HN  n[        U R                  U   U R                  U   5       H!  u  p4X1;  a  / X'   X   R                  U5        M#     MP     U$ r+   )rq   rp   r\   r   ra   r   rw   r   r{   r   r   s        r&   r!  "Explanation._flatten_feature_names  sk    %'
s4;;'(AD..q14;;q>B&$&JM$$Q' C )
 r%   c                    0 n[        [        U R                  5      5       HN  n[        U R                  U   U R                  U   5       H!  u  p4X1;  a  / X'   X   R                  U5        M#     MP     U$ r+   )rq   rp   r\   r   r^   r   rd  s        r&   _use_data_as_feature_names&Explanation._use_data_as_feature_names  sg    %'
s4;;'(ADIIaL$++a.9&$&JM$$Q' : )
 r%   )rv   rk   rj   rn   )NNNNNNNNNNNNNNrS   rV   rS   r   )r  r   )NN)r  z
int | Noner+   )Fr   )rJ  r   rF  r   rK  r   rS   rV   )sqeuclideanr   )rR  r   r  r   )r   rV   rS   rV   )ra  z)int | list[int] | tuple[int] | np.ndarrayrS   r^  )rS   r#   )4r   r   r   r    r!   r}   rT   r\   setterr]   r^   r_   r`   rb   rc   ra   rd   re   rf   rg   rh   ri   r   r-   r   rZ   r   r   r   r  r  r  r  r  r  r'  r2   r7   r:   r=   rJ   rD   rG   rA   rA  rM   rQ   rX  ra  r!  rg  r$   r   r%   r&   rV   rV   [   s!   	  !W
v   ]]$ $ # # . .   
[[    $ $ 0 0
 & & $ $ 0 0 & & % % 2 2 $ $ $ $ ! ! $ $ 0 0 + + >  > " " , ,l\ : :,$KKKKKKS*X ' '   + + ( (322U* ,84"Hn6r%   rV   )	metaclassc                   0 nU H   nUR                  X   / 5      U/-   X!U   '   M"     U R                  n[        R                  " U 5      n0 nSn[	        U R
                  5      S:H  nU GH8  nUR                  X35      n	X;   a  M  SXi'   UR                  X35      n	UR                  X/5      n
U
 Vs/ s H  oR                  U5      PM     nnU(       aU  U R                  U   R                  5       UR                  U'   U R                  U   R                  5       UR                  U'   OfU R                  S S 2U4   R                  S5      UR                  S S 2U4'   U R                  S S 2U4   R                  S5      UR                  S S 2U4'   XR                  U'   US-  nGM;     [        U(       a  UR                  S U OUR                  S S 2S U24   UR                  U(       a  UR                  S U OUR                  S S 2S U24   UR                  c  S O0U(       a  UR                  S S 2S U24   OUR                  S S 2S U24   S UR                  c  S OUR                  S U S S S S S S S S S9$ s  snf )Nr   r   Tr   )r  ra   r   r   rp   r   indexr\   rA   r^   rV   r]   r_   )shap_valuesfeature_mapreverse_mapr   
curr_namessv_newfoundr{   rank1new_namecols_to_sumr   old_indss                r&   r=  r=    sa   (*K)49JB)OSWRX)X%&  **J]];'FE	A!!"a'E??4.??4.!ooh
;1<=A$$Q'=*11(;??AFMM!(--h7;;=FKKN"-"4"4Q["A"E"Ea"HFMM!Q$ + 0 0H = A A! DFKK1"*Q	Q# & "bqa!e(<&& %V[[!_6;;q"1"u+=& ,1f!!!RaR%(v7J7J1bqb57Q$22:d@T@TUWVW@X !  >s   0I2c                   [        U 5      nUb  [        U5      nOUnUbI  [        U5      nU[        U5      * S U:w  a*  U[        U5      * S-   S USS :X  a  US   US   :X  a  USS nOUb  [        U5      SS nO
[        5       n[        U5      [        U5      -
  [        U5      -
  n[        [        U5      U-   [        U5      5      n[        U5      $ )zPUses the passed data to infer which dimensions correspond to the model's output.Nr   r   )ro   rp   r   rq   )	r\   r]   r^   rb   ry   
data_shapeoutput_shapeinteraction_orderrn   s	            r&   rm   rm     s    !&)L #D)
 "
 %l3 #l++-.,>c,//!356,qr:JJQ<?2'+L		 %k2126wL)C
O;c,>OOJ*;;S=NOKr%   c                R    [        U S   [        [        R                  45      (       + $ r   )rl   rr   r   r   )vals    r&   r   r   )  s    3q6D"**#5677r%   c           	     ,  ^ S n[        U S5      (       a  [        U [        5      (       a
  [        5       $ [        R
                  R                  U 5      (       d+  [        U 5      S:  a  [        U" U 5      [        5      (       a  g[        U [        5      (       a-  [        U 5      4[        U [        [        U 5      5         5      -   $ [        [        U S[        5       5      5      S:  a  U R                  $ [        U 5      S:X  a  g[        U 5      S:X  a  S[        U" U 5      5      -   $ [        U" U 5      5      mT[        5       :X  a  [        U 5      4$ [        R                  " [        T5      [         S	9n[#        S[        U 5      5       H^  n[        X   5      n[        U5      [        T5      :X  d   S
5       e[#        [        U5      5       H  nX%==   XE   TU   :H  -  ss'   M     M`     [        U 5      4[        U4S j[%        U5       5       5      -   $ )z-Computes the shape of a generic object ``x``.c                    U  H  nUs  $    g r+   r   )iterabler/   s     r&   _first_item#_compute_shape.<locals>._first_item0  s    DK r%   rZ   r   r+   r   r   )r   )r   )dtypezDArrays in Explanation objects must have consistent inner dimensions!c              3  D   >#    U  H  u  pU(       a  TU   OS v   M     g 7fr+   r   )r   r   matchfirst_shapes      r&   r   !_compute_shape.<locals>.<genexpr>P  s      bOa81u[^$>Oas    )rt   rl   r   r   scipysparseissparserp   r#   ro   nextiterr#  r   r   onesr   rq   r   )xr  matchesr{   r   r   r  s         @r&   ro   ro   -  s   
 1i  Jq#$6$6w<<  ##A
z+a.RU7V7V!TAy>!DaM*:;;; 71guw'(1,ww 1v{
1v{n[^444 Q0KegAy ggc+&d3G1c!fqt$5zS--u/uu-s5z"AJ%(k!n44J # 
 F9ubyY`Oabbbbr%   c                  ~    \ rS rSrSrSS jr\SS j5       r\R                  S 5       rSS jr	SS jr
SS jrS	 rS
rg)r^  iS  a'  A collection of :class:`.Explanation` objects, typically each explaining a cluster of similar samples.

Examples
--------
A ``Cohorts`` object can be initialized in a variety of ways.

By explicitly specifying the cohorts:

>>> exp = Explanation(
...     values=np.random.uniform(low=-1, high=1, size=(500, 5)),
...     data=np.random.normal(loc=1, scale=3, size=(500, 5)),
...     feature_names=list("abcde"),
... )
>>> cohorts = Cohorts(
...     col_a_neg=exp[exp[:, "a"].data < 0],
...     col_a_pos=exp[exp[:, "a"].data >= 0],
... )
>>> cohorts
<shap._explanation.Cohorts object with 2 cohorts of sizes: [(198, 5), (302, 5)]>

Or using the :meth:`.Explanation.cohorts` method:

>>> cohorts2 = exp.cohorts(3)
>>> cohorts2
<shap._explanation.Cohorts object with 3 cohorts of sizes: [(182, 5), (12, 5), (306, 5)]>

Most of the :class:`.Explanation` interface is also exposed in ``Cohorts``. For example, to retrieve the
SHAP values corresponding to column 'a' across all cohorts, you can use:

>>> cohorts[..., 'a'].values
<shap._explanation.Cohorts object with 2 cohorts of sizes: [(198,), (302,)]>

To actually retrieve the values of a particular :class:`.Explanation`, you'll need to access it via the
:meth:`.Cohorts.cohorts` property:

>>> cohorts.cohorts["col_a_neg"][..., 'a'].values
array([...])  # truncated

c                    Xl         0 U l        g r+   )ra  
_callables)rw   r   s     r&   r}   Cohorts.__init__|  s    /1r%   c                    U R                   $ )z7Internal collection of cohorts, stored as a dictionary.)_cohortsr   s    r&   ra  Cohorts.cohorts  s     }}r%   c                    [        U[        5      (       d  Sn[        U5      eUR                  5        H1  n[        U[        5      (       a  M  S[        U5       3n[        U5      e   Xl        g )Nz"self.cohorts must be a dictionary!zBArguments to a Cohorts set must be Explanation objects, but found )rl   r#   r`  r\   rV   typer  )rw   cvalemsgexps       r&   ra  r    s`    $%%7DD/!;;=Cc;//[\`ad\e[fgo% !
 15r%   c                    0 nU R                    H#  nU R                   U   R                  U5      X#'   M%     [        S0 UD6$ )Nr   )r  r-   r^  )rw   r/   new_cohortsks       r&   r-   Cohorts.__getitem__  s>    A!]]1-99$?KN %%%r%   c                    [        5       nU R                   HJ  n[        U R                  U   U5      n[        U5      (       a  XBR                  U'   M<  XBR                  U'   ML     U$ r+   )r^  r  r#  callabler  )rw   r   r  r  results        r&   __getattr__Cohorts.__getattr__  s[    iAT]]1-t4F,2&&q)*0$$Q'  r%   c                    U R                   (       d  Sn[        U5      e0 nU R                   R                  5        H  u  pVU" U0 UD6XE'   M     [        S0 UD6$ )a  Call the bound methods on the Explanation objects retrieved during attribute access.

For example,
``Cohorts(...).mean(axis=0)`` would first run ``__getattr__("mean")`` and return a bound method
``Explanation.mean`` for all the :class:`Explanation` objects inside the ``Cohorts``, returned as a
new ``Cohorts`` object. Then the ``(axis=0)`` call would be executed on that returned ``Cohorts``
object, which is why we need ``__call__`` defined.
zNo methods to __call__!r   )r  rs   itemsr^  )rw   r   r   r  r  r  bound_methods          r&   __call__Cohorts.__call__  sX     ,DT""#446OA)4:6:KN  7%%%r%   c                    S[        U R                  5       SU R                  R                  5        Vs/ s H  oR                  PM     sn S3$ s  snf )Nz'<shap._explanation.Cohorts object with z cohorts of sizes: >)rp   r  r\   r   )rw   r   s     r&   r   Cohorts.__repr__  s{    8T]]9K8LL_rvrr  sG  sG  sI  aJ  sImnahah  sI  aJ  `K  KL  M  	M  aJs   A
)r  r  ra  N)r   rV   rS   None)rS   zdict[str, Explanation]rS   r^  )r   r   rS   r^  )r   r   r   r    r!   r}   rT   ra  rl  r-   r  r  r   r$   r   r%   r&   r^  r^  S  sN    &P2   ^^	5 	5&&$Mr%   r^  c                8   [         R                  R                  US9nUR                  U R                  U R
                  5        UR                  U R                  5      R                  5       n/ n[        U R                  S   5       H  nSn[        [        X5   5      5       H  nX5U4   S:  d  M  UR                  R                  U   nUR                  R                  U   n	U R                  XX4   n
US:  d  MY  U[        U R                  U   5      -  nX:  a  US-  nOUS-  nU[        U	5      S-   -  nM     UR!                  USS 5        M     ["        R$                  " U5      n0 n["        R&                  " U5       H  nXU:H     X'   M     [)        S	0 UD6$ )
zWThis uses a DecisionTreeRegressor to build a group of cohorts with similar SHAP values.)max_leaf_nodesr    z < z >= z & Nr   )sklearntreeDecisionTreeRegressorfitr^   r\   decision_pathtoarrayrq   r   rp   tree_feature	thresholdr   ra   r   r   r   r_  r^  )rp  r[  mpaths
path_namesr{   r   r   r  r  r  path_names_arrra  s                r&   r]  r]    s~    	**+*FAEE+

K../ OOK,,-557EJ ;$$Q'(s58}%AT{Q''//!,GG--a0	!&&qz2a<C 9 9' BCCDC	NU22D & 	$s)$ ) XXj)N G		.)#d$:; * Wr%   c                    [        U [        R                  5      (       aM  [        U R                  5      S:X  a4  [        U S   [        R                  5      (       a  U  Vs/ s H  oPM     sn$ U $ s  snf )zfA helper to patch things since slicer doesn't handle arrays of arrays (it does handle lists of arrays)r   r   )rl   r   r   rp   r   )r  r   s     r&   ru   ru     sS    !RZZ  S\Q%6:adBJJ;W;W~1a1~ s   A/ri  rj  )rS   ztuple[int | None, ...]r  )*
__future__r   r   r   dataclassesr   r   typingr   r   r   numpyr   pandasr   scipy.clusterr  scipy.sparsescipy.spatialr  slicerr	   r
   r   utils._clusteringr   utils._exceptionsr   utils._generalr   r,   r   r  r(   rV   r=  rm   r   ro   r^  r]  ru   r   r%   r&   <module>r     s    "   ( & &       % % . - #*+ & & &6$d 6$rw	O w	t/dD8#cLaM aMH!Hr%   