
     he                     p   d dl Zd dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dl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 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 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 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$ d dl%m&Z& d/dZ'd Z(d Z)d Z*d  Z+d! Z,d" Z-d# Z.ej/        0                    d$eee g          d%             Z1d& Z2d' Z3ej/        0                    d(g d)          ej/        0                    d*g d+          d,                         Z4d- Z5d. Z6dS )0    N)optimize)assert_allclose)	factorialxlogy)product)assert_almost_equal)assert_array_equal)assert_array_almost_equal)DummyRegressor)GridSearchCV)explained_variance_score)mean_absolute_error)mean_squared_error)mean_squared_log_error)median_absolute_error)mean_absolute_percentage_error)	max_error)mean_pinball_loss)r2_score)mean_tweedie_deviance)d2_tweedie_score)d2_pinball_score)d2_absolute_error_score)make_scorer)_check_reg_targets)UndefinedMetricWarning2   c           
         t          j        |           }|dz   }|dz
  }t          t          ||          d           t          t	          ||          t          t          j        d|z             t          j        d|z                                  t          t          ||          d           t          t          ||          d           t          t          ||          d           t          t          ||d          d           t          t          ||d          d           t          t          ||          d           t          ||          }t          j
        |          sJ |dk    sJ t          t          ||          d           t          t          ||          dd	           t          t          ||d
          dd	           t          t          ||          d           t          t          ||d
          d           t          t          ||d          t          ||                     t          t          ||d          t          ||                     t          j        |t          j        |          z
                                            }t'          t)          ||          dt          j        ||z
                                            |z  z
             d}d }t          j        ||dz            }t          t-          |||          d ||||                                           ||||                                          z  z
             t          t)          ||          t-          ||d                     t          j        dd| z             }d	|z  }| }	t          t          ||d          d|	z  |	d	z  d	|	z  z   dz   z             t          t          ||d          |	dz   dt          j        d	          z
  z             t          t          ||d	          d	t          j        d	          z  dz
             t          t          ||d          dt          j        d	          z  dz
  |	z  t          j        |                                          z             t          t          ||d          t          j        d|z            d|	z  z             d	t          j        t3          |d	|z  |	dz   z                      z  }
t          t          ||d          d|	dz   dt          j        d	          z
  z  |
z  z
             d	t          j        |	dz   d	z            z  d	|	z  t          j        t5          |	                    z  z
  }
t          t          ||d	          dd	t          j        d	          z  dz
  |
z  z
             d S )N         ?      ?皙?alpha333333?    .Agףp=
?   Fforce_finiter   power皙?c                 v    |t          j        | |z
  d          z  d|z
  t          j        || z
  d          z  z   S )Nr   r   )npmaximum)y_truey_predr$   s      a/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/sklearn/metrics/tests/test_regression.py<lambda>z)test_regression_metrics.<locals>.<lambda>I   sC    : : 2	
Ubj&!44425     d   )qg?      ?            )r.   aranger   r   r   logr   r   r   r   isfiniter   r   r   r   r   absmediansumr
   r   
percentiler   sqrtmeanr   r   )	n_samplesr0   r1   y_pred_2mape
dev_medianr$   pinball_loss
y_quantilendev_means              r2   test_regression_metricsrN   "   s   Yy!!FaZFzH*66::C@@@vv..26!f*--rva&j/A/ABB   +FF;;SAAA)&&993???)&(;;SAAA)&&DDDcJJJ)&(#FFFLLL-ff==sCCC)&&99D;t#::::	&&11377700%;;;eDDDeQOOO0@@#FFF eDDDc   ffA66666**   q1118FF3K3K   6!2!22337799J//	BF6F?##''))J66   E5 5L v555Ju555	
,vvu
-
-
1
1
3
3
,vz5
1
1
5
5
7
78	8   //s333   Yq!i-((FZFAffB777
adQUlQ&'   ffA666Q1rvayy=8Q   ffA666BF1II8I   ffE:::
bgajj.1
	!RWV__%8%8%:%::   ffA666q6z8J8JaRSe8T   275Vq1u)=>>???Hq111	QUq26!99}%00  
 261q5A+&&&Q	!1E1E)EEHq1111BF1II8IX7U3U    r4   c                      t          dggdggdd          } t          dggdggdd          }t          j        |           t          j        |          k    sJ d S )Nr   
   
