Ë
    ~\;jš  ã                   óÊ   — d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	m
Z
 g d¢Z ee«      Zd„ Zd„ Zd	„ Zd
„ Zej$                  dd„«       Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zy)z`
A module for sharing intermediates between contractions.

Copyright (c) 2018 Uber Technologies
é    N)ÚCounterÚdefaultdicté   )Úalpha_canonicalizeÚparse_einsum_input)Úcurrently_sharingÚget_sharing_cacheÚshared_intermediatesÚcount_cached_opsÚtranspose_cache_wrapÚeinsum_cache_wrapÚto_backend_cache_wrapc                  ó6   — t        j                  «       t        v S )zBCheck if we are currently sharing a cache -- thread specific.
    )Ú	threadingÚ	get_identÚ_SHARING_STACK© ó    ú[G:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\opt_einsum/sharing.pyr   r      s   € ô ×ÑÓ ¤NÐ2Ð2r   c                  ó>   — t         t        j                  «          d   S )z=Return the most recent sharing cache -- thread specific.
    éÿÿÿÿ)r   r   r   r   r   r   r	   r	      s   € ô œ)×-Ñ-Ó/Ñ0°Ñ4Ð4r   c                 óX   — t         t        j                  «          j                  | «       y ©N)r   r   r   Úappend©Úcaches    r   Ú_add_sharing_cacher   #   s   € Ü”9×&Ñ&Ó(Ñ)×0Ñ0°Õ7r   c                  ó|   — t        j                  «       } t        |    j                  «        t        |    st        | = y y r   )r   r   r   Úpop)Útids    r   Ú_remove_sharing_cacher!   '   s6   € Ü
×
Ñ
Ó
€CÜ�3Ñ×ÑÔÜ˜#ÒÜ˜3Ñð r   c              #   óf   K  — | €i } t        | «       	 | –— t        «        y# t        «        w xY w­w)a¼  Context in which contract intermediate results are shared.

    Note that intermediate computations will not be garbage collected until
    1. this context exits, and
    2. the yielded cache is garbage collected (if it was captured).

    Parameters
    ----------
    cache : dict
        If specified, a user-stored dict in which intermediate results will
        be stored. This can be used to interleave sharing contexts.

    Returns
    -------
    cache : dict
        A dictionary in which sharing results are stored. If ignored,
        sharing results will be garbage collected when this context is
        exited. This dict can be passed to another context to resume
        sharing.
    N)r   r!   r   s    r   r
   r
   .   s1   è ø€ ð, €}ØˆÜ�uÔð ØŠäÕøÔÕüs   ‚1“" —1¢.®1c                 óB   — t        d„ | j                  «       D «       «      S )zrReturns a counter of the types of each op in the cache.
    This is useful for profiling to increase sharing.
    c              3   ó&   K  — | ]	  }|d    –— Œ y­w)r   Nr   )Ú.0Úkeys     r   Ú	<genexpr>z#count_cached_ops.<locals>.<genexpr>Q   s   è ø€ Ð2¡\˜c�3�q•6¡\ùó   ‚)r   Úkeysr   s    r   r   r   M   s   € ô Ñ2 U§Z¡Z¤\Ó2Ó2Ð2r   c                  óF   — t        «       }| D ]  }||dt        |«      f<   Œ y)z{Save tensors in the cache to prevent their ids from being recycled.
    This is needed to prevent false cache lookups.
    ÚtensorN)r	   Úid)Útensorsr   r+   s      r   Ú_save_tensorsr.   T   s)   € ô Ó€EÛˆØ&,ˆˆhœ˜6›
Ð"Ò#ñ r   c                 óF   — t        «       }| |v r||    S  ||i |¤Ž}||| <   |S )z Memoize ``fn(*args, **kwargs)`` using the given ``key``.
    Results will be stored in the innermost ``cache`` yielded by
    :func:`shared_intermediates`.
    )r	   )r&   ÚfnÚargsÚkwargsr   Úresults         r   Ú_memoizer4   ]   s:   € ô
 Ó€EØ
ˆe�|Ø�S‰zÐÙ�Ð ˜Ñ €FØ€Eˆ#�JØ€Mr   c                 óD   ‡ — t        j                  ‰ «      dˆ fd„	«       }|S )zqDecorates a ``transpose()`` implementation to be memoized inside a
    :func:`shared_intermediates` context.
    c                 ó˜   •— t        «       s ‰| ||¬«      S t        | «       t        |«      }d|t        | «      |f}t	        |‰| ||¬«      S )N©ÚbackendÚ	transpose)r   r.   Útupler,   r4   )ÚaÚaxesr8   r&   r9   s       €r   Úcached_transposez.transpose_cache_wrap.<locals>.cached_transposen   sP   ø€ ä Ô"Ù˜Q ¨gÔ6Ð6ô 	�aÔÜ�T‹{ˆØ˜7¤B q£E¨4Ð/ˆÜ˜˜Y¨¨4¸ÔAÐAr   )Únumpy©Ú	functoolsÚwraps)r9   r=   s   ` r   r   r   j   s*   ø€ ô ‡_�_�YÓôBó  ðBð Ðr   c                 óD   ‡ — t        j                  ‰ «      dˆ fd„	«       }|S )zqDecorates a ``tensordot()`` implementation to be memoized inside a
    :func:`shared_intermediates` context.
    c                 óÜ  •— t        «       s ‰| |||¬«      S t        | |«       t        |t        j                  «      rjt        t        t        | j                  «      «      «      t        | j                  «      |z
  d  t        t        t        |j                  «      «      «      d | f}t        |d   «      t        |d   «      f}d|t        | «      t        |«      |f}t        |‰| |||¬«      S )Nr7   r   r   Ú	tensordot)r   r.   Ú
