ó
    †ñ:i¥s  ã                   ó¢   • S SK r S SKrS SKrS SKJr  SSKJr  SSK	J
r
  SSKJrJrJrJr  SqSq " S S\
5      r " S	 S
\
5      r " S S\
5      rg)é    N)Úversioné   )ÚExplanation)Ú	Explainer)Ú
_get_graphÚ_get_model_inputsÚ_get_model_outputÚ_get_sessionc                   ó8   • \ rS rSrSrSS jrS	S jr S
S jrSrg)ÚGradientExplaineré   aœ  Explains a model using expected gradients (an extension of integrated gradients).

Expected gradients an extension of the integrated gradients method (Sundararajan et al. 2017), a
feature attribution method designed for differentiable models based on an extension of Shapley
values to infinite player games (Aumann-Shapley values). Integrated gradients values are a bit
different from SHAP values, and require a single reference value to integrate from. As an adaptation
to make them approximate SHAP values, expected gradients reformulates the integral as an expectation
and combines that expectation with sampling reference values from the background dataset. This leads
to a single combined expectation of gradients that converges to attributions that sum to the
difference between the expected model output and the current output.

Examples
--------
See :ref:`Gradient Explainer Examples <gradient_explainer_examples>`

Nc                 ó¬  • [        U5      [        L a  Uu  pg UR                  5         SnO UR                  5         Sn[	        U[
        R                  5      (       a  UR                  R                  U l	        OSU l	        US:X  a  [        XX4U5      U l        gUS:X  a  [        XXE5      U l        gg! [         a    Sn N‚f = f! [         a    Sn N”f = f)aù  An explainer object for a differentiable model using a given background dataset.

Parameters
----------
model : tf.keras.Model, (input : [tf.Tensor], output : tf.Tensor), torch.nn.Module, or a tuple
        (model, layer), where both are torch.nn.Module objects

    For TensorFlow this can be a model object, or a pair of TensorFlow tensors (or a list and
    a tensor) that specifies the input and output of the model to be explained. Note that for
    TensowFlow 2 you must pass a tensorflow function, not a tuple of input/output tensors).

    For PyTorch this can be a nn.Module object (model), or a tuple (model, layer), where both
    are nn.Module objects. The model is an nn.Module object which takes as input a tensor
    (or list of tensors) of shape data, and returns a single dimensional output. If the input
    is a tuple, the returned shap values will be for the input of the layer argument. layer must
    be a layer in the model, i.e. model.conv2.

data : [np.array] or [pandas.DataFrame] or [torch.tensor]
    The background dataset to use for integrating out features. Gradient explainer integrates
    over these samples. The data passed here must match the input tensors given in the
    first argument. Single element lists can be passed unwrapped.

ÚpytorchÚ
tensorflowN)ÚtypeÚtupleÚnamed_parametersÚ	ExceptionÚ
isinstanceÚpdÚ	DataFrameÚcolumnsÚvaluesÚfeaturesÚ_TFGradientÚ	explainerÚ_PyTorchGradient)	ÚselfÚmodelÚdataÚsessionÚ
batch_sizeÚlocal_smoothingÚaÚbÚ	frameworks	            Ú\/srv/projetos/modelo_ml_acdoc/venv/lib/python3.13/site-packages/shap/explainers/_gradient.pyÚ__init__ÚGradientExplainer.__init__&   sÌ   € ô2 �‹;œ%ÒØ‰DˆAð)Ø×"Ñ"Ô$Ø%‘	ð)Ø×&Ñ&Ô(Ø%�	ô �dœBŸL™L×)Ñ)Ø ŸL™L×/Ñ/ˆD�Mà ˆDŒMà˜Ó$Ü(¨°gÈ?Ó[ˆD�NØ˜)Ó#Ü-¨e¸:ÓWˆD�Nð $øô! ó )Ø(’	ð)ûô ó )Ø(’	ð)ús"   ˜B2 ¬C Â2CÃ CÃCÃCc                 óL   • U R                  X5      n[        X1U R                  S9$ )a“  Return an explanation object for the model applied to X.

Parameters
----------
X : list,
    if framework == 'tensorflow': np.array, or pandas.DataFrame
    if framework == 'pytorch': torch.tensor
    A tensor (or list of tensors) of samples (where X.shape[0] == # samples) on which to
    explain the model's output.
nsamples : int
    number of background samples

Returns
-------
shap.Explanation:

)r   r    Úfeature_names)Úshap_valuesr   r   )r   ÚXÚnsamplesr,   s       r'   Ú__call__ÚGradientExplainer.__call__W   s%   € ð$ ×&Ñ& qÓ3ˆÜ +ÀTÇ]Á]ÑSÐSó    c                 ó<   • U R                   R                  XX4XV5      $ )a—  Return the values for the model applied to X.

Parameters
----------
X : list,
    if framework == 'tensorflow': np.array, or pandas.DataFrame
    if framework == 'pytorch': torch.tensor
    A tensor (or list of tensors) of samples (where X.shape[0] == # samples) on which to
    explain the model's output.

ranked_outputs : None or int
    If ranked_outputs is None then we explain all the outputs in a multi-output model. If
    ranked_outputs is a positive integer then we only explain that many of the top model
    outputs (where "top" is determined by output_rank_order). Note that this causes a pair
    of values to be returned (shap_values, indexes), where shap_values is a list of numpy arrays
    for each of the output ranks, and indexes is a matrix that tells for each sample which output
    indexes were chosen as "top".

output_rank_order : "max", "min", "max_abs", or "custom"
    How to order the model outputs when using ranked_outputs, either by maximum, minimum, or
    maximum absolute value. If "custom" Then "ranked_outputs" contains a list of output nodes.

rseed : None or int
    Seeding the randomness in shap value computation  (background example choice,
    interpolation between current and background example, smoothing).

Returns
-------
np.array or list
    Estimated SHAP values, usually of shape ``(# samples x # features)``.

    The shape of the returned array depends on the number of model outputs:

    * one input, one output: array of shape ``(#num_samples, *X.shape[1:])``.
    * one input, multiple outputs: array of shape ``(#num_samples, *X.shape[1:], #num_outputs)``
    * multiple inputs: list of arrays with corresponding shape above.

    If ranked_outputs is ``None`` then this list of tensors matches the
    number of model outputs. If ranked_outputs is a positive integer a
    pair is returned ``(shap_values, indexes)``, where shap_values is a
    list of tensors with a length of ranked_outputs, and indexes is a
    matrix that tells for each sample which output indexes were chosen
    as "top".

    .. versionchanged:: 0.45.0
        Return type for models with multiple outputs and one input changed
        from list to np.ndarray.

)r   r,   )r   r-   r.   Úranked_outputsÚoutput_rank_orderÚrseedÚreturn_variancess          r'   r,   ÚGradientExplainer.shap_valuesl   s   € ðh �~‰~×)Ñ)¨!°~ÐZ_ÓrÐrr1   )r   r   ©Né2   r   )éÈ   ©r:   NÚmaxNF)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r(   r/   r,   Ú__static_attributes__© r1   r'   r   r      s!   † ñô"/XôbTð, kp÷4sr1   r   c                   ó6   • \ rS rSrSS jrS r S	S jrS rSrg)
r   é£   Nc                 óò  • [         cV  SS Kq [        R                  " [         R                  5      [        R                  " S5      :  a  [
        R                  " S5        [        cY   SSKJq  [        R                  " [        R                  5      [        R                  " S5      :  a  [
        R                  " S5        [         R                  5       (       a_  [        U[        [        45      (       a>  [        U5      S:X  d   S5       eSSKJq  [        R                  US   US	   5      U l        OXl        [!        U5      U l        [%        U5      U l        [        U R&                  [        5      (       a   S
5       e[        U R&                  R(                  5      S:  d   S5       eSU l        [        U R&                  R(                  5      S	:X  a  SU l        SU l        [        U R"                  [        5      (       d  U R"                  /U l        [        U R"                  5      S	:„  U l        [        U[.        R0                  5      (       a  UR2                  /n[        U[        5      (       d  U/nX l        0 U l        X@l        XPl        [         R                  5       (       dn  [=        U5      U l        [A        U 5      U l!        S U l"        U RB                  RG                  5        H)  nSURH                  ;   d  M  URJ                  S   U l"        M+     U R*                  (       d	  S /U l&        g [O        U R&                  R(                  S	   5       Vs/ s H  nS PM     snU l&        g ! [         a     GN²f = fs  snf )Nr   z1.4.0z>Your TensorFlow version is older than 1.4.0 and not supported.)Úkerasz2.1.0z9Your Keras version is older than 2.1.0 and not supported.r   z?When a tuple is passed it must be of the form (inputs, outputs)é   z9The model output to be explained must be a single tensor!é   z4The model output must be a vector or a single value!TFÚkeras_learning_phase)(Útfr   r   ÚparseÚ__version__ÚwarningsÚwarnrG   r   Úexecuting_eagerlyr   Úlistr   ÚlenÚModelr   r   Úmodel_inputsr	   Úmodel_outputÚshapeÚmulti_outputÚmulti_inputr   r   r   r    Ú_num_vinputsr"   r#   r
   r!   r   ÚgraphÚkeras_phase_placeholderÚget_operationsÚnameÚoutputsÚ	gradientsÚrange)r   r   r    r!   r"   r#   ÚopÚis           r'   r(   Ú_TFGradient.__init__¤   sŸ  € ô ‰:Û#ä�}Š}œRŸ^™^Ó,¬w¯}ª}¸WÓ/EÓEÜ—’Ð^Ô_Ü‰=ðÝ,ä—=’=¤×!2Ñ!2Ó3´g·m²mÀGÓ6LÓLÜ—M’MÐ"]Ô^ô ×Ñ×!Ñ!Ü˜%¤$¬ ×/Ñ/Ü˜5“z Q“ÐiÐ(iÓi�Ý,ä"Ÿ[™[¨¨q©°5¸±8Ó<�•
à"”
ä-¨eÓ4ˆÔÜ-¨eÓ4ˆÔÜ˜d×/Ñ/´×6Ñ6ÐsÐ8sÓsÐ6Ü�4×$Ñ$×*Ñ*Ó+¨aÓ/ÐgÐ1gÓgÐ/Ø ˆÔÜˆt× Ñ ×&Ñ&Ó'¨1Ó,Ø %ˆDÔð  ˆÔÜ˜$×+Ñ+¬T×2Ñ2Ø!%×!2Ñ!2Ð 3ˆDÔÜ˜t×0Ñ0Ó1°AÑ5ˆÔÜ�dœBŸL™L×)Ñ)Ø—K‘K�=ˆDÜ˜$¤×%Ñ%Ø�6ˆDàŒ	ØˆÔØ$ŒØ.Ôä×#Ñ#×%Ñ%Ü'¨Ó0ˆDŒLÜ# DÓ)ˆDŒJà+/ˆDÔ(Ø—j‘j×/Ñ/Ö1�Ø)¨R¯W©WÕ4Ø35·:±:¸a±=�DÖ0ñ 2ð × × Ø"˜VˆD�Nä,1°$×2CÑ2C×2IÑ2IÈ!Ñ2LÔ,MÓNÒ,M q›dÑ,MÑNˆD�Nøôc ó Úðüòb Os   Á&AM# ÍM4Í#
M1Í0M1c                 ó2  ^ ^• T R                   T   c÷  [        R                  5       (       d^  T R                  (       a  T R                  S S 2T4   OT R                  n[        R                  UT R
                  5      T R                   T'   O€[        R                  " [        R                  5      [        R                  " S5      :  a  [        R                  UU 4S j5       nO[        R                  UU 4S j5       nUT R                   T'   T R                   T   $ )Nz2.16.0c                 óò  >• [         R                  R                  R                  5       n[         R                  R                  R	                  S5        [         R                  SS9 nUR                  U 5        TR                  U 5      nTR                  (       a	  US S 2T4   nS S S 5        WR                  WU 5      n[         R                  R                  R	                  U5        U$ ! , (       d  f       NK= f)Nr   F©Úwatch_accessed_variables)
rK   rG   ÚbackendÚlearning_phaseÚset_learning_phaseÚGradientTapeÚwatchr   rW   Úgradient)ÚxÚphaseÚtapeÚoutÚx_gradrb   r   s        €€r'   Ú
grad_graphÚ(_TFGradient.gradient.<locals>.grad_graphï   s±   ø€ ä "§¡× 0Ñ 0× ?Ñ ?Ó A˜ÜŸ™×(Ñ(×;Ñ;¸AÔ>äŸ_™_Àe˜_ÑLÐPTØ ŸJ™J qœMØ"&§*¡*¨Q£-˜CØ#×0×0Ø&)ª!¨Q¨$¡i ÷	 Mð "&§¡¨s°AÓ!6˜äŸ™×(Ñ(×;Ñ;¸EÔBà%˜÷ MÕLús   Á&=C(Ã(
C6c                 óü   >• [         R                  SS9 nUR                  U 5        TR                  U SS9nTR                  (       a	  US S 2T4   nS S S 5        WR                  WU 5      nU$ ! , (       d  f       N"= f)NFrf   )Útraining)rK   rk   rl   r   rW   rm   )rn   rp   rq   rr   rb   r   s       €€r'   rs   rt     sn   ø€ äŸ_™_Àe˜_ÑLÐPTØ ŸJ™J qœMØ"&§*¡*¨Q¸ *Ð"?˜CØ#×0×0Ø&)ª!¨Q¨$¡i ÷	 Mð "&§¡¨s°AÓ!6˜Ø%˜÷ MÕLús   •<A-Á-
A;)
r_   rK   rP   rW   rU   rT   r   rL   rM   Úfunction)r   rb   rq   rs   s   ``  r'   rm   Ú_TFGradient.gradientå   sÑ   ù€ ð �>‰>˜!ÑÑ$Ü×'Ñ'×)Ñ)Ø15×1B×1B�d×'Ñ'ª¨1¨Ò-È×HYÑHY�Ü$&§L¡L°°d×6GÑ6GÓ$H�—‘˜qÒ!ä—=’=¤§¡Ó0´7·=²=ÀÓ3JÓJä—[‘[õ&ó !ñ&ô" —[‘[õ&ó !ð&ð %/�—‘˜qÑ!à�~‰~˜aÑ Ð r1   c                 ó˜  • SS K qSS KJq  U R                  (       d   [        U[        5      (       a   S5       eU/nO[        U[        5      (       d   S5       e[        U R                  5      [        U5      :X  d   S5       e[        R                  5       (       d(  U R                  U R                  U R                  U5      nO'U R                  U R                  U R                  U5      nUb¥  U R                  (       a”  US:X  a  [        R                  " U* 5      nOdUS:X  a  [        R                  " U5      nOGUS:X  a+  [        R                  " [        R                   " U5      5      nOUS:X  a  UnOS	n	[#        U	5      eUS
;   a  US S 2S U24   nOP[        R$                  " [        R&                  " [        U R(                  5      5      US   R*                  S   S45      n/ n
/ n[-        [        U5      5       Vs/ s H9  n[        R.                  " U4X   R*                  SS  -   [        R0                  S9PM;     nn[-        [        U5      5       Vs/ s H9  n[        R.                  " U4X   R*                  SS  -   [        R0                  S9PM;     nnUc   [        R2                  R5                  SS5      n[-        UR*                  S   5       GH¢  n[        R2                  R7                  U5        / n/ n[-        [        U5      5       Hg  nUR9                  [        R.                  " UU   R*                  5      5        UR9                  [        R.                  " UU   R*                  5      5        Mi     [-        US   R*                  S   5       GHŽ  n[-        U5       GH  n[        R2                  R;                  U R<                  S   R*                  S   5      n[        R2                  R?                  5       n[-        [        U5      5       Hž  nU R@                  S:”  aD  UU   U   [        R2                  RB                  " UU   U   R*                  6 U R@                  -  -   nOUU   U   nUU-  SU-
  U R<                  U   U   -  -   UU   U'   UU R<                  U   U   -
  UU   U'   M      GM     UUU4   n/ n[-        SX RD                  5       H  n[-        [        U5      5       Vs/ s H"  nUU   U[G        UU RD                  -   U5       PM$     nnUR9                  U R                  U RI                  U5      U R                  U5      5        M�     [-        [        U5      5       VVs/ s H.  n[        RJ                  " U Vs/ s H  nUU   PM
     snS5      PM0     nnn[-        [        U5      5       H`  nUU   UU   -  nURM                  S5      UU   U'   URO                  S5      [        RP                  " UR*                  S   5      -  UU   U'   Mb     GM‘     U
R9                  U R                  (       d  US   OU5        UR9                  U R                  (       d  US   OU5        GM¥     [        U
[        5      (       a~  [        U
S   [        5      (       aQ  [-        [        U
S   5      5       VVs/ s H,  n[        RR                  " U
 Vs/ s H  nUU   PM
     snSS9PM.     n
nnO[        RR                  " U
SS9n
Ub  U(       a  X«U4$ X¨4$ U(       a  X«4$ U
$ s  snf s  snf s  snf s  snf s  snnf s  snf s  snnf )Nr   ú%Expected a single tensor model input!ú Expected a list of model inputs!z7Number of model inputs does not match the number given!r<   ÚminÚmax_absÚcustomz6output_rank_order must be max, min, max_abs or custom!)r<   r|   r}   rH   ©Údtypeç    €„.Aéÿÿÿÿ©Úaxis)*r   rK   Útensorflow.kerasrG   rX   r   rQ   rR   rT   rP   ÚrunrU   r   rW   ÚnpÚargsortÚabsÚ
ValueErrorÚtileÚaranger_   rV   r`   ÚzerosÚfloat32ÚrandomÚrandintÚseedÚappendÚchoicer    Úuniformr#   Úrandnr"   r|   rm   ÚconcatenateÚmeanÚvarÚsqrtÚstack) r   r-   r.   r3   r4   r5   r6   Úmodel_output_valuesÚmodel_output_ranksÚemsgÚoutput_phisÚoutput_phi_varsÚtÚsamples_inputÚsamples_deltarb   ÚphisÚphi_varsÚkÚjÚrindÚurn   ÚfindÚgradsr%   r$   ÚbatchÚgÚgradÚsamplesÚphis                                    r'   r,   Ú_TFGradient.shap_values  s  € ó
 	 Ý(ð ××Ü! !¤T×*Ñ*ÐSÐ,SÓSÐ*Ø�‰Aä˜a¤×&Ñ&ÐJÐ(JÓJÐ&Ü�4×$Ñ$Ó%¬¨Q«Ó/ÐjÐ1jÓjÐ/ô ×#Ñ#×%Ñ%Ø"&§(¡(¨4×+<Ñ+<¸d×>OÑ>OÐQRÓ"SÑà"&§(¡(¨4¯:©:°t×7HÑ7HÈ!Ó"LÐØÑ%¨$×*;×*;Ø  EÓ)Ü%'§Z¢ZÐ1DÐ0DÓ%EÑ"Ø" eÓ+Ü%'§Z¢ZÐ0CÓ%DÑ"Ø" iÓ/Ü%'§Z¢Z´·²Ð7JÓ0KÓ%LÑ"Ø" hÓ.Ø%3Ñ"àO�Ü  Ó&Ð&à Ð$=Ó=Ø%7º¸?¸N¸?Ð8JÑ%KÐ"øä!#§¢¬¯ª´3°t·~±~Ó3FÓ)GÈ!ÈAÉ$Ï*É*ÐUVÉ-ÐYZÐI[Ó!\Ðð ˆØˆÜ[`ÔadÐefÓagÔ[hÓiÒ[hÐVWœŸš 8 +°±·
±
¸1¸2°Ñ">ÄbÇjÁjÔQÑ[hˆÐiÜ[`ÔadÐefÓagÔ[hÓiÒ[hÐVWœŸš 8 +°±·
±
¸1¸2°Ñ">ÄbÇjÁjÔQÑ[hˆÐià‰=Ü—I‘I×%Ñ% a¨Ó-ˆEäÐ)×/Ñ/°Ñ2×3ˆAÜ�I‰I�N‰N˜5Ô!ØˆDØˆHÜœ3˜q›6–]�Ø—‘œBŸHšH Q q¡T§Z¡ZÓ0Ô1Ø—‘¤§¢¨¨1©¯©Ó 4Ö5ñ #ô ˜1˜Q™4Ÿ:™: a™=×)�ä˜xŸ�AÜŸ9™9×+Ñ+¨D¯I©I°a©L×,>Ñ,>¸qÑ,AÓB�DÜŸ	™	×)Ñ)Ó+�AÜ"¤3 q£6ž]˜Ø×/Ñ/°!Ó3Ø ! !¡ Q¡¬"¯)©)¯/ª/¸1¸Q¹4À¹7¿=¹=Ð*IÈD×L`ÑL`Ñ*`Ñ `™Aà ! !¡ Q¡˜AØ./°!©e°q¸1±uÀÇ	Á	È!ÁÈTÑ@RÑ6RÑ.R˜ aÑ(¨Ñ+Ø./°$·)±)¸A±,¸tÑ2DÑ.D˜ aÑ(¨Ó+ô +ñ )ð *¨!¨Q¨$Ñ/�Ø�Ü˜q (¯O©OÖ<�AÜ_dÔehÐijÓekÔ_lÓmÒ_lÐZ[˜]¨1Ñ-¨a´#°a¸$¿/¹/Ñ6IÈ8Ó2TÓUÑ_l�EÐmØ—L‘L §¡¨$¯-©-¸Ó*=¸t×?PÑ?PÐRWÓ!XÖYñ =ô KPÔPSÐTUÓPVÌ-ÔXÊ-ÀQœŸš±eÓ'<²e°¨¨!¬±eÑ'<¸aÖ@É-�ÑXô œs 1›vž�AØ" 1™g¨°aÑ(8Ñ8�GØ!(§¡¨a£�D˜‘G˜A‘JØ%,§[¡[°£^´b·g²g¸g¿m¹mÈAÑ>NÓ6OÑ%O�H˜Q‘K “Nô 'ñ- *ðj ×Ñ¨d×.>×.>˜t AšwÀDÔIØ×"Ñ"°d×6F×6F 8¨A¢;ÈH×Uñ{ 4ô~ �k¤4×(Ñ(ä˜+ a™.¬$×/Ñ/Ü[`ÔadÐepÐqrÑesÓatÔ[uÔvÒ[uÐVWœrŸxšx¹;Ó(Gº;°C¨¨Q¬¹;Ñ(GÈbÔQÑ[u�Ñv�ô !Ÿhšh {¸Ñ<�ØÑ%ÞØ"Ð5GÐGÐGà"Ð6Ð6æØ"Ð3Ð3à"Ð"ùòk jùÚiùò: nùâ'<ùÓXùòP )HùÓvsD   Ç;A \'ÉA \,Ó.)\1
Õ/\;
Ö	\6Ö\;
Ú>]Û]Û'
]Ü6\;
Ý]c                 óú  • [         R                  5       (       dJ  [        [        X#5      5      nU R                  b  SX@R                  '   U R
                  R                  X5      $ / n[        [        U5      5       Hw  n[        U R                  U   R                  5      nSUS'   [         R                  X6   R                  U5      U R                  U   R                  S9nUR                  U5        My     U" U5      $ )Nr   r‚   r   )rK   rP   ÚdictÚzipr[   r!   r†   r`   rR   rQ   rT   rV   ÚconstantÚreshaper€   r’   )	r   rq   rT   r-   Ú	feed_dictÚinputsrb   rV   Úvs	            r'   r†   Ú_TFGradient.run‘  sÔ   € ô ×#Ñ#×%Ñ%ÜœS Ó1Ó2ˆIØ×+Ñ+Ñ7Ø:;�	×6Ñ6Ñ7Ø—<‘<×#Ñ# CÓ3Ð3ð ˆFÜœ3˜q›6–]�Ü˜T×.Ñ.¨qÑ1×7Ñ7Ó8�Ø��a‘Ü—K‘K ¡§¡¨UÓ 3¸4×;LÑ;LÈQÑ;O×;UÑ;U�KÐV�Ø—‘˜aÖ ñ	 #ñ
 �v“;Ðr1   )rY   r"   r    r_   rZ   r[   r#   r   rT   rU   rX   rW   r!   r8   r;   )	r=   r>   r?   r@   r(   rm   r,   r†   rB   rC   r1   r'   r   r   £   s"   † ô?OòB)!ðX kpô#õBr1   r   c                   óF   • \ rS rSrS	S jrS r\S 5       rS r S
S jr	Sr
g)r   i¤  c                 óÒ  • SS K n[        R                  " UR                  5      [        R                  " S5      :  a  [        R
                  " S5        SU l        [        U[        5      (       a  SU l        [        U[        5      (       d  U/nX l	        X0l
        X@l        S U l        S U l        SU l        [        U[        5      (       aÑ  SU l        Uu  pUR!                  5       nU R#                  U5        X`l        UR%                  5          U" U6 nU R                  R&                  n[)        U5      [        L a4  U V	s/ s H   o™R+                  5       R-                  5       PM"     sn	U l        O$UR+                  5       R-                  5       /U l        S S S 5        OX l        UR!                  5       U l        Sn
U R0                  " U R                  6 n[3        UR4                  5      S:”  a  UR4                  S   S:”  a  Sn
X l        U R6                  (       d	  S /U l        g [;        UR4                  S   5       Vs/ s H  nS PM     snU l        g s  sn	f ! , (       d  f       NÀ= fs  snf )Nr   z0.4z9Your PyTorch version is older than 0.4 and not supported.FTrH   )Útorchr   rL   rM   rN   rO   rX   r   rQ   rT   r"   r#   ÚlayerÚinput_handleÚinterimr   ÚevalÚadd_handlesÚno_gradÚtarget_inputr   ÚcloneÚdetachr    r   rR   rV   rW   r_   r`   )r   r   r    r"   r#   r¼   r½   Ú_Úinterim_inputsrb   rW   r^   s               r'   r(   Ú_PyTorchGradient.__init__¥  sá  € Ûä�=Š=˜×*Ñ*Ó+¬g¯mªm¸EÓ.BÓBÜ�MŠMÐUÔVð !ˆÔÜ�dœD×!Ñ!Ø#ˆDÔÜ˜$¤×%Ñ%Ø�6ˆDð !ÔØ$ŒØ.ÔàˆŒ
Ø ˆÔØˆŒÜ�eœU×#Ñ#ØˆDŒLØ ‰LˆEØ—J‘J“LˆEØ×Ñ˜UÔ#ØŒJð —‘•Ù˜4�L�Ø!%§¡×!8Ñ!8�Ü˜Ó'¬5Ò0á=KÓ Lº^¸§¡£×!1Ñ!1Ö!3¹^Ñ L�D•Ià!/×!5Ñ!5Ó!7×!>Ñ!>Ó!@Ð A�D”I÷ !�ð ŒIØ—Z‘Z“\ˆŒ
àˆØ—*’*˜d×/Ñ/Ð0ˆÜˆw�}‰}Ó Ó! g§m¡m°AÑ&6¸Ó&:ØˆLØ(Ôà× × Ø"˜VˆD�Nä,1°'·-±-ÀÑ2BÔ,CÓDÒ,C q›dÑ,CÑDˆD�Nùò! !M÷ !•üò* Es$   Ä2IÄ>'IÅ%-IÈ9I$ÉIÉ
I!c                 ó  • SS K nU R                  R                  5         U Vs/ s H  oDR                  5       PM     nnU R                  " U6 nUS S 2U4    Vs/ s H  owPM     nnU R                  bŽ  U R
                  R                  n	[        U	5       VV
s/ s HR  u  pUR                  R                  XŠUS-   [        U	5      :  a  SOS S9S   R                  5       R                  5       PMT     nnn
U R
                  ?U$ [        U5       VVs/ s HR  u  pUR                  R                  X„US-   [        U5      :  a  SOS S9S   R                  5       R                  5       PMT     nnnU$ s  snf s  snf s  sn
nf s  snnf )Nr   rH   T)Úretain_graph)r¼   r   Ú	zero_gradÚrequires_grad_r¾   r½   rÃ   Ú	enumerateÚautogradr­   rR   ÚcpuÚnumpy)r   Úidxr·   r¼   rn   r-   r^   ÚvalÚselectedrÇ   Úinputrª   s               r'   rm   Ú_PyTorchGradient.gradientÝ  sy  € Ûà�
‰
×ÑÔÙ)/Ó0ª A×ÑÖ©ˆÐ0Ø—*’*˜a�.ˆØ#*ª1¨c¨6¢?Ó3¢?˜C’C¡?ˆÐ3Ø×ÑÑ(Ø!ŸZ™Z×4Ñ4ˆNô
 #,¨NÔ";ô	ò #<‘J�Cð —‘×#Ñ# HÈ#ÐPQÉ'ÔTWÐXfÓTgÓJgÁ$ÐmqÐ#ÐrÐstÑuß‘“ß‘“òñ #<ð	 ñ ð —
‘
Ð'ð ˆô (¨œlôâ*‘F�Cð —‘×#Ñ# HÀcÈAÁgÔPSÐTUÓPVÓFV¹dÐ\`Ð#ÐaÐbcÑd×hÑhÓj×pÑpÖrÙ*ð ñ ð ˆùò# 1ùâ3ùóùós   £E,ÁE1ÂAE6ÄAE<c                 ó6   •  U ? Xl         g ! [         a     Nf = f©N)rÃ   ÚAttributeError)r   rÔ   Úoutputs      r'   Úget_interim_inputÚ"_PyTorchGradient.get_interim_inputô  s)   € ð	ØÐ!ð "Õøô ó 	Ùð	ús   ‚ ‹
—c                 óF   • UR                  U R                  5      nX l        g r×   )Úregister_forward_hookrÚ   r¾   )r   r½   r¾   s      r'   rÁ   Ú_PyTorchGradient.add_handlesü  s   € Ø×2Ñ2°4×3IÑ3IÓJˆØ(Õr1   Nc                 ól  • SS K nU R                  (       d   [        U[        5      (       a   S5       eU/nO[        U[        5      (       d   S5       eUb¬  U R                  (       a›  UR                  5          U R                  " U6 nS S S 5        US:X  a  UR                  WSS9u  pšONUS:X  a  UR                  WSS9u  pšO5US	:X  a"  UR                  UR                  W5      SS9u  pšOS
n[        U5      eU
S S 2S U24   n
OxUR                  US   R                  S   [        U R                  5      45      R                  5       UR                  S[        U R                  5      5      R                  5       -  n
U R                   c*  U R"                  SL a  U R%                  U R&                  5        US   R                  S   n/ n/ n[)        [        U5      5       Vs/ s H1  o÷R+                  U4X   R                  SS  -   X   R,                  S9PM3     nn[)        [        U R.                  5      5       Vs/ s H7  n[0        R*                  " U4U R.                  U   R                  SS  -   5      PM9     nnUc   [0        R2                  R5                  SS5      n[)        U
R                  S   5       GHÓ  n[0        R2                  R7                  U5        / n/ n[)        [        U R.                  5      5       H‰  nUR9                  [0        R*                  " U4U R.                  U   R                  SS  -   5      5        UR9                  [0        R*                  " U4U R.                  U   R                  SS  -   5      5        M‹     [)        US   R                  S   5       GH‹  n[)        U5       GHø  n[0        R2                  R;                  U R.                  S   R                  S   5      n[0        R2                  R=                  5       n[)        [        U5      5       GHe  nU R>                  S:”  an  UU   U   RA                  5       RC                  5       URE                  UU   U   R                  UU   R,                  S9RG                  5       U R>                  -  -   nO$UU   U   RA                  5       RC                  5       nUU-  SU-
  U RH                  U   U   RA                  5       RC                  5       -  -   RA                  5       RC                  5       UU   U'   U R                   b  GM  UU R.                  U   U   RA                  5       RC                  5       -
  RK                  5       RM                  5       UU   U'   GMh     U R"                  SL d  GMë  UR                  5          U R                  " [)        [        U5      5       Vs/ s H  nUU   U   RO                  S5      PM     sn6 n	U R&                  RP                  nU R&                  ?([S        U5      [T        L ay  [S        U5      [T        L aC  [)        [        U5      5       H*  nUU   RK                  5       RM                  5       UU   U'   M,     O$URK                  5       RM                  5       US   U'   S S S 5        GMû     U
UU4   n/ n[)        SX RV                  5       H�  n[)        [        U5      5       Vs/ s H>  nUU   U[Y        UU RV                  -   U5       RA                  5       RC                  5       PM@     nnUR9                  U R[                  UU5      5        Mƒ     [)        [        U R.                  5      5       V V!s/ s H.  n [0        R\                  " U V!s/ s H  n!U!U    PM
     sn!S5      PM0     n"n n![)        [        U R.                  5      5       H`  nU"U   UU   -  n#U#R_                  S5      UU   U'   U#Ra                  S5      [0        Rb                  " U#R                  S   5      -  UU   U'   Mb     GMŽ     UR9                  [        U R.                  5      S:X  a  US   OU5        UR9                  U R                  (       d  US   OU5        GMÖ     U R                   b!  U R                   Re                  5         S U l        [        U[        5      (       a~  [        US   [        5      (       aQ  [)        [        US   5      5       VV$s/ s H,  n[0        Rf                  " U V$s/ s H  n$U$U   PM
     sn$SS9PM.     nnn$O[0        Rf                  " USS9nUb  U(       a  XÞU
4$ XÚ4$ U(       a  XÞ4$ U$ ! , (       d  f       GNè= fs  snf s  snf s  snf ! , (       d  f       GMë  = fs  snf s  sn!f s  sn!n f s  sn$f s  sn$nf )Nr   rz   r{   r<   T)Ú
descendingr|   Fr}   z/output_rank_order must be max, min, or max_abs!rH   )Údevicer�   r‚   rƒ   )4r¼   rX   r   rQ   rW   rÂ   r   Úsortr‰   rŠ   ÚonesrV   rR   r_   ÚintrŒ   r¾   r¿   rÁ   r½   r`   r�   rá   r    r‡   r�   r�   r‘   r’   r“   r”   r#   rÄ   rÅ   ÚemptyÚnormal_rT   rÏ   rÐ   Ú	unsqueezerÃ   r   r   r"   r|   rm   r–   r—   r˜   r™   Úremoverš   )%r   r-   r.   r3   r4   r5   r6   r¼   r›   rÆ   rœ   r�   Ú	X_batchesrž   rŸ   r    r¡   r¢   rb   r£   r¤   r¥   r¦   r§   r$   rn   rÇ   r©   rª   r%   Úcr«   Úzr¬   r­   r®   r¯   s%                                        r'   r,   Ú_PyTorchGradient.shap_values   sO  € ó 	ð
 ××Ü! !¤T×*Ñ*ÐSÐ,SÓSÐ*Ø�‰Aä˜a¤×&Ñ&ÐJÐ(JÓJÐ&àÑ%¨$×*;×*;Ø—‘•Ø&*§j¢j°! nÐ#÷ !ð ! EÓ)Ø(-¯
©
Ð3FÐSW¨
Ð(XÑ%�Ð%Ø" eÓ+Ø(-¯
©
Ð3FÐSX¨
Ð(YÑ%�Ð%Ø" iÓ/Ø(-¯
©
°5·9±9Ð=PÓ3QÐ^b¨
Ð(cÑ%�Ð%àH�Ü  Ó&Ð&Ø!3²A°¸°Ð4FÑ!GÑð —
‘
˜A˜a™DŸJ™J q™M¬3¨t¯~©~Ó+>Ð?Ó@×DÑDÓFÈÏÉÐVWÔY\Ð]a×]kÑ]kÓYlÓIm×IqÑIqÓIsÑsð ð ×ÑÑ$¨¯©¸Ò)=Ø×Ñ˜TŸZ™ZÔ(ð �a‘D—J‘J˜q‘Mˆ	ØˆØˆô afÔfiÐjkÓflÔ`mÓnÒ`mÐ[\Ÿ™ h [°1±4·:±:¸a¸b°>Ñ%AÈ!É$Ï+É+˜ÓVÑ`mˆÐnÜQVÔWZÐ[_×[dÑ[dÓWeÔQfÓgÒQfÈAœŸš 8 +°·	±	¸!±×0BÑ0BÀ1À2Ð0FÑ"FÖGÑQfˆÐgð ‰=Ü—I‘I×%Ñ% a¨Ó-ˆEäÐ)×/Ñ/°Ñ2×3ˆAÜ�I‰I�N‰N˜5Ô!ØˆDØˆHÜœ3˜tŸy™y›>Ö*�à—‘œBŸHšH i \°D·I±I¸a±L×4FÑ4FÀqÀrÐ4JÑ%JÓKÔLØ—‘¤§¢¨)¨¸¿	¹	À!¹×8JÑ8JÈ1È2Ð8NÑ)NÓ OÖPñ +ô ˜1˜Q™4Ÿ:™: a™=×)�ä˜xŸ�AÜŸ9™9×+Ñ+¨D¯I©I°a©L×,>Ñ,>¸qÑ,AÓB�DÜŸ	™	×)Ñ)Ó+�AÜ"¤3 q£6Ÿ]˜Ø×/Ñ/°!Ó3ð !" !¡ Q¡§¡£× 6Ñ 6Ó 8Ø"'§+¡+¨a°©d°1©g¯m©mÀAÀaÁDÇKÁK +Ð"P×"XÑ"XÓ"ZÐ]a×]qÑ]qÑ"qñ!rñ ð
 !" !¡ Q¡§¡£× 6Ñ 6Ó 8˜Aà ™U a¨!¡e°×0AÑ0AÀ!Ñ0DÀTÑ0J×/QÑ/QÓ/S×/ZÑ/ZÓ/\Ñ%\Ñ\×cÑcÓe×lÑlÓnð & aÑ(¨Ñ+ð  ×,Ñ,Ô4Ø34¸¿	¹	À!¹ÀTÑ8J×7QÑ7QÓ7S×7ZÑ7ZÓ7\Ñ3\×2aÑ2aÓ2c×2iÑ2iÓ2k˜M¨!Ñ,¨QÔ/ñ +ð —|‘| tÕ+Ø"Ÿ]™]�_Ø $§
¢
ÔW\Ô]`ÐabÓ]cÔWdÓ,eÒWdÐRS¨]¸1Ñ-=¸aÑ-@×-JÑ-JÈ1Ö-MÑWdÑ,eÐ f˜AØ-1¯Z©Z×-DÑ-D˜NØ $§
¡
Ð 7Ü# NÓ3´uÒ<Ü#'¨Ó#7¼5Ò#@ä-2´3°~Ó3FÖ-G¨Ø>LÈQÑ>O×>SÑ>SÓ>U×>[Ñ>[Ó>]¨°aÑ(8¸Ó(;ò .Hð ;I×:LÑ:LÓ:N×:TÑ:TÓ:V M°!Ñ$4°QÑ$7÷ -š_ñ' )ð@ *¨!¨Q¨$Ñ/�Ø�Ü˜q (¯O©OÖ<�AäkpÔqtÐuvÓqwÔkxóÚkxÐfg˜ aÑ(¨¬S°°T·_±_Ñ1DÀhÓ-OÐP×VÑVÓX×_Ñ_ÖaÑkxð ð ð —L‘L §¡¨t°UÓ!;Ö<ñ	 =ô
 KPÔPSÐTX×T]ÑT]ÓP^ÔJ_Ô`ÒJ_ÀQœŸš±eÓ'<²e°¨¨!¬±eÑ'<¸aÖ@ÑJ_�Ñ`äœs 4§9¡9›~Ö.�AØ" 1™g¨°aÑ(8Ñ8�GØ!(§¡¨a£�D˜‘G˜A‘JØ%,§[¡[°£^´b·g²g¸g¿m¹mÈAÑ>NÓ6OÑ%O�H˜Q‘K “Nô /ñW *ð` ×Ñ¬#¨d¯i©i«.¸AÓ*=˜t AšwÀ4ÔHØ×"Ñ"°d×6F×6F 8¨A¢;ÈH×Uñs 4ðv ×ÑÑ(Ø×Ñ×$Ñ$Ô&Ø $ˆDÔô �k¤4×(Ñ(ä˜+ a™.¬$×/Ñ/Ü[`ÔadÐepÐqrÑesÓatÔ[uÔvÒ[uÐVWœrŸxšx¹;Ó(Gº;°C¨¨Q¬¹;Ñ(GÈbÔQÑ[u�Ñv�ô !Ÿhšh {¸Ñ<�àÑ%ÞØ"Ð5GÐGÐGà"Ð6Ð6æØ"Ð3Ð3à"Ð"÷o !–üò> oùÚgùòH -f÷ -Ÿ_üò ùò (=ùÓ`ùò$ )HùÓvsn   Á6e'Ç8e9È6>e>Ö(#f	×!f×,B1f	Û"Af
Ý/f%
Þ	f Þf%
ã>f0äf+ä'
f0å'
e6æf	æ
fæ f%
æ+f0)r"   r    r_   r¾   r¿   r½   r#   r   rT   rX   rW   rÃ   )r9   r   r;   )r=   r>   r?   r@   r(   rm   ÚstaticmethodrÚ   rÁ   r,   rB   rC   r1   r'   r   r   ¤  s4   † ô6Eòpð. ñ"ó ð"ò)ð
 kp÷F#r1   r   )rN   rÐ   r‡   Úpandasr   Ú	packagingr   Ú_explanationr   Úexplainers._explainerr   Úexplainers.tf_utilsr   r   r	   r
   rG   rK   r   r   r   rC   r1   r'   Ú<module>ró      s[   ðÛ ã Û Ý å &Ý -÷ó ð 	€Ø	€ôLs˜	ô Lsô^~�)ô ~ôBb#�yõ b#r1   