o
    X۷i                     @  s   d dl mZ 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 )    )annotationsN)_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   bindings)cutensornet)	tensornet)	cuquantumhasattrcuquantum.bindingsr   r   ImportError r   r   N/home/ubuntu/vllm_env/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_operands2   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optimizeFTgreedyc                 S  s   g | ]}t |qS r   )cupyasarrayr   opr   r   r   r   l   s    z(_try_use_cutensornet.<locals>.<listcomp>r   c                 s  s    | ]}|j d kV  qdS r   N)sizer2   r   r   r   	<genexpr>t   s    z'_try_use_cutensornet.<locals>.<genexpr>c                 s  s    | ]
}t |jd kV  qdS r4   )r   shaper2   r   r   r   r6   u   s    c                   s   g | ]	}|j  d dqS )F)copy)astyper2   result_dtyper   r   r   ~       cutn_handle_cache)	device_idhandleautoblockingc                 S  s   g | ]
}|d  |d fqS )r   r   r   r   r   r   r   r      s    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)optionsr.      c                 S  s   g | ]	}|D ]}|qqS r   r   )r   pairr   r   r   r   r      r<   )%r0   cudaruntimeis_hipr   ACCELERATOR_CUTENSORNETget_routine_acceleratorsr   r   warningswarngetr+   r   anyresult_typefloat32float64	complex64
complex128	getDevicer
   _tlsr=   creater   destroyr?   r   ranger!   r   floatr   contractzipr$   )r&   kwargsr-   rD   r(   devicer=   r?   cutn_optionsraise_warningcutn_optimizeroutr)   r   r:   r   _try_use_cutensornetO   s   



rd   )
__future__r   	threadingrM   r0   r   
cupy._corer   cupy.cuda.devicer   localrW   r	   r   r   r   memoizer   r   r+   rd   r   r   r   r   <module>   s    