raw_valuesTmultioutputsquaredF)r   r.   rD   pytestapprox)mse1mse2s     r2   5test_mean_squared_error_multioutput_raw_value_squaredrY   |   si     serdVtTTTDserdVuUUUD74==FM$////////r4   c                  z   t          j        g dg dg dg          t          j        g dg dg dg          t                    } t          | d           t          d          } t          | d	d
           t	                    } t          | dd
           t                    } t          | d           t                    } t          | d           t          j        t                    d
          } t          j	        |           sJ | dk    sJ t                    } t          | d           t          d          } t          | d           t          d          } t          | d           t          dd          }fdt          j        d                   D             }t          j        t          j        |          d|          }t#          ||           t          dd          }t          ||                                           ddg}t          |ddgd          } t          | d           t          |ddgd          } t          | d           t          dd          } t          | t           j                   t          dd          } t          | t           j                   d d d df         d d d df         t          d          } t          dd          }t          | |           t          d          } t          dd          }t          | |           t          |ddgdd          } t          | t           j                   t          |dd gdd          } t          | t           j                    d S )!N)r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   g?FrT   guV?r'   decimalr,   g?)decimalsr&   r!   variance_weightedrS   g      uniform_averageg      rQ   r$   rS   c                 0   g | ]}d t          j        dd|f         dd|f         z
                                            t          j        dd|f         t          j        dd|f                   z
                                            z  z
  S )r   N)r.   r@   rB   rA   ).0ir1   r0   s     r2   
<listcomp>z/test_multioutput_regression.<locals>.<listcomp>   s         	

&1qqq!t,
-
-
1
1
3
3
&1	&A, 7 77
8
8
<
<
>
>?	?  r4   r   g      @r    gffffff@        rS   r)   r7   g      @)r.   arrayr   r   r   r   r   aroundr   r?   r   r   r   rangeshapewhereisnanr
   rE   naninf)errorscoreraw_expected_scoreycerror2r1   r0   s        @@r2   test_multioutput_regressionrv      s;   X|||\\\<<<@AAFX|||\\\<<<@AAFvv..EBCCCvvu===Eua0000"6622Eua0000  //E4555ff--E4555I4VVDDqQQQE;u3;;;;!&&11E0111VV1DEEEE}---VV1BCCCEv&&&VV3LQQQE     v|A''	   "(+=">">CUVVe%7888VV3DUVVVE16688999
sBR#s1DEEEEs###R#s1DEEEEs### $7e  E rv&&&VV1BQVWWWErv&&& AAAssF^FAAAssF^FVV1DEEEE$7e  F v&&&VV1BCCCEff2CRWXXXFv&&& 
S#J$7e  E rv&&&
S#J$7e  E w'''''r4   c                  `   t          t          dgdg          d           t          t          dgdgd          d           t          t          dgdg          d           t          t          dgdg          d           t          t	          dgdg          d           t          t          dgdg          d           t          t          dgdg          d           t          t          dgdg          d           t          t          dgdg          d           t          t          ddgddg          d           t          t          ddgddg          d           t          t          fD ]} t           | ddgddg          d           t           | ddgddgd          t          j                    t           | ddgddg          d           t           | ddgddgd          t          j                   d	}t          j        t           |
          5  t          dgdg           d d d            n# 1 swxY w Y   d	}t          j        t           |
          5  t          g dg d           d d d            n# 1 swxY w Y   d	}t          j        t           |
          5  t          g dg d           d d d            n# 1 swxY w Y   d}t#          t%          dgdg|          dd|z
  z  d           d}t          j        t           |
          5  t%          dgdg|           d d d            n# 1 swxY w Y   t          j        t           |
          5  t'          dgdz  dgdz  |           d d d            n# 1 swxY w Y   t          t%          dgdgd          dd           d}d}t          j        t           |
          5  t%          dgdg|           d d d            n# 1 swxY w Y   t          j        t           |
          5  t'          dgdz  dgdz  |           d d d            n# 1 swxY w Y   d}t#          t%          dgdg|          dd|z
  z             d}t          j        t           |
          5  t%          dgdg|           d d d            n# 1 swxY w Y   t          j        t           |
          5  t'          dgdz  dgdz  |           d d d            n# 1 swxY w Y   d}t#          t%          dgdg|          dd           d}t          j        t           |
          5  t%          dgdg|           d d d            n# 1 swxY w Y   t          j        t           |
          5  t'          dgdz  dgdz  |           d d d            n# 1 swxY w Y   d}t#          t%          dgdg|          dd           d}t          j        t           |
          5  t%          dgdg|           d d d            n# 1 swxY w Y   t          j        t           |
          5  t'          dgdz  dgdz  |           d d d            n# 1 swxY w Y   d}t          j        t           d
          5  t%          dgdg|           d d d            n# 1 swxY w Y   t          j        t           d
          5  t'          dgdz  dgdz  |           d d d            d S # 1 swxY w Y   d S )Nrg   Fr[   r    r   r   r7   r(   zSMean Squared Logarithmic Error cannot be used when targets contain negative values.match      )r           @      @)r    g       r|   g333333r*   r'   gMbP?)rtolz-can only be used on strictly positive y_pred.z<only be used on non-negative y and strictly positive y_pred.r8   r{   g:0yE>atolz3can only be used on strictly positive y and y_pred.r|   r!   z)is only defined for power<=0 and power>=1)r   r   r   r   r   r   r   r   r   r   r   r.   rp   ro   rU   raises
