
    IR-eV              
       N   d dl Zd dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ d dlmZmZ d dlmZ d Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&ej'        (                    e oed          d             Z)d Z*d Z+d Z,ej'        -                    d  ej.        d!d"gd#$           ej/        d!d"gd%$           ej0        d!d"gd&d'gd()          g          d*             Z1ej'        -                    d+d,d-g          d.             Z2dS )/    N)coordinatestime)units)ColumnNdarrayMixinQTableTabletable_helpersunique)NUMPY_LT_1_22NUMPY_LT_1_22_1)AstropyUserWarningc                 B    t          |           t          |          k    S N)sorted)list1list2s     ?lib/python3.11/site-packages/astropy/table/tests/test_groups.pysort_eqr      s    %==F5MM))    c                    dD ]9}t          | |          }|d                                         }|                    |d                   }t          j        |j        j        t          j        g d          k              sJ |                    |d                   }t          j        |j        j        t          j        g d          k              sJ |                    |d                                                   }t          j        |j        j        t          j        g d          k              sJ ;d S )NFTmaskedar            r   br   r      r         r   )	r   copygroup_bynpallgroupsindicesarrayas_array)T1r   t1t1at1ags        r   test_column_group_byr2      s&    N NBv&&&gllnn ||BsG$$vdk)RXlll-C-CCDDDDD ||BxL))vdk)RX6K6K6K-L-LLMMMMM ||BxL113344vdk)RX6K6K6K-L-LLMMMMMMN Nr   c           	         dD ]}t          | |          }|                    d          }t          j        |j        j        t          j        g d          k              sJ t          |j                  dk    sJ t          |d         j                  dk    sJ |                                g dk    sJ |j	        d         d	k    sJ |d
         j	        d         d	k    sJ |d
         j
        dk    sJ |                    |d                   }|                                |                                k    sJ ddgdfD ]k}|                    |          }t          j        |j        j        t          j        g d          k              sJ |                                g dk    sJ l|                    |d                   }|                                |                                k    sJ |                    |d                                                   }|                                |                                k    sJ |                    t          j        g d                    }t          j        |j        j        t          j        g d          k              sJ |                                g dk    sJ dS )zl
    Test basic table group_by functionality for possible key types and for
    masked/unmasked tables.
    r   r   r   r   z<TableGroups indices=[0 1 4 8]>z <ColumnGroups indices=[0 1 4 8]>) a   b   c   d   q                  m --- --- --- --- ---  0   a 0.0   4 4.0  1   b 3.0   5 5.0  1   a 2.0   6 6.0  1   a 1.0   7 7.0  2   c 7.0   0 0.0  2   b 5.0   1 1.0  2   b 6.0   2 2.0  2   a 4.0   3 3.0tar   ccolumn cr!   r    r"   )r4   r5   r6   r7   r9   r:   r8   r>   r<   r=   r;   )r   r   r   r      r   r   r   )r   r   r%   r   )r4   r5   r6   r;   r=   r9   r:   r<   r>   r8   r7   N)r   r'   r(   r)   r*   r+   r,   strpformatmetadescriptionr-   )r.   r   r/   tgtg2keyss         r   test_table_group_byrJ   #   s   
   H
 H
