
    KiV              
          S SK rS SKrS SKJr  S SKJr  S SKJrJ	r	J
r
  S SKJrJrJrJrJrJrJ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Jr  S S
KJr  S SK J!r!  S SK"J#r#  S SK$J%r%  S SK&J'r'J(r(  S SK)J*r*J+r+J,r,J-r-  S SK.J/r/J0r0J1r1J2r2J3r3J4r4  S SK5J6r6  S SK7J8r8J9r9  S SK:J;r;J<r<  S SK=J>r>  S SK?J@r@  S SKAJBrBJCrCJDrDJErEJFrF  S SKGJHrH  S SKIJJrJ  S SKKJLrLJMrMJNrNJOrOJPrP  S SKQJRrR  S SKSJTrT  S SKUJVrV  SrW\R                  " SS9S  5       rYS! rZ\R                  R                  S"\T5      \R                  R                  S#S$S%/5      \R                  R                  S&S'S(/5      S) 5       5       5       r]S* r^\R                  R                  S&S'S(/5      S+ 5       r_S, r`\R                  R                  S#/ S-Q5      \R                  R                  S&S'S(/5      S. 5       5       ra\R                  R                  \R                  R                  S#/ S-Q5      \R                  R                  S&S'S(/5      S/ 5       5       5       rc\R                  R                  S#S$S%/5      \R                  R                  S&S'S(/5      \R                  R                  S0\d" S15      5      S2 5       5       5       reS3 rf\R                  R                  S"\T5      \R                  R                  S#/ S-Q5      S4 5       5       rg\R                  R                  S#S5/S$\" 5       4S%\%" S6S794S8\" 5       4/5      S9 5       rhS: ri\R                  R                  S;/ S<Q5      \R                  R                  S&S'S(/5      S= 5       5       rjS> rkS? rl\R                  R                  S#/ S-Q5      \R                  R                  S&S'S(/5      S@ 5       5       rm\R                  R                  S#/ S-Q5      \R                  R                  S&S'S(/5      SA 5       5       rn\R                  R                  S&S'S(/5      SB 5       ro\R                  R                  SC\R                  R                  SD5      R                  SESFS15      \R                  R                  SD5      R                  SESFS1SG5      /5      SH 5       rs\R                  SI 5       rt\R                  SJ 5       ruSK rvSL rwSM rxSN ry\R                  " SS9SO 5       rz\R                  " SS9SP 5       r{\R                  R                  SQSFSR/5      \R                  R                  SSSTSU/5      SV 5       5       r|SW r}\R                  R                  SXSYSZ/5      S[ 5       r~S\ r\R                  R                  S]S^S_/5      S` 5       rSa r\R                  R                  Sb\\/5      Sc 5       r\R                  R                  Sb\\/5      Sd 5       r\R                  R                  SeSfS1SgSh.SfS1SgSi./5      Sj 5       r\R                  R                  Sk/ SlQ5      Sm 5       r\R                  R                  S#/ S-Q5      \R                  R                  S&S'S(/5      Sn 5       5       r\R                  R                  SoSpSq/5      Sr 5       r\R                  R                  SsSt/\W-  \GR                  " \W5      /5      Su 5       rSv rSw rSx rSy r\R                  R                  SzS'S(/5      \R                  R                  S#/ S-Q5      S{ 5       5       rS| r\R                  R                  S&S(S'/5      \R                  R                  SzS(S'/5      \R                  R                  S}\F" 5       \CS~9S 5       5       5       r\R                  R                  S&S(S'/5      \R                  R                  SzS(S'/5      \R                  R                  S}\F" 5       \CS~9S 5       5       5       rg)    N)assert_allclose)config_context)BaseEstimatorClassifierMixinclone)CalibratedClassifierCVCalibrationDisplay_CalibratedClassifier_sigmoid_calibration_SigmoidCalibration_TemperatureScalingcalibration_curve)	load_iris
make_blobsmake_classification)LinearDiscriminantAnalysis)DummyClassifier)RandomForestClassifierVotingClassifier)DictVectorizer)FrozenEstimator)SimpleImputer)IsotonicRegression)LogisticRegressionSGDClassifier)accuracy_scorebrier_score_losslog_lossroc_auc_score)KFoldLeaveOneOutcheck_cvcross_val_predictcross_val_scoretrain_test_split)MultinomialNB)Pipelinemake_pipeline)LabelEncoderStandardScaler)	LinearSVC)DecisionTreeClassifier)_convert_to_numpy_get_namespace_device_dtype_idsdeviceget_namespace)yield_namespace_device_dtype_combinations)CheckingClassifier)get_tags)_array_api_for_tests_convert_containerassert_almost_equalassert_array_almost_equalassert_array_equal)softmax)CSR_CONTAINERS)check_is_fitted   module)scopec                  *    [        [        SSS9u  pX4$ )N   *   	n_samples
n_featuresrandom_state)r   	N_SAMPLESXys     `/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/sklearn/tests/test_calibration.pydatarK   I   s    qrRDA4K    c                     U u  pSn[         R                  " [        5         [        US9R	                  X5        S S S 5        g ! , (       d  f       g = f)Nz%not sigmoid, isotonic, or temperaturemethod)pytestraises
ValueErrorr   fit)rK   rH   rI   invalid_methods       rJ   test_calibration_method_raisesrU   O   s9    DA<N	z	"n599!? 
#	"	"s   A
Acsr_containerrO   sigmoidisotonicensembleTFc                 ~   [         S-  nU u  pV[        R                  R                  SS9R	                  UR
                  S9nXUR                  5       -
  nUS U US U US U pnXTS  XdS  p[        5       R                  XU
S9nUR                  U5      S S 2S4   n[        XR
                  S-   US9n[        R                  " [        5         UR                  XV5        S S S 5        X4U" U5      U" U5      44 GH0  u  nn[        XSUS	9nUR                  UXS9  UR                  U5      S S 2S4   n[        X5      [        UU5      :  d   eUR                  UU	S-   U
S9  UR                  U5      S S 2S4   n[        UU5        UR                  USU	-  S-
  U
S9  UR                  U5      S S 2S4   n[        UU5        UR                  UU	S-   S-  U
S9  UR                  U5      S S 2S4   nUS
:X  a  [        USU-
  5        GM  [        X5      [        US-   S-  U5      :  a  GM1   e   g ! , (       d  f       GNX= f)N   rA   seedsizesample_weight   cvrY      rO   rd   rY   rW   )rF   nprandomRandomStateuniformr_   minr&   rS   predict_probar   rP   rQ   rR   r   r7   )rK   rO   rV   rY   rC   rH   rI   ra   X_trainy_trainsw_trainX_testy_testclfprob_pos_clfcal_clfthis_X_trainthis_X_testprob_pos_cal_clfprob_pos_cal_clf_relabeleds                       rJ   test_calibrationry   X   st   
 QIDAII))r)2:::GM	EEGA "#:I*9}Zi?XhGz]AjMF /

gh

GC$$V,QT2L$SVVaZ(KG	z	"A 
#
 
	w	v!67&!k )HU 	L'B"00=adC  58H$9
 
 	
 

 	L'A+XF%,%:%:;%G1%M"!"24NO 	L!g+/J%,%:%:;%G1%M"!"24NO 	L7Q;!"38L%,%:%:;%G1%M"Y%&6<V8VW $F9<L!q "<=   C&	 
#	"s   
H--
H<c                     U u  p[        SS9nUR                  X5        UR                  S   R                  n[	        U[
        5      (       d   eg )Nr[   rd   r   )r   rS   calibrated_classifiers_	estimator
isinstancer+   )rK   rH   rI   	calib_clfbase_ests        rJ   "test_calibration_default_estimatorr      sH    DA&!,IMM!003==Hh	****rL   c                    U u  p#Sn[        US9n[        XQS9n[        UR                  [         5      (       d   eUR                  R                  U:X  d   eUR                  X#5        U(       a  UOSn[        UR                  5      U:X  d   eg )Nre   n_splitsrc   rb   )r    r   r~   rd   r   rS   lenr|   )rK   rY   rH   rI   splitskfoldr   expected_n_clfs           rJ   test_calibration_cv_splitterr      s     DAF6"E&%CIillE****<<  F***MM!'VQNy001^CCCrL   c                 f   U u  p[        SS9n[        USS9n[        R                  " [        SS9   UR                  X5        S S S 5        [        [        5       SS9n[        R                  " [        SS9   UR                  X5        S S S 5        g ! , (       d  f       NT= f! , (       d  f       g = f)Ne   r   Trc   z$Requesting 101-fold cross-validationmatchz!LeaveOneOut cross-validation does)r    r   rP   rQ   rR   rS   r!   )rK   rH   rI   r   r   s        rJ   test_calibration_cv_nfoldr      s    DA3E&%$?I	z)O	Pa 
Q '+-$GI	z)L	Ma 
N	M	 
Q	P 
N	Ms   B6B"
B"
B0)rW   rX   temperaturec                    [         S-  nU u  pE[        R                  R                  SS9R	                  [        U5      S9nUS U US U US U pnXCS  n
[        SS9n[        XUS9nUR                  XxU	S9  UR                  U
5      nUR                  Xx5        UR                  U
5      n[        R                  R                  X-
  5      nUS:  d   eg )	Nr[   rA   r\   r^   rE   )rO   rY   r`   皙?)rF   rg   rh   ri   rj   r   r+   r   rS   rl   linalgnorm)rK   rO   rY   rC   rH   rI   ra   rm   rn   ro   rp   r}   calibrated_clfprobs_with_swprobs_without_swdiffs                   rJ   test_sample_weightr      s     QIDAII))r)2::A:GM!":I*9}Zi?XhGz]Fr*I+IxXNwx@"008M w(%33F;99>>-:;D#::rL   c                 &   U u  p4[        X4SS9u  pVpx[        [        5       [        SS95      n	[	        XSUS9n
U
R                  XW5        U
R                  U5      n[	        XSUS9nUR                  XW5        UR                  U5      n[        X5        g)zTest parallel calibrationrA   r   r[   )rO   n_jobsrY   rb   N)r%   r(   r*   r+   r   rS   rl   r   )rK   rO   rY   rH   rI   rm   rp   rn   rq   r}   cal_clf_parallelprobs_parallelcal_clf_sequentialprobs_sequentials                 rJ   test_parallel_executionr      s    
 DA'72'N$GWn.	r0JKI-X *%33F;N/X 7,)77?N5rL   r]   r[   c                    S n[        SS9n[        SSUSSS9u  pVS	XfS	:  '   [        R                  " U5      R                  S
   nUS S S	2   US S S	2   pUSS S	2   USS S	2   pUR                  X5        [        X@SUS9nUR                  X5        UR                  U
5      n[        [        R                  " USS9[        R                  " [        U
5      5      5        SUR                  X5      s=:  a  S:  d   e   eUR                  X5      SUR                  X5      -  :  d   eU" U[        UR                  U
5      5      US9nU" XUS9nUSU-  :  d   e[        SSS9nUR                  X5        UR                  U
5      nU" UUUS9n[        X@SUS9nUR                  X5        UR                  U
5      nU" UUUS9nUSU-  :  d   eg )Nc                     [         R                  " U5      U    n[         R                  " X1-
  S-  5      UR                  S   -  $ )Nr[   r   )rg   eyesumshape)y_true
proba_pred	n_classesY_onehots       rJ   multiclass_brier5test_calibration_multiclass.<locals>.multiclass_brier   s:    66)$V,vvx,23hnnQ6GGGrL      r     d   
         .@rC   rD   rE   centerscluster_stdr[   r   rb   re   rf   axis?gffffff?)r   g?   rA   )n_estimatorsrE   )r+   r   rg   uniquer   rS   r   rl   r   r   onesr   scorer9   decision_functionr   )rO   rY   r]   r   rr   rH   rI   r   rm   rn   rp   rq   rt   probasuncalibrated_briercalibrated_brier	clf_probscal_clf_probss                     rJ   test_calibration_multiclassr      s   H 
#C#D"RVDA A!eH		!""1%I1vq1vWqt!tWa1gFGGG$SAQGKK!""6*FBFF6*BGGCK,@A
 #))F+2d22222 ==(4#))F2K+KKKK
 *--f56) ()Lc$66666 !br
