
    e!hcK                       d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlm	Z	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZ d d
lmZ d dlmZ d dl m!Z" d dl m#Z$ d dl m%Z%m&Z& d dl'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z: d dl;m<Z<m=Z= d dl>m?Z?m@Z@mAZA ej                  j                  d      ZD ee"d       Z! ee$d       Z#dZEdd gd dgddggZFg dZGg dZH e       ZId ZJej                  j                  deA      d         ZLd! ZMe=d"        ZNej                  j                  deA      d#        ZOej                  j                  d$      ej                  j                  d% e! ePeIj                        d&d'(       e! ePeIj                        d)*       e! ePeIj                        d+*       e! ePeIj                        d,d-d'd./       e! ePeIj                        d0d-d'd./       e! ePeIj                        d1*      g      d2               ZRej                  j                  d$      ej                  j                  d3e!e#g      d4               ZSej                  j                  d3e!e#g      d5        ZTej                  j                  d$      ej                  j                  d6g d7      d8               ZUej                  j                  d$      d9        ZVej                  j                  d:e@      d;        ZWd< ZXd= ZYd> ZZd? Z[d@ Z\dA Z]dB Z^ej                  j                  dCdDdEgfdFdGdHgfdIdGdHgfdJdEgfdKdGdHgfg      dL        Z_dM Z`ej                  j                  deA      dN        Zaej                  j                  d$      dO        ZbdP Zcej                  j                  d$      ej                  j                  dQdRdSg      dT               Zdej                  j                  dQdRdSg      dU        Zeej                  j                  dVdWdXdYdWdXdZd[g      ej                  j                  d\dVd]g      d^               Zfej                  j                  d_d`      ej                  j                  d6d      da               Zgej                  j                  d6db      dc        Zhdd Zide Zjej                  j                  ddf geAz         dg        Zkdh Zldi Zmej                  j                  deA      dj        Znej                  j                  deA      dk        Zodl Zpdm Zqej                  j                  deA      dn        Zrej                  j                  dod.g      ej                  j                  dpdqdrg      ds               Zsdt Ztej                  j                  d$      ej                  j                  du ej                  ddv            ej                  j                  dwd'dxg      ej                  j                  dyg dz      d{                             Zvej                  j                  d$      ej                  j                  d6eE      d|               Zwej                  j                  d6 ex eyeE       eyd&d1g      z
              ej                  j                  d}d~      ej                  j                  dQd~      d                      Zzej                  j                  deA      d        Z{ej                  j                  d$      ej                  j                  dwd'dxg      ej                  j                  d6g d      ej                  j                  dQdRdSg      ej                  j                  deA      d                                    Z|d Z}d Z~ej                  j                  dg d      ej                  j                  dddg      d               Zej                  j                  dg d      d        Zej                  j                  d ej                  ddd            ej                  j                  dg d      d               Zej                  j                  dd      d        Zej                  j                  d$      d        Zej                  j                  d$      ej                  j                  dpd      ej                  j                  dwd      d                      Zej                  j                  d$      d        Zd Zej                  j                  d ej                  ddd            ej                  j                  dg d      d               Zd Zej                  j                  d$      ej                  j                  d e!d d       e#d dddd      gd       ej                  j                  d6eE      d                      Zej                  j                  d6 ex eyeE       eyd&g      z
              d        Zej                  j                  ddqdRddddrdSddddrdRdddg      d        Zd Zej                  j                  d$      ej                  j                  d6g d      ej                  j                  dQdRdSg      d                      Zej                  j                  d$      ej                  j                  dwg d      ej                  j                  d\dddd[d]g      d                      Zej                  j                  d6eE      ej                  j                  deA      d               Zd Zd Z edS      d        Zd Zej                  j                  d6eE      d        Zd Zd Zd Zy)    N)partial)assert_allcloseassert_almost_equalassert_array_almost_equalassert_array_equal)sparse)LinAlgWarningsvd)config_context)HalfMultinomialLoss)clone)	load_irismake_classificationmake_low_rank_matrix)ConvergenceWarning)SGDClassifier)LogisticRegression)LogisticRegressionCV)_log_reg_scoring_path_logistic_regression_path)
get_scorerlog_loss)GridSearchCVLeaveOneGroupOutStratifiedKFoldcross_val_scoretrain_test_split)OneVsRestClassifier)LabelEncoderStandardScalerscale)l1_min_c)compute_class_weightshuffle)ignore_warningsskip_if_no_parallel)	_IS_32BITCOO_CONTAINERSCSR_CONTAINERSz6error::sklearn.exceptions.ConvergenceWarning:sklearn.*random_state)lbfgs	liblinear	newton-cgnewton-choleskysagsaga   )r   r3   r3   )   r3   r   c                    t        |      }t        j                  |      }|j                  d   }| j	                  ||      j                  |      }t        | j                  |       |j                  |fk(  sJ t        ||       | j                  |      }|j                  ||fk(  sJ t        |j                  d      t        j                  |             t        |j                  d      |       y)z;Check that the model is able to fit the classification datar   r3   axisN)lennpuniqueshapefitpredictr   classes_predict_probar   sumonesargmax)clfXy	n_samplesclasses	n_classes	predictedprobabilitiess           p/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/sklearn/linear_model/tests/test_logistic.pycheck_predictionsrL   ?   s    AIiilGa I1%%a(Is||W-??yl***y!$%%a(M9i"8888m//Q/79KL}+++3Q7    csr_containerc                    t        t        d      t        t               t        t        d       | t              t               t        t        dd      t        t               t        t        dd       | t              t               t        t        dd      t        t               t        t        dd       | t              t               y )Nr   r*   d   )Cr+   Ffit_interceptr+   )rL   r   rD   Y1rN   s    rK   test_predict_2_classesrV   Q   s     (a8!R@(a8-:JBO(3Q?BG(3Q?qAQSUV(u1MqRTUQ?qAQSUrM   c                      G d d      }  |        }g d}d}t        |||      }t        d      \  }}|j                  ||       |j                  d   |d   k(  sJ |j                  |t        |      z  k(  sJ d|_        |j                  ||j                  |            }||j                  d   k(  sJ |j                  dk(  sJ y )	Nc                       e Zd Zd ZddZy)0test_logistic_cv_mock_scorer.<locals>.MockScorerc                 $    d| _         g d| _        y )Nr   )皙?g?皙?      ?)callsscores)selfs    rK   __init__z9test_logistic_cv_mock_scorer.<locals>.MockScorer.__init__c   s    DJ.DKrM   Nc                     | j                   | j                  t        | j                         z     }| xj                  dz  c_        |S )Nr3   )r_   r^   r8   )r`   modelrD   rE   sample_weightscores         rK   __call__z9test_logistic_cv_mock_scorer.<locals>.MockScorer.__call__g   s4    KK

S-= =>EJJ!OJLrM   N)__name__
__module____qualname__ra   rf    rM   rK   
MockScorerrY   b   s    	/	rM   rl   )r3   r4         r4   )Csscoringcvr   r*   r3   )	r   r   r<   C_r^   r8   re   r=   r_   )rl   mock_scorerro   rq   lrrD   rE   custom_scores           rK   test_logistic_cv_mock_scorerrv   a   s      ,K	B	
B	[R	@BA.DAqFF1aL 558r!u SW,,, K88Arzz!}-L;--a0000!!!rM   c                  >   t         j                  j                  \  } }t         j                  t         j                     }t        dd      }d}t        j                  t        |      5  |j                  t         j                  |       d d d        y # 1 sw Y   y xY w)Nr-   r4   )solvern_jobsz\'n_jobs' > 1 does not have any effect when 'solver' is set to 'liblinear'. Got 'n_jobs' = 2.match)
irisdatar;   target_namestargetr   pytestwarnsUserWarningr<   )rF   
n_featuresr   rt   warning_messages        rK   test_lr_liblinear_warningr      su     IIOOIzt{{+F	;q	9B	 
 
k	9 "
tyy&!" " "s   )!BBc                     t        t        d      t        t               t        t        d       | t              t               y )N
   rQ   )rL   r   rD   Y2rU   s    rK   test_predict_3_classesr      s+    (2.26(2.a0@"ErM   z5ignore:.*'multi_class' was deprecated.*:FutureWarningrC   r-   ovr)rQ   rx   multi_classr,   )rQ   rx   r.   r0   {Gz?*   )rQ   rx   tolr   r+   r1   r/   c                    t         j                  j                  \  }}t         j                  t         j                     }| j
                  dk(  rXt        j                         5  t        j                  dt               | j                  t         j                  |       ddd       n | j                  t         j                  |       t        t        j                  |      | j                         | j                  t         j                        }t        j                   ||k(        dkD  sJ | j#                  t         j                        }t%        |j'                  d      t        j(                  |             t         j                  |j+                  d         }t        j                   ||k(        dkD  sJ y# 1 sw Y   xY w)zTest logistic regression with the iris dataset.

    Test that both multinomial and OvR solvers handle multiclass data correctly and
    give good accuracy score (>0.95) for the training data.
    r,   ignoreNffffff?r3   r6   )r|   r}   r;   r~   r   rx   warningscatch_warningssimplefilterr   r<   r   r9   r:   r>   r=   meanr?   r   r@   rA   rB   )rC   rF   r   r   predrJ   s         rK   test_predict_irisr      sE   4 !IIOOIzt{{+F
zzW$$& 	'!!(,>?GGDIIv&	' 	' 			6"ryy(#,,7;;tyy!D7746>"T)))%%dii0MM%%1%-rwwy/AB]11q19:D7746>"T)))	' 	's   ";F::GLRc                    t         j                  t         j                  }}dD ]H  }d| d} | |d      }t        j                  t
        |      5  |j                  ||       d d d        J dD ]H  }d|z  } | |d	d
      }t        j                  t
        |      5  |j                  ||       d d d        J dD ]H  }d|z  } | |dd
      }t        j                  t
        |      5  |j                  ||       d d d        J dD ]H  }d| d} | |d      }t        j                  t
        |      5  |j                  ||       d d d        J | t        u rCd} | d d      }t        j                  t
        |      5  |j                  ||       d d d        y y # 1 sw Y   xY w# 1 sw Y   HxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr-   zSolver z( does not support a multinomial backend.multinomial)rx   r   rz   )r,   r.   r/   r0   z/Solver %s supports only 'l2' or None penalties,l1r   )rx   penaltyr   r,   r.   r/   r0   r1   z1Solver %s supports only dual=False, got dual=TrueT)rx   dualr   z;Only 'saga' solver supports elasticnet penalty, got solver=.