ValueErrorr   r   r   )smsgr+   s      r2   !test_regression_metrics_at_limitsr      sy    *C53%88#>>>*C53%GGGMMM.use<<cBBB+SEC5993???)3%#77===6useDDcJJJ-secU;;SAAA	3%#//5550#>>DDD #qC844c:::(#qC8<<cBBB 01 K KAAq!fq"g..444AAq!fq"gEBBBRVGLLLAAq!fq!f--s333AAq!fq!f5AAA26JJJJ	#  
z	-	-	- / /vv.../ / / / / / / / / / / / / / /	#  
z	-	-	- B B0@0@0@AAAB B B B B B B B B B B B B B B	#  
z	-	-	- B B///AAAB B B B B B B B B B B B B B B EqcC5666QYd    :C	z	-	-	- 9 9secU%88889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	z	-	-	- < <#SEAIU;;;;< < < < < < < < < < < < < < < -secU!DDDc1MMME
HC	z	-	-	- 9 9secU%88889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	z	-	-	- < <#SEAIU;;;;< < < < < < < < < < < < < < < E)3%#eDDDa1u9oVVV
HC	z	-	-	- 9 9secU%88889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	z	-	-	- < <#SEAIU;;;;< < < < < < < < < < < < < < < E)3%#eDDDdQUVVVV
?C	z	-	-	- 9 9secU%88889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	z	-	-	- < <#SEAIU;;;;< < < < < < < < < < < < < < < E)3%#eDDDdQUVVVV
?C	z	-	-	- 9 9secU%88889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	z	-	-	- < <#SEAIU;;;;< < < < < < < < < < < < < < < E	z)T	U	U	U 9 9secU%88889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	z)T	U	U	U < <#SEAIU;;;;< < < < < < < < < < < < < < < < < <s  &II	I	-JJJ6KKK+MMM2NN N&PPP-QQQ&SSS-TTT"VV
V)WWWX??YY%ZZZ4[[[;\##\'*\'c            	      j   dg ddfddgdgdggdfdddgddgddggdfdddgddgddggdfdg d	g d
g dgdfg} t          | d          D ]\  \  }}}\  }}}||k    r||k    rt          ||d           \  }}}	}
||k    sJ |dk    rGt          |t          j        |d                     t          |	t          j        |d                     t          ||           t          |	|           t          j        t                    5  t          ||d            d d d            n# 1 swxY w Y   d S )N
continuousr   r'   r;   r   r'   r;   zcontinuous-multioutput   r<   )r   r;   r<   )r'   r'   r'   )r;   r   r   )repeat)r7   r   )r   r   r	   r.   reshaperU   r   r   )EXAMPLEStype1y1n_out1type2y2n_out2y_typey_check1y_check2rS   s              r2   test__check_reg_targetsr   6  s    
yyy!$	aS1#*	!QFQFQF#;Q?	!QFQFQF#;Q?	!IIIyyy)))#DaHH 5<HQ4O4O4O 1 10F0eRE>>f..6HRQU6V6V3FHhF????$$"8RZG-D-DEEE"8RZG-D-DEEEE"8R000"8R0000z** 1 1"2r40001 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1s   	D''D+	.D+	c                      d} d                     |           }t          j        t          |          5  t	          g ddgdgdgg|            d d d            d S # 1 swxY w Y   d S )Nthis_value_is_not_validzFAllowed 'multioutput' string values are.+You provided multioutput={!r}rx   r   r   r'   r;   )formatrU   r   r   r   )invalid_multioutputexpected_messages     r2   !test__check_reg_targets_exceptionr   P  s    3PWW	
 	
 
 
