
    biE                        d dl Z d dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZ d dlmZmZ d dlmZ e j*                  j,                  ZegZ edd      d	        Z ej2                  d d
h      d        Zd Z eej8                         G d d             Z edd      d        Z ee       G d d             Zy)    N)stats)_xp_searchsorted)xp_default_dtypeis_numpyis_torchis_jaxmake_xp_test_caseSCIPY_ARRAY_APIxp_sizexp_copy)xp_assert_closexp_assert_equal)_apply_over_batch)x   )pr   c                    |dk(  r| t        j                  |           } t        j                  |      }|j                         }d||<   |dk(  rS| j                  dk(  rt        j                  || d         n)t
        j                  j                  | |      j                  }nJ|j                  d      r!t        t        j                  |       ||      }nt        j                  | ||      }t        j                  |      }|dk(  r;t        j                  t        j                  |             rt         j                  |d d  t         j                  ||<   |S )	Nomit      ?harrell-davisr   r   roundmethod	propagate)npisnancopysize	full_liker   mstatshdquantilesdata
startswithwinsor_reference_1dsortquantileasarrayanynan)r   r   
nan_policyr   p_maskress         Z/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/scipy/stats/tests/test_quantile.pyquantile_reference_last_axisr.      s    Vrxx{lOXXa[F	AAfI ()!r||Aqt$LL,,Q277 				7	#!"''!*a8kk!Qv.
**S/C[ RVVBHHQK%8A&&CKJ       )excludedc                    t        |       }|dk(  rFt        |dk  rt        j                  ||z        nt        j                  ||z  dz
              }| |   S |dk(  rFt        |dk  rt        j                  ||z        nt        j
                  ||z  dz
              }| |   S |dk(  rAt        |dk  rt        j
                  ||z        nt        j                  ||z  dz
              }|    S )Nround_nearestr   r   round_outwardround_inward)lenintr   r   floorceil)yr   r   njs        r-   r$   r$   /   s     	AA 1s7QQ0CD
 Q4K	 
?	"1s7QA	0BC Q4K 
>	!!c'ArxxA	/BCQ4Kr/   c                   t        j                  | |d      t        j                  t        j                  |      |d      }} t        | |||      }t        j                  |d|      }|st        j                  ||      }|S )Naxis)r   moveaxis
atleast_1dr.   squeeze)r   r   r@   r*   keepdimsr   r,   s          r-   quantile_referencerE   =   sh    ;;q$#R[[q1A4%LqA
&q!Z
@C
++c2t
$Cjj4(Jr/   c                      e Zd Zd Zd Z edddg      ej                  j                  dg d      ej                  j                  d	g d
      ej                  j                  dddg      d                             Z	ej                  j                  d       eddddg      ej                  j                  dddg      ej                  j                  dddg      ej                  j                  dg d      ej                  j                  dddg      ej                  j                  dg d      ej                  j                  dddg      d                                                         Zd Zej                  j                  dg dej                  i fg ddddd ej                  gej                  dd!ej                  ej                  gi fg dg g i fej                  d"ggdej                  d"gdd#ifg g gd ej                  d"ej                        ddifg g gd ej                   d$      ddd%fg g gd ej                   d&      ddd%fg dd'g ej                  d"ej                        i f ej"                  dd(      j%                  d)      dd*gggd+dd%fdd"gd!d,ggg d-g d.gd+dd%fg
      d/        Zej                  j                  dg d0      ej                  j                  dddg      d1               Zej                  j                  dg d2      d3        Zej                  j                  d4ddg      d5        Zej                  j                  dg d6      d7        Zej                  j                  d      ej                  j                  dg d6      ej                  j                  d8d9d:g      d;                      Zy+)<TestQuantilec           	         |j                  g d      }|j                  d      }d}t        j                  t        |      5  t	        j
                  |j                  ddg      |       d d d        t        j                  t              5  t	        j
                  |j                  ddg      |       d d d        d	}t        j                  t        |      5  t	        j
                  ||j                  d