Bv&&&[[vbi'28LLL+A+AABBBBB29~~!BBBBB2c7>""&HHHHH zz||  
  
  
 
 
 
 
 wt}!!!!#w|C A%%%%#w"j0000 kk"S'""zz||s{{}},,,, 3Z, 	 	DT""B6")+rx8M8M8M/N/NNOOOOO::<< $ $ $      kk"X,''zz||s{{}},,,, kk"X,//1122zz||s{{}},,,, [[":":":;;<<vbi'28LLL+A+AABBBBBzz||  
  
  
 
 
 
 
 
yH
 H
r   c                 x   |                      d          }|j        j        }|j        j        dk    sJ t          j        |d         t          j        g d          k              sJ |                      ddg          }|j        j        }|j        j        dk    sJ t          j        |d         t          j        g d          k              sJ t          j        |d         t          j        g d          k              sJ |                      | d                   }|j        j        }|j        j        J d S )Nr   r   r   r   rB   r!   r    )r   r   r   rB   rB   rB   )r   r   r!   r   r!   r@   )r'   r*   rI   dtypenamesr(   r)   r,   )r.   rG   rI   s      r   test_groups_keysrP   s   s*   	S		B9>D:v%%%%6$s)rx			22233333	c3Z	 	 B9>D:z))))6$s)rx(:(:(:;;;<<<<<6$s)rx(F(F(FGGGHHHHH 
RW		B9>D:#####r   c                 2   |                      d          }t          |j                  D ]l\  }}|                                |j        |                                         k    sJ |d         d         |d         |j        j        |                  k    sJ md S )Nr   r   )r'   	enumerater*   rD   r+   )r.   rG   iigroups       r   test_groups_iteratorrU      s    	S		Bry)) ? ?	E}}")B-"7"7"9"99999Sz!}3	(9"(= >>>>>>? ?r   c                    dD ]h}t          | |          }|                    d          }|                                }t          j        |j        j        |j        j        k              sJ t          j        |j        j        |j        j        k              sJ |d                                         }t          j        |j        j        |d         j        j        k              sJ |d                                         }|                    |d                   }|                                }t          j        |j        j        t          j        g d          k              sJ jdS )zH
    Test that copying a table or column copies the groups properly
    r   r   r   r   N)	r   r'   r&   r(   r)   r*   r+   rI   r,   )	r.   r   r/   rG   tgctacc1gc1gc1cs	            r   test_grouped_copyr\      s7      E EBv&&&[[ggiivcj(BI,==>>>>>vcjo788888gllnnvcj(BsGN,BBCCCCCW\\^^kk"S'""xxzzvdk)RXlll-C-CCDDDDDDE Er   c           
         dD ]}t          | |          }|                    d          }|dd         }t          j        |j        j        t          j        dt          |          g          k              sJ |j        j        J dS )z=
    Test that slicing a table removes previous grouping
    r   r   r   r#   r$   r   N)	r   r'   r(   r)   r*   r+   r,   lenrI   )r.   r   r/   rG   rH   s        r   test_grouped_slicingr_      s    
   ' 'Bv&&& [[1gvcj(BHaS],C,CCDDDDDz&&&&' 'r   c                 L   | d                              t          j        | d                             }t          j        |j        j        t          j        g d          k              sJ t          j        |j        j        t          j        g d          k              sJ dS )z0
    Group a column that is part of a table
    r@   r   rM   r   N)r'   r(   r,   r)   r*   rI   r+   )r.   cgs     r   test_group_column_from_tablerb      s     
C		"(2c7++	,	,B6").BHYYY$7$77888886")#rx'='==>>>>>>>r   c                 V   dD ]$}t          | |                              d          }|j        t          j        g d                   }t          |j                  dk    sJ |j        d                                         |j        d                                         k    sJ |j        d                                         |j        d                                         k    sJ t          j        |j        j        d         t          j        ddg          k              sJ &dS )	z<
    Use boolean mask as item in __getitem__ for groups
    r   r   r   )TFTrB   r   r   N	r	   r'   r*   r(   r,   r^   rD   r)   rI   r.   r   r/   t2s       r   test_table_groups_mask_indexrg      s      ? ?2f%%%..s33Yrx 3 3 344529~~""""y|##%%1)=)=)?)?????y|##%%1)=)=)?)?????vbinS)RXq!f-=-==>>>>>>? ?r   c                 V   dD ]$}t          | |                              d          }|j        t          j        ddg                   }t          |j                  dk    sJ |j        d                                         |j        d                                         k    sJ |j        d                                         |j        d                                         k    sJ t          j        |j        j        d         t          j        ddg          k              sJ &dS )z;
    Use numpy array as item in __getitem__ for groups
    r   r   r   r   rB   r   Nrd   re   s       r   test_table_groups_array_indexri      s      ? ?2f%%%..s33YrxA''(29~~""""y|##%%1)=)=)?)?????y|##%%1)=)=)?)?????vbinS)RXq!f-=-==>>>>>>? ?r   c                 Z   dD ]}t          | |                              d          }|j        dd         }t          |j                  dk    sJ |j        d                                         |j        d                                         k    sJ |j        d                                         |j        d                                         k    sJ t          j        |j        j        d         t          j        ddg          k              sJ |j        dd         }t          |j                  dk    sJ |j        d                                         |j        d                                         k    sJ t          j        |j        j        d         t          j        dg          k              sJ |j        ddd         }t          |j                  dk    sJ |j        d                                         |j        d                                         k    sJ |j        d                                         |j        d                                         k    sJ t          j        |j        j        d         t          j        ddg          k              sJ dS )	z.
    Test that slicing table groups works
    r   r   r   r   rB   r   r#   N)	r	   r'   r*   r^   rD   r(   r)   rI   r,   re   s       r   test_table_groups_slicingrk      s\   
   ? ?2f%%%..s33 Yqs^29~~""""y|##%%1)=)=)?)?????y|##%%1)=)=)?)?????vbinS)RXq!f-=-==>>>>> Yqs^29~~""""y|##%%1)=)=)?)?????vbinS)RXqc]]:;;;;; Yq1u29~~""""y|##%%1)=)=)?)?????y|##%%1)=)=)?)?????vbinS)RXq!f-=-==>>>>>>+? ?r   c                    dD ]q}t          | |          }|                    d          }|d         }t          j        |j        j        |j        j        k              sJ t          j        |j        j        |j        j        k              sJ |j                            t          j                  }|	                                g dk    sJ |d         }t          j        |j        j        |j        j        k              sJ t          j        |j        j        |j        j        k              sJ |j                            t          j                  }|	                                g dk    sJ sdS )	z5
    Test that column slicing preserves grouping
    r   r   r   r   r@   d a   c    d --- ---- ---  0  0.0   4z  1  6.0  18  2 22.0   6)r@   rn   )z c    d z---- ---z 0.0   4z 6.0  18z22.0   6N)