z)9	:	:	: L L999sQC!o7JKKKL L L L L L L L L L L L L L L L L Ls   AA!Ac            	      r   ddgddgddgddgg} ddgddgdd	gdd
gg}t          | |d          }t          | |d          }d}t          j        t          |          5  t          | |d           d d d            n# 1 swxY w Y   t          j        t          |          5  t          | |d           d d d            n# 1 swxY w Y   t          | |d          }t          | |d          }t          | |d          }t          | |d          }t          | |dd          }	t          | |dd          }
t          |ddgd           t          |ddgd           t          |ddgd           t          |ddgd           t          |ddgd           t          |ddgd           t          |	ddgd           t          |
ddgd           d d ggd	z  } ddggd	z  }t          | |d          }t          | |d          }t          | |d          }t          | |d          }t          | |d          }	t          |d!d!gd           t          |d!d!gd           t          |ddgd           t          |d"d"gd           t          |	d"d"gd           t          d dgd dggddgddggd          }t          |d d#gd           t          j        |          t          d dgd dggddgddggd$          k    sJ t          d dgd dggddgddggd          }t          |d d%gd           t          d dgd dggddgddggdd          }
t          |
t          j         d%gd           ddgddgg} dd	gddgg}t          | |d          }t          |d!d&gd           t          j        |          t          | |d$          k    sJ t          | |dd          }t          |t          j        d&gd           t          t          j        |          t          | |d$d                     t          | |d          }t          |d!d&gd           t          j        |          t          | |          k    sJ t          | |dd          }	t          |	d!d'gd           t          | |dd          }
t          |
t          j        d&gd           t          t          j        |
          t          | |d(                     t          j        ddgddgdd)gg          } t          j        ddgddgd*d*gg          }t#          | |d          }t          t          j        d| z             t          j        d|z             d          }t          ||d           d S )+Nr   r'         @r7         @r;   r      r<         @rQ   r`   zgmultioutput is expected to be 'raw_values' or 'uniform_average' but we got 'variance_weighted' instead.rx   r_   r!   rb   Frh   g      ?g      ?r\         ?g      ?g      ?g	g?g2w-!?ffffff?g(\?g-?gv?r   r    rg   g      ra   g      g      rz   r(   r9   r:   )r   r   rU   r   r   r   r   r   r   r   r
   r.   rE   rp   ro   r   ri   r   r>   )r0   r1   msemaeerr_msgpblrH   revsd2psevs2r2r22mslemsle2s                  r2   !test_regression_multioutput_arrayr   [  s   !fsBi#qAq62F!fq"g1v3x0F
VV
F
F
FC
ff,
G
G
GC	G  
z	1	1	1 K K&&6IJJJJK K K K K K K K K K K K K K K 
z	1	1	1 J J5HIIIIJ J J J J J J J J J J J J J J FF
E
E
EC)&&lSSSD\:::A
"66|
L
L
LCFF#<PPPD#Lu  D cE6?A>>>>cD%=!<<<<cHi#8!DDDDdVV$4a@@@@a$q9999cD$<;;;;dUENA>>>>dT4L!<<<< !fX\F!fX\F
VV
F
F
FC
ff,
G
G
GC
FF
E
E
EC\:::AFFEEEDcC:q9999cC:q9999cC:q9999a#sQ7777dS#J::::1b'Aq6"aVaV$4,OOOAa!TA666671::
R1a&QFQF+9J       #
R1a&QFQF+  C cAu:q9999#
R1a&
Q!Q 	  D dbfWe$4a@@@@ !fq!fF!fq!fF	&&l	;	;	;Bb3+q999972;;(66?PQQQQQQQ
66|%
P
P
PCcBFD>1====
->USSS  
 #66|
L
L
LCcC;::::73<<3FFCCCCCCFF#<PPPDdS$K;;;;#Lu  D dRVTNA>>>>
/USSS  
 XQx!Q!Q011FXQx!SAq6233F!&&lKKKD
q6zBF1v:..L  E dE1555555s$   A==BB#CC	Cc                     ddgddgddgddgg} ddgddgdd	gdd
gg}t          | |ddg          }t          | |ddgd          }t          | |ddg          }t          | |ddg          }t          | |ddg          }t	          | |ddg          }t          | |dddg          }t	          | |ddgd          }	t          |dd           t          |dd           t          |dd           t          |dd           t          |dd           t          |dd           t          |dd           t          |	dd           t          j        ddgddgddgg          } t          j        ddgddgddgg          }t          | |ddg          }
t          t          j
        d| z             t          j
        d|z             ddg          }t          |