dg             d d d        d}t        j                  t        |      5  t	        j
                  |||j                  ||j                               d d d        d}t        j                  t        |      5  t	        j
                  ||d       d d d        t        j                  t        |      5  t	        j
                  ||d       d d d        d}t        j                  t        |      5  t	        j
                  ||d       d d d        t        |      sZd}t        j                  t        |      5  t	        j
                  |j                  |j                  ddg      |d       d d d        d}t        j                  t        |      5  t	        j
                  ||d       d d d        d}t        j                  t        |      5  t	        j
                  |||d       d d d        d}t        j                  t        |      5  t	        j
                  |||d       d d d        d}t        j                  t        |      5  t	        j
                  ||d       d d d        d }t        j                  t        |      5  t	        j
                  ||j                  dd!g      d       d d d        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   xY w# 1 sw Y   gxY w# 1 sw Y   8xY w# 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   Lx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   r0      r   z`x` must have real dtype.)matchTFy      ?      ?r0   z"`p` must have real floating dtype.r   r   z`weights` must have real dtype.)weightsz"`axis` must be an integer or None.r?   )r   r>   z7`axis` is not compatible with the shapes of the inputs.zThe input contains nan valuesraise)r*   z`method` must be one of...za duckr   z4`method='harrell-davis'` does not support `weights`.r   rL   r   z4`method='round_nearest'` does not support `weights`.r3   z/If specified, `keepdims` must be True or False.*   )rD   zD`keepdims` may be False only if the length of `p` along `axis` is 1.333333?)
r'   pytestraises
ValueErrorr   r&   astype	complex64r   r)   )selfxpr   r   messages        r-   test_input_validationz"TestQuantile.test_input_validationI   sx   JJy!JJsO-]]:W5 	9NN2::tUm4a8	9]]:& 	5NN2::tQi0!4	5 7]]:W5 	2NN1bjj!Q01	2 4]]:W5 	ENN1a1bll)CD	E 7]]:W5 	+NN1ac*	+]]:W5 	/NN1ag.	/ L]]:W5 	)NN1aa(	) bz5Gz9 Rrzz2661a.91QR /]]:W5 	2NN1a1	2 I]]:W5 	DNN1a?C	D I]]:W5 	DNN1a?C	D D]]:W5 	.NN1a"-	. Y]]:W5 	FNN1bjj#s4uE	F 	F[	9 	9	5 	5	2 	2	E 	E	+ 	+	/ 	/	) 	)
R R	2 	2	D 	D	D 	D	. 	.	F 	Fs   (O(O(O!%3O.=O;9P7P 5P"P/P<Q	Q*Q"OO!O+.O8;PPP"P,/P9<Q	QQ"Q+c                    t        j                  ||d      }|j                  }t        j                  |      }|j	                  d|j
                  d   t         j                        }g }g }|D ]I  }|j                  |      }	|j                  t        j                  ||	             |j                  |	       K t        j                  |      t        j                  |      }}|dk  r.t        j                  |d      t        j                  |d      }}t        j                  |d|      t        j                  |d|      }}t        j                  ||j                        }||fS )Nr>   
   )r   dtyper0   r   r?   r\   )r   swapaxesndim
atleast_2dintegersshapeint32permutedappendrepeatstackrC   r'   r\   )
rV   r   r@   rngr_   countsx_reprL   x_counts_s
             r-   _get_weights_x_repzTestQuantile._get_weights_x_rep   s   KK4$vvMM!bqwwr{"((C 	$Bll6*GLL2w/0NN7#	$ %"((7*;w!8ZZA6

7QR8S7EUB5r{{7BPT7Uw**WAGG4~r/   TzPyTorch doesn't have `betainc`.cupy)cpu_onlyreason
exceptionsr   )inverted_cdfaveraged_inverted_cdfclosest_observationhazeninterpolated_inverted_cdflinearmedian_unbiasednormal_unbiasedweibullr   r3   r4   r5   _lower_higher	_midpoint_nearestzshape_x, shape_p, axis))r[   Nr>   )r[   r[   r>   )r[   )r0   rJ   r>   ))r[   r0   Nr   rL   Fc           	         |r<|j                  d      s|j                  d      s|dk(  rt        j                  d       t        |      }t        j
                  j                  d      }|j                  |      }	|j                  |      }
