o
    ٷi(                     @   s   d dl Z d dl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 ej Zdd ZdefddZdefd	d
ZG dd dZd%ddZe jG dd dZeddeddeddeddeddeddgZdd  Zd!d" Zd#d$ ZdS )&    N)EinopsErrorasnumpypackunpack)collect_test_backendsc                 C   s^   t | |\}}t| ||}t|t| ksJ t|| D ]\}}tt|t|s,J qd S N)r   r   lenzipnpallcloser   )xspatternxpsunpackedab r   M/home/ubuntu/.local/lib/python3.10/site-packages/einops/tests/test_packing.pypack_unpack   s   r   r   c                 C   s8   t | ||}t||d\}}tt|t| sJ |S N)r   )r   r   r
   r   r   )r   r   r   r   packedps2r   r   r   unpack_and_pack   s   r   c                 C   s*  t  }t  }| t| ||}t||d\}}W d    n1 s!w   Y  | t| }t|||}	t|	|d\}
}W d    n1 sEw   Y  t|jt|jksVJ |jd ur]d S tt|t| siJ tt|
t| suJ t|t|	ksJ t	||	D ]\}}tt||sJ qd S r   )
CaptureExceptionr   r   r   type	exceptionr
   r   r   r	   )r   r   r   capturer_backendcapturer_numpyr   r   r   x_npunpacked_np	packed_npps3r   r   r   r   r   unpack_and_pack_against_numpy   s(   
r#   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s
   d | _ d S r   r   selfr   r   r   	__enter__8      
zCaptureException.__enter__c                 C   s
   || _ dS )NTr$   )r&   exc_typeexc_valexc_tbr   r   r   __exit__;   s   zCaptureException.__exit__N)__name__
__module____qualname__r'   r,   r   r   r   r   r   7   s    r         c           	      C   s  dd }dd }|d| |\}}}|| |d}|t j|||gddt|||gd	d
  |t j|||gddt|||gdd
  |t j|||gd
dt|||gdd
  |t j|||gddt|||gdd
  |t j|||gd
dt|||gdd
  t jd d d d d f }|t j|| || || |gddt||||gd	d
  tt t||||gd W d    n1 sw   Y  t|||gd tt t||||gd W d    n1 sw   Y  tt t||||gd W d    n	1 sw   Y  tt t||||gd W d    n	1 s&w   Y  tt t||||gd W d    n	1 sEw   Y  tt t||||gd W d    n	1 sdw   Y  t||||gd d S )Nc                  W   s
   t | S r   )rngrandom)shaper   r   r   randA   r(   z test_numpy_trivial.<locals>.randc                 S   s6   | j |j ksJ | j|jksJ t| |ksJ d S r   )dtyper4   r
   all)r   r   r   r   r   checkD   s   z!test_numpy_trivial.<locals>.check          )axiszh w *r      zh * wz* h wzh *z* wzh w nonexisting_axis *z"some_name_for_H some_name_for_w1 *zh _w *zh_ w *z1h_ w *z1 w *zh h *zh H *)r
   stackr   concatenate	index_exppytestraisesr   )	HWr5   r8   rgr   
embeddingsir   r   r   test_numpy_trivial@   sb    rI   c                   @   s8   e Zd ZU ejedf ed< eed< dd Zdd Z	dS )	UnpackTestCase.r4   r   c                 C   s   | j  dS )N*)r   splitindexr%   r   r   r   dim   s   zUnpackTestCase.dimc                 C   s   | j |   dksJ d S )N   )r4   rN   r%   r   r   r   	selfcheck   s   zUnpackTestCase.selfcheckN)
r-   r.   r/   typingTupleint__annotations__strrN   rP   r   r   r   r   rJ   {   s
   
 rJ   )rO   rK   )rO      z* seven)rV   rO   zseven *)rO   r9      z* three four)rW   rO   r9   zfour * three)r9   rW   rO   zthree four *c               	      s|  t D ]8} | j}| j}t| t dgdgdgg| tt t dgdgdgg|d  W d    n1 s:w   Y  tt t dgdgdgg| W d    n1 s[w   Y  tt t dgdgdgg| W d    n1 s|w   Y  t dgdgdgg| t dgdgdgg| t dgdgdgg| t dgdgdgg|\}}}|j| 	  dksJ tt t
 dgdgdgg| W d    n1 sw   Y  tt t
 dgdgdgg| W d    n1 sw   Y  t ddgddgddgg|}t fd	d