r	   r'   r(   r)   r*   rI   r+   	aggregatesumrD   )r.   r   r/   rG   tgstgsas         r   test_grouped_item_accessrx      sv      
 
2f%%% [[vcjo788888vcj(BI,==>>>>>z##BF++||~~ "
 "
 "
 
 
 
 
 lvcjo788888vcj(BI,==>>>>>z##BF++||~~ "
 "
 "
 
 
 
 
 
+
 
r   c                    dD ]}t          | |          }|                    d          }|                    dddddt          j        z  f           t          j        |j        j        t          j	        dt          |          g          k              sJ |j        j        J |                    d          }|                    d           t          j        |j        j        t          j	        dt          |          g          k              sJ |j        j        J |                    d          }|j        j                                        }|                    t          dt          j        t          |                    	                     t          j        |j        j        |k              sJ t          j        |d         j        j        |k              sJ t          j        |d         j        j        |j        j        k              sJ |                    d          }|                    d
           t          j        |j        j        |k              sJ |j        j        j        j        dk    sJ t          j        |d         j        j        |k              sJ |                    d          }|                    d           t          j        |j        j        |k              sJ |j        j        j        j        dk    sJ t          j        |d
         j        j        |k              sJ |                    d          }|                    dd           t          j        |j        j        |k              sJ |j        j        j        j        dk    sJ t          j        |d         j        j        |k              sJ dS )z
    Operations like adding or deleting a row should removing grouping,
    but adding or removing or renaming a column should retain grouping.
    r   r   r   r         @r   Ne)namedatar!   rL   aa)r   r'   add_rowumr(   r)   r*   r+   r,   r^   rI   
remove_rowr&   
add_columnr   arangeremove_columnrN   rO   rename_column)r.   r   r/   rG   r+   s        r   test_mutable_operationsr     sn   
   +: +:Bv&&& [[


AsCAG,---vbi'28QBL+A+AABBBBBy~%%% [[
avbi'28QBL+A+AABBBBBy~%%% [[)#((**
f#BIc"gg,>,>???@@@vbi'7233333vbgn,788888vbgn)RY^;<<<<< [[
vbi'7233333y~#)V3333vbgn,788888 [[
vbi'7233333y~#)V3333vbgn,788888 [[
d###vbi'7233333y~#)V3333vbho-8999999W+: +:r   c                     t          | d          }d|d         j        d<   d|d         j        d<   |                    d                                          g dk    sJ d S )	NTr   r@   r   rn   r$   r   )r4   r5   r6   z  0   a  --   4 4.0z  1   b 3.0  -- 5.0r9   r:   r;   r<   r=   r>   )r   maskr'   rD   )r.   t1ms     r   test_group_by_maskedr   F  s|    
D
!
!
!CCHM!CHM!<<$$&& + + +      r   c                 2   t          j        t                    5  |                     d           ddd           n# 1 swxY w Y   t          j        t                    5  |                     ddg           ddd           n# 1 swxY w Y   t          j        t                    5  |                     t	          j        ddg                     ddd           n# 1 swxY w Y   t          j        t                    5  |                     d           ddd           n# 1 swxY w Y   t          | d          }d|d         j        d	<   t          j        t                    5  |                    d           ddd           dS # 1 swxY w Y   dS )
z(
    Appropriate errors get raised.
    fNgr   rB   Tr   r   r   )	pytestraises
ValueErrorr'   r(   r,   	TypeErrorr   r   )r.   r/   s     r   test_group_by_errorsr   Y  s   
 
z	"	"  
C               
z	"	"    
S#J                              
z	"	" & &
BHaV$$%%%& & & & & & & & & & & & & & & 
y	!	!  
D               
4	 	 	 BBsGLO	z	"	"  
C                 sW   <A A  BBB(*CC"%C"D$$D(+D()FFFc                    |                      d          }|j        j        j        d         du sJ |d         j        j        j        d         du sJ |j        d         j        j        j        d         du sJ |d         j        t	          j        g d                   j        j        j        d         du sJ |                      | d                   }|j        j        j        d         d	u sJ |d         j        j        j        d         d	u sJ |j        d         j        j        j        d         d	u sJ |                      | d                                                   }t          |j        j        d
          rJ t          |d         j        j        d
          rJ |                      | d                   }d|j        j        j        vsJ d|d         j        j        j        vsJ dS )zF
    Make sure the keys meta['grouped_by_table_cols'] is working.
    r   grouped_by_table_colsTr@   r   rn   )FTTr    FrE   N)r'   r*   rI   rE   r(   r,   r-   hasattr)r.   rG   s     r   test_groups_keys_metar   t  s   
 
