Ë
    L²j�  ã                   óT   — d dl Z d dlmZ d dlmZ d dlZd dlmZ  G d„ de«      ZdgZ	y)é    N)ÚLiteral)ÚSelf)Ú_acceleratorGraphc            
       ó"  ‡ — e Zd ZdZ	 ddddœdedeeef   dz  ded   d	efˆ fd
„Z		 ddddœdedeeef   dz  ded   d	dfˆ fd„Z
dˆ fd„Zdˆ fd„Zdˆ fd„Zdˆ fd„Zdˆ fd„Zd	eeef   fˆ fd„Zdˆ fd„Zded	dfˆ fd„Zdd„Zded	dfd„Zˆ xZS )ÚGrapha\  
    Wrapper around an :ref:`accelerator<accelerators>` graph that supports capture and replay.

    A graph captures a sequence of operations and their dependencies, allowing them to be
    replayed efficiently with reduced overhead. This class can be used as a context manager
    to automatically capture operations on the current stream.

    Arguments:
        keep_graph (bool, optional): If ``False``, the underlying graph is destroyed and the
            executable graph is instantiated on the GPU at the end of ``capture_end``.
            If ``True``, the underlying graph is preserved after ``capture_end``. In this case,
            the executable graph is not instantiated automatically; it must be explicitly created
            by calling ``instantiate``, or it will be instantiated on the first call to ``replay``.
            Defaults to ``False``.
        pool (tuple[int, int], optional): Memory pool identifier for this graph. Multiple graphs
            can share the same pool by passing the same identifier, which can reduce memory overhead.
            Defaults to ``None``.
        capture_error_mode (Literal["default", "global", "thread_local", "relaxed"], optional):
            Specifies the behavior of graph capture. The exact semantics are backend-specific.
            ``"default"``: backend-defined default capture behavior.
            ``"global"``: potentially unsafe API calls are prohibited. Errors may occur if capture
            in the current thread affects other threads.
            ``"thread_local"``: potentially unsafe API calls are prohibited. Errors occur only if
            capture in the current thread affects itself.
            ``"relaxed"``: the current thread is allowed to make potentially unsafe API calls, except
            for calls that inherently conflict with stream capture.
            Default: ``"default"``.

    Example::

        >>> # xdoctest: +SKIP
        >>> x = torch.zeros([2000], device=0)

        >>> stream = torch.Stream()
        >>> graph = torch.accelerator.Graph()
        >>> with stream, graph:
        ...     x += 1

        >>> graph.replay()
    NÚdefault©ÚpoolÚcapture_error_modeÚ
keep_graphr
   r   )r   ÚglobalÚthread_localÚrelaxedÚreturnc                ó$   •— t         ‰| �  | |«      S ©N)ÚsuperÚ__new__)Úclsr   r
   r   Ú	__class__s       €úW/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/accelerator/graphs.pyr   zGraph.__new__3   s   ø€ ô ‰w‰˜s JÓ/Ð/ó    c                ó@   •— t         ‰| �  |«       || _        || _        y r   )r   Ú__init__Ú
graph_poolr   )Úselfr   r
   r   r   s       €r   r   zGraph.__init__>   s!   ø€ ô 	‰Ñ˜Ô$ØˆŒØ"4ˆÕr   c                 óP   •— t         ‰| �  | j                  | j                  ¬«       y)a  
        Begin graph capture on the current stream.

        All operations on the current stream after this call will be recorded into the graph until
        ``capture_end`` is called, using the memory pool and capture error mode provided at construction time.
        r	   N)r   Úcapture_beginr   r   ©r   r   s    €r   r   zGraph.capture_beginL   s&   ø€ ô 	‰ÑØ—‘°T×5LÑ5Lð 	õ 	