|d           d S )Nr   r'   r   r7   r   r;   r   r   r<   r   r"   r%   r`   FrR   r!   rb   rh   g(\?r\   gzG?gffffff?g|гY?gGz?gPn?r9   r:   g333333?gffffff?)r   r   r   r   r   r   r   r.   ri   r   r>   )r0   r1   msewrmsewmaewmapewrwevswd2pswevsw2r   r   s               r2   test_regression_custom_weightsr     sk   !fsBi#qAq62F!fq"g1v3x0Fff3*EEEDvvC:uUUUEvvC:FFFD*66SzRRRE	&&sCj	9	9	9B#FFc
KKKDVV3S#JOOOE$S#JU  E dA....tQ////eQ////vq1111D!,,,,dA....ua0000tQ//// XQx!Q!Q011FXQx!SAq6233F!&&sCjIIID
q6zBF1v:..S#J  E eQ//////r4   metricc                     dg}dg}d}t          j        t          |          5   | ||          }t          j        |          sJ 	 d d d            d S # 1 swxY w Y   d S )Nr   r   z,not well-defined with less than two samples.rx   )rU   warnsr   r.   rn   )r   r0   r1   warning_msgrr   s        r2   test_regression_single_sampler     s    SFSF@K 
,K	@	@	@  vv&&x                 s   #AAAc                  j   d} t           j                            d                              |           dz   }t           j                            d                              |           dz   }t	          t          ||d          t          ||d                     t	          t          ||d          t          ||d          d	           t	          t          ||d
          t          ||d          d	           t	          t          ||d          t          ||d          d	           d S )Nr5   r   皙?r   g|۽r*   g8   ?gư>r~   g ?r'   go    @)r.   randomRandomStaterandr   r   )rF   r0   r1   s      r2    test_tweedie_deviance_continuityr     sW   IY""1%%**955;FY""1%%**955;FffI>>>ffA666   ffI>>>ffA666    ffI>>>ffA666    ffI>>>ffA666     r4   c                      t           j                            d          } |                     d          }d|z  }t	          ||          t          j        d          k    sJ d S )N*   r5   sizeg333333?r,   )r.   r   r   exponentialr   rU   rV   )random_number_generatorr0   r1   s      r2   #test_mean_absolute_percentage_errorr     sb     i33B77$00c0::F6\F)&&99V]3=O=OOOOOOOr4   distribution)normal	lognormalr   uniformtarget_quantile)皙?r!         ?c                    t          t          d          st          j        d           dt          j                            d          } t          ||                     t          j                  }t          j        |          }t          |          }t          j        t          j
        dd	d
                    }|D ]}t          j        |          }t          |          }	|	|t          j        |j                  j        z
  k    sJ ||k              z
                                  d	z
  z  |k             |z
                                  z  z   }