|r| j                  |	||      \  }}nd |	}}t        ||
|j                  d      r|dd  n||d|d u	      }|j                  |	|
      |j                  |
|
      }
}	||n|j                  ||
      }t        j                  |	|
|||      }t        ||j                  ||
             y )N_r   r   z4`weights` not supported by private (legacy) methods.   lv_r   r   r   )r   r@   r*   rD   r]   )r   rL   r@   )r#   rQ   skipr   r   randomdefault_rngrm   rE   r'   r   r&   r   )rV   r   shape_xshape_pr@   rL   rW   r\   rh   r   r   rj   refr,   s                 r-   test_against_referencez#TestQuantile.test_against_reference   s6    ))#.&2C2CG2L!?2KKNO $ii##$56JJGJ$JJGJ$!44QcBNGU!1UG 16+<+<S+AVABZv+t8KM zz!5z)2::au:+E1$_'"**WE*2RnnQ&'MRZZ5Z9:r/   z%ignore:torch.searchsorted:UserWarningz	jax.numpyr@   r   r   rD   r*   )r   r   marrayr\   float32float64)rw   r   r3   c                    t        |      r|dk(  rt        j                  d       |r|dv rt        j                  d       t        j                  j                  d      }d}	|j	                  |	      j                  |      }
|j	                  |	      j                  |      }|j	                  |	      dkD  }t        j                  |      sJ t        j                  |
|<   |st        j                  ||d	
      }t        |      r|j                         }d|d<   d|d<   t        ||      }|r,| j                  |
||      \  }}||n|j                  |      }nd |
}}|dk(  rt        st        j                  d       |t        j                  d       t        j                   d      }t#        |||      }|j%                  |      }|j                  |
|      }||n|j                  |      }t'        j(                  ||j                  |      fd|i|}t+        ||fddi|}t-        |j.                  |j                  ||             y t#        ||||      }t'        j(                  |j                  |
      |j                  |      fd|i|}t+        ||fi |}t-        ||j                  ||             y )Nr   z(`marray` currently incompatible with JAX>   r3   r   z'These methods don't yet support weightsr   )      r   g?Tr@   rD           r         ?z-MArray is only available if SCIPY_ARRAY_API=1z)MArray is not yet compatible with weights)r@   rD   r   )maskrL   r*   r   r]   )r@   rD   r*   r   )r   rQ   r   r   r   r   rT   r(   r)   meanr   ravelgetattrrm   r'   r
   importorskipdict_get_namespacer   r&   rE   r   r"   )rV   r@   rD   r*   r\   r   rL   rW   rh   rb   r   r   r   p0rj   r   kwargsmxpx_mpr,   r   s                        r-   test_against_reference_2z%TestQuantile.test_against_reference_2   sr    ":*0KKBCv!CCKKABii##$56JJEJ"))%0JJEJ"))%0zzuz%+vvd||&&$t4A
 B<BBqEBrFE"!44QcBNGU!(gbjj6IG!1UG!"KL"GH((2FthvFF''+C;;qt;,D!(gckk'6JG..s{{1~QwQ&QC$UAK&KFKCCHHbjjEj&BC4(!+F<nnRZZ]BJJqMU7UfU 4V4RZZ5Z9:r/   c                     t        j                  |j                  d|j                        d      }|j                  t        |      k(  sJ y )Nr[   r]   r   )r   r&   arangeint64r\   r   )rV   rW   r,   s      r-   test_integer_input_output_dtypez,TestQuantile.test_integer_input_output_dtype   s;    nnRYYrY:C@yy,R0000r/   zx, p, ref, kwargsr   rI   r>   g      ?rJ   r0   r   )r   r   )r   r   rP      )rJ   rJ   rJ   g      ,@N   )g      ?r   g      ?)g      ?g      @g      