S		B9>674????c7>#$;<DDDD9Q<#()@ATIIII
3	,,,--	/	T1	3 	 	 	 	 
R\	"	"B9>675@@@@c7>#$;<EEEE9Q<#()@AUJJJJ 
R\**,,	-	-Bry~v.....r#w~*F33333 
RW		B"").*=====""S'.*=*BBBBBBBr   c                 `   | d         }|                     d          }|j                            t          j                  }|                                g dk    sJ t          j        |j        j        t          j        ddg          k              sJ |j        j	        J |j
        d         dk    sJ |d	         j
        d         dk    sJ |d	         j        d
k    sJ t          | d          }d|d	         j        dd<   d|d         j        dd<   |                     d          }t          j        t           d          5  |j                            t          j                  }ddd           n# 1 swxY w Y   |                                g dk    sJ t          |d          }d|d	         j        d<   d|d         j        d<   |                     d          }|j                            t          j                  }|                                g dk    sJ |                      d          }t          j        t"          d          5  |j                            t          j                  }ddd           n# 1 swxY w Y   |                                g dk    sJ dS )z
    Aggregate a table
    rm   r   ro   r   r#   Nr?   r   r@   rA   Tr   r      rn   z"converting a masked element to nanmatch)z a   c    d    q  z               m  z--- ---- ---- ----z  0  nan  nan  4.0z  1  3.0 13.0 18.0z  2 22.0  6.0  6.0r$   )rp   rq   rr   z  1  3.0  13rs   Cannot aggregate column)z a   c    d   q  z              m  z--- ---- --- ----z  0  0.0   4  4.0z  1  6.0  18 18.0z  2 22.0   6  6.0)r'   r*   rt   r(   ru   rD   r)   r+   r,   rI   rE   rF   r   r   r   warnsUserWarningr   )r.   r/   rG   tgar   s        r   test_table_aggregater     sH   
 
M	B	S		B
)

bf
%
%C;;==        6#*$!Q(8(8899999:?""" 8D>Qs8=""""s8:----
 D
!
!
!CCHM!A#CHM!A#	c		B	k)M	N	N	N * *i!!"&))* * * * * * * * * * * * * * * ;;==        D
!
!
!CCHM!CHM!	c		B
)

bf
%
%C;;==        
S		B	(0I	J	J	J * *i!!"&))* * * * * * * * * * * * * * *;;==         s$   %E99E= E=%JJJc                    d }d }d }| d         }|                     d          }|j                            t          j                  }|j                            t          j                  }|j                            |          }t          j        ||k              sJ t          j        ||k              sJ |                                g dk    sJ |j                            t          j                  }|j                            |          }t          j        ||k              sJ |                                g dk    sJ | d         }	|	                     d          }t          j
        t          d	
          5  |j                            |          }