|
z  }
t          |
|	           fd}t!          j        |                                d          }|j        sJ |j        t          j        |d          k    sJ |j        t          j        |          k    sJ d S )NquantilezOThis test requires a more recent version of numpy with support for np.quantile.i  r   r   
fill_valuer#   r   r   r5   c                 T    t          j        |           }t          |          S )Nr   r#   )r.   fullr   )xconstant_preddatarF   r   s     r2   objective_funczFtest_mean_pinball_loss_on_constant_predictions.<locals>.objective_funcD  s,    	a888 }OLLLLr4   zNelder-Mead)methodg{Gz?)rel)hasattrr.   rU   skipr   r   getattrr   r   r   linspacefinfodtypeepsrB   r   r   minimizerE   successr   rV   fun)r   r   rng	best_predbest_constant_predbest_pblcandidate_predictionspredr   r   expected_pblr   resultr   rF   s    `           @@r2   .test_mean_pinball_loss_on_constant_predictionsr     s5   
 2z"" 
,	
 	
 	
 I
)


#
#C%73%%9555D D/22IyAAA '9QQQH Kbk!Q.D.DEE% / /	d;;;m?KKK
 h(.!9!9!====== tD4K0055771;NO%
#%%/S" " 		!L#....M M M M M M M ~tyy{{=QQQF>>8v}YD9999999:x00000000r4   c                     d} t           j                            d          }|                    | df          }|                    |           }g d}|D ]}t          t          |d          }t          dd	
          }t          |t          |          |          
                    ||          }|j        d         t          j        |          k    sJ d S )Ni  r   r   r   )r   r   r   r!   r   g?r   F)r$   greater_is_betterr   r   )strategyr   )r   )
param_gridscoring)r.   r   r   r   r   r   r   r   r   dictfitbest_params_rU   rV   )	rF   r   Xyall_quantilesr$   neg_mean_pinball_loss	regressorgrid_searchs	            r2   $test_dummy_quantile_parameter_tuningr   O  s   
 I
)


"
"C

A
''AY''A;;;M L L +#!
 !
 !

 #JFFF	"]333)
 
 
 #a))	 	 '
3v}U7K7KKKKKKL Lr4   c                     t           j                            d          } d}|                     |          }|                                |                     |          z   }t          ||          t          ||d          dz  k    sJ d S )Ni  r5   r   r!   r#   r'   )r.   r   r   r   copyr   r   r   )r   rL   r0   r1   s       r2   #test_pinball_loss_relation_with_maer  j  s    
)


$
$CAZZQZF[[]]S[[^^+FFF++VV3777!;	< 	< 	< 	< 	< 	<r4   )r   )7numpyr.   scipyr   numpy.testingr   scipy.specialr   r   	itertoolsr   rU   sklearn.utils._testingr   r	   r
   sklearn.dummyr   sklearn.model_selectionr   sklearn.metricsr   r   r   r   r   r   r   r   r   r   r   r   r   r   sklearn.metrics._regressionr   sklearn.exceptionsr   rN   rY   rv   r   r   r   r   r   markparametrizer   r   r   r   r   r   r4   r2   <module>r     s]             ) ) ) ) ) ) * * * * * * * *        6 6 6 6 6 6 5 5 5 5 5 5 < < < < < < ( ( ( ( ( ( 0 0 0 0 0 0 4 4 4 4 4 4 / / / / / / . . . . . . 2 2 2 2 2 2 1 1 1 1 1 1 : : : : : : % % % % % % - - - - - - $ $ $ $ $ $ 1 1 1 1 1 1 , , , , , , , , , , , , 3 3 3 3 3 3 ' ' ' ' ' ' : : : : : : 5 5 5 5 5 5W W W Wt0 0 0Q( Q( Q(h[< [< [<|1 1 14L L Ld6 d6 d6N0 0 0D H.>@P#QRR  SR  DP P P EEE  *,=,=,=>>/1 /1 ?> /1dL L L6	 	 	 	 	r4   