@c                     t        |      }|j                  |      |j                  |      |j                  ||      }}}t        j                  ||fi |}t	        ||       y )Nr]   )r   r'   r   r&   r   )rV   r   r   r   r   rW   default_dtyper,   s           r-   test_edge_caseszTestQuantile.test_edge_cases   sW    $ ),JJqM2::a="**S*2Vc1nnQ,V,S!r/   )r   r   r0   c                     g d}|j                         }|rd||<   n|j                  |       t        j                  |j	                  t        |            d||      }|j                  t        |      k(  sJ y )N)rJ   r   r   r   r   r   )r   popr   r&   zerostuplerb   )rV   r@   rD   rW   rb   	out_shaper,   s          r-   test_size_0zTestQuantile.test_size_0  sd     JJL	IdOMM$nnRXXeEl3SthWyyE),,,,r/   )rr   rs   rt   r{   r|   r}   r~   c                    |dk(  r(t         j                  dk  rt        j                  d       t        j                  dt         j
                        }t        j                  ddd      }t        j                  |j                  |      |j                  |      |	      }t        j                  |||j                  d
      r|dd  n|	      }t        ||j                  ||j
                               y )Nrt   z2.0.1z5Bug in np.quantile (numpy/numpy#26656) fixed in 2.0.1g       @r]   r   g     ?g      ?r   r   r   )r   __version__rQ   r   r   r   r   r&   r'   r#   r   )rV   r   rW   r   r   r,   r   s          r-   test_transitionzTestQuantile.test_transition  s     **r~~/GKKOPIIb

+IIa'*nnRZZ]BJJqM&Ikk!QV5F5Fs5KvabzQWXRZZ2::Z>?r/   zero_weightsc           	      H   t        |      r$|j                  dk  rt        j                  d       t	        |      }t
        j                  j                  d      }d}|j                  d      }|j                  d      }|rd||dk  <   t        j                  d	d
d      }t        j                  |j                  ||      |j                  ||      ||j                  ||            }	t        j                  ||||      }
t        |	|j                  |
|             y )Nz2.0z'`weights` not supported by NumPy < 2.0.   z-\"}	rr   d   r   r   r   r   r   i,  r]   )r   rL   )r   r   rQ   r   r   r   r   r   linspacer   r&   r'   r   )rV   r   rW   r\   rh   r   r   rL   r   r,   r   s              r-   test_weights_against_numpyz'TestQuantile.test_weights_against_numpy*  s    B<BNNU2KKAB $ii##$56JJCJ **#*&%&GGcM"KKB$nnRZZZ7AU9S$*BJJweJ4TVkk!Qvw?RZZ5Z9:r/   )	rr   rs   rt   ru   rv   rw   rx   ry   rz   c                 V   t         j                  j                  d      }d}|j                  |j                  |            }t	        |      }|j                  |j                  |            }|j                  |j                  |      dk        }|j                  |j                  |            }	|j                  |d|	      }	t        j                  |||	|      }
t        j                  ||    ||	|    |      }t        |
|       t        ||       d}|j                  |j                  |            }t	        |      }|j                  |j                  |            }|j                  |j                  |      dk        }|j                  |j                  |            }	|j                  ||j                  |      }|j                  |d|	      }t        j                  ||||d	      }
t        j                  |||	d
|d      }t        |
|       t        ||       y )Nr   r   r   皙?r   rN   )r   r   r>   )rL   r   r@   r   )rL   r*   r   r@   )r   r   r   r'   r   wherer   r&   r   r   r)   )rV   r   rW   rh   r;   r   x0r   i_zerorL   r,   r   rb   x_nannedweights_zeroeds                  r-   test_zero_weightszTestQuantile.test_zero_weights;  s   
 ii##$56 JJszzqz)*QZJJszzqz)*CJJAJ.45**SZZQZ/0((62w/nnQ76BnnQwZGVG4DVTS!2 JJszzuz-.QZJJszzuz-.CJJEJ2S89**SZZUZ3488FBFFA.&"g6nnQ>&rRnnXq'(.vBHS!2r/   rb   2   )r   rJ   c                 b   t         j                  j                  d      }|j                  |j                  |            }|j                  |j                  |            }|j	                  |      }t        j                  ||||      }t        j                  |||      }	t        ||	       y )Nl   .,+r   rN   r   )r   r   r   r'   	ones_liker   r&   r   )
rV   r   rb   rW   rh   r   r   rL   r,   r   s
             r-   test_unity_weightszTestQuantile.test_unity_weights^  s     ii##$56JJszzuz-.JJszzuz-.,,q/nnQ76BnnQ&1S!r/   )__name__