ddd           n# 1 swxY w Y   |
                                g dk    sJ dS )zE
    Aggregate table with functions which have a reduceat method
    c                 *    t          j        |           S r   )r(   meanxs    r   np_meanz.test_table_aggregate_reduceat.<locals>.np_mean  s    wqzzr   c                 *    t          j        |           S r   )r(   ru   r   s    r   np_sumz-test_table_aggregate_reduceat.<locals>.np_sum      vayyr   c                 *    t          j        |           S r   )r(   addr   s    r   np_addz-test_table_aggregate_reduceat.<locals>.np_add  r   r   rm   r   ro   ) a   c   d --- --- ---z  0 0.0 4.0z  1 2.0 6.0z  2 5.5 1.5)r   r@   r   r   N) a ---z  0z  1z  2)r'   r*   rt   r(   ru   r   r)   rD   r   r   r   r   )r.   r   r   r   r/   rG   tga_rtga_atga_nrf   r   s              r   test_table_aggregate_reduceatr     s*          
M	B	S		BI''EI''EI''E6%5.!!!!!6%5.!!!!!==??        I((EI((E6%5.!!!!!==??        
HB	S		B	(0I	J	J	J * *i!!&))* * * * * * * * * * * * * * *;;==?????????s   F,,F03F0c                     dD ]l}t          | |                              d          }|d         j                            t          j                  }|                                g dk    sJ mdS )z)
    Aggregate a single table column
    r   r   r   r@   )z c  z----z 0.0z 6.0z22.0N)r   r'   r*   rt   r(   ru   rD   )r.   r   rG   r   s       r   test_column_aggregater     s       I IBv&&&//44gn&&rv..{{}} H H HHHHHHI Ir   z+https://github.com/numpy/numpy/issues/20699)reasonc                     dD ]} t          dt          j        dd          i|                               d          }|d         j                            t          j                  }|                                g dk    sJ dS )	z/https://github.com/astropy/astropy/issues/12706r   r   rB   z>f8rN   r   )r   r   0.01.0N)r	   r(   r   r'   r*   rt   ru   rD   )r   rG   r   s      r   test_column_aggregate_f8r     s       = =C1E2223FCCCLLSQQgn&&rv..{{}} < < <<<<<<= =r   c                  6   d } t          j        g dd          }|                    d          }|j                            |           }|j        d                                         g dk    sJ |j        d                                         g d	k    sJ d
S ) 
    Table groups filtering
    c                 H     t           fd j        D                       S )Nc              3   \   K   | ]&}|vt          j        |         d k              V  'dS )r   N)r(   r)   ).0colnamekey_colnamestables     r   	<genexpr>z:test_table_filter.<locals>.all_positive.<locals>.<genexpr>1  sM       
 
l** F5>Q&''****
 
r   )r)   colnames)r   r   s   ``r   all_positivez'test_table_filter.<locals>.all_positive0  sC     
 
 
 
 
 >
 
 
 
 
 	
r   
z a c dz	 -2 7.0 0z	 -2 5.0 1z 0 0.0 4z 1 3.0 5z	 1 2.0 -6z 1 1.0 7z 3 3.0 5z	 3 -2.0 6z 3 1.0 7asciiformatr   r   )r   r   z -2 7.0   0z -2 5.0   1r   )r   r   z  0 0.0   4N)r	   readr'   r*   filterrD   )r   trG   rf   s       r   test_table_filterr   +  s    

 
 
 	
	
 	
 	
 	 	 	A 
CB			,	'	'B9Q<!! & & &     9Q<!!%R%R%RRRRRRRr   c                     d } t          j        g dd          }|                    d          }|d         j                            |           }t          |j                  dk    sJ |j        d                                         g d	k    sJ |j        d
                                         g dk    sJ |j        d                                         g dk    sJ dS )r   c                 :    t          j        | dk               rdS dS )Nr   FT)r(   any)columns    r   r   z(test_column_filter.<locals>.all_positiveW  s"    6&1* 	5tr   r   r   r   r   r@   r#   r   ) c r   z7.0z5.0r   )r   r   r   rB   )r   r   z3.0z2.0r   N)r	   r   r'   r*   r   r^   rD   )r   r   rG   c2s       r   test_column_filterr   R  s   
   	
	
 	
 	
 	 	 	A 
CB	C		|	,	,Bry>>Q9Q<!!%A%A%AAAAA9Q<!!%:%:%:::::9Q<!!%H%H%HHHHHHHr   c                  r   t          j        d          } t          j        g d          }|t          j        z  }t          j        |t          j        z            }t          j        |t          j        z            }t          j
        dd          t          j        |dz  d          z   }t          j        ||          }t          j        |          }t          j        g d	d
                              t                     }t#          | ||||||||g	g d          }	g d}
