Ë
    ~\;jD  ã                   ó"  — d Z ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z
 ddlmZ dd	lmZ g d
¢ZdddddddœZdd„Zej$                  ej&                  ej(                  ej$                  ej&                  ej*                  dœZdd„Zi Zd„ Zi Zd„ Ze
j8                  ej8                  ej8                  ej8                  ej8                  dœZe
j<                  ej<                  ej<                  ej<                  ej<                  dœZd„ Zd„ Zd„ Z y)z¦
Handles dispatching array operations to the correct backend library, as well
as converting arrays to backend formats and then potentially storing them as
constants.
é    Né   )Úobject_arrays)Úcupy)Újax)Ú
tensorflow)Útheano)Útorch)Úget_funcÚ
has_einsumÚhas_tensordotÚbuild_expressionÚevaluate_constantsÚhas_backendz
dask.arrayztheano.tensorzopt_einsum.backends.torchz	jax.numpyzautograd.numpyzmars.tensor)Údaskr   r	   r   ÚautogradÚmarsc                 óà   — 	 t        j                  t        j                  ||«      «      }|€t	        || «      S t	        || |«      S # t
        $ r d}t        |j                  || «      «      ‚w xY w)z½Try and import ``{backend}.{func}``.
    If library is installed and func is found, return the func;
    otherwise if default is provided, return default;
    otherwise raise an error.
    z´{} doesn't seem to provide the function {} - see https://optimized-einsum.readthedocs.io/en/latest/backends.html for details on which functions are required for which contractions.)Ú	importlibÚimport_moduleÚ_aliasesÚgetÚgetattrÚAttributeErrorÚformat)ÚfuncÚbackendÚdefaultÚlibÚ	error_msgs        úeG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\opt_einsum/backends/dispatch.pyÚ_import_funcr!      sr   € ð>Ü×%Ñ%¤h§l¡l°7¸GÓ&DÓEˆØ%, _Œw�s˜DÓ!ÐU¼'À#ÀtÈWÓ:UÐUøÜò >ð[ˆ	ô ˜Y×-Ñ-¨g°tÓ<Ó=Ð=ð	>ús   ‚6A ¹A Á'A-))Ú	tensordotÚnumpy)Ú	transposer#   )Úeinsumr#   )r"   Úobject)r$   r&   )r%   r&   c                 ól   — 	 t         | |f   S # t        $ r t        | ||«      }|t         | |f<   |cY S w xY w)ziReturn ``{backend}.{func}``, e.g. ``numpy.einsum``,
    or a default func if provided. Cache result.
    )Ú_cached_funcsÚKeyErrorr!   )r   r   r   Úfns       r    r
   r
   <   sF   € ðÜ˜T 7˜]Ñ+Ð+øÜò Ü˜$ ¨Ó1ˆØ')Œ�d˜G�mÑ$ØŠ	ðús   ‚
 �#3²3c                 ó¤   — 	 t         |    S # t        $ r; 	 t        d| «       dt         | <   n# t        $ r dt         | <   Y nw xY wt         |    cY S w xY w)zHCheck if ``{backend}.einsum`` exists, cache result for performance.
    r%   TF)Ú_has_einsumr)   r
   r   ©r   s    r    r   r   L   s`   € ð	$Ü˜7Ñ#Ð#øÜò $ð	)Ü�X˜wÔ'Ø#'ŒK˜Ò øÜò 	)Ø#(ŒK˜Ó ð	)úô ˜7Ñ#Ò#ð$úó-   ‚ ‹	A•+ªA«A ½A¿A Á AÁAc                 ó¤   — 	 t         |    S # t        $ r; 	 t        d| «       dt         | <   n# t        $ r dt         | <   Y nw xY wt         |    cY S w xY w)zKCheck if ``{backend}.tensordot`` exists, cache result for performance.
    r"   TF)Ú_has_tensordotr)   r
   r   r-   s    r    r   r   ^   s`   € ð	'Ü˜gÑ&Ð&øÜò 'ð	,Ü�[ 'Ô*Ø&*ŒN˜7Ò#øÜò 	,Ø&+ŒN˜7Ó#ð	,úô ˜gÑ&Ò&ð'úr.   )r   r   r   r	   r   c                 ó    — t        |    ||«      S )zxBuild an expression, based on ``expr`` and initial arrays ``arrays``,
    that evaluates using backend ``backend``.
    )ÚCONVERT_BACKENDS©r   ÚarraysÚexprs      r    r   r   €   s   € ô ˜GÑ$ V¨TÓ2Ð2ó    c                 ó    — t        |    ||«      S )zƒConvert constant arrays to the correct backend, and perform as much of
    the contraction of ``expr`` with these as possible.
    )ÚEVAL_CONSTS_BACKENDSr3   s      r    r   r   ‡   s   € ô   Ñ(¨°Ó6Ð6r6   c                 ó.   — | j                  «       t        v S )z$Checks if the backend is known.
    )Úlowerr2   r-   s    r    r   r   Ž   s   € ð �=‰=‹?Ô.Ð.Ð.r6   )N)r#   N)!Ú__doc__r   r#   Ú r   r   Ú_cupyr   Ú_jaxr   Ú_tensorflowr   Ú_theanor	   Ú_torchÚ__all__r   r!   r"   r$   r%   Úobject_einsumr(   r
   r,   r   r0   r   r   r2   r   r8   r   © r6   r    Ú<module>rE      s  ðñó ã å Ý Ý Ý 'Ý Ý â
n€ð ØØ(ØØ Øñ€ó>ð& "ŸO™OØ!ŸO™OØŸ™à"Ÿ_™_Ø"Ÿ_™_Ø'×5Ñ5ñ€ó	ð €ò$ð €ò'ð$ ×.Ñ.Ø×&Ñ&Ø×"Ñ"Ø×$Ñ$Ø× Ñ ñÐ ð ×0Ñ0Ø×(Ñ(Ø×$Ñ$Ø×&Ñ&Ø×"Ñ"ñÐ ò3ò7ó/r6   