__module____qualname__rY   rm   skip_xp_backendsrQ   markparametrizer   filterwarningsr   r   r   r)   fullr   r   reshaper   r   r   r   r   r    r/   r-   rG   rG   F   s   3Fl& t,M"(+[[X
89 [[5LN[[Y6; 7N9+;2 [[ GHt,M"(+!68[[VaV,[[Z%7[[\+JK[[Wy)&<=[[X'ST[[Y64; 7 U > L 8 -8 I4;l1 [[0
c2662	
b!QRVV,rvvq!RVVRVV.Lb	Q
RR	 FFA;-rvvqkL&+A	Br(CBFF+fb\	:r(C$!)G	Hr(C&)A4+H	I
sCj'"''!RVV,b	1
"))Ar

"
"9
-sseWIT
*
,q6Aq6
-0A/BT
*
,	""#"" [[VY/[[Z%7- 8 0- [[X	78	@8	@ [[^eT];; <;  [[X		> [[ GH[[X	 [[Wr7m4" 5	 I"r/   rG   )ar   )vr   c                 2    t        j                  | ||      S )Nside)r   searchsorted)r   r   r   s      r-   np_searchsortedr   o  s    ??1ad++r/   c            	       \   e Zd Zej                  j                  dddg      ej                  j                  dddg      ej                  j                  dg d      ej                  j                  d	ddg      ej                  j                  d
ddg      d                                    Zy)Test_XPSearchsortedr   leftrighttiesFTrb   )r   r   r0   r[      i  i'  )r0   r   )r   r0   )r0   r[   )r0   rJ   r   nans_xinfs_xc                 >   |r t        |      rt        j                  d       t        j                  j                  d      }|r|j                  d|      }n|j	                  |      }t        j                  |t        j                        }t        j                  |t        j                        }	t        j                  |t        j                         }
t        j                  t        j                   t        j                  t        j                  g      }t        j                  ||j                  d d dz         }|j                  t        j                  |
||	|fd      d      }|r'|j	                  |      d	k  }t        j                  ||<   |rO|j	                  |      d	k  }t        j                   ||<   |j	                  |      d
kD  }t        j                  ||<   t        j                   |d      }t        j                  |t        j"                        t        j                  |t        j"                        }}|j                  d      j$                  }t'        |      dk(  rS|j(                  dkD  rD|j                  d   dk7  r2|j+                  |j                  d d |j                  d   fz   |      }n|j                  t-        |||      |      }|j                  |      |j                  |      }}t/        |||      }t1        ||       y )Nztorch sorts NaNs differentlyl   %Dg hr   r   r]   r>   )rJ   r?   r   g?r   r   r   )r   rQ   r   r   r   r   ra   r'   r   	nextafterinfr)   broadcast_torb   rd   concatenater%   r   r\   r   r_   emptyr   r   r   )rV   r   r   rb   r   r   rW   rh   r   xrxlrk   r:   r   xp_default_intr   r,   s                    r-   test_ndzTest_XPSearchsorted.test_ndv  sD    hrlKK67ii##$67QU+A

5!AJJq

+\\!RVV$\\!bffW%ZZ"&&"&&"&&12__R"!45LLQBbALK::e$s*DffAdG::e$s*DvvgAdG::e$s*DffAdGGGABzz!2::.

1BJJ0O1A,,1:?qvvzaggbkQ.>((1773B<1772;.8(OC**_Q=^*TCzz!}bjjm1q!$/S!r/   N)r   r   r   rQ   r   r   r   r   r/   r-   r   r   t  s    [[Vfg%67[[VeT]3[[W 'L M[[Xt}5[[Xt}5 " 6 6M 4 8 "r/   r   ) rQ   numpyr   scipyr   scipy.stats._quantiler   scipy._lib._array_apir   r   r   r   r	   r
   r   r   scipy._lib._array_api_no_0dr   r   scipy._lib._utilr   r   r   lazy_xp_modulesr.   	vectorizer$   rE   r&   rG   r   r   r   r/   r-   <module>r      s       2	 	 	 I .;;// '8X& '. 1v
 
 5>>"e" e" #e"P	 8X&, ', #$'" '" %'"r/   