elasticnet)rx   r   z6penalty=None is not supported for the liblinear solverr-   r   rx   )r|   r}   r   r   raises
ValueErrorr<   r   )r   rD   rE   rx   msgrt   s         rK   test_check_solver_optionr      s    99dkkqA   xGHv=9]]:S1 	FF1aL	 	 C ?&Hvt?]]:S1 	FF1aL	 	
 K AFJvDe<]]:S1 	FF1aL	 	   KF8STUv|4]]:S1 	FF1aL	 	 
F[1]]:S1 	FF1aL	 	  5	 		 	
	 		 		 	s<   F!F.+F;8GG!F+	.F8	;G	G	Gc                      | dd      }t        j                  t        d      5  |j                  t	        j
                  ddgdd	gg      t	        j
                  d
dg             d d d        y # 1 sw Y   y xY w)Nr   r1   r   z.*l1_ratio.*rz   r3   r4   rm   rn   r   )r   r   r   r<   r9   array)r   rc   s     rK   $test_elasticnet_l1_ratio_err_helpfulr      sh     |F3E	z	9 @		"((QFQF+,bhh1v.>?@ @ @s   AA00A9rx   r,   r.   r0   r1   c                    t         j                  dkD  j                  t        j                        }t        j
                  ddg      |   }t        | ddd      }|j                  t         j                  |       |j                  j                  dt         j                  j                  d   fk(  sJ |j                  j                  d	k(  sJ t        |j                  t         j                        |       t        | ddd
      }|j                  t         j                  |       |j                  t        j                  |j!                  t         j                        d         }t        j"                  ||k(        dkD  sJ y )Nr   setosaz
not-setosar   r     )rx   r   r+   max_iterr3   r3   F)rx   r   r+   rS   r6   ?)r|   r   astyper9   intpr   r   r<   r}   coef_r;   
intercept_r   r=   r>   rB   predict_log_probar   )rx   r   rC   mlrr   s        rK   test_multinomial_binaryr      s!    kkAo%%bgg.FXXx./7F
=rDC GGDIIv99??q$))//!"45555>>4'''s{{499-v6
=rQVC GGDIIv<<		#"7"7		"BKLD7746>"S(((rM   c                 t   t        |       \  }}t        ddd|       }|j                  ||       |j                  |      }|j	                  |      }t        j                  |      t        j                  |      t        j                  |       z   z  }t
        j                  d|z
  |f   }t        ||       y )Nr*   r   r1   MbP?)r   rx   r   r+   r3   )	r   r   r<   decision_functionr?   r9   expc_r   )global_random_seedrD   rE   rC   decisionprobaexpected_proba_class_1expected_probas           rK   %test_multinomial_binary_probabilitiesr     s     ,>?DAq
!'	C GGAqM$$Q'Ha EVVH-1ABFFH9DU1UVUU1557MMNN~.rM   coo_containerc                 L   t         j                  j                  \  }}t         j                  t         j                     }t        t         j                        }t        d      j                  ||      }|j                  |      }|j                          t        j                  |j                        sJ |j                  |      } | |      }|j                  |      }	|j                          |j                  |      }
t        ||       t        ||	       t        ||
       y Nr   r*   )r|   r}   r;   r~   r   r!   r   r<   r   sparsifyr   issparser   densifyr   )r   rF   r   r   rD   rC   pred_d_dpred_s_dsp_datapred_s_spred_d_ss              rK   test_sparsifyr   .  s     !IIOOIzt{{+FdiiA
!
,
0
0F
;C$$Q'HLLN??399%%%$$Q'HAG$$W-HKKM$$W-Hh1h1h1rM   c                     t         j                  j                  d      } | j                  d      }t        j                  |j
                  d         }d|d<   t        d      }|d d }t        j                  t              5  |j                  t        |       d d d        t        j                  t              5  |j                  ||      j                  | j                  d             d d d        y # 1 sw Y   \xY w# 1 sw Y   y xY w)Nr   )   r   r*   r2   )rm      )r9   randomRandomStaterandom_samplerA   r;   r   r   r   r   r<   rD   r=   )rngX_y_rC   y_wrongs        rK   test_inconsistent_inputr   G  s    
))


"C			7	#B	!	BBqE
!
,C "gG	z	" 7 
z	" <B 1 1' :;< <	 < <s   C4:1D 4C= D	c                      t        d      } | j                  t        t               d| j                  d d  d| j
                  d d  t        | j                  t              d       y r   )r   r<   rD   rT   r   r   r   r   rC   s    rK   test_write_parametersr   [  sI    
!
,CGGArNCIIaLCNN1c33A6:rM   c                     t        j                  t        t         j                        } t         j                  | d<   t        d      }t        j                  t              5  |j                  | t               d d d        y # 1 sw Y   y xY w)Ndtyper   r3   r   r*   )r9   r   rD   float64nanr   r   r   r   r<   rT   )Xnanlogistics     rK   test_nanr   d  s^     88ARZZ(DDJ!q1H	z	" T2  s   "BBc                  V   t         j                  j                  d      } t        j                  | j	                  dd      ddgz   | j	                  dd      f      }dgdz  dgdz  z   }t        j
                  ddd      }t        }dD ]  }  |t              |||d	d
|dd      \  }}}t        |      D ]W  \  }}	t        |	d	d
|dd      }
|
j                  ||       |
j                  j                         }t        |||   dd|z         Y  dD ]  }dg}  |t              |||d|dd      \  }}}t        |d   ddd|      }
|
j                  ||       t        j                  |
j                  j                         |
j                  g      }t        ||d   dd|z          y )Nr   rP   r4   r3   r2   rn   r   r0   r1   Fh㈵>  )ro   rS   r   rx   r   r+   )rQ   rS   r   rx   r+   r   zwith solver = %s)decimalerr_msg)r,   r.   r/   r-   r0   r1        @@ư>     @)ro   r   rx   intercept_scalingr+   )rQ   r   r   r+   rx   )r9   r   r   concatenaterandnlogspacer%   r   	enumerater   r<   r   ravelr   r   )r   rD   rE   ro   frx   coefs_irQ   rt   lr_coefs               rK   test_consistency_pathr   o  s   
))


"C
		#q)QF2CIIc14EFGA	
c	RD3JA	Q2	BA " 3q23	
r1 bM 	DAq##B FF1aLhhnn&G%q16H66Q	6 X 
U3q23%
r1  e%
 	q!.."((.."2BMM!BC!U1Xq2Dv2M	
)
rM   c            
         t         j                  j                  d      } t        j                  | j	                  dd      ddgz   | j	                  dd      f      }dgdz  dgdz  z   }dg}t        j                  t              5 }t        |||dddd       d d d        t              dk(  sJ |d   j                  j                  d   }d	|v sJ d
|v sJ d|v sJ d|v sJ y # 1 sw Y   NxY w)Nr   rP   r4   r3   r2   r           )ro   r   r   r+   verboselbfgs failed to convergez!Increase the number of iterationszscale the dataz%linear_model.html#logistic-regression)r9   r   r   r   r   r   r   r   r   r8   messageargs)r   rD   rE   ro   recordwarn_msgs         rK   .test_logistic_regression_path_convergence_failr    s   
))


"C
		#q)QF2CIIc14EFGA	
c	RD3JA
B
 
