o
    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   bindings)cutensornet)	tensornet)	cuquantumhasattrcuquantum.bindingsr   r   ImportError r   r   U/home/ubuntu/veenaModal/venv/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optimizeFTgreedyc                 S   s   g | ]}t |qS r   )cupy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)sizer1   r   r   r   	<genexpr>r   s    z'_try_use_cutensornet.<locals>.<genexpr>c                 s   s    | ]
}t |jd kV  qdS r3   )r   shaper1   r   r   r   r5   s   s    c                    s   g | ]	}|j  d dqS )F)copy)astyper1   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;   )%r/   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,   rC   r'   devicer<   r>   cutn_optionsraise_warningcutn_optimizeroutr(   r   r9   r   _try_use_cutensornetM   s   



rc   )	threadingrL   r/   r   
cupy._corer   cupy.cuda.devicer   localrV   r   r   r   r   memoizer   r   r*   rc   r   r   r   r   <module>   s    