|
D ]}|	                    |          }t          j        |d         g dk              sJ dD ]}t          j        |	|         ddg         |j        d         |         k              sJ t          j        |	|         dg         |j        d         |         k              sJ t          j        |	|         dg         |j        d         |         k              sJ t+          |	|
          }t-          |          dk    sJ t          j        |d         g dk              sJ t          j        |d         g dk              sJ |	d                             |	|
                   }t          j        |g dk              sJ dS )z2
    Test grouping a table with mixin columns
    r   )rz         ?       @r   i  jyearr   g|=sec)radec))r#   r@   r   r   )rB   r!   r   z<i4,|S1r   )	idxr   qlonlattmscawndrO   )r   r   r   r   r   r   r   r   r   )r   r#   rB   r   )r   r   r   r   r   r   r   r   r#   r   rB   )rI   )r   rB   r   r   )r   r   rz   N)r(   r   r,   r   r   r   	LongitudedegLatituder   Time	TimeDeltaSkyCoordr
   ArrayWrapperviewr   r   r'   r)   r*   r   r^   )r   r   r   r   r   r   r   r   r   qt
mixin_keyskeyqtgr|   uqtidxgs                   r   test_group_mixinsr   t  s   
 )A,,C
%%%&&A	ACA

AE	
*
*C

q15y
)
)C	4	(	(	(4>!e)E+R+R+R	RB		#	.	.	.B		#A	&	&B	:::)	L	L	L	Q	Q
 
B 
	aCb"b"-EEE
 
 
B BAAJ @ @kk# vc%jLLL011111 ? 	@ 	@D6"T(Aq6*cjmD.AABBBBB6"T(A3-3:a=+>>?????6"T(A3-3:a=+>>??????	@ *
%
%
%Cs88q====6#e*			)*****6#c(ooo-..... e9bn--D6$,,,&'''''''r   colr   rB   r   r   cxcsecr#   r   zdeg,deg)unitc                    t          ddgddg| gg d          }|                    d          }t          j        t          d          5  |j                            t          j                   d	d	d	           d	S # 1 swxY w Y   d	S )
z@Test that aggregating unsupported mixins produces a warning onlyr   r#   r   )r   r!   mixr   r   zCannot aggregate column 'mix'r   N)	r	   r'   r   r   r   r*   rt   r(   ru   )r   r   rG   s      r   test_group_mixins_unsupportedr     s     	1v1vs#+<+<+<===A	
CB	(0O	P	P	P $ $
	BF###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   %A==BB	add_indexFTc                    t           j                            ddd          }t          j        t	          |                    }t          ||gddg          }| r|                    d           |                    d          }|j        D ]:}t          j	        |d         t          j
        |d                   k              sJ ;dS )aY  Test that group_by preserves the order of the table.

    This table has 5 groups with an average of 200 rows per group, so it is not
    statistically possible that the groups will be in order by chance.

    This tests explicitly the case where grouping is done via the index sort.
    See: https://github.com/astropy/astropy/issues/14882
    r   r$   i  r   r!   r   N)r(   randomrandintr   r^   r	   r   r'   r*   r)   sort)r   r   r!   r   rG   grps         r   test_group_stable_sortr    s     		!Q%%A
	#a&&Aq!fS#J'''A 	C	
CBy 5 5vc#h"'#c("3"334444445 5r   )3numpyr(   r   astropyr   r   r   r   astropy.tabler   r   r   r	   r
   r   astropy.utils.compatr   r   astropy.utils.exceptionsr   r   r2   rJ   rP   rU   r\   r_   rb   rg   ri   rk   rx   r   r   r   r   r   r   r   markskipifr   r   r   r   parametrizer   r   r   r   r   r   r   <module>r     s        % % % % % % % %       T T T T T T T T T T T T T T T T ? ? ? ? ? ? ? ? 7 7 7 7 7 7* * *N N N$M
 M
 M
`$ $ $$? ? ?E E E(' ' '? ? ?? ? ?? ? ?? ? ?:
 
 
D0: 0: 0:f  &  6C C CBG G GT2@ 2@ 2@jI I I )/8   = =	 =$S $S $SNI I ID/( /( /(d 	1ve,,,	1a&***aVaV)<<< $ $ $ udm445 5 545 5 5r   