isinstanceÚnumbersÚNumberÚlistÚrangeÚlenÚshaper:   r,   r4   )ÚxÚyr<   r8   r&   rD   s        €r   Úcached_tensordotz.tensordot_cache_wrap.<locals>.cached_tensordot€   sÊ   ø€ ä Ô"Ù˜Q  4°Ô9Ð9ô 	�a˜ÔÜ�dœGŸN™NÔ+Üœœc !§'¡'›lÓ+Ó,¬S°·±«\¸DÑ-@Ð-AÐBÄDÌÌsÐST×SZÑSZË|ÓI\ÓD]Ð^cÐ_cÐDdÐdˆDÜ�T˜!‘W‹~œu T¨!¡W›~Ð-ˆØ˜7¤B q£E¬2¨a«5°$Ð6ˆÜ˜˜Y¨¨1¨d¸GÔDÐDr   )é   r>   r?   )rD   rN   s   ` r   Útensordot_cache_wraprP   |   s*   ø€ ô ‡_�_�YÓô
Eó  ð
Eð Ðr   c                 óB   ‡ — t        j                  ‰ «      ˆ fd„«       }|S )zoDecorates an ``einsum()`` implementation to be memoized inside a
    :func:`shared_intermediates` context.
    c            	      ó–  •— t        «       s ‰| i |¤ŽS |j                  dd«      }| d   }t        | «      \  }}}|j                  d«      }t	        |Ž  t        t        |t        t        |«      «      d„ ¬«      }t        d„ |D «       «      }dj                  d„ |D «       «      }	t        |	d	z   |z   «      }
