o
    i                     @   s   d dl Z d dlm  mZ d dlZddlmZ d dlm	Z	 dd Z
dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    N   )_unraveluse_name_ofc                  G   s   t | dkr
| d S t| S )Nr   r   )lentuple)args r	   _/home/ubuntu/.local/lib/python3.10/site-packages/einx/_src/adapter/elementary_from_classical.pyid   s   r   c                       t   fdd}|S )Nc                    s    | S Nr	   )tensoropr	   r
   reduce   s   zreduce.<locals>.reducer   )r   r   r	   r   r
   r         r   c                    r   )Nc                    s    | fi |S r   r	   )r   kwargsr   r	   r
   preserve_shape   s   z&preserve_shape.<locals>.preserve_shaper   )r   r   r	   r   r
   r      r   r   c                    r   )Nc                     s"   t dd | D rtd |  S )Nc                 s   s    | ]}|j d kV  qdS )r   N)ndim).0r   r	   r	   r
   	<genexpr>"   s    z3elementwise.<locals>.elementwise.<locals>.<genexpr>z6All tensors must be scalars for elementwise operation.)any
ValueError)tensorsr   r	   r
   elementwise    s   z elementwise.<locals>.elementwiser   )r   r   r	   r   r
   r      s   r   c                 C   s   | j S r   )dot	classicalr	   r	   r
   r   )   s   r   c                    s    fdd}|S )Nc              	      s   g }|D ]+}|j dkr|| q|j dkr,t|jd D ]}| j||dd qqtd| j t|kr;td | t|S )Nr   r   axis0Coordinate tensors must be scalars or 1D arrays.HNumber of coordinates must match the number of dimensions of the tensor.r   appendrangeshapeget_atr   r   r   )r   coordinatescoords2coordir   r	   r
   r'   .   s   

zget_at.<locals>.get_atr	   )r   r'   r	   r   r
   r'   -   s   r'   c                       t  fdd}|S )Nc               	      s   | d }| dd }| d }g }|D ]+}|j dkr|| q|j dkr:t|jd D ]}| j||dd q+qtd|j t|krItd|t||S )Nr   r   r   r!   r"   r#   )r   r   r(   updatesr)   r*   r+   r   r   r	   r
   	update_at@   s   

zupdate_at.<locals>.update_atr   )r   r   r0   r	   r/   r
   r0   ?   s   r0   c                    r,   )Nc                    s>     | t| jf}| jdkrtdt || jddS )Nr   z>Tensor must have at least one dimension for argfind operation.r   )reshapenpprodr&   r   r   r   )r   idxr/   r	   r
   argfindX   s   
zargfind.<locals>.argfindr   )r   r   r5   r	   r/   r
   r5   W   s   r5   c                    s    fddt jjD  fddt jjD B  fddt jjD B  fddt jjD B  fddt jjD B t t t	dB S )Nc                       i | ]
}|t t |qS r	   )r   getattrr   namer   r	   r
   
<dictcomp>e       zops.<locals>.<dictcomp>c                    r6   r	   )r   r7   r8   r   r	   r
   r:   f   r;   c                    r6   r	   )r   r7   r8   r   r	   r
   r:   g   r;   c                       i | ]}|t t | qS r	   )r5   r7   r8   r   r	   r
   r:   h       c                    r<   r	   )r0   r7   r8   r   r	   r
   r:   i   r=   )r'   r   r   )
adapteropsr   r   r   r5   r0   r'   r   r   r   r	   r   r
   r?   c   s   r?   )	functoolseinx._src.adapter_srcr>   numpyr2   _utilr   einx._src.util.functoolsr   r   r   r   r   r   r'   r0   r5   r?   r	   r	   r	   r
   <module>   s    
