
    ,Vh                     v    d Z ddlmZ ddlmZ ddlmZ g dZdada	dZ
d Zd	 Zd
 ZddZed        Zd Zd Zy)zLRequired functions for optimized contractions of numpy arrays using pytorch.    )has_array_interface)convert_to_valid_einsum_chars)to_backend_cache_wrap)	transposeeinsum	tensordotto_torchbuild_expressionevaluate_constantsN4abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZc                  ~    t         2dd l} | j                  j                         rdnd}| |fa t	        | d      at         S )Nr   cudacpur   )_TORCH_DEVICEtorchr   is_availablehasattr_TORCH_HAS_TENSORDOT)r   devices     I/home/dcms/DCMS/lib/python3.12/site-packages/opt_einsum/backends/torch.py_get_torch_and_devicer      s?      ::224%v&uk:    c                       | j                   | S )z5Normal torch transpose is only valid for 2D matrices.)permute)aaxess     r   r   r   $   s    199dr   c                 V    t        |       } t               \  }}|j                  | |      S )z4Variadic version of torch.einsum to match numpy api.)r   r   r   )equationoperandskwargsr   _s        r   r   r   )   s+     -X6H$&HE1<<(++r   c                 "   t               \  }}t        r|j                  | ||      S | j                         }|j                         }t	        |t
              rt        ||z
  |      t        |      f}t	        |d   t
              r|d   f|d   f}t	        |d   t
              r|d   |d   ff}dg|z  }dg|z  }g }	t        t              }
t        | D ]  \  }}t        |
      }|||<   |||<    t        |      D ])  }||   	t        |
      }|||<   |	j                  |       + t        |      D ])  }||   	t        |
      }|||<   |	j                  |       +  dj                  t        dj                  |||	f       }t        || |      S )z1Simple translation of tensordot syntax to einsum.)dimsr      Nz	{},{}->{} )r   r   r   
ndimension
isinstanceintrangeiter_torch_symbols_basezipnextappendformatmapjoinr   )xyr   r   r!   xndyndx_ixy_ixout_ixavailable_ixax1ax2repeatileave
einsum_strs                    r   r   r   3   s   $&HE1q!$//
,,.C
,,.C $S4Z%uT{2 $q'3Qz47"$q'3Awa
" 6C<D6C<DF +,LJ Sl#S	S	 3Z !7?&EDGMM% 	!
 3Z !7?&EDGMM% 	! $##S4v2F%GHJ*a##r   c                 v    t               \  }}t        |       r |j                  |       j                  |      S | S )N)r   r   
from_numpyto)arrayr   r   s      r   r	   r	   d   s7    )+ME65!&))&11Lr   c                     fd}|S )z8Build a torch function based on ``arrays`` and ``expr``.c                      | D cg c]  }t        |       }}j                  |d      }|j                  j                  dk(  r|j	                         S |j                         j	                         S c c}w )Nr   )backendr   )r	   	_contractr   typenumpyr   )arraysr2   torch_arrays	torch_outexprs       r   torch_contractz(build_expression.<locals>.torch_contractq   sg    -3444NN<NA	  E)??$$}}$$&& 5s   A4 )r!   rM   rN   s    ` r   r
   r
   n   s    ' r   c                 N    | D cg c]  }t        |       } } || dddS c c}w )z]Convert constant arguments to torch, and perform any possible constant
    contractions.
    r   T)rF   r   )r	   )const_arraysrM   r2   s      r   r   r   }   s/     *66AHQK6L6w4HH 7s   ")   )__doc__opt_einsum.helpersr   opt_einsum.parserr   opt_einsum.sharingr   __all__r   r   r+   r   r   r   r   r	   r
   r   rO   r   r   <module>rX      s_    R 2 ; 4  L 
,.$b  Ir   