r   c                 ó"   •— t         ‰| �  «        y)z”
        End graph capture on the current stream of the current device.

        After this call, the graph can be replayed via ``replay``.
        N)r   Úcapture_endr   s    €r   r!   zGraph.capture_endW   ó   ø€ ô 	‰ÑÕr   c                 ó"   •— t         ‰| �  «        y)zâ
        Instantiate the underlying graph. Will be called by ``capture_end``
        if ``keep_graph=False``, or by ``replay`` if ``keep_graph=True`` and
        ``instantiate`` has not already been explicitly called.
        N)r   Úinstantiater   s    €r   r$   zGraph.instantiate_   r"   r   c                 ó"   •— t         ‰| �  «        y)z'Replay the work captured by this graph.N)r   Úreplayr   s    €r   r&   zGraph.replayg   s   ø€ ä‰‰Õr   c                 ó"   •— t         ‰| �  «        y)zñ
        Delete the graph currently held by this instance.

        After this call, the graph can be recaptured. Set :attr:`graph_pool` or
        :attr:`capture_error_mode` beforehand to use different settings on the next capture.
        N)r   Úresetr   s    €r   r(   zGraph.resetk   s   ø€ ô 	‰‰�r   c                 ó    •— t         ‰| �  «       S )aT  
        Return an opaque token representing the id of this graph's memory pool.

        This id can optionally be passed to another graph's ``capture_begin``,
        which hints the other graph may share the same memory pool.

        Example::
            >>> # xdoctest: +SKIP
            >>> g1 = torch.accelerator.Graph()
            >>> g1.capture_begin()
            >>> # ... operations ...
            >>> g1.capture_end()

            >>> # Share g1's memory pool with a new graph
            >>> pool_id = g1.pool()
            >>> g2 = torch.accelerator.Graph(pool=pool_id)
        )r   r
   r   s    €r   r
   z
Graph.poolt   s   ø€ ô$ ‰w‰|‹~Ðr   c                 ó    •— t         ‰| �  «       S )z)Enable debugging mode for ``debug_dump``.)r   Úenable_debug_moder   s    €r   r+   zGraph.enable_debug_modeˆ   s   ø€ ä‰wÑ(Ó*Ð*r   Úpathc                 ó"   •— t         ‰| �  |«      S )a.  
        Dump the captured graph to a file for debugging purposes if the debugging is
        enabled via ``enable_debug_mode``.

        Arguments:
            path (str): Path to dump the graph to.

        Example::
            >>> # xdoctest: +SKIP
            >>> s = torch.Stream()
            >>> g = torch.accelerator.Graph()
            >>> g.enable_debug_mode()

            >>> with s, g:
            >>> # ... operations ...

            >>> # Dump captured graph to a file "graph_dump.dot"
            >>> g.debug_dump("graph_dump.dot")
        )r   Ú
debug_dump)r   r,   r   s     €r   r.   zGraph.debug_dumpŒ   s   ø€ ô( ‰wÑ! $Ó'Ð'r   c                 óH  — t         j                  j                  «        t         j                  j                  j
                  rt        j                  «        t         j                  j                  «        t         j                  j                  «        | j                  «        y r   )ÚtorchÚacceleratorÚsynchronizeÚcompilerÚconfigÚforce_cudagraph_gcÚgcÚcollectÚempty_cacheÚempty_host_cacher   )r   s    r   Ú	__enter__zGraph.__enter__¢   sb   € Ü×Ñ×%Ñ%Ô'Ü�>‰>× Ñ ×3Ò3ô �J‰JŒLÜ×Ñ×%Ñ%Ô'Ü×Ñ×*Ñ*Ô,Ø×ÑÕr   Úexc_infoc                 ó$   — | j                  «        y r   )r!   )r   r;   s     r   Ú__exit__zGraph.__exit__­   s   € Ø×ÑÕr   )F)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚboolÚtupleÚintr   r   r   r   r   r!   r$   r&   r(   r
   r+   Ústrr.   r:   Úobjectr=   Ú__classcell__)r   s   @r   r   r   	   s  ø„ ñ'ðV !ð	0ð (,ð ò	0àð	0ð �C˜�H‰o Ñ$ð		0ð
 $Ø:ñ
ð	0ð 
õ	0ð !ð5ð (,ð ò5àð5ð �C˜�H‰o Ñ$ð	5ð
 $Ø:ñ
ð5ð 
õ5õ	
õõõõð�e˜C ˜H‘oõ õ(+ð(˜sð ( tõ (ó,	ð &ð ¨T÷ r   r   )
r6   Útypingr   Útyping_extensionsr   r0   Útorch._Cr   r   Ú__all__© r   r   ú<module>rM      s-   ðÛ 	Ý Ý "ã Ý &ôeÐô eðP ˆ)�r   