
    `i *                         d dl Z d dlmZ d dlmZmZ d dlmZmZm	Z	m
Z
 d dlZd dlmZ e G d d                      Z G d de	          Z G d	 d
          Z G d d          ZdS )    N)contextmanager)	dataclassfield)AnyCallable
NamedTupleOptionalc                       e Zd ZU dZ eej        j                  Zej        j        e	d<   dZ
eeeef                  e	d<   dS )TracingConfiga  
    This represents a symbolic tracing configuration.

    Args:
        tracer (torch.fx.Tracer): An instance of :class:`torch.fx.Tracer` to
            use for symbolic tracing. The default value is the native
            :class:`torch.fx.Tracer` constructed with default arguments.
            However, the user may want to pass a different value such as the
            ``HFTracer`` for models in the HuggingFace Transformers_ library.
            .. _Transformers: https://huggingface.co/docs/transformers/index
        concrete_args (Optional[Dict[str, Any]]): Concrete arguments that
            should not be treated as ``torch.fx.Proxy`` when tracing the
            module ``forward()``. Passing ``concrete_args`` allows partially
            specializing the forward, e.g. to remove control flow or data
            structures. This ``concrete_args`` here is the same argument used
            in :meth:`~torch.fx.Tracer.trace`.
    )default_factorytracerNconcrete_args)__name__
__module____qualname____doc__r   torchfxTracerr   __annotations__r   r	   dictstrr        w/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/distributed/fsdp/_trace_utils.pyr   r      s`          $ $eEHODDDFEHODDD.2M8DcN+22222r   r   c                   X    e Zd ZU dZej        ed<   eee	ej
        f                  ed<   dS )_ParamUsageInfoa6  
    This is used for ``_ExecutionInfo.module_to_param_usage_infos`` to record
    execution information. The ``dict`` maps modules to a list of these
    ``_ParamUsageInfo`` instances, where each instance represents a group of
    parameters used together.

    Specifically, for each module key in the ``dict``, each instance of this
    class represents either:
    (1) the module and some sublist of its ``named_parameters()`` used
    together in execution (see ``_patched_create_proxy()``), or
    (2) a submodule and all of ``submodule.named_parameters()`` (see
    ``_patched_call_module()``).

    Type (1) corresponds to directly using parameters in ops without calling
    ``forward()``, and type (2) corresponds to calling ``forward()``. The
    mapped-to lists in the ``dict`` follow the execution order.
    modulenamed_paramsN)r   r   r   r   nnModuler   listtupler   	Parameterr   r   r   r   r   #   sI          $ IuS",./000000r   r   c                   ,    e Zd ZdZdej        ddfdZdS )_ExecutionInfoa1  
    This represents the execution order information from the forward pass.

    Attributes:
        curr_module (nn.Module): Current module being traced.
        module_forward_order (List[nn.Module]): The modules in (pre-)forward
            order, i.e. the order in which their ``forward()`` methods are
            called. Each call to a module's ``forward()`` corresponds to one
            element in the list.
        module_to_param_usage_infos (Dict[nn.Module, List[_ParamUsageInfo]]):
            Maps a module to a list of module execution infos. See
            :class:`_ParamUsageInfo` for details.
        param_forward_order (List[nn.Parameter]): The parameters in forward
            execution order, where only a parameter's first participation is
            included.
        visited_params (Set[nn.Parameter]): The parameters visited so far
            during the trace. This is only used during tracing for fast
            membership check. Invariant: The parameters in
            ``param_forward_order`` are exactly those in ``visited_params``.
    root_modulereturnNc                 j    || _         |g| _        |g i| _        g | _        t	                      | _        d S N)curr_modulemodule_forward_ordermodule_to_param_usage_infosparam_forward_ordersetvisited_params)selfr'   s     r   __init__z_ExecutionInfo.__init__P   s@    &16A]!T
( 8: 14r   )r   r   r   r   r    r!   r2   r   r   r   r&   r&   :   sB         *7BI 7$ 7 7 7 7 7 7r   r&   c                      e Zd ZddZedej        j        dej	        fd            Z
deded	ej	        d
edeedf         deeef         defdZ	 	 	 ddededeeej        f         dedej        j        j        deedf         deeef         dee         dee         deeej        j        gej        j        f                  dej        j        fdZdS )_ExecOrderTracerr(   Nc                     d | _         d S r*   )	exec_info)r1   s    r   r2   z_ExecOrderTracer.__init__[   s    37r   r   r'   c              #   r  K   t          |          | _        |j        }|j        }t	          j        | j        || j                  |_        t          |                                          }t	          j        | j	        || j        |          |_        	 d V  ||_        ||_        d S # ||_        ||_        w xY wr*   )
r&   r6   call_modulecreate_proxy	functoolspartial_patched_call_moduler   named_parameters_patched_create_proxy)r1   r   r'   orig_call_moduleorig_create_proxyfqn_to_params         r   patch_tracerz_ExecOrderTracer.patch_tracer^   s      '44!-"/&.%'7
 
 K88::;;'/&N	
 
	4EEE!1F"3F "2F"3F3333s   B& &B6r8   r6   r   forwardargs.kwargsc                 j   |j                             |           t          |                                          }|j        }|rF||j        v s
