o
    2h3                     @   sx   d Z ddlmZ ddlmZ g dZdadd Zedd	dddZdd Z	dd Z
dd Zdd Zdd Zdd ZdS )zORequired functions for optimized contractions of numpy arrays using tensorflow.    )has_array_interface)to_backend_cache_wrap)to_tensorflowbuild_expressionevaluate_constantsNc                  C   sx   t d u r:dd l} z|  }W n ty+   z| jj }W n ty(   d}Y nw Y nw | j }|s5d}| ||fa t S )Nr   Fcpu)	_CACHED_TF_DEVICE
tensorflowexecuting_eagerlyAttributeErrorcontribeagerin_eager_modetestgpu_device_name)tfr   device r   Y/var/www/html/chatgem/venv/lib/python3.10/site-packages/opt_einsum/backends/tensorflow.py_get_tensorflow_and_device   s"   

r   T)	constantsFc                 C   sz   t  \}}}|r(t| r&|| || W  d   S 1 s!w   Y  | S t| r;|r3|| S || j| jS | S )z?Convert a numpy array to a ``tensorflow.placeholder`` instance.N)r   r   r   convert_to_tensorplaceholderdtypeshape)arrayconstantr   r   r   r   r   r   r   "   s    
r   c                    s<   t  \}}dd | D |jdd  fdd}|S )z=Build a tensorflow function based on ``arrays`` and ``expr``.c                 S      g | ]}t |qS r   r   ).0r   r   r   r   
<listcomp>>       z*build_expression_graph.<locals>.<listcomp>r	   backendc                     s*     }dd t| D }|j |dS )Nc                 S   s"   i | ]\}}|j jd kr||qS )Placeholder)optype)r   par   r   r   
<dictcomp>D   s   " zGbuild_expression_graph.<locals>.tensorflow_contract.<locals>.<dictcomp>)	feed_dict)get_default_sessionziprun)arrayssessionr*   graphplaceholdersr   r   r   tensorflow_contractA   s   z3build_expression_graph.<locals>.tensorflow_contract)r   	_contract)r.   expr_r3   r   r0   r   build_expression_graph:   s
   r7   c                    sh   t  \}}}dd | D } || ddd\}}| }t|dd |D   fdd|D }||fS )zConvert constant arguments to tensorflow constants, and perform any
    possible constant contractions. Requires evaluating a tensorflow graph.
    c                 S   s   g | ]}t |d dqS )Tr   r   r   xr   r   r   r    Q       z,evaluate_constants_graph.<locals>.<listcomp>r	   Tr#   r   c                 S   s   g | ]}|d ur|qS Nr   r9   r   r   r   r    V   r;   c                    s(   g | ]}|d u r
d nt t ddqS )NTr8   )r   nextr9   
new_constsr   r   r    W   s   ( )r   r+   iterr-   )const_arraysr5   r   r6   new_opsnew_contraction_listr/   r   r?   r   evaluate_constants_graphJ   s   rE   c                    s    fdd}|S )zCBuild a eager tensorflow function based on ``arrays`` and ``expr``.c                     s    j dd | D dd S )Nc                 S   r   r   r   r9   r   r   r   r    c   r!   zMbuild_expression_eager.<locals>.tensorflow_eager_contract.<locals>.<listcomp>r	   r"   )r4   numpy)r.   r5   r   r   tensorflow_eager_contractb   s   z9build_expression_eager.<locals>.tensorflow_eager_contractr   )r6   r5   rH   r   rG   r   build_expression_eager_   s   rI   c                 C   s   |dd | D dddS )zoConvert constant arguments to tensorflow_eager arrays, and perform any
    possible constant contractions.
    c                 S   r   r   r   r9   r   r   r   r    l   r!   z,evaluate_constants_eager.<locals>.<listcomp>r	   Tr<   r   )rB   r5   r   r   r   evaluate_constants_eagerh   s   rJ   c                 C   "   t  \}}}|r
tnt}|| |S r=   )r   rI   r7   )r.   r5   r6   r   fnr   r   r   r   r      
r   c                 C   rK   r=   )r   rJ   rE   )rB   r5   r6   r   rL   r   r   r   r   x   rM   r   )F)__doc__opt_einsum.helpersr   opt_einsum.sharingr   __all__r   r   r   r7   rE   rI   rJ   r   r   r   r   r   r   <module>   s    	