(	) 
V!qRS11a	


 v;!ay  %%a(H%111.(:::x'''2h>>>
 
s   C%%C.c                     t        dd      \  } }t        dddd      }|j                  | |       t        dddd      }|j                  | |       t        dddd      }|j                  | |       t        |j                  |j                         d	}t        j                  t        |
      5  t        |j                  |j                         d d d        y # 1 sw Y   y xY w)N   r   rF   r+   Tr   r-   )r+   r   r   rx      z)Arrays are not almost equal to 6 decimalsrz   )r   r   r<   r   r   r   r   AssertionError)rD   rE   lr1lr2lr3r   s         rK    test_liblinear_dual_random_stater    s    !<DAq
	C GGAqM
	C GGAqM
	C GGAqM cii3
5C	~S	1 8!#))SYY78 8 8s   1!CC$c                     d\  } }t         j                  j                  d      }|j                  | |      }t        j                  |j                  d|j                  |      z              }||j                         z  }||j                         z  }t        dgddd      }|j                  ||       t        ddd	      }|j                  ||       t        |j                  |j                         t        |j                  j                  d
|f       t        |j                  dd
g       t!        |j                        dk(  sJ t        j"                  t%        |j&                  j)                                     }t        |j                  d
dd
|f       t        |j*                  j                  d       t        j"                  t%        |j,                  j)                                     }t        |j                  d       y )N)2   r   r   r         ?Fr-   rm   )ro   rS   rx   rq   )rQ   rS   rx   r3   r2   r4   r   )r3   rm   r3   )r9   r   r   r   signdotr   stdr   r<   r   r   r   r   r;   r>   r8   asarraylistcoefs_paths_valuesCs_scores_)	rF   r   r   X_refrE   lr_cvrt   coefs_pathsr_   s	            rK   test_logistic_cvr    s   !Iz
))


"CIIi,E
		!cii
3345A	UZZ\E	UYY[E 5kaE 
IIeQ	c{	KBFF5!bhh4u{{((1j/:u~~Aw/u~~!###**T%"4"4";";"=>?K{((1aJ*?@uyy-ZZU]]11345Fv||Y/rM   zscoring, multiclass_agg_listaccuracy 	precision_macro	_weightedf1neg_log_lossrecallc                    t        dddd      \  }}t        j                  d      t        j                  dd      }}t        d      }|j	                         }d	D ]  }||=  |j                  ||   ||          |D ]J  }	t        | |	z         }
t        t        ||||fdg|
d d d d d
|ddiz  d   d    |
|||   ||                L y )NrP   r   rm      )rF   r+   rH   n_informativeP   r  r   )rQ   ry   
warm_start)ro   rp   	pos_classmax_squared_sumrd   score_paramsr   r   r4   )	r   r9   aranger   
get_paramsr<   r   r   r   )rp   multiclass_agg_listrD   rE   traintestrt   paramskey	averagingscorers              rK   "test_logistic_cv_multinomial_scorer7    s   & A!DAq ))B-2s!34E	c	"B]]_F, 3KFF1U8QuX( 
	Gi/0!!	
 5 $"! ]M::   2qw$(	

rM   c                  B   d\  } }}t        | ||dd      \  }}t               j                  g d      j                  |      }t	        j
                  |      dz
  }t               }t        d      }t               }t        d      }	|j                  ||       |j                  ||       |j                  ||       |	j                  ||       t        |j                  |j                         t        |j                        g dk(  sJ t        |j                  |	j                         t        |j                        g dk(  sJ t        |	j                        g dk(  sJ t        t	        j                  |j                  |                  g dk(  sJ t        t	        j                  |	j                  |                  g dk(  sJ t        dddd	      j                  ||      }	t        t	        j                  |	j                  |                  d
dgk(  sJ y )N)r  r   rm   rm   r   )rF   r   rH   r(  r+   )barbazfoor3   )ro   r4   )class_weightr9  r:  )r   r   r<   inverse_transformr9   r   r   r   r   r   sortedr>   r:   r=   )
rF   r   rH   r  rE   y_strrt   r  lr_str	lr_cv_strs
             rK   2test_multinomial_logistic_regression_string_inputsrB  1  s   '/$Iz9"HE1 N45GGJE
aA		B A&E!F$*IFF5!	IIeQ
JJueMM%bhh5&//"&;;;;ekk9??;&//"&;;;;)$$%)>>>> "))FNN51237LLLL"))I--e456:OOOO #!A0NOSSuI "))I--e4565%.HHHrM   c                 l   t        ddd      \  }}d||dk  <    | |      }t               }|j                  ||       t               }|j                  ||       t        |j                  |j                         t        |j
                  |j
                         |j                  |j                  k(  sJ y )Nr  r   r   rF   r   r+   r   r  )r   r   r<   r   r   r   rr   )rN   rD   rE   csrrC   clfss         rK   test_logistic_cv_sparserG  Z  s    JDAqAa#gJ

C

 CGGAqM!DHHS!djj#))4doos~~>77cffrM   c                     t         j                  t         j                  }} | j                  \  }}d}t	        |      }t        |j                  | |            }t        |d      }|j                  | |       t        |d      }|j                         }	d|	|	dk(  <   |j                  | |	       t        |j                  d   |j                  d          t        |j                  dd  |j                         t        |j                  d   t        j                  d d f   |j                         |j                  j                  d|fk(  sJ t!        |j"                  g d       t        j$                  t        |j&                  j)                                     }
|
j                  d|d|dz   fk(  sJ |j*                  j                  d	k(  sJ t        j$                  t        |j                  j)                                     }|j                  d|dfk(  sJ d
D ]h  }|dv rdnd}t        ||d|dv rdndd      }|dk(  rt-        |       } |j                  | |       |j/                  | |      }|j/                  | |      }||kD  sJ |j                  j                  |j                  j                  k(  sJ t!        |j"                  g d       t        j$                  t        |j&                  j)                                     }
|
j                  d|d|dz   fk(  sJ |j*                  j                  d	k(  sJ t        j$                  t        |j                  j)                                     }|j                  d|dfk(  riJ  y )Nr4   r   )rq   r   r3   r   rm   r   r3   r4   r   )r   r   r        r   r   r   )rx   r   r+   r   rq   r,   )r|   r}   r   r;   r   r  splitr   r<   copyr   r  r   r   r9   newaxisr   r>   r  r  r  r  r!   re   )r1  r   rF   r   n_cvrq   precomputed_foldsrC   clf1target_copyr  r_   rx   r   	clf_multimulti_score	ovr_scores                    rK   test_ovr_multinomial_irisrV  k  s    IIt{{6E!KKIz
 D		BRXXeV45 "3
GCGGE6  #4%HD++-K$%Kq !HHUK  CKKNDLLO4CNN12&8CIIaLQ/< 99??q*o---s||Y/**T#"2"2"9"9";<=KD"j1n ====77==E!!!ZZS[[//123F<<AtR=((( 8 - O33(/1t
	 W%LEeV$ooeV4IIeV,	Y&&& yy)//"7"77779--y9jji&<&<&C&C&E!FG  Qb*q.$AAAA}}""e+++D!2!2!9!9!;<=||4},,,3-rM   c            	      6   t        ddd      \  } }t        dd      }t        D ci c]   }|t        dd|i|j	                  | |      " }}t        j                  |d	
      D ]-  \  }}t        ||   j                  ||   j                  d       / yc c}w )z)Test solvers converge to the same result.r   r   r   )r   r(  r+   Fr   rR   rx   r4   rrm   r   Nrk   )	r   dictSOLVERSr   r<   	itertoolscombinationsr   r   )rD   rE   r3  rx   
regressorssolver_1solver_2s          rK    test_logistic_regression_solversrb    s    "AANDAqB7F  	";&;F;??1EEJ 
 (44Z1E 
(!x &&
8(<(B(BA	

s   %BrS   FTc                 8   t        ddddd      \  }}d}t        | |d      }d	d
d
d}t        t              t        dg      z
  D ci c]1  }|t	        d||j                  |d      d|j                  ||      3 }}t        j                  |d      D ]|  \  }}	t        ||   j                  ||	   j                  |dk(  s|	dk(  rdnd| d|	        | sCt        ||   j                  ||	   j                  |dk(  s|	dk(  rdnd| d|	        ~ yc c}w )zATest solvers converge to the same result for multiclass problems.r  r   rm   r   rF   r   r(  rH   r+   :0yE>r   )rS   r   r+      '  r,   r0   r1   r-   rP   rx   r   r4   rX  r1   {Gzt?r    vs rtolr   Nrk   )r   r[  setr\  r   getr<   r]  r^  r   r   r   )
rS   rD   rE   r   r3  solver_max_iterrx   r_  r`  ra  s
             rK   +test_logistic_regression_solvers_multiclassrq    s`    2QRDAq C3RHF !$FFCO 'lS+%77	  	" 
O$7$7$D
HN

#a)	J  (44Z1E (x &&x &&"f,F0BjXJ/		
 8$//8$//&&0H4FTT#*D
3	s   6Dc                    t        j                  dd       d\  }}}t        j                  j	                  |      }t        ||| z   || z   d|      }| r	d|ddd	f<   t        |      \  }}}	t        j                  |d
kD        sJ t        j                  |      t        j                  |      z  dk  sJ | r|dddd	f   }|j                  dd||z        }
|
j                  ||      }
|j                  d	d|      | z  }||
j                  z  |z   }t        |      }|j                  j                  |      }t        j                   |      }t#        |      D ]5  }t        j$                  |j'                  d||ddf               d   ||<   7 d}t)        | d      }dddd}ddd}t+        t,              t+        dg      z
  D ci c]Q  }|t/        d&t        j0                  ||j3                  ||      |j3                  |d      d|j5                  ||      S }}|j7                         D ].  }t9        ||   j:                  j=                  d      dd|       0 t?        j@                  |d       D ]|  \  }}t9        ||   j:                  ||   j:                  |d!k(  s|d!k(  rd"nd#| d$| %       | sCt9        ||   jB                  ||   jB                  |d!k(  s|d!k(  rd"nd
| d$| %       ~ yc c}w )'zGTest and compare solver results for unpenalized multinomial multiclass.numpyz1.22.0)
minversion)rP   rn   rm   r[   )rF   r   effective_ranktail_strengthr+   r3   Nr2   r   rP   rm   )lowhighsize)rH   )npvals)r   r   g&.>r   rR   rf  rg  rh  re  r   r-   )rQ   rx   r   r   r   r6   绽|=)atolr   r4   rX  r1   rj  gMb`?rk  rl  rk   )"r   importorskipr9   r   r   r   r
   allmaxminuniformreshapeTr   linkinversezerosrangeargwherer   r[  rn  r\  r   infro  r<   keysr   r   r@   r]  r^  r   )rS   r   rF   r   rH   r   rD   UsVtcoef	interceptraw_predictionlossr   rE   r   r   r3  rp  
solver_tolrx   r_  r`  ra  s                            rK   7test_logistic_regression_solvers_multiclass_unpenalizedr    s,    H5'0$Iz9
))

 2
3C-!M1	A !R%1vHAq"66!d(66!9rvvay 3&&&a"fI;;11:	+A;BD<<	:.D;mKIZ)+N3DIIn-E
A9 J{{3??QeAqDk?BCDI!J CB?F #FFCOt,J 'lS+%77	  	" 
ffvs+$((5	

 
 #a)		J 	 //# 
v$$((a(0!%	

 (44Z1E (x &&x &&"f,F0BjXJ/		
 8$//8$//&&0H4FTT#*D
3	!	s   AK=weightr[   g?r   r]   rI  r<  balancedc           	         t        |       }|dk(  r| }t        ddddd||      \  }}t        dd|d	      }t        dd
di|}t	        t
              5  |j                  ||       ddd       t        t              t        g d      z
  D ]b  }t        dd
|i|}	|dv r|	j                  dd|dz          |	j                  ||       t        |	j                  |j                  d| d       d y# 1 sw Y   xY w)z+Test class_weight for LogisticRegressionCV.r  rK  rm   r   )rF   r   
n_repeatedr(  n_redundantrH   r+   r3   Fre  )ro   rS   r<  r   rx   r,   categoryN)r,   r-   r/   r   gC]r2<rg  )r   r   r+   r   z	 vs lbfgsrl  rk   )r8   r   r[  r   r%   r   r<   rn  r\  
set_paramsr   r   )
r  r<  r   rH   rD   rE   r3  	clf_lbfgsrx   rC   s
             rK   (test_logistic_regressioncv_class_weightsr  -  s    FIx'DAq !	F %>G>v>I 
"4	5 a g,%N!OO 

";&;F;_$NNE8JQ8N   	1IIyTfXY;O	


 s   C22C;problem)singlerq   c                    d}d}t        ||z  dddd|      \  }}t        j                  j                  |      }t        j                  |j
                  d         }|d|j                  d      rd	nd
dd}	|	j                         }
|j                  dd|      |d | t        j                  ||j                  t              d      }t        j                  ||j                  t              d      }| dk(  rt        }n| dk(  rt        }t        j                  t        j                  |d      t        j                  |d      t        j                  |d      g      }t!        t#               j%                  ||            }|	j'                  d|d       t        j                  ||j                  t              d      }t!        t#               j%                  ||            }|
j'                  d|d        dd|i|	} |dd|i|
}|dk(  r^t)        j*                         5  t)        j,                  dt.               |j1                  |||       |j1                  ||       d d d        n&|j1                  |||       |j1                  ||       | dk(  r&t3        |j4                  d   |j4                  d          t3        |j6                  |j6                  d       y # 1 sw Y   WxY w)Nrf  rm   r   r4   r   )rF   r   r(  rH   r  r+   Fr0   順 r   re  r+   rS   r   r   ry  r6   r  rq   r3   )groupsrP   )ro   rq   rx   r,   r   rd   r   r}  rk   )r   r9   r   r   rA   r;   
startswithrM  randintrepeatr   intr   r   r   fullr  r   rL  updater   r   r   r   r<   r   r  r   )r  rx   r   n_samples_per_cv_groupn_cv_groupsrD   rE   r   swkw_weightedkw_repeated
X_repeated
y_repeatedr   groups_weightedsplits_weightedgroups_repeatedsplits_repeatedclf_sw_weightedclf_sw_repeateds                       rK   'test_logistic_regression_sample_weightsr  ]  s   
 !K(;6'DAq ))

 2
3C		B +%007GU	K ""$K"%++a9O+"PB1biin15J1biin15J(	D!...2.2.2
 /177/7RS#_=>))ORYYs^!L$$Z$H
 	#_=>66+6O66+6O $$& 	8!!(,>?1B7
J7	8 	8 	Aq3J
3$//2O4K4KA4NOO))?+@+@tL	8 	8s   'AK%%K.r   c                    t        dddd|      \  }}|dz   }|ddd	d
}t        d| dddd|}|j                  ||       t        dd| i|}|j                  |||       t        |j                  |j                  d       y )N,  r   rm   r4   rd  r3   Fr  re  r  r   )rx   r<  rx   r  r   r  rk   r   r   r<   r   r   )rx   r   rD   rE   rd   r  	clf_cw_12	clf_sw_12s           rK   -test_logistic_regression_solver_class_weightsr    s     'DAq EM +	K # aL4?I MM!Q"@&@K@IMM!QmM4IOOY__4@rM   c           
         t        dddd|       \  }}|dz   }t        ddddd	d
dd|       }|j                  ||       t        ddd
dd|       }|j                  |||       t        |j                  |j                  d       t        ddddd	dddd|       }|j                  ||       t        dddddd|       }|j                  |||       t        |j                  |j                  d       y )Nr  r   rm   r4   rd  r3   r-   Fr   r   rg  -q=)rx   rS   r<  r   r   r   r+   )rx   rS   r   r   r   r+   r|  r  l2T)rx   rS   r<  r   r   r   r   r+   )rx   rS   r   r   r   r   r+   r  )r   rD   rE   rd   clf_cwclf_sws         rK   2test_sample_and_class_weight_equivalence_liblinearr    s    'DAq EMq\'F JJq!'F JJq!]#FLL&,,U;q\'	F JJq!'F JJq!]#FLL&,,U;rM   c                 v    t        j                  |       }t        d||       }t        t	        ||            }|S )Nr  )rG   rE   )r9   r:   r#   r[  zip)rE   rG   r<  class_weight_dicts       rK    _compute_class_weight_dictionaryr     s5    iilG'
GqILS,78rM   c                     | S rg   rk   xs    rK   <lambda>r    s    Q rM   c                 :   t        t        j                        }|dd d d f   } | |      }t        j                  dd  }t	        |      }t        t              t        ddg      z
  D ]  }t        |d      }t        dddi|}t        dd|i|}|j                  ||       |j                  ||       t        |j                        dk(  sJ t        |j                  |j                  d	
       t        j                  |j                   d         }	|j                  D ]  }
|	||
k(  xx   ||
   z  cc<    t        di |j                  |||	      }t        |j                  |j                  d	
        |ddd d f   }t        j                  dd }t	        |      }t        D ]o  }t        |d      }t        dddi|}t        dd|i|}|j                  ||       |j                  ||       t#        |j                  |j                  d       q y )N-   r-   r/   r   ri  r<  r  rm   -C6?rm  r   r  rP   r'  rZ  rk   )r!   r|   r}   r   r  rn  r\  r[  r   r<   r8   r>   r   r   r9   rA   r;   r   )rN   X_irisrD   rE   r  rx   r3  rQ  clf2r  cclf3s               rK   &test_logistic_regression_class_weightsr    s    499FrsAvAaABCA8;g,k3D%E!FF ;Vd3!DzDVD!K/@KFKAA4==!Q&&&

DJJT:WWQWWQZ  	/AqAvJ+A..J	/!+F+//1B/G

DJJT:;  	r#vqyABsA8; EVd3!DzDVD!K/@KFKAA!$**djj!DErM   c                     d\  } }}t        | |d|d      \  }}t        d      j                  |      }d}t        |d	      }t        |dd
      }|j	                  ||       |j	                  ||       |j
                  j                  ||fk(  sJ |j
                  j                  ||fk(  sJ dD ]  }t        |ddd      }t        |dddd      }	|j	                  ||       |	j	                  ||       |j
                  j                  ||fk(  sJ |	j
                  j                  ||fk(  sJ t        |j
                  |j
                  d       t        |j
                  |	j
                  d       t        |j                  |j                  d        dD ]h  }t        |dddg      }
|
j	                  ||       t        |
j
                  |j
                  d       t        |
j                  |j                  d       j y )N)r  r  rm   r   r   rd  F)	with_meanr,   r   rx   r   )rx   rS   r   )r0   r1   r.   r   r   gHz>)rx   r+   r   r   )rx   r+   r   r   rS   r   r  r   r   r  )rx   r   r   ro   )
r   r    fit_transformr   r<   r   r;   r   r   r   )rF   r   rH   rD   rE   rx   ref_iref_wclf_iclf_wclf_paths              rK   $test_logistic_regression_multinomialr  /  s    (1$Iz9DAq 	'55a8A Ff$7EfEtLE	IIaO	IIaO;;J 7777;;J 7777. G"	
 #
 			!Q		!Q{{  Y
$;;;;{{  Y
$;;;; 	U[[t<U[[t<((%*:*:F-G6 8 J'Ddu
 	Q$?++U-=-=DIJrM   c                      t        ddd      \  } }t        dd      }|j                  | |       t        j                  d      } t        |j                  |       t        j                  d             y )Nr   r   rD  Fr-   )rS   rx   )r   r   )r   r   r<   r9   r  r   r=   )rD   rE   rC   s      rK   %test_liblinear_decision_function_zeror  j  sY     qqIDAq
5
ECGGAqM 	As{{1~rxx{3rM   c                 n    t        ddd      \  }}t        d      }|j                   | |      |       y )Nr   r   r   rD  r-   rx   r   r   r<   rN   rD   rE   rC   s       rK   test_liblinear_logregcv_sparser  y  s3     JDAq
k
2CGGM!a rM   c                 p    t        ddd      \  }}t        dd      }|j                   | |      |       y )Nr   r   r   rD  r1   r   r  r  r  s       rK   test_saga_sparser    s5     JDAq
f$
7CGGM!a rM   c                  r    t        d      } | j                  t        t               | j                  dk(  sJ y )NF)rS   r   )r   r<   rD   rT   r   r   s    rK   "test_logreg_intercept_scaling_zeror    s-     5
1CGGArN>>S   rM   c                  ~   t         j                  j                  d      } d}t        |dd      \  }}| j	                  |df      }t        j
                  |df	      }t        j                  |||fd
      }t        ddddd      }|j                  ||       t        dddddd      }|j                  ||       t        |j                  |j                         t        |j                  ddd f   t        j                  d             t        |j                  ddd f   t        j                  d             y )Nr   r  r  r   rD  rm   r  r4   r;   r3   r6   r   r  r-   Fr|  r   rQ   rx   rS   r   r1   r   r   rQ   rx   rS   r   r   r   )r9   r   r   r   normalrA   r   r   r<   r   r   r  )r   rF   rD   rE   X_noise
X_constantlr_liblinearlr_sagas           rK   test_logreg_l1r    s    ))


#CIrPQRDAqjjy!nj-G	1~.J
7J/a8A%
L Q 
G KK1gmm\-?-?@ l00BC8"((1+FgmmArsF3RXXa[ArM   c                 B   t         j                  j                  d      }d}t        |dd      \  }}|j	                  d|df      }t        j
                  |d	f
      }t        j                  |||fd      }d||dk  <    | |      }t        ddddd      }|j                  ||       t        dddddd      }|j                  ||       t        |j                  |j                         t        |j                  ddd f   t        j
                  d             t        |j                  ddd f   t        j
                  d             t        dddddd      }	|	j                  |j                         |       t        |j                  |	j                         y )Nr   r  r  r   rD  r[   rm   )r!   ry  r4   r  r3   r6   r   r  r-   Fr|  r  r1   r   r  r  r   )r9   r   r   r   r  r  r   r   r<   r   r   toarray)
rN   r   rF   rD   rE   r  r  r  r  lr_saga_denses
             rK   test_logreg_l1_sparse_datar    s   
 ))


#CIrPQRDAqjjs)Qj8GA/J
7J/a8AAa!eHaA%
L Q 
G KK1gmm\-?-?@ l00BC8"((1+FgmmArsF3RXXa[A '
M aiik1%gmm]-@-@ArM   random_seedr   r   r  c                    t        dd|       \  }}t        d|| dd      }t        ddgd	d
|}|j                  ||       t	        dddi|}|j                  ||       t        |j                  |j                         y )NrP   r  rD  r1   r   r  )rx   r   r+   r   r   r  T)ro   refitrQ   rk   )r   r[  r   r<   r   r   r   )r  r   rD   rE   common_paramsr  rt   s          rK   !test_logistic_regression_cv_refitr    s     +VDAq M !GSEGGE	IIaO		3c	3]	3BFF1aLekk2884rM   c                     t        ddddd      \  } }t        d      }|j                  | |       t        ||j	                  |             }t        t        d            }|j                  | |       t        ||j	                  |             }||kD  sJ t        ||j	                  |             }t        ||j                  |             }||kD  sJ y )Nr   r  r   rm   )rF   r   r+   rH   r(  r,   r  )r   r   r<   r   r?   r   _predict_proba_lr)rD   rE   rS  clf_multi_lossclf_ovrclf_ovr_lossclf_wrong_losss          rK   %test_logreg_predict_proba_multinomialr    s    !qPRDAq #'2IMM!Qa!8!8!;<N!"4G"DEGKK1Aw44Q78L.((( a!8!8!;<Na!<!<Q!?@NN***rM   r   r   r   r   zsolver, message))r.   zAnewton-cg failed to converge.* Increase the number of iterations.)r-   z@Liblinear failed to converge, increase the number of iterations.)r0   ?The max_iter was reached which means the coef_ did not converge)r1   r	  )r,   r   )r/   z6Newton solver did not converge after [0-9]* iterationsc                    t         j                  t         j                  j                         }}d||dk(  <   |dv r|dk(  rt	        j
                  d       |dk(  r| dkD  rt	        j
                  d       t        | d	|d|
      }t	        j                  t        |      5  |j                  ||       d d d        |j                  d   | k(  sJ y # 1 sw Y   xY w)Nr   r4   r   r   z+'multinomial' is not supported by liblinearr/   r3   z/solver newton-cholesky might converge very fastgV瞯<)r   r   r   r+   rx   rz   )r|   r}   r   rM  r   skipr   r   r   r<   n_iter_)r   r   rx   r   rD   y_binrt   s          rK   test_max_iterr    s    , yy$++**,uAE%1*K=$@AB""x!|EF	
B 
(	8 
q% ::a=H$$$ s   CCc                    t         j                  t         j                  }}| dk(  rt        |      }t	        j
                  |      j                  d   }|dk(  sJ |j                         }d||dk(  <   d}d}t        dd| d	      }|j                  ||       |j                  j                  d
k(  sJ t        d| ||d      }|j                  ||       |j                  j                  d||fk(  sJ |j                  d      j                  ||       |j                  j                  |fk(  sJ |j                  d      j                  ||       |j                  j                  |||fk(  sJ | dv ry |j                  d      j                  ||       |j                  j                  d
k(  sJ |j                  d      j                  ||       |j                  j                  d||fk(  sJ y )Nr,   r   rm   r4   rn   r   r  r   )r   rQ   rx   r+   r   )r   rx   ro   rq   r+   r3   r   r   r   r   )r|   r}   r   r!   r9   r:   r;   rM  r   r<   r  r   r  )	rx   rD   rE   rH   r  n_Cs	n_cv_foldrC   clf_cvs	            rK   test_n_iterr  G  s    99dkkqA!H		!""1%I>> FFHEE%1*DI V"
MCGGAu;;$$$!DYRF JJq%>>Ay$#7777 NNuN%))!Q/;;,,,
%(,,Q2>>Iy$#????  NN}N-11!Q7;;$$$
-044Q:>>Ay$#7777rM   r*  )TFc                    t         j                  t         j                  }}t        d|| d|      }t	        t
              5  |j                  ||       |j                  }d|_        |j                  ||       d d d        t        j                  t        j                  |j                  z
              }d|  d|d|}|rd	|kD  sJ |       y |d	kD  sJ |       y # 1 sw Y   exY w)
Nr  r   )r   r*  rx   r+   rS   r  r3   z Warm starting issue with solver zwith fit_intercept=z and warm_start=       @)r|   r}   r   r   r%   r   r<   r   r   r9   r@   abs)	rx   r*  rS   rD   rE   rC   coef_1cum_diffr   s	            rK   test_warm_startr  z  s     99dkkqA
#C 
"4	5 11 vvbffVcii/01H
*6(
0ZM	3  X~"s"~#~"s"~ s   8CC&c                 x   t               }|j                  |j                  }}t        j                  |gdz        }t        j                  |gdz        }||dk     }||dk     dz  dz
  }t        ddd      \  }} | |      }||f||ffD ]  \  }}dD ]  }|j                  d   }	t        j                  d	dd      D ]w  }
t        d
|	|
z  z  ddd|dd      }t        d
|	|
z  z  ddd|dd      }|j                  ||       |j                  ||       t        |j                  |j                  d       y   y )Nrm   r3   r4   r  r  r   rD  )r   r  r2   r  r1   rf  Fr   )rQ   rx   r   rS   r   r+   r   r-   )r   r}   r   r9   r   r   r;   r   r   r<   r   r   )rN   r|   rD   rE   X_binr  X_sparsey_sparser   rF   alphar1   r-   s                rK   test_saga_vs_liblinearr     sk   ;D99dkkqA
sQwA
sQwAa1fIEa1fIMAE,!Hh X&H(H!56 J1# 	JG
IRA. J)Y./! "'#!" /Y./& "'#!"	 Aa#)$**iooqI1J	JJrM   )r-   r.   r/   r1   c                 (   | dk(  r|dk(  rt        j                  d|  d       | dk(  rt        j                  nt        j                  }t        j
                  t              j                  t        j                        }t        j
                  t              j                  t        j                        }t        j
                  t              j                  t        j                        }t        j
                  t              j                  t        j                        } |t        t        j                        }	 |t        t        j                        }
d}t        | |d||      }t        |      }|j                  ||       |j                  j                  |k(  sJ t        |      }|j                  |	|       |j                  j                  |k(  sJ t        |      }|j                  ||       |j                  j                  t        j                  k(  sJ t        |      }|j                  |
|       |j                  j                  t        j                  k(  sJ d	|z  }t        j                  d
k(  rt         rd}t#        |j                  |j                  j                  t        j                        |       | dk(  r|rd}t#        |j                  |j                  |       t#        |j                  |j                  |       y )Nr-   r   zSolver=z' does not support multinomial logistic.r   gMb@?r   )rx   r   r+   r   rS   gQ@ntr   r  r1   r[   )r   r  r9   r   float32r   rD   r   rT   r   r   r<   r   r   osnamer'   r   )rx   r   rS   rN   
out32_typeX_32y_32X_64y_64X_sparse_32X_sparse_64r  lr_templlr_32lr_32_sparselr_64lr_64_sparser}  s                     rK   test_dtype_matchr2    sA    !=gfX%LMN%4"**J88A;bjj)D88B<rzz*D88A;bjj)D88B<rzz*D4K4KJ!#H (OE	IIdD;;
*** ?L[$'##z111 (OE	IIdD;;

*** ?L[$'##rzz111 j D	ww$9 EKK!3!3BJJ!?dKM EKK!3!3$?EKK!3!3$?rM   c                     t         j                  j                  d      } t        j                  | j	                  dd      ddgz   | j	                  dd      f      }t        j
                  dgdz  dgdz  z         }t        ddd      }t        dd	d      }t        ||j                  ||      j                  |            }t        d
      D ]  }|j                  ||        t        ||j                  |            }t        ||d       y )Nr   rP   r4   r3   r2   r0   F)rx   r*  r+   Tr   r   r  )r9   r   r   r   r   r   r   r   r<   r?   r  r   )r   rD   rE   lr_no_wslr_wslr_no_ws_lossr   
lr_ws_losss           rK   test_warm_start_converge_LRr8    s     ))


"C
		#q)QF2CIIc14EFGA
!sbTCZ'(A!5qQHe1MEQQ 2 @ @ CDM1X 		!Q!U0034JM:D9rM   c            
         t        d      \  } }d}d}t               }d|fddfD ]D  \  }}t        ||dd|d	d
      }|j                  | |       |j	                  |j
                         F |\  }}	}
t        j                  ||	dd      rJ t        j                  ||
dd      rJ t        j                  |
|	dd      rJ y )Nr   r*   r  r]   r   )r   N)r  Nr1   r   rf  )r   rQ   rx   r+   l1_ratior   r   r[   )rm  r}  )r   r  r   r<   appendr   r9   allclose)rD   rE   rQ   r:  coeffsr   ratiort   elastic_net_coeffs	l1_coeffs	l2_coeffss              rK   test_elastic_net_coeffsrB  ,  s     A.DAqAHVF((3\<P  
 	q!bhh  06,	9{{-yqsKKK{{-yqsKKK{{9iacBBBBrM   rQ   )r   r[   r3   r   rP   r       .Azpenalty, l1_ratio)r   r3   )r  r   c                     t        d      \  }}t        d| |ddd      }t        || ddd      }|j                  ||       |j                  ||       t        |j                  |j                         y )Nr   r*   r   r1   r   )r   rQ   r:  rx   r+   r   r   rQ   rx   r+   r   )r   r   r<   r   r   )rQ   r   r:  rD   rE   lr_enetlr_expecteds          rK   "test_elastic_net_l1_l2_equivalencerH  H  sw    
 A.DAq 
G %1V!K KK1OOAqgmm[->->?rM   )r   r3   rP   rC  c                    t        dd      \  }}t        ||d      \  }}}}dt        j                  ddd      i}t	        d| ddd	
      }t        ||d      }	t	        d| ddd	
      }
t	        d| ddd	
      }|	|
|fD ]  }|j                  ||        |	j                  ||      |
j                  ||      k\  sJ |	j                  ||      |j                  ||      k\  sJ y )NrJ  r   r*   r:  r3   r   r   r1   r   rE  T)r  r   r  )r   r   r9   linspacer   r   r<   re   )rQ   rD   rE   X_trainX_testy_trainy_test
param_gridenet_clfgsl1_clfl2_clfrC   s                rK   test_elastic_net_vs_l1_l2rT  `  s   
 s3DAq'711'M$GVWfbkk!Q23J!&qdH 
h
$	7B&qdF  &qdF FF# "!" 88FF#v||FF'CCCC88FF#v||FF'CCCCrM   r4   rn   r:  )r[   r]   r   c           	          t        ddddddd      \  t              t        ddd d	
      }t        ddd d	      }|j                         |j                          fd} ||       ||      k  sJ y )Nr   r4   r  r   r   rF   rH   r   r(  r  r  r+   r   r1   F)r   rx   r+   rQ   r:  rS   r  )r   rx   r+   rQ   rS   c                    | j                   j                         }t        | j                              z  }|t	        j
                  t	        j                  |            z  z  }|dz
  dz  t	        j                  ||      z  z  }|S )Nr  r]   )r   r   r   r?   r9   r@   r  r  )rt   r  objrQ   rD   r:  rE   s      rK   enet_objectivezEtest_LogisticRegression_elastic_net_objective.<locals>.enet_objective  sw    xx~~(1b..q122x"&&...h#%tT(:::
rM   )r   r!   r   r<   )rQ   r:  rF  lr_l2rZ  rD   rE   s   ``   @@rK   -test_LogisticRegression_elastic_net_objectiver\  }  s     DAq 	aA 
G V!qE KK1	IIaO '"^E%::::rM   rH   )r4   rm   c           	         t        d| dd      \  }}t        d      }t        j                  ddd      }t        j                  ddd      }t        d	|d
||dd      }|j                  ||       ||d}t        d	d
dd      }t        |||      }	|	j                  ||       |	j                  d   |j                  d   k(  sJ |	j                  d   |j                  d   k(  sJ y )NrP   rm   r   rF   rH   r(  r+   r   r3   rn   r   r1   r   )r   ro   rx   rq   	l1_ratiosr+   r   rQ   r:  )r   rx   r+   r   rq   r:  rQ   )r   r   r9   rJ  r   r   r<   r   r   best_params_	l1_ratio_rr   )
rH   rD   rE   rq   r`  ro   lrcvrO  rt   rQ  s
             rK   2test_LogisticRegressionCV_GridSearchCV_elastic_netrf    s    
 !!DAq 
	BAq!$I	RA	BD 	HHQNy1J		
B 
b*	,BFF1aL??:&$..*;;;;??34771:---rM   c            
      L   t        dddd      \  } }t        | |d      \  }}}}t        d      }t        j                  ddd      }t        j
                  dd	d      }t        d
|d||ddd      }	|	j                  ||       ||d}
t        d
dddd      }t        ||
|      }|j                  ||       |	j                  |      |j                  |      k(  j                         dk\  sJ |	j                  |      |j                  |      k(  j                         dk\  sJ y )NrP   rm   r   r^  r*   r   r3   r_  rn   r   r1   r   r   )r   ro   rx   rq   r`  r+   r   r   ra  )r   rx   r+   r   r   rb  r\   )r   r   r   r9   rJ  r   r   r<   r   r   r=   r   )rD   rE   rK  rL  rM  rN  rq   r`  ro   re  rO  rt   rQ  s                rK   6test_LogisticRegressionCV_GridSearchCV_elastic_net_ovrrh    s3    !!DAq (811'M$GVWf		BAq!$I	RA	B	D 	HHWgy1J	
B 
b*	,BFF7G LL!RZZ%88>>@CGGGLL BJJv$66<<>#EEErM   )r  r   )r   r   autoc           
         d}d}t        d|||d      \  }}t        j                  ddd      }| dk(  rt        j                  dd	d
      }nd }t	        | |d|d|dd      }|j                  ||       |j                  j                  |fk(  sJ |j                  j                  |fk(  sJ |j                  j                  ||fk(  sJ y )Nrm   r  rf  r   rF   rH   r(  r   r+   r_  rn   r   r3   r4   r1   r   F)r   ro   rx   r`  r+   r   r   r  )
r   r9   r   rJ  r   r<   rr   r;   rd  r   )	r   r   rH   r   rD   rE   ro   r`  re  s	            rK   "test_LogisticRegressionCV_no_refitrl     s     IJDAq 
RA	B,KK1a(			D 	HHQN77==YL(((>>I<///::	:6666rM   c            
         d} d}t        d| | |d      \  }}t        j                  ddd      }t        j                  ddd	      }d	}t	        d
|d||ddd      }|j                  ||       t        j                  t        |j                  j                                     }|j                  | ||j                  |j                  |dz   fk(  sJ t        j                  t        |j                  j                                     }	|	j                  | ||j                  |j                  fk(  sJ |j                  j                  | ||j                  |j                  fk(  sJ y )Nrm   r  rf  r   rk  r_  rn   r3   r4   r   r1   r   r   )r   ro   rx   rq   r`  r   r+   r   )r   r9   r   rJ  r   r<   r  r  r  r  r;   ry  r  r  )
rH   r   rD   rE   ro   r`  n_foldsre  r  r_   s
             rK   5test_LogisticRegressionCV_elasticnet_attribute_shapesro  )  sO   
 IJDAq 
RA	BAq!$IG	D 	HHQN**T$"3"3":":"<=>K
Q!    ZZT\\00234F<<IwHHHH<<)Wbggy~~!NNNNrM   c                      d} t        j                  t        |       5  t        ddd      j	                  t
        t               d d d        y # 1 sw Y   y xY w)NzQl1_ratio parameter is only used when penalty is 'elasticnet'\. Got \(penalty=l1\)rz   r   r1   r]   )r   rx   r:  )r   r   r   r   r<   rD   rT   )r   s    rK   test_l1_ratio_non_elasticnetrq  U  sN    	.  
k	- Q4EII!RPQ Q Qs   'AAc           
      ,   d}t        |dddddd      \  }}t        |      }t        dddd d	|d
| z  |z  d      }t        ddddd|| d      }|j	                  ||       |j	                  ||       t        |j                  |j                  d       y )NrJ  r4   r   r   r3   rW  r   Fr   r  r   )r   r+   rS   r   r   r:  r  r  r   r   r1   )r   r+   rS   r   r   r:  rQ   rx   rZ  )r   r!   r   r   r<   r   r   )rQ   r:  rF   rD   rE   sgdlogs          rK   test_elastic_net_versus_sgdru  ^  s     IDAq 	aA
Ag	!	C 
	C GGAqMGGAqMciiA>rM   c            	         t        ddddddd      \  } }g d}t        | |d|d	dd
      \  }}}t        j                  t              5  t        |d   |d   d       d d d        t        j                  t              5  t        |d   |d   d       d d d        t        j                  t              5  t        |d   |d   d       d d d        y # 1 sw Y   vxY w# 1 sw Y   LxY w# 1 sw Y   y xY w)Nrf  rm   r4   r   r3   )rF   rH   r(  r  n_clusters_per_classr+   r   )r   r3   rg  r   r1   r   )r   ro   rx   r+   r   rZ  )r   r   r   r   r	  r   )rD   rE   ro   r   r   s        rK   /test_logistic_regression_path_coefs_multinomialrx    s    DAq 
B+		!KE1a 
~	& A!%(E!Ha@A	~	& A!%(E!Ha@A	~	& A!%(E!Ha@A A	A AA AA As$   	C?C5C+CC(+C4estrJ  )r+   r   rm   r   )r+   rq   ro   r   r   c                 .    | j                   j                  S rg   )	__class__rh   r  s    rK   r  r    s    !++&& rM   )idsc           	           fd}t        t        j                        }|d d d   }|dd d   }t        j                  d d d   }|dk(  } |||d|      } |||d|      }	t	        |j
                  |	j
                         t	        |j                  |      |	j                  |              |||d|      }
|dk(  rW |||d|      }t	        |
j
                  |j
                         t	        |
j                  |      |j                  |             y  |||d	|      }t	        |
j
                  |j
                         t	        |
j                  |      |j                  |             t        j                  |j
                   |||d	|      j
                        rJ t        j                  |j
                   |||d	|      j
                        rJ y )
Nc                 Z     t              j                  di |j                  | |      S )Nrk   )r   r  r<   )rD   rE   kwry  s      rK   r<   z6test_logistic_regression_multi_class_auto.<locals>.fit  s*    $uSz$$*r*..q!44rM   r   r3   r   ri  )r   rx   r   r-   r   )	r!   r|   r}   r   r   r   r?   r9   r<  )ry  rx   r<   scaled_datarD   X2y_multir  est_auto_binest_ovr_binest_auto_multiest_ovr_multiest_multi_multis   `            rK   )test_logistic_regression_multi_class_autor    s   5 		"KDbDA	QUU	Bkk$B$GqLEq%VFCLaE&AKL&&(9(9:L..r2K4M4Mb4QRGGNAwE&I,,m.A.AB((,m.I.I".M	
 amFS,,o.C.CD((,o.K.KB.O	

 ;;5mFCII
 	
 
 ;;7fEKK
 	
 
 
rM   c                    t        ddd      \  }}d}t        d | d      }t        j                  t        |      5  |j                  ||       d d d        t        d | d      }t        d	t        j                  | d
      }|j                  ||      j                  |      }|j                  ||      j                  |      }t        ||       y # 1 sw Y   xY w)Nr   r   )rF   r  r+   z&Setting penalty=None will ignore the Crn   )r   rx   rQ   rz   )r   rx   r+   r  )r   rQ   rx   r+   )
r   r   r   r   r   r<   r9   r  r=   r   )	rx   rD   rE   r   rt   lr_nonelr_l2_C_inf	pred_nonepred_l2_C_infs	            rK   test_penalty_noner    s     11MDAq
2C	D1	=B	k	- 
q! !f1MG$vAK Aq!))!,IOOAq)11!4My-0 s   CCr3  r   r   )r   r   r   r   r  c                    t        j                  ddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddggt        j                  d            }t        j                  g dt        j                  d            }t        j                  ||g      }t        j                  |d|z
  g      }t        j
                  t        |      dz  	      }d
|t        |      d  t        |||d
      \  }}}t        dd      } |j                  di |  t        |      j                  ||      }t        |      j                  |||      }dD ]2  }	 t        ||	      |      }
 t        ||	      |      }t        |
|       4 y )Nr3   rm   r4   rn   floatr   )r3   r3   r3   r3   r4   r4   r4   r4   r3   r3   r3   r3   r4   r4   r4   r4   r  r  r   r*   r-   r   )rx   r+   r  )r=   r?   r   rk   )r9   r   r   vstackhstackrA   r8   r$   r   r  r   r<   getattrr   )r3  rD   rE   r  y2rd   base_clfclf_no_weightclf_with_weightmethodX_clf_no_weightX_clf_with_weights               rK   /test_logisticregression_liblinear_sample_weightr    s    	FFFFFFFFFFFFFFFF!	
$ hhw'	A* 	8	A 
Aq6	B	Aq1u:	BGG#a&1*-MM#a&(#BMJBM!2FHH!&!(O''1-MHo))"b)NOC <8'-8;<GOV<Q?):;<rM   c                     t        dd      \  } }t        d      }ddg}g d}t        d	d
|||ddd      }|j                  | |       |j                  d   j                  d      }t        |      D ]f  \  }}t        |      D ]S  \  }	}
t        d	d
||
ddd      }t        || ||      j                         }|||	f   t        j                  |      k(  rSJ  h y )Nr   r   r  r   )n_splitsr[   r   )r[   r3   r   r   r1      r   )r   rx   r`  ro   rq   r+   r   r   r3   r6   )r   rx   rQ   r:  r+   r   r   rb  )r   r   r   r<   r  r   r   r   r   r   approx)rD   rE   rq   r`  ro   re  avg_scores_lrcvr   rQ   jr:  rt   avg_score_lrs                rK   'test_scores_attribute_layout_elasticnetr  (  s    A>DAq	!	$Bc
I	B	D 	HHQNll1o***2O" H1$Y/ 	HKAx#$!B +2q!;@@BL"1a4(FMM,,GGGG	HHrM   )r,   r.   r/   c                    t         j                  j                  \  }}t         j                  t         j                     }t        t        t         j                        d|      }t        t         j                        }|j                  ||       t        |j                  j                  d      dd       |r7|j                  j                  d      t        j                  dd      k(  sJ y	y	)
a|  Test that the multinomial classification is identifiable.

    A multinomial with c classes can be modeled with
    probability_k = exp(X@coef_k) / sum(exp(X@coef_l), l=1..c) for k=1..c.
    This is not identifiable, unless one chooses a further constraint.
    According to [1], the maximum of the L2 penalized likelihood automatically
    satisfies the symmetric constraint:
    sum(coef_k, k=1..c) = 0

    Further details can be found in [2].

    Reference
    ---------
    .. [1] :doi:`Zhu, Ji and Trevor J. Hastie. "Classification of gene microarrays by
           penalized logistic regression". Biostatistics 5 3 (2004): 427-43.
           <10.1093/biostatistics/kxg046>`

    .. [2] :arxiv:`Noah Simon and Jerome Friedman and Trevor Hastie. (2013)
           "A Blockwise Descent Algorithm for Group-penalized Multiresponse and
           Multinomial Regression". <1311.6529>`
    r,   )rQ   rx   rS   r   r6   r|  r  gdy=)r  N)r|   r}   r;   r~   r   r   r8   r!   r<   r   r   r@   r   r   r  )rx   rS   rF   r   r   rC   X_scaleds          rK   (test_multinomial_identifiability_on_irisr  T  s    4 !IIOOIzt{{+F

dii.#C TYYHGGHf CIIMMqM)159~~!!q!)V]]1%-HHHH rM   r  g      $@c                     t        d      \  }}t        |      }t        j                  |      }d|d |dz   |j	                         }t        d|d|       }|j                  |||       t        ||       y )NT
return_X_yr4   r   rf  )r+   r<  r   r   r  )r   r8   r9   rA   rM  r   r<   r   )r   r<  rD   rE   r   WexpectedrC   s           rK   test_sample_weight_not_modifiedr    sv     %DAqQJ

AA
avvxH
\C[C GGAqG"Ha rM   c           	          |t        j                  dd|            }dD ](  }t        ||t        ||      j	                  d             * t
        j                  j                  |      }|j                  d|j                  d         }| d	v rCd
}t        j                  t        |      5  t        |       j                  ||       d d d        y t        |       j                  ||       y # 1 sw Y   y xY w)Nr  r   r*   )indicesindptrint64r4   r   r  )r-   r0   r1   z0Only sparse matrices with 32-bit integer indicesrz   r  )r   randsetattrr  r   r9   r   r   r  r;   r   r   r   r   r<   )rx   r   rN   rD   attrr   rE   r   s           rK   test_large_sparse_matrixr    s     	fkk"b7IJKA% ;4D)009:;
))

 2
3CAAGGAJ'A--@]]:S1 	8f-11!Q7	8 	8 	&)--a3	8 	8s   ,C//C8c                      t        j                  g dg      j                  } t        j                  g d      }| j                  d   dk(  sJ t	        dd      j                  | |       y )N)r]   g?g?g      ?r\   gHzG?r   ffffff?)r3   r3   r   r   r3   r3   r   r3   r3   r.   T)rx   rS   )r9   r   r  r;   r   r<   )rD   rE   s     rK   test_single_feature_newton_cgr    sV     	>?@BBA
)*A771:??k>BB1aHrM   c            	         t         j                  j                         } t         j                  j                         }| |dk7     } ||dk7     }t	               j                  |       }t        | |d      dz  }t        ddddd	d
|      }t        j                         5  t        j                  dt               |j                  ||       d d d        y # 1 sw Y   y xY w)Nr4   rt  )r  gnt@r   r-   r   rP   r   r   )r   rx   r   r   r   r+   rQ   error)r|   r}   rM  r   r    r  r"   r   r   r   r   r   r<   )rD   rE   X_preprQ   rC   s        rK   test_liblinear_not_stuckr    s    		AA	!q&	A	!q&	A++A.FAE"_4A
!
C 
	 	 	" g'9:  s   -CCenable_metadata_routingc                     t         j                  j                  d      } t        d|       \  }}t        d|       \  }}t        j                  t        |            }d|dt        |      dz   d|i}t        d      }t        |      } |j                  ||fi | t        d      }	|	j                  d	       t        |	      }
 |
j                  ||fi | t        j                  |j                  d
   |
j                  d
         rJ  |j                  ||fi |} |
j                  ||fi |}t        j                  ||      rJ y)zTest that `sample_weight` is correctly passed to the scorer in
    `LogisticRegressionCV.fit` and `LogisticRegressionCV.score` by
    checking the difference in scores with the case when `sample_weight`
    is not requested.
    r   r  r4   Nrd   r  rp   Tr  r3   )r9   r   r   r   rA   r8   r   r   r<   set_score_requestr<  r  re   )r   rD   rE   X_ty_trd   kwargsscorer1lr_cv1scorer2lr_cv2score_1score_2s                rK   8test_lr_cv_scores_differ_when_sample_weight_is_requestedr    s5    ))


#C#>DAq"RcBHCGGCFOM#$M-CFaK }-F$G!'2FFJJq!v$GD1!'2FFJJq!v{{6>>!,fnnQ.?@@@fll3.v.Gfll3.v.G{{7G,,,,rM   c                     t         j                  j                  d      } t        d|       \  }}t        d|       \  }}t        j                  t        |            }d|dt        |      dz   d|i}t        d      5  t        d      }t        |	      } |j                  ||fi |  |j                  ||fi |}	ddd       t        d
      5  t        d      }
|
j                  d
       t        |
	      } |j                  ||fi |  |j                  ||fi |}ddd       t        j                  d   j                  d          t        	       y# 1 sw Y   xY w# 1 sw Y   HxY w)zTest that `sample_weight` is passed correctly to the scorer in
    `LogisticRegressionCV.fit` and `LogisticRegressionCV.score` even
    when `enable_metadata_routing=False`
    r   r  r4   Nrd   Fr  r  r  Tr  r3   )r9   r   r   r   rA   r8   r   r   r   r<   re   r  r   r  )r   rD   rE   r  r  rd   r  r  r  r  r  r  r  s                rK   3test_lr_cv_scores_without_enabling_metadata_routingr    s\   
 ))


#C#>DAq"RcBHCGGCFOM#$M-CFaK }-F		6 3Z(%g6

1a"6"&,,sC262	3 
	5 3Z(!!!5%g6

1a"6"&,,sC2623 FNN1%v~~a'89GW%3 33 3s   ?A E AE, E),E5c                    t        d      \  }}|dk(  }t        t              5  t        | d      j	                  ||      }d d d        | dvrj
                  dk(  sJ | dk7  rt        j                  t        j                  |j                               t        |j                  |      t        j                  |j                  d   |j                  	             t        |j                  |      t        j                  |j                  d   dfd
	             j                  ||      dk  sJ y # 1 sw Y   xY w)NTr  r4   r  r   ri  )r1   r0   r,   )r;   
fill_valuer]   r  )r   r%   r   r   r<   r  r   r   r9   
zeros_liker   r  r;   r   r?   re   )rx   rD   rE   rC   s       rK   test_zero_max_iterr  	  s    %DAq	QA	"4	5 F ;??1EF_${{a		2==#;<!!!$GG!''!*@	
 	a GG1771:q/c:	
 99Q?S   #F Fs   D66D?c                     t        dd      \  } }t               }d}t        d      5  ddi}t        j                  t
        |	      5   |j                  | |fi | d
d
d
       t        j                  t
        |	      5   |j                  | |fi | d
d
d
       d
d
d
       y
# 1 sw Y   JxY w# 1 sw Y   xY w# 1 sw Y   y
xY w)zTest that the right error message is raised when metadata params
    are passed while not supported when `enable_metadata_routing=False`.r   r   r  z1is only supported if enable_metadata_routing=TrueFr  extra_paramr  rz   N)r   r   r   r   r   r   r<   re   )rD   rE   r  r   r3  s        rK   5test_passing_params_without_enabling_metadata_routingr  !	  s     !<DAq "E
=C		6 (%]]:S1 	&EIIa%f%	& ]]:S1 	(EKK1''	(( (	& 	&	( 	(( (s;    B?	B'#B?B3B?'B0	,B?3B<	8B??Cc                     t        ddd      \  } }t        d      }d}t        j                  t        |      5  |j                  | |       d	d	d	       t        d      }t        j                  t        |      5  |j                  | |       d	d	d	       t        d
dd      \  } }t        d      }d}t        j                  t        |      5  |j                  | |       d	d	d	       t        d      }t        j                  t        |      5  |j                  | |       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   dxY w# 1 sw Y   y	xY w)z)Check `multi_class` parameter deprecated.rm   r  r'  )rH   rF   r(  r   r  z'multi_class' was deprecatedrz   Nr4   r   z-'multi_class' was deprecated.*binary problems)r   r   r   r   FutureWarningr<   r   )rD   rE   rt   r   lrCVs        rK   test_multi_class_deprecatedr  3	  s#   bJDAq		.B
(C	m3	/ 
q!  E2D	m3	/ A bJDAq		6B
9C	m3	/ 
q!  M:D	m3	/ A     s/   D0=D<EE0D9<EEEc                    t        dd|       \  }}d}t        d|      }t        j                         5  t        j                  d       |j                  ||       |j                  d   }d d d        d	k\  sJ t        d
|      }t        t              5  |j                  ||       |j                  d   }d d d        |k(  sJ t        d
||d	z
        }t        t              5  t        j                  t        d      5  |j                  ||       |j                  d   }	d d d        d d d        	|j                  d	z
  k(  sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   >xY w# 1 sw Y   BxY w)Nr   r  rD  gꌠ9Y>)Fr,   )rx   rQ   r  r   r3   r/   r  )rx   rQ   r   r   rz   )r   r   r   r   r   r<   r  r%   r	   r   r   r   r   )
r   rD   rE   rQ   lr_lbfgsn_iter_lbfgslr_nc	n_iter_nclr_nc_limitedn_iter_nc_limiteds
             rK   &test_newton_cholesky_fallback_to_lbfgsr  K	  s{    2DDAq 	A "A6H		 	 	" +g&Q''*+
 1 &71=E	-	0 %		!QMM!$	% $$$ ' Aq0@M 
-	0 9\\,4NO 	9a# - 5 5a 8	99
  6 6 ::::9+ +% %	9 	99 9s;   7E"E*E1"E%(E1EE"%E.	*E11E:)r]  r$  r   	functoolsr   rs  r9   r   numpy.testingr   r   r   r   scipyr   scipy.linalgr	   r
   sklearnr   sklearn._lossr   sklearn.baser   sklearn.datasetsr   r   r   sklearn.exceptionsr   sklearn.linear_modelr   sklearn.linear_model._logisticr   LogisticRegressionDefaultr   LogisticRegressionCVDefaultr   r   sklearn.metricsr   r   sklearn.model_selectionr   r   r   r   r   sklearn.multiclassr   sklearn.preprocessingr   r    r!   sklearn.svmr"   sklearn.utilsr#   r$   sklearn.utils._testingr%   r&   sklearn.utils.fixesr'   r(   r)   markfilterwarnings
pytestmarkr\  rD   rT   r   r|   rL   parametrizerV   rv   r   r   r8   r}   r   r   r   r   r   r   r   r   r   r   r  r  r  r7  rB  rG  rV  rb  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r.  r  r  r>  rn  r  r   r2  r8  rB  rH  rT  r   r\  rf  rh  rl  ro  rq  ru  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rk   rM   rK   <module>r     s    	       + " -  Q Q 1 . 1  3 E E   7 G I I[[''<
 6QG :K  P!Wq!fq!f{8$ .9 :"B " " .9F :F ST	S^KUSS^G<S^K@$))nU%VX	
 	$))n	
 	S^4EF&*' U(*: ST 24HIJ% K U%P  24HIJ@ K@ ST#HI) J U)2 ST/ U/* .92 :20<(;;
|?,8B06 "	bT	x-. 
+&'	"	Hk*+ 
 
F&IR .9 :  ST?- U?-D
$ ST5$-8  9 U F 5$-8D 9DN $4###6N#OP(J)?@+
 A Q+
\ $45S@M 6@MF FAA<8<v ;-.*HI#E J#EL8Jv4 .9! :! .9! :!!!BH .9/B :/Bd -T4L15 2 .50+. STYRYYq!_5(>?"%# @ 6 U(%0 ST7+.8 , U.8b fS\C6G(H$IIJ }5-8# 9 6
#< .9*J :*J\ ST(>?C 5$-8.9E@ : 9 @ UE@P:"C8 AB,y).DE@ F C@, 23D 4D8 kbkk"a34_5&; 6 5&;R f-#. .#.P ST*F U*F\ ST$89(FG 7 H : U 7L ST(O U(OVQ kbkk"a34_5%? 6 5%?PAB ST	C8!aTCP 	'   7+'
 , U'
T 6#g,k]9K*K#LM1 N1* %$G$u$G%4H*<*<Z(HX ST#LM5$-8&I 9 N U&IT ST(FGcds*CZ)PQ! R H U! 7+.94 : ,4&I2 -- .-<&: 7+! ,!2($0';rM   