o
    0 i                     @   s   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  Z	d a
 aadd Ze dd Zd	d
 Zdd Zdd ZdS )    N)_util)_accelerator)Handlec                   C   sh   t d urd S z#dd l a tt drddlma ddl ma W d S ddl ma taW d S  ty3   Y d S w )Nr   Zbindings)cutensornet)	tensornet)	cuquantumhasattrZcuquantum.bindingsr   r   ImportError r
   r
   d/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/cupy/linalg/_einsum_cutn.py_maybe_lazy_load_cutensornet   s   

r   c                  C   sB   dd t jdD } | d dks| d dkr| d dkrdS d	S )
Nc                 S   s   g | ]}t |qS r
   )int.0ir
   r
   r   
<listcomp>&   s    z-_is_cuqnt_22_11_or_higher.<locals>.<listcomp>.r            TF)r   __version__split)verr
   r
   r   _is_cuqnt_22_11_or_higher$   s   $r   c                   C   s   t  S )N)r   r
   r
   r
   r   _is_nonblocking_supported,   s   r   c                 C   s   t | dkr
tdt| d tr!| d }t| dd }||fS t| } g }g }d}t | dkrG|| d || d t | dks1t | dkrR| d}| rVJ |||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outputr
   r
   r   _get_einsum_operands0   s(   

r(   c                     s  t jjjrd S tjt vrd S t  td u r t	j
ddd d S |dd }|dd}|du r2d}t| } d	d
 | d D }t|dkrGd S tdd |D sYtdd |D r[d S |d u rdt j| n|  t jt jt jt jfvrtd S  fdd
|D }t jj }ttdsi  }t_ntj}||}|d u rt }t|tj||< n|j}||d}t rd|d< d}	|du rdd
 tt|ddD }n5t|r|d dkr|dd  }n$t|dkrt|d tt frd}	|d dkrd}	d }n|dkrd}	d }|	r	t	j
ddd |rd|ind }
t| dkr*t!j"| d g|R ||
d}|S t| dkrVdd
 t#|| d D }| d d urK|$| d  t!j"|||
d}|S J )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optimizeFTZgreedyc                 S   s   g | ]}t |qS r
   )cupyZasarrayr   opr
   r
   r   r   j   s    z(_try_use_cutensornet.<locals>.<listcomp>r   c                 s   s    | ]}|j d kV  qdS r   N)sizer-   r
   r
   r   	<genexpr>r   s    z'_try_use_cutensornet.<locals>.<genexpr>c                 s   s    | ]
}t |jd kV  qdS r/   )r   shaper-   r
   r
   r   r1   s   s    c                    s   g | ]	}|j  d dqS )F)copy)Zastyper-   Zresult_dtyper
   r   r   |       cutn_handle_cache)Z	device_idhandleautoblockingc                 S   s   g | ]
}|d  |d fqS )r   r   r
   r   r
   r
   r   r      s    r   Z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)optionsr+      c                 S   s   g | ]	}|D ]}|qqS r
   r
   )r   pairr   r
   r
   r   r      r5   )%r,   cudaZruntimeZis_hipr   ZACCELERATOR_CUTENSORNETZget_routine_acceleratorsr   r   warningswarngetr(   r   anyZresult_typeZfloat32Zfloat64Z	complex64Z
complex128Z	getDevicer   _tlsr6   creater   destroyr7   r   ranger   r   floatr   Zcontractzipr!   )r#   kwargsr*   r;   r%   Zdevicer6   r7   Zcutn_optionsZraise_warningZcutn_optimizeroutr&   r
   r4   r   _try_use_cutensornetM   s   



rL   )	threadingr@   r,   r   Z
cupy._corer   Zcupy.cuda.devicer   localrD   r   r   r   r   memoizer   r   r(   rL   r
   r
   r
   r   <module>   s    