BCGGG!!&)I)&)yQ$SAQGKK!))&1M'Sc$66666rL   c                       " S S5      n [        SSSSSS9u  p[        5       R                  X5      nU " 5       n[        X4/UR                  S9nUR                  U5      n[        US	UR                  -  5        g )
Nc                       \ rS rSrS rSrg)9test_calibration_zero_probability.<locals>.ZeroCalibratori8  c                 H    [         R                  " UR                  S   5      $ )Nr   )rg   zerosr   selfrH   s     rJ   predictAtest_calibration_zero_probability.<locals>.ZeroCalibrator.predict:  s    88AGGAJ''rL    N)__name__
__module____qualname____firstlineno__r   __static_attributes__r   rL   rJ   ZeroCalibratorr   8  s    	(rL   r   2   r   r   r   r   )r}   calibratorsclasses      ?)r   r   rS   r
   classes_rl   r   
n_classes_)r   rH   rI   rr   
calibratorrt   r   s          rJ   !test_calibration_zero_probabilityr   3  s~    
( (
 !RTDA 



%C!J#<G ""1%F FC#..01rL   c                    Sn[        SU-  SSS9u  p4[        R                  R                  SS9R	                  UR
                  S9nX3R                  5       -  nUSU USU USU pnX2S	U-   XBS	U-   XRS	U-   pn	US	U-  S US	U-  S p[        5       nUR                  XgU5        UR                  U5      SS2S
4   nX4U " U	5      U " U5      44 H  u  nn[        [        U5      US9nUS4 H  nUR                  UU
US9  UR                  U5      nUR                  U5      nUSS2S
4   n[        U[        R                  " SS
/5      [        R                  " US
S9   5        [!        X5      [!        UU5      :  a  M   e   M     g)z'Test calibration for frozen classifiersr      r@   rA   rB   r\   r^   Nr[   rb   rN   r`   r   r   )r   rg   rh   ri   rj   r_   rk   r&   rS   rl   r   r   r   r8   arrayargmaxr   )rV   rO   rC   rH   rI   ra   rm   rn   ro   X_caliby_calibsw_calibrp   rq   rr   rs   this_X_calibrv   cal_clf_frozenswy_prob_frozeny_pred_frozenprob_pos_cal_clf_frozens                          rJ   test_calibration_frozenr   L  s    IY1SUVDAII))r)2:::GMLA "#:I*9}Zi?XhG	a)m$	a)m$!i-0 G
 q9}'1y=?);F /CGGGh'$$V,QT2L 
	w	v!67&!k 00DVTT"B|WBG*88EM*22;?M&3AqD&9#rxxA/		-a0PQ $F9<L/=    #&rL   r   clip)out_of_boundsr   c                    U u  p4[        SS9n[        XQSSS9nUR                  X45        UR                  U5      n[	        XSUSSS9nUR                  X5        UR                  X45        UR                  U5      n	UR                  U	5      n
US:X  a,  U
R                  S	:X  a  U
R                  S
   S	:X  a	  U
S S 2S
4   n
[        US S 2S
4   U
5        g )Nr   r   r   Frf   r   )rd   rO   r   r[   rb   )
r+   r   rS   rl   r#   r   r   ndimr   r   )rK   rO   r   rH   rI   rr   rt   
cal_probasunbiased_predsclf_dfmanual_probass              rJ   test_calibration_ensemble_falser   y  s     DA

#C$SANGKK&&q)J 'sqQ?RSNNN>%GGAM""1%F&&v.M!#-*=*=a*@A*E)!Q$/MJq!t$m4rL   c                  >   [         R                  " / SQ5      n [         R                  " / SQ5      n[         R                  " SS/5      n[        U[        X5      S5        SS[         R                  " US   U -  US   -   5      -   -  n[        5       R                  X5      R                  U 5      n[        X4S	5        [        R                  " [        5         [        5       R                  [         R                  " X 45      U5        S
S
S
5        g
! , (       d  f       g
= f)z0Test calibration values with Platt sigmoid model)re   r   )rb   r   gj=ɿgY90(?r   r   r   rb   r@   N)rg   r   r7   r   expr   rS   r   rP   rQ   rR   vstack)exFexYAB_lin_libsvmlin_probsk_probs        rJ   test_sigmoid_calibrationr     s    
((<
 C
((;
CHH24GHIMm-A#-KQOcBFF=#3c#9M!<L#LMMNH!#''199#>Gh3 
z	"!!"))SJ"7= 
#	"	"s   0D
Dr   )r[   r   re   c                    [        SSSSU SSSS9u  p#[        X#SS9u  pEpg[        [        R                  S	S
SS9nUR                  XF5        [        [        U5      SSUS9R                  XW5      n	U	R                  n
U
 HJ  n[        UR                  5      S:X  d   eUR                  S   n[        U5        UR                  S:  a  MJ   e   U(       d  UR                  U5      nU	R                  U5      n[        X~5      [        X}5      :X  d   eUR                  U5      nU	R                  U5      n[!        UU5      [!        X5      ::  d   eU S:X  a  USS2S4   nUSS2S4   n[#        [%        XSS9[%        UUSS95        UR                  U5      n['        5       R                  UU5      n[#        UR                  SSSS9  gg)z%Check temperature scaling calibration  r   r   rb          @rA   rC   rD   n_informativen_redundantr   n_clusters_per_class	class_seprE   r   g:0yE>r<   )Ctolmax_iterrE   r   r   rd   rO   rY   r[   Novr)multi_classr   ư>)atolrtol)r   r%   r   rg   infrS   r   r   r|   r   r   r;   beta_r   r   rl   r   r   r   r   )r   rY   rH   rI   rm   X_calrn   y_calrr   rt   calibrated_classifierscalibrated_classifierr   y_pred
y_pred_caly_scoresy_scores_caly_scores_traintss                      rJ   test_temperature_scalingr    s    	DA &6a%L"GG
rvv4#A
NCGGG$=8	c%  %<<!7 (445:::*66q9

#!### "8 U#__U+
e0N54QQQQ $$U+,,U3|,0IIII
 >1~H'1-L%u=%5A	
 **73 "&&~w?#Dq95 rL   c                    [         R                  " S5      R                  U 5      nUR                  SS5      n[         R                  R                  SSUR                  S   S9n[        5       R                  X5      n[        5       R                  X#5      n[        U5      [        U5      :X  d   eUR                  U5      nUR                  U5      n[        Xg5        g )Nr   r   rb   r   r[   r^   )rg   arangeastypereshaperh   randintr   r   rS   r3   r   r   )global_dtyperH   X_2drI   r  ts_2dy_pred1y_pred2s           rJ   )test_temperature_scaling_input_validationr%    s    
		"\*A99RD
		!QQWWQZ0A			"	"1	(B!%%d.EB<8E?***jjmGmmD!GG%rL   c                     [         R                  " / SQ5      n [         R                  " / SQ5      n[        XSS9u  p#[        U5      [        U5      :X  d   e[        U5      S:X  d   e[	        USS/5        [	        USS/5        [
        R                  " [        5         [        S/S	/5        S
S
S
5        [         R                  " / SQ5      n[         R                  " / SQ5      n[        XESSS9u  pg[        U5      [        U5      :X  d   e[        U5      S:X  d   e[	        USS/5        [	        USS/5        [
        R                  " [        5         [        XESS9  S
S
S
5        g
! , (       d  f       N= f! , (       d  f       g
= f)z Check calibration_curve function)r   r   r   rb   rb   rb   )        r   皙?皙??r   r[   n_binsr   rb   r   r*  gN)r   r   r   r   rb   rb   )r'  r   r(        ?r*  r   quantiler,  strategygUUUUUU?r)  
percentile)r0  )rg   r   r   r   r6   rP   rQ   rR   )r   r  	prob_true	prob_predy_true2r$  prob_true_quantileprob_pred_quantiles           rJ   test_calibration_curver7    sI   XX()FXX45F,VAFIy>S^+++y>Q	Aq6*	C:. 
z	"1#v& 
# hh)*Ghh56G->Z.* !"c*<&====!"a'''*QJ7*S#J7 
z	"'\B 
#	"! 
#	"  
#	"s   E'E8'
E58
Fc                     [        SSSSSS9u  p#[        R                  US'   [        S[	        5       4S[        S	S
94/5      n[        USXS9nUR                  X#5        UR                  U5        g)z$Test that calibration can accept nanr   r[   r   rA   )rC   rD   r  r  rE   r   r   imputerrfrb   )r   r  N)	r   rg   nanr'   r   r   r   rS   r   )rO   rY   rH   rI   rr   clf_cs         rJ   test_calibration_nan_imputerr>  "  sw     !QSDA ffAdG

]_	%.DRS.T'UVC #31VOE	IIaO	MM!rL   c                     [        SSSS9u  p#/ SQn[        SSS9n[        XP[        S	S
9US9nUR	                  X$5        [        UR                  U5      R                  SS9S5        g )Nr   re   r[   )rC   rD   r   )
rb   rb   rb   rb   rb   r   r   r   r   r   r   r   )r  rE   r   r   rf   rb   r   )r   r+   r   r    rS   r   rl   r   )rO   rY   rH   _rI   rr   clf_probs          rJ   test_calibration_prob_sumrB  2  sl    
 QGDA&A
c
*C%ua08H LLH**1-11q193?rL   c           	         [         R                  R                  SS5      n/ SQ/ SQ-   / SQ-   n[        SS9n[	        US[        S	5      U S
9nUR                  X5        U (       a  [         R                  " S5      n[        SS/SS	/5       H|  u  pgUR                  U   R                  U5      n[        US S 2U4   [         R                  " [        U5      5      5        [         R                  " US S 2XW:g  4   S:  5      (       a  M|   e   g UR                  S   R                  U5      n[        UR!                  SS9[         R"                  " UR$                  S   5      5        g )N   re   )r   r   r   rb   )rb   rb   r[   r[   )r[   r   r   r   r   r   rW   r   rf      r   r[   rb   r   )rg   rh   randnr,   r   r    rS   r  zipr|   rl   r8   r   r   allr7   r   r   r   )	rY   rH   rI   rr   rt   r   calib_iclass_iprobas	            rJ   test_calibration_less_classesrL  B  s'    			AA|#l2A
 a
0C$I%(XG KK))A, #QFQF 3G33G<JJ1MEuQZ0"((3q62BC66%7#5 56:;;;; !4 //2@@C!%)))"3RWWU[[^5LMrL   rH   rA      re   r@   c                 v    / SQn " S S[         [        5      n[        U" 5       5      nUR                  X5        g)z;Test that calibration accepts n-dimensional arrays as input)rb   r   r   rb   rb   r   rb   rb   r   r   rb   r   r   rb   r   c                   $    \ rS rSrSrS rS rSrg)>test_calibration_accepts_ndarray.<locals>.MockTensorClassifierik  z*A toy estimator that accepts tensor inputsc                 <    [         R                  " U5      U l        U $ N)rg   r   r   )r   rH   rI   s      rJ   rS   Btest_calibration_accepts_ndarray.<locals>.MockTensorClassifier.fitn  s    IIaLDMKrL   c                 Z    UR                  UR                  S   S5      R                  SS9$ )Nr   r   rb   r   )r  r   r   r   s     rJ   r   Ptest_calibration_accepts_ndarray.<locals>.MockTensorClassifier.decision_functionr  s)    99QWWQZ,00a088rL   )r   N)r   r   r   r   __doc__rS   r   r   r   rL   rJ   MockTensorClassifierrP  k  s    8		9rL   rW  N)r   r   r   rS   )rH   rI   rW  r   s       rJ    test_calibration_accepts_ndarrayrX  `  s5     	6A	9 	9 ,,@,BCNqrL   c                  <    SSS.SSS.SSS.SSS.SSS./n / S	QnX4$ )
NNYadult)stateageTXVTchildCTBR)rb   r   rb   rb   r   r   )	dict_datatext_labelss     rJ   rc  rc  {  sC     w'w'w'w'w'I "K!!rL   c                 n    U u  p[        S[        5       4S[        5       4/5      nUR                  X5      $ )N
vectorizerrr   )r'   r   r   rS   )rc  rH   rI   pipeline_prefits       rJ   dict_data_pipelinerh    s?    DA
(	)E3I3K+LMO q$$rL   c                 (   U u  p#Un[        [        U5      SS9nUR                  X#5        [        UR                  UR                  5        [        US5      (       a   e[        US5      (       a   eUR                  U5        UR                  U5        g)a>  Test that calibration works in prefit pipeline with transformer

`X` is not array-like, sparse matrix or dataframe at the start.
See https://github.com/scikit-learn/scikit-learn/issues/8710

Also test it can predict without running into validation errors.
See https://github.com/scikit-learn/scikit-learn/issues/19637
r[   r{   n_features_in_N)r   r   rS   r8   r   hasattrr   rl   )rc  rh  rH   rI   rr   r   s         rJ   test_calibration_dict_pipelinerl    s     DA
C&s';BIMM!y))3<<8 s,----y"23333 aArL   c                     [        SSSSS9u  p[        [        SS9SS9nUR                  X5        [	        5       R                  U5      R
                  n[        UR
                  U5        UR                  U R                  S   :X  d   eg )	Nr   re   r[   r   rC   rD   r   rE   rb   r  r{   )	r   r   r+   rS   r)   r   r8   rj  r   )rH   rI   r   r   s       rJ   test_calibration_attributesrp    su    QUVWDA&y1~!<IMM!n  #,,Gy))73##qwwqz111rL   c                     [        SSSSS9u  p[        SS9R                  X5      n[        [	        U5      5      nSn[
        R                  " [        US	9   UR                  U S S 2S S
24   U5        S S S 5        g ! , (       d  f       g = f)Nr   re   r[   r   rn  rb   ro  zAX has 3 features, but LinearSVC is expecting 5 features as input.r   r   )r   r+   rS   r   r   rP   rQ   rR   )rH   rI   rr   r   msgs        rJ   2test_calibration_inconsistent_prefit_n_features_inrs    ss     QUVWDA
a.

Q
"C&s';<I
MC	z	-a2A2h" 
.	-	-s   A;;
B	c            	         [        SSSSS9u  p[        [        S5       Vs/ s H  nS[        U5      -   [	        5       4PM     snSS	9nUR                  X5        [        [        U5      S
9nUR                  X5        g s  snf )Nr   re   r[   r   rn  r   lrsoft)
estimatorsvotingr}   )r   r   rangestrr   rS   r   r   )rH   rI   ivoter   s        rJ   !test_calibration_votingclassifierr~    sy     QUVWDACH8L8aTCF]$6$898LD 	HHQN&1FGIMM! Ms   "A>c                      [        SS9$ )NT
return_X_y)r   r   rL   rJ   	iris_datar    s    %%rL   c                 &    U u  pXS:     X"S:     4$ )Nr[   r   )r  rH   rI   s      rJ   iris_data_binaryr    s     DAU8Q1uXrL   r,  r   r0  rj   r.  c           	         Uu  pE[        5       R                  XE5      n[        R                  " XdXRUSS9nUR	                  U5      S S 2S4   n[        XXX#S9u  p[        UR                  U	5        [        UR                  U
5        [        UR                  U5        UR                  S:X  d   eSS Kn[        UR                  UR                  R                  5      (       d   eUR                  R!                  5       S:X  d   e[        UR"                  UR$                  R&                  5      (       d   e[        UR(                  UR*                  R,                  5      (       d   eUR"                  R/                  5       S:X  d   eUR"                  R1                  5       S:X  d   eSS	/nUR"                  R3                  5       R5                  5       n[7        U5      [7        U5      :X  d   eU H  nUR9                  5       U;   a  M   e   g )
Nr)  )r,  r0  alpharb   r/  r   r   z.Mean predicted probability (Positive class: 1)z)Fraction of positives (Positive class: 1)Perfectly calibrated)r   rS   r	   from_estimatorrl   r   r   r2  r3  y_probestimator_name
matplotlibr~   line_linesLine2D	get_alphaax_axesAxesfigure_figureFigure
get_xlabel
get_ylabel
get_legend	get_textsr   get_text)pyplotr  r,  r0  rH   rI   ru  vizr  r2  r3  mplexpected_legend_labelslegend_labelslabelss                  rJ    test_calibration_display_computer    s    DA			!	!!	'B

+
+
q(#C a A&F,	&I CMM9-CMM9-CJJ'!5555 cii!1!1222299 C'''cggsxx}}----ckk3::#4#4555577#SSSS77#NNNN24JKGG&&(224M}%;!<<<< $::::  rL   c                 r   Uu  p#[        [        5       [        5       5      nUR                  X#5        [        R
                  " XBU5      nUR                  S/nUR                  R                  5       R                  5       n[        U5      [        U5      :X  d   eU H  nUR                  5       U;   a  M   e   g )Nr  )r(   r*   r   rS   r	   r  r  r  r  r  r   r  )	r  r  rH   rI   rr   r  r  r  r  s	            rJ   $test_plot_calibration_curve_pipeliner    s    DA
(*<*>
?CGGAM

+
+CA
6C!002HIGG&&(224M}%;!<<<< $::::  rL   zname, expected_label)N_line1)my_estr  c                    [         R                  " / SQ5      n[         R                  " / SQ5      n[         R                  " / 5      n[        X4XQS9nUR                  5         Uc  / OU/nUR	                  S5        UR
                  R                  5       R                  5       n[        U5      [        U5      :X  d   eU H  n	U	R                  5       U;   a  M   e   g )Nr   rb   rb   r   r(  r)  r)  皙?r  r  )
rg   r   r	   plotappendr  r  r  r   r  )
r  nameexpected_labelr2  r3  r  r  r  r  r  s
             rJ   'test_calibration_display_default_labelsr    s     &I-.IXXb\F
Y6
OCHHJ#'<RdV!!"89GG&&(224M}%;!<<<< $::::  rL   c                    [         R                  " / SQ5      n[         R                  " / SQ5      n[         R                  " / 5      nSn[        XX4S9nUR                  U:X  d   eSnUR	                  US9  US/nUR
                  R                  5       R                  5       n[        U5      [        U5      :X  d   eU H  nUR                  5       U;   a  M   e   g )Nr  r  zname oner  zname twor  r  )
rg   r   r	   r  r  r  r  r  r   r  )	r  r2  r3  r  r  r  r  r  r  s	            rJ   )test_calibration_display_label_class_plotr  )  s     &I-.IXXb\FD
Y6
OC%%%DHH$H"$:;GG&&(224M}%;!<<<< $::::  rL   constructor_namer  from_predictionsc                    Uu  p4Sn[        5       R                  X45      nUR                  U5      S S 2S4   n[        [        U 5      nU S:X  a  XcU4OXG4n	U" U	SU06n
U
R
                  U:X  d   eUR                  S5        U
R                  5         US/nU
R                  R                  5       R                  5       n[        U5      [        U5      :X  d   eU H  nUR                  5       U;   a  M   e   UR                  S5        SnU
R                  US9  [        U5      [        U5      :X  d   eU H  nUR                  5       U;   a  M   e   g )	Nzmy hand-crafted namerb   r  r  rH  r  another_namer  )r   rS   rl   getattrr	   r  closer  r  r  r  r   r  )r  r  r  rH   rI   clf_namerr   r  constructorparamsr  r  r  r  s                 rJ   ,test_calibration_display_name_multiple_callsr  =  sQ    DA%H


"
"1
(Cq!!Q$'F,.>?K,0@@ca[qkF
v
-H
-C)))
LLHHJ&(>?GG&&(224M}%;!<<<< $::::   LLHHH(H}%;!<<<< $::::  rL   c                 D   Uu  p#[        5       R                  X#5      n[        5       R                  X#5      n[        R                  " XBU5      n[        R                  " XRX6R
                  S9nUR
                  R                  5       S   nUR                  S5      S:X  d   eg )N)axrb   r  )r   rS   r,   r	   r  r  get_legend_handles_labelscount)	r  r  rH   rI   ru  dtr  viz2r  s	            rJ   !test_calibration_display_ref_liner  `  s    DA			!	!!	'B		!	%	%a	+B

+
+B1
5C,,RA''BDXX//1!4F<<./1444rL   dtype_y_strc                 8   [         R                  R                  S5      n[         R                  " S/S-  S/S-  -   U S9nUR	                  SSUR
                  S9nS	n[        R                  " [        US
9   [        X#5        SSS5        g! , (       d  f       g= f)zKCheck error message when a `pos_label` is not specified with `str` targets.rA   spamr   eggsr[   dtyper   r^   zy_true takes value in {'eggs', 'spam'} and pos_label is not specified: either make y_true take value in {0, 1} or {-1, 1} or pass pos_label explicitlyr   N)
rg   rh   ri   r   r  r_   rP   rQ   rR   r   )r  rngy1y2err_msgs        rJ   *test_calibration_curve_pos_label_error_strr  m  s     ))


#C	6(Q,&A-[	AB	Q	(B	$ 
 
z	1"! 
2	1	1s   6B
Bc                    [         R                  " / SQ5      n[         R                  " SS/U S9nX!   n[         R                  " / SQ5      n[        XSS9u  pV[        U/ SQ5        [        X4SSS	9u  pV[        U/ SQ5        [        US
U-
  SSS	9u  pV[        U/ SQ5        [        US
U-
  SSS	9u  pV[        U/ SQ5        g)z8Check the behaviour when passing explicitly `pos_label`.)	r   r   r   rb   rb   rb   rb   rb   rb   r  eggr  )	r   r(  g333333?r  r   gffffff?r)  r*  r   rE  r+  )r   r-  rb   rb   )r,  	pos_labelrb   r   )r   r   r-  rb   N)rg   r   r   r   )r  r   r   
y_true_strr  r2  r@  s          rJ    test_calibration_curve_pos_labelr  }  s     XX12Fhhk:GJXXDEF %VA>LII~.$ZUSLII~.$VQZQOLII~.$ZVAQWXLII~.rL   kwargsred-.)clwls)color	linewidth	linestylec                 .   Uu  p4[        5       R                  X45      n[        R                  " XSU40 UD6nUR                  R                  5       S:X  d   eUR                  R                  5       S:X  d   eUR                  R                  5       S:X  d   eg)z*Check that matplotlib aliases are handled.r  r[   r  N)r   rS   r	   r  r  	get_colorget_linewidthget_linestyle)r  r  r  rH   rI   ru  r  s          rJ   test_calibration_display_kwargsr    s     DA			!	!!	'B

+
+B1
?
?C99 E)))99""$)))99""$,,,rL   zpos_label, expected_pos_label))Nrb   r9  )rb   rb   c                    Uu  pE[        5       R                  XE5      n[        R                  " XdXRS9nUR	                  U5      SS2U4   n[        XXUS9u  p[        UR                  U	5        [        UR                  U
5        [        UR                  U5        UR                  R                  5       SU S3:X  d   eUR                  R                  5       SU S3:X  d   eUR                  R                  S/nUR                  R                  5       R!                  5       n[#        U5      [#        U5      :X  d   eU H  nUR%                  5       U;   a  M   e   g)z?Check the behaviour of `pos_label` in the `CalibrationDisplay`.)r  Nz,Mean predicted probability (Positive class: )z'Fraction of positives (Positive class: r  )r   rS   r	   r  rl   r   r   r2  r3  r  r  r  r  	__class__r   r  r  r   r  )r  r  r  expected_pos_labelrH   rI   ru  r  r  r2  r3  r  r  r  s                 rJ   "test_calibration_display_pos_labelr    sR   
 DA			!	!!	'B

+
+B1
JCa $6!67F,Q)LICMM9-CMM9-CJJ' 	9:L9MQO	P	P 	45G4HJ	K	K !ll335KLGG&&(224M}%;!<<<< $::::  rL   c                 J   [        SS9u  p#[        5       R                  U5      nUSS USS p2[        R                  " U5      S-  n[        R
                  " UR                  S   S-  UR                  S   4UR                  S9nX%SSS2SS24'   X%SSS2SS24'   [        R
                  " UR                  S   S-  UR                  S9nX6SSS2'   X6SSS2'   [        5       n[        UU USS	9n[        U5      n	U	R                  X#US
9  UR                  XV5        [        U	R                  UR                  5       H9  u  p[        U
R                  R                   UR                  R                   5        M;     U	R#                  U5      nUR#                  U5      n[        X5        g)znCheck that passing repeating twice the dataset `X` is equivalent to
passing a `sample_weight` with a factor 2.Tr  Nr   r[   r   rb   r  )rO   rY   rd   r`   )r   r*   fit_transformrg   	ones_liker   r   r  r   r   r   rS   rG  r|   r   r}   coef_rl   )rO   rY   rH   rI   ra   X_twicey_twicer}   calibrated_clf_without_weightscalibrated_clf_with_weightsest_with_weightsest_without_weightsy_pred_with_weightsy_pred_without_weightss                 rJ   ?test_calibrated_classifier_cv_double_sample_weights_equivalencer    s   
 %DA&&q)ATc7AdsGqLLOa'M hh
Q
3177CGCaCFOADqD!GhhqwwqzA~QWW5GCaCLADqDM"$I%;	&" #((F"G##A#F"&&w8 25#;;&>>2- 	&&,,))//	
	2 6CCAF;II!L'@rL   fit_params_typelistr   c                     Uu  p#[        X05      [        X05      S.n[        SS/S9n[        U5      nUR                  " X#40 UD6  g)zTests that fit_params are passed to the underlying base estimator.

Non-regression test for:
https://github.com/scikit-learn/scikit-learn/issues/12384
)abr  r  )expected_fit_paramsN)r5   r2   r   rS   )r  rK   rH   rI   
fit_paramsrr   pc_clfs          rJ    test_calibration_with_fit_paramsr    sM     DA33J
 #s
<C#C(F
JJq"z"rL   ra   r   c                 T    Uu  p#[        SS9n[        U5      nUR                  X#U S9  g)zETests that sample_weight is passed to the underlying base
estimator.
T)expected_sample_weightr`   N)r2   r   rS   )ra   rK   rH   rI   rr   r  s         rJ   -test_calibration_with_sample_weight_estimatorr    s/     DA
D
9C#C(F
JJq=J1rL   c                    U u  p[         R                  " U5      n " S S[        5      nU" 5       n[        U5      n[        R
                  " [        5         UR                  XUS9  SSS5        g! , (       d  f       g= f)zCheck that even if the estimator doesn't support
sample_weight, fitting with sample_weight still works.

There should be a warning, since the sample_weight is not passed
on to the estimator.
c                   (   ^  \ rS rSrU 4S jrSrU =r$ )Ptest_calibration_without_sample_weight_estimator.<locals>.ClfWithoutSampleWeighti'  c                 6   > SU;  d   e[         TU ]  " X40 UD6$ )Nra   superrS   )r   rH   rI   r  r  s       rJ   rS   Ttest_calibration_without_sample_weight_estimator.<locals>.ClfWithoutSampleWeight.fit(  s%    "*4447;q2z22rL   r   r   r   r   r   rS   r   __classcell__r  s   @rJ   ClfWithoutSampleWeightr  '  s    	3 	3rL   r
  r`   N)rg   r  r2   r   rP   warnsUserWarningrS   )rK   rH   rI   ra   r
  rr   r  s          rJ   0test_calibration_without_sample_weight_estimatorr    sa     DALLOM3!3 3
 !
"C#C(F	k	"

1}
5 
#	"	"s   A00
A>c           
           " S S[         5      n[        U" 5       S9R                  " U S[        R                  " [        U S   5      S-   5      06  g)zWCheck that CalibratedClassifierCV does not enforce sample alignment
for fit parameters.c                   ,   ^  \ rS rSrSU 4S jjrSrU =r$ )Jtest_calibration_with_non_sample_aligned_fit_param.<locals>.TestClassifieri7  c                 *   > Uc   e[         TU ]  XUS9$ )Nr`   r  )r   rH   rI   ra   	fit_paramr  s        rJ   rS   Ntest_calibration_with_non_sample_aligned_fit_param.<locals>.TestClassifier.fit8  s"    (((7;q=;AArL   r   )NNr  r	  s   @rJ   TestClassifierr  7  s    	B 	BrL   r  ry  r  rb   N)r   r   rS   rg   r   r   )rK   r  s     rJ   2test_calibration_with_non_sample_aligned_fit_paramr  3  sJ    B+ B
 ^%56::	T!W!12rL   c           	         SnSn[         R                  R                  U 5      R                  US9n[         R                  " S/[        X!-  5      -  S/U[        X!-  5      -
  -  -   5      nSUR                  S5      -  U-   n[        SUS	S
9nUR                  XT5      nU HV  u  pXX   XH   pXY   n[        SU S9nUR                  X5        UR                  U5      nUS:  R                  5       (       a  MV   e   [        [        SU S9SS9n[        XUSS9n[        [        SU S9SS9n[        UXTSS9n[        UU5        g)zTest that :class:`CalibratedClassifierCV` works with large confidence
scores when using the `sigmoid` method, particularly with the
:class:`SGDClassifier`.

Non-regression test for issue #26766.
gq=
ףp?r   r^   rb   r   g     j@)r   rb   NT)rd   rI   
classifiersquared_hinge)lossrE   g     @rW   rN   roc_auc)scoringrX   )rg   rh   default_rngnormalr   intr  r"   splitr   rS   r   anyr   r$   r   )global_random_seedprobnrandom_noiserI   rH   rd   indicestraintestrm   rn   rp   sgd_clfpredictionsclf_sigmoidscore_sigmoidclf_isotonicscore_isotonics                      rJ   @test_calibrated_classifier_cv_works_with_large_confidence_scoresr.  A  sY    DA99(();<CCCKL
!s18}$sa#ah-.?'@@AAaii  </A 
TQ4	0BhhqnG8QX_CUVG%//7c!&&((((  )?9KLK $KAyIM *?9KLL %\1KN M>2rL   c                 .   [         R                  R                  U S9nSnUR                  SSUS9nUR	                  SSSS9nSn[        UUUS	9u  pgS
n[        UUUS	9u  p[        UUS9u  pSn[        XiUS9  [        XUS9  [        XzUS9  [        XUS9  g )Nr\   r   r   r[   r^   )lowhighr_   r   )r)  rI   max_abs_prediction_thresholdr   )r)  rI   r  )r  )rg   rh   ri   r  rj   r   r   )r!  rE   r#  rI   predictions_smallthreshold_1a1b1threshold_2a2b2a3b3r  s                 rJ   5test_sigmoid_calibration_max_abs_prediction_thresholdr=  s  s    99((.@(ALAQ*A %,,!#,F K!%
%0FB K!%
%0FB "%
FB DB&B&B&B&rL   use_sample_weightc                 >   U(       a'  [         R                  " U S   [         R                  S9nOSn " S S[        5      nU" 5       n[	        XRS9nUR
                  " U SU06  U" 5       R
                  " U SU06n[	        [        U5      US9nUR
                  " U SU06  g)ztCheck that CalibratedClassifierCV works with float32 predict proba.

Non-regression test for gh-28245 and gh-28247.
rb   r  Nc                   (   ^  \ rS rSrU 4S jrSrU =r$ )4test_float32_predict_proba.<locals>.DummyClassifer32i  c                 \   > [         TU ]  U5      R                  [        R                  5      $ rR  )r  rl   r  rg   float32)r   rH   r  s     rJ   rl   Btest_float32_predict_proba.<locals>.DummyClassifer32.predict_proba  s"    7(+222::>>rL   r   )r   r   r   r   rl   r   r  r	  s   @rJ   DummyClassifer32rA    s    	? 	?rL   rE  rN   ra   )rg   r  float64r   r   rS   r   )rK   r>  rO   ra   rE  modelr   s          rJ   test_float32_predict_probarH    s      T!WBJJ??? ? E'=JNND66 ""DFFE'(>vNJNND66rL   c                      [         R                  R                  SS9n S/S-  S/S-  -   n[        SS9R	                  X5        g)	zdCheck that CalibratedClassifierCV works with string targets.

non-regression test for issue #28841.
)   r   r^   r  r   r  r   r{   N)rg   rh   r  r   rS   rG   s     rJ   (test_error_less_class_samples_than_foldsrK    sD    
 			g&A	
cURZAa $$Q*rL   z$array_namespace, device_, dtype_name)idsc                    [        X#5      n[        SSSSSSSSS9u  pg[        XgSS	9u  ppUR                  U5      nU
R                  U5      n
UR	                  XS
9nUR	                  XS
9nU	R                  U5      n	UR                  U5      nUR	                  XS
9nUR	                  XS
9nU(       a  [
        R                  " U5      nSUSSS2'   OSn[        5       nUR                  X5        [        [        U5      SSU S9R                  XUS9nUR                  S   R                  S   nUR                  U5      n[        SS9   [        5       nUR                  X5        [        [        U5      SSU S9R                  XUS9nUR                  S   R                  S   nUS:X  a  SOSn[        UR                   5      S   R"                  UR"                  :X  d   eUR                   R$                  UR$                  :X  d   e['        UR                   5      ['        U5      :X  d   e[)        [+        UR                   US9UR                   US9  UR                  U5      n[)        [+        UUS9U5        SSS5        g! , (       d  f       g= f)z]Check that `CalibratedClassifierCV` with temperature scaling is compatible
with the array APIr   r   r   re   rb   r   rA   r   r   r/   r[   Nr   r   r  r`   Tarray_api_dispatchrC  MbP?Hz>xpr  )r4   r   r%   r  asarrayrg   r  r   rS   r   r   r|   r   r   r   r0   r  r   r  r/   r   r-   )rY   r>  array_namespacedevice_
dtype_namerT  rH   rI   rm   r  rn   r  
X_train_xp
y_train_xpX_cal_xpy_cal_xpra   clf_np
cal_clf_npcalibrator_nppred_npclf_xp
cal_clf_xpcalibrator_xpr  pred_xps                             rJ   -test_temperature_scaling_array_api_compliancerf    su    
o	7B	DA &6a%L"GGnnZ(GnnZ(GG4JG4JLL$ELL$Ezz%z0Hzz%z0HU+add')F
JJw 'Amh	c%mc4  66q9EEaHM  )G	4	0+-

:*+F#-(

#h#
> 	 #::1=II!L!Y.tD]001!4==LLL""((HNN:::m))*fX.>>>>m11b9	

 $$Z0)'b97C% 
1	0	0s   D-I==
Jc                    [        X#5      n[        SSSSSSSSS9u  pg[        R                  " / S	Q5      nUR	                  U5      nX   n	UR                  XcS
9n
U(       a  [        R
                  " U5      nSUSSS2'   OSn[        [        5       SSU S9R                  XiUS9nUR                  S   R                  S   nUR                  U5      n[        SS9   [        [        5       SSU S9R                  XUS9nUR                  S   R                  S   nUS:X  a  SOSn[        UR                  5      S   R                  UR                  :X  d   eUR                  R                   U
R                   :X  d   e[#        UR                  5      [#        U
5      :X  d   e[%        ['        UR                  US9UR                  US9  UR                  U
5      n[)        UU5        SSS5        g! , (       d  f       g= f)zCheck that `CalibratedClassifierCV` with temperature scaling is compatible
with the array API when `y` is an ndarray of strings and the estimator is not
fit beforehand (i.e. it is fit within `CalibratedClassifierCV`).
r   r   r   re   rb   r   rA   r   )r  r  r  derN  r[   Nr   r   )r}   rd   rO   rY   r`   TrO  rC  rQ  rR  rS  rU  )r4   r   rg   rV  r  r  r   r   rS   r|   r   r   r   r0   r  r   r  r/   r   r-   r8   )rY   r>  rW  rX  rY  rT  rH   rI   str_mappingy_strX_xpra   r_  r`  ra  rc  rd  r  re  s                      rJ   Btest_temperature_scaling_array_api_with_str_y_estimator_not_prefitrm    s   & 
o	7B	DA **67K	ANE::a:(DQadd',.	
 
c!-c0  66q9EEaHM  #G	4	0+02 	

 #d#
7 	 #::1=II!L!Y.tD]001!4==LLL""((DJJ666m))*fTl:::m11b9	

 $$T*7G,' 
1	0	0s   D	G,,
G:)numpyrg   rP   numpy.testingr   sklearnr   sklearn.baser   r   r   sklearn.calibrationr   r	   r
   r   r   r   r   sklearn.datasetsr   r   r   sklearn.discriminant_analysisr   sklearn.dummyr   sklearn.ensembler   r   sklearn.feature_extractionr   sklearn.frozenr   sklearn.imputer   sklearn.isotonicr   sklearn.linear_modelr   r   sklearn.metricsr   r   r   r   sklearn.model_selectionr    r!   r"   r#   r$   r%   sklearn.naive_bayesr&   sklearn.pipeliner'   r(   sklearn.preprocessingr)   r*   sklearn.svmr+   sklearn.treer,   sklearn.utils._array_apir-   r.   r/   r0   r1   sklearn.utils._mockingr2   sklearn.utils._tagsr3   sklearn.utils._testingr4   r5   r6   r7   r8   sklearn.utils.extmathr9   sklearn.utils.fixesr:   sklearn.utils.validationr;   rF   fixturerK   rU   markparametrizery   r   r   r   r   thread_unsafer   rz  r   r   r   r   r   r  r%  r7  r>  rB  rL  rh   ri   rF  rX  rc  rh  rl  rp  rs  r~  r  r  r  r  r  r  r  r  r{  objectr  r  r  r  r  r  r   r  r  r  r.  r=  rH  rK  rf  rm  r   rL   rJ   <module>r     sW     ) " > >   H G D ) 6 * ( / B   . 4 > ! /  6 (  * . 4	 h  
@ .9Iz#:;dE]38 4 < :8v+ dE]3D 4D #IJdE]3 4 K0 #IJdE]36 4 K 6, Iz#:;dE]3 q*:7 + 4 <
:7z22 .9#IJ( K :(V |	')*	'f=>	+-.554>"  	5M;:		;:|&"C> #IJdE]3 4 K #IJdE]3@ 4 K@ dE]3N 4N: 
		b!''Aq1
		b!''Aq!4( 	" 	" % %42	#  h&  & h  
 Ar7+i%<=&; > ,&;R; -/CD;; ;( +.>@R-ST; U;D
5 f6" 7" f6/ 7/( 1D)ad;	-	- 8:UV; W;@ #IJdE]3-A 4 K-A` *VW,=># ?#$ 		
	226,/3d&'R ,tUm<#IJ7 K =7D+ eT]3,udm<*-/'  
=D = 4=D@ eT]3,udm<*-/'  
>- = 4>-rL   