d
||
|f}t        |‰|g|¢­d|iŽS )Nr8   r>   r   Ú,c                 ó   — | d   S )Nr   r   )rL   s    r   Ú<lambda>z:einsum_cache_wrap.<locals>.cached_einsum.<locals>.<lambda>¢   s   € ÈÈ1Êr   )r&   c              3   ó&   K  — | ]	  \  }}|–— Œ y ­wr   r   )r%   Ú_Úid_s      r   r'   z;einsum_cache_wrap.<locals>.cached_einsum.<locals>.<genexpr>£   s   è ø€ Ð:±	¡f a¨œc±	ùr(   c              3   ó&   K  — | ]	  \  }}|–— Œ y ­wr   r   )r%   Úinput_rW   s      r   r'   z;einsum_cache_wrap.<locals>.cached_einsum.<locals>.<genexpr>¤   s   è ø€ Ð#F¹I©y¨v°q¤F¹Iùr(   z->Úeinsum)r   r   r   Úsplitr.   ÚsortedÚzipÚmapr,   r:   Újoinr   r4   )r1   r2   r8   ÚequationÚinputsÚoutputÚoperandsÚ	canonicalÚcanonical_idsÚcanonical_inputsÚcanonical_equationr&   r[   s               €r   Úcached_einsumz(einsum_cache_wrap.<locals>.cached_einsum”   sÚ   ø€ ä Ô"Ù˜4Ð* 6Ñ*Ð*ð —*‘*˜Y¨Ó0ˆØ˜‘7ˆÜ#5°dÓ#;Ñ ˆ�˜Ø—‘˜cÓ"ˆä�xÑ ô œ3˜v¤s¬2¨xÓ'8Ó9¹~ÔNˆ	ÜÑ:±	Ó:Ó:ˆØŸ8™8Ñ#F¹IÓ#FÓFÐÜ/Ð0@À4Ñ0GÈ&Ñ0PÓQÐà˜Ð!3°]ÐBˆÜ˜˜V XÐJ°ÒJÀ'ÑJÐJr   r?   )r[   ri   s   ` r   r   r   �   s*   ø€ ô ‡_�_�VÓóKó ðKð* Ðr   c                 óÀ   ‡ — ‰ €t        j                  t        |¬«      S |r t        j                  ‰ «      dˆ fd„	«       }|S t        j                  ‰ «      ˆ fd„«       }|S )z”Decorates an ``to_backend()`` implementation to be memoized inside a
    :func:`shared_intermediates` context (e.g. ``to_cupy``, ``to_torch``).
    )Ú	constantsc                 óz   •— t        «       s
 ‰| |¬«      S ‰j                  t        | «      |f}t        |‰| |¬«      S )N)Úconstant©r   Ú__name__r,   r4   )Úarrayrm   r&   Ú
to_backends      €r   Úcached_to_backendz0to_backend_cache_wrap.<locals>.cached_to_backend·   s?   ø€ ä$Ô&Ù! %°(Ô;Ð;ð ×%Ñ%¤r¨%£y°(Ð:ˆCÜ˜C ¨U¸XÔFÐFr   c                 óp   •— t        «       s ‰| «      S ‰j                  t        | «      f}t        |‰| «      S r   rn   )rp   r&   rq   s     €r   rr   z0to_backend_cache_wrap.<locals>.cached_to_backendÂ   s9   ø€ ä$Ô&Ù! %Ó(Ð(ð ×%Ñ%¤r¨%£yÐ0ˆCÜ˜C ¨UÓ3Ð3r   )F)r@   Úpartialr   rA   )rq   rk   rr   s   `  r   r   r   ­   sl   ø€ ð
 ÐÜ× Ñ Ô!6À)ÔLÐLáä	�‰˜Ó	$ô	Gó 
%ð	Gð& Ðô 
�‰˜Ó	$ó	4ó 
%ð	4ð Ðr   r   )NF)Ú__doc__Ú
contextlibr@   rF   r   Úcollectionsr   r   Úparserr   r   Ú__all__rH   r   r   r	   r   r!   Úcontextmanagerr
   r   r.   r4   r   rP   r   r   r   r   r   Ú<module>r{      s‚   ðñó Û Û Û ß ,ç :ò€ñ
 ˜TÓ"€ò3ò5ò8ò ð ×Ñò ó ð ò<3ò-ò
òò$ò(ô:r   