|D sJ t ddgddgddgg|}t fdd
|D s;J t ddgddgddgg|}t fdd
|D sXJ tt t
 ddgdgdgg| W d    n	1 svw   Y  tt t
 ddgdgddgg| W d    n	1 sw   Y  tt t
 ddgdgddgg| W d    n	1 sw   Y  tt t
 ddgddgdgg| W d    n	1 sw   Y  tt t
 ddgddgdgg| W d    n	1 sw   Y  t dgdgdgg| t dgdgdgg| t dgdgdgg| t ddgddgg| qd S )Nr;   r=   z non_existent_axisrW   r9   r   rO   c                 3   (    | ]}t |jt  jd  kV  qdS r=   Nr   r4   .0rE   r   r   r   	<genexpr>      & z.test_pack_unpack_with_numpy.<locals>.<genexpr>c                 3   rY   rZ   r[   r\   r^   r   r   r_      r`   c                 3   rY   rZ   r[   r\   r^   r   r   r_      r`   )casesr4   r   r2   r3   r   rA   rB   r   rN   r   r7   )caser4   r   _lastrsr   r^   r   test_pack_unpack_with_numpy   sf   

rf   c               
   C   s  t dddD ]} td| j  d}tD ]}t}|j}|j}t|}| 	|}||dgdgdgg| t
t t|dgdgdgg| W d    n1 sRw   Y  t
t t|dgdgdgg| W d    n1 ssw   Y  ||dgdgdgg| ||dgdgdgg| ||dgdgdgg| t
t t|dgdgdgg| W d    n1 sw   Y  t
t t|dgdgd	gg| W d    n1 sw   Y  ||ddgddgddgg| ||ddgddgddgg| ||ddgddgddgg| t
t t|ddgdgd	gg| W d    n	1 s)w   Y  t
t t|ddgdgd	dgg| W d    n	1 sMw   Y  t
t t|ddgdgd
dgg| W d    n	1 sqw   Y  t
t t|ddgd
dgdgg| W d    n	1 sw   Y  t
t t|d
dgddgdgg| W d    n	1 sw   Y  |r||dgd
gdgg| ||dgd	gdgg| ||dgdgd	gg| ||dgd	gdgg| ||ddgdd	gg| qqd S )NF)symboliclayersztest packing against numpy for Tr;   r=   rW   rX   rO   r9   r   )r   printframework_namera   r#   r4   r   r2   r3   
from_numpyrA   rB   r   r   )backendcheck_zero_lenrb   r   r4   r   r   r   r   r   test_pack_unpack_against_numpy   sh   


rn   c               
   C   s  dd l } ddlm} | jdk rt  tD ]}|j}|j}t	
|}| |}dgdgdggdgdgdggdgdgddggddgg ddggfD ]F}t|||}||||}	t||	D ]\}
}t|
||d smJ q\t||\}}||	|\}}||ksJ t|||sJ qHddggdgd	ggdgd	gdggdgddggdgd	gddggfD ]}tt t||| W d    n1 sw   Y  qqd S )
Nr   )	array_apiz2.0.0r;   r=   rX   r9   )r=   r=   r=   rO   )numpyeinopsro   __version__rA   skipra   r4   r   r2   r3   from_dlpackr   r	   r
   r   r   r   rB   r   )xpAArb   r4   r   r   x_xpr   
x_np_split
x_xp_splitr   r   x_agg_npps1x_agg_xpr   r   r   r   test_pack_unpack_array_api  sD   



r}   )r0   r1   )dataclassesrQ   rp   r
   rA   rq   r   r   r   r   einops.testsr   r3   default_rngr2   r   rU   r   r#   r   rI   	dataclassrJ   ra   rf   rn   r}   r   r   r   r   <module>   s0    

	;?@