J d            |j        |j                                     t          ||                     |}	||_        g |j        |<    |||||          }
|	|_        |
S )a  
        Overrides ``call_module`` to save execution information to
        ``exec_info``. Note that ``call_module`` is called during symbolic
        tracing for each non-root module.

        Args:
            call_module (Callable): Original ``call_module`` to override.
            exec_info (_ExecutionInfo): Used to record execution information.
            module (nn.Module): Module corresponding to this ``call_module``.
            forward (Callable): ``forward()`` method of ``module`` to be called
                for this ``call_module``.
            args (Tuple[Any, ...]): Positional arguments for ``forward``.
            kwargs (Dict[str, Any]): Keyword arguments for ``forward``.

        Returns:
            Same return value as ``call_module``.
        zPThe current module should have already been processed by a patched `call_module`)r,   appendr"   r=   r+   r-   r   )r1   r8   r6   r   rC   rD   rE   r   r+   prev_curr_moduleoutputs              r   r<   z%_ExecOrderTracer._patched_call_modules   s    6 	&--f555F335566+ 	)"GGGGb HGG 1)2GHOO55   ' &	8:	-f5VWdF;; 0	r   r9   rA   kindtargetname	type_exprproxy_factory_fnc           	      $    |||||||	|
          }|j         }|dv r|g }|D ]}t          |t          j        j                  r~|j        j        |v rp||j        j                 }|                    |j        j        |f           ||j        vr4|j        	                    |           |j
                            |           |r.|j        |                             t          ||                     n|dk    rt          |                                          }|r.|j        |                             t          ||                     |D ]B\  }}||j        vr4|j        	                    |           |j
                            |           C|S )a  
        Overrides ``create_proxy`` to save execution information to
        ``exec_info``. Note that ``create_proxy`` is called during symbolic
        tracing for each leaf function/method/module.

        Args:
            create_proxy (Callable): Original ``create_proxy`` to override.
            exec_info (_ExecutionInfo): Used to record execution information.
            fqn_to_param (Dict[str, nn.Parameter]): ``dict`` version of the
                root module's ``named_parameters()`` with FQN as key and
                parameter as value.
            kind (str): Kind of the target method ('call_function',
                'call_method', 'get_attr', 'call_module', 'placeholder', or
                'output'). See :class:`torch.fx.Graph` for details. This is
                passed to ``create_proxy``.
            target (torch.fx.node.Target): Contains the string name of the
                function/method/module. This is passed to ``create_proxy``.
            args (Tuple[Any, ...]): Positional arguments for the function/
                method/module. This is passed to ``create_proxy``.
            kwargs (Dict[str, Any]): Keyword arguments for the function/method/
                module. This is passed to ``create_proxy``
            name (Optional[str]): An optional string name for the ``Node``
                created in ``create_proxy``. This is passed to
                ``create_proxy``.
            type_expr (Optional[Any]): An optional type annotation representing
                the Python type that the output of the node has. This is passed
                to ``create_proxy``.
            proxy_factory_fn (Callable[[torch.fx.Node], torch.fx.Proxy]):
                An alternative proxy constructor used in ``create_proxy``. This
                is passed to ``create_proxy``.

        Returns:
            torch.fx.Proxy: Created ``Node`` wrapped in a ``Proxy`` object.
        )call_functioncall_methodNr8   )r+   
isinstancer   r   ProxynoderK   rG   r0   addr.   r-   r   r"   r=   )r1   r9   r6   rA   rJ   rK   rD   rE   rL   rM   rN   proxyr+   r   argparam_s                    r   r>   z&_ExecOrderTracer._patched_create_proxy   s   ` &$i9I
 
  +333?A 	H 	HC"377HHO|;; ,SX_ =$++SX_e,DEEE 	(@@@%488???%9@@GGG 9+FMM'\BB   ]"" < < > >??L 5kBII#K>>   ) @ @5	 888,00777188???r   )r(   N)NNN)r   r   r   r2   r   r   r   r   r    r!   rB   r   r&   r#   r   r   r   r<   r$   rT   Targetr	   NoderS   r>   r   r   r   r4   r4   Z   s       8 8 8 8 458? 4 4 4 4 ^4(** "*
 	* * CHo* S#X* 
* * * *l ##'PTO OO "O 3,-	O O $O CHoO S#XO smO C=O #8UX]OUX^,K#LMO 
O O O O O Or   r4   )r:   
contextlibr   dataclassesr   r   typingr   r   r   r	   r   torch.nnr    r   r   r&   r4   r   r   r   <module>r`      s=       % % % % % % ( ( ( ( ( ( ( ( 6 6 6 6 6 6 6 6 6 6 6 6        3 3 3 3 3 3 3 3.1 1 1 1 1j 1 1 1.7 7 7 7 7 7 7 7@T T T T T T T T T Tr   