
    `i                         d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ  e j                    Z	dxa
xaad Z ej                    d             Zd Zd Zd	 ZdS )
    N)_util)_accelerator)Handlec                      t           d S 	 dd l a t          t           d          rddlma ddl ma d S ddl ma t          ad S # t
          $ r Y d S w xY w)Nr   bindings)cutensornet)	tensornet)	cuquantumhasattrcuquantum.bindingsr   r	   ImportError     l/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/cupy/linalg/_einsum_cutn.py_maybe_lazy_load_cutensornetr      s     9j)) 	$666666++++++++ .-----#III   s   %A A 
AAc                      d t           j                            d          D             } | d         dk    s| d         dk    r| d         dk    rdS dS )	Nc                 ,    g | ]}t          |          S r   )int.0is     r   
<listcomp>z-_is_cuqnt_22_11_or_higher.<locals>.<listcomp>&   s    
<
<
<a3q66
<
<
<r   .r            TF)r
   __version__split)vers    r   _is_cuqnt_22_11_or_higherr    $   sU    
<
<9066s;;
<
<
<CAQ2#a&B,,t5r   c                      t                      S )N)r    r   r   r   _is_nonblocking_supportedr"   ,   s    $&&&r   c                 :   t          |           dk    rt          d          t          | d         t                    r#| d         }t	          | dd                   }||fS t	          |           } g }g }d}t          |           dk    rc|                    |                     d                     |                    |                     d                     t          |           dk    ct          |           dk    r|                     d          }| rJ |||fS )znParse & retrieve einsum operands, assuming ``args`` is in either
    "subscript" or "interleaved" format.
    r   zmust specify the einstein sum subscripts string and at least one operand, or at least one operand and its corresponding subscripts listr   N   )len
ValueError
isinstancestrlistappendpop)argsexproperandsinputsoutputs        r   _get_einsum_operandsr1   0   s   
 4yyA~~  	
 $q'3 (AwQRR>>X~Dzz$ii1nnOODHHQKK(((MM$((1++&&& $ii1nn t99>>XXa[[Fxx''r   c                     t           j        j        j        rd S t          j        t	          j                    vrd S t                       t          t          j
        dd           d S |                    dd           }|                    dd          }|du rd}t          |           } d	 | d
         D             }t          |          d
k    rd S t          d |D                       st          d |D                       rd S |t          j        | n|t           j        t           j        t           j        t           j        fvrd S fd|D             }t           j        j                                        }t+          t,          d          si x}t,          _        nt,          j        }|                    |          }|7t                                          }t3          |t          j                  ||<   n|j        }||d}t9                      rd|d<   d}	|du r)d t;          t          |          d
d          D             }nxt          |          r|d         dk    r|d
d          }nRt          |          dk    r5t=          |d
         t>          t@          f          rd}	|d         dk    rd}	d }n
|dk    rd}	d }|	rt          j
        dd           |rd|ind }
t          |           dk    rtC          j"        | d         g|R ||
d}nkt          |           dk    rVd tG          || d                   D             }| d         |$                    | d                    tC          j"        |||
d}nJ |S )Nzusing the cuTensorNet backend was requested but it cannot be imported -- maybe you forgot to install cuQuantum Python? Please do "pip install cuquantum-python" or "conda install -c conda-forge cuquantum-python" and retryr$   )
stackleveldtypeoptimizeFTgreedyc                 6    g | ]}t          j        |          S r   )cupyasarrayr   ops     r   r   z(_try_use_cutensornet.<locals>.<listcomp>j   s"    333RR  333r   r   c              3   ,   K   | ]}|j         d k    V  dS r   N)sizer:   s     r   	<genexpr>z'_try_use_cutensornet.<locals>.<genexpr>r   s(      ,,RBGqL,,,,,,r   c              3   F   K   | ]}t          |j                  d k    V  dS r=   )r%   shaper:   s     r   r?   z'_try_use_cutensornet.<locals>.<genexpr>s   s/      66rBH"666666r   c                 >    g | ]}|                     d           S )F)copy)astype)r   r;   result_dtypes     r   r   z(_try_use_cutensornet.<locals>.<listcomp>|   s)    GGG		,U	33GGGr   cutn_handle_cache)	device_idhandleautoblockingc                 "    g | ]}|d z
  |dz
  fS )r   r$   r   r   s     r   r   z(_try_use_cutensornet.<locals>.<listcomp>   s$    @@@q1ac
@@@r   r   einsum_pathr   zthe cuTensorNet backend ignores the "optimize" option except when an explicit contraction path is provided or when optimize=False (disable optimization); also, the maximum intermediate size, if set, is ignoredpath)optionsr5      c                     g | ]	}|D ]}|
S r   r   )r   pairr   s      r   r   z(_try_use_cutensornet.<locals>.<listcomp>   s%    EEEEE1!EEEEr   )%r8   cudaruntimeis_hipr   ACCELERATOR_CUTENSORNETget_routine_acceleratorsr   r   warningswarngetr1   r%   anyresult_typefloat32float64	complex64
complex128	getDevicer   _tlsrF   creater   destroyrH   r"   ranger'   r   floatr	   contractzipr*   )r,   kwargsr4   rN   r.   devicerF   rH   cutn_optionsraise_warningcutn_optimizeroutr/   rE   s                @r   _try_use_cutensornetro   M   s   y t,133	4 	4t """9 	 	 	 	 t JJw%%E::j%((Dt||
  %%D3347333H
8}} t,,8,,,,, 66X66666 t 38-4#X..ULL$,I I ItGGGGhGGGH Y((**F4,-- 3577D22 2""6**F~##%%$*6;3F$G$G&!!!'6::L "" *#)Z  Mu}} A@E#h--B$?$?@@@	T tAw-//ABBx	Tad1gU|,, 	! M7m## M=   M @ 	 	 	 	 (,5fd^^N
4yyA~~ GOO O(4~O O O	TaEEHd1g 6 6EEE7MM$q'""" \ND D D 	uJr   )	threadingrX   r8   r   
cupy._corer   cupy.cuda.devicer   localrb   r
   r   r	   r   memoizer    r"   r1   ro   r   r   r   <module>ru      s                # # # # # # # # # # # # y&* *	 *K)  *   ' ' '( ( (:n n n n nr   