
    ȅi                         S SK Jr  S SKJrJr  S SKrS SKJrJrJ	r	  S SK
Jr  S SKJr  S\	S\\	\\	   4   S	\\	   4S
 jrS\	S\\	\\	   4   S	\\	   4S jrS\S\\	\\	   4   S	\4S jrS\\   S	\4S jrg)    )deque)AnyOptionalN)Graphmap_argNode)
OrderedSet)tree_flattennodenode_to_additional_depsreturnc                     [         [           " 5       n[        U R                  U R                  4UR
                  5        X;   a  UR                  X   5        U$ N)listr   r   argskwargsappendextendr   r   r   s      S/home/james-whalen/.local/lib/python3.13/site-packages/torch/_dynamo/graph_utils.py_get_flat_argsr      sE     9;DTYY$dkk2&+12K    c                     [         [           " 5       n[        U R                  U R                  4UR
                  5        X;   a  UR                  X   5        U$ r   )r	   r   r   r   r   addupdater   s      r   _get_flat_args_uniquer      sG     dDTYY$dhh/&+12Kr   graphc                   ^
^ [        5       m
[        5       m[        5       nS[        SS 4U
U4S jjnS
U
U4S jjnS[        4U
4S jjnU R                  SS9 GH  nT
R	                  5         TR	                  5         U" U5        [        Xa5       H  nUR                  Xv45        M     U(       d  MY  UR                  5       u  pT
(       a&  U" 5       U	:w  a  U" 5         T
(       a  U" 5       U	:w  a  M  [        U[        5      (       d  M_  UT;   a  T
R                  U5        ST
 3s  $ U" U5        [        X5       H  nUR                  Xx45        M     U(       a  M  GM     g	)Nr   r   c                 J   > TR                  U 5        TR                  U 5        g r   )r   r   r   current_pathcurrent_path_sets    r   add_to_current_path+_detect_cycles.<locals>.add_to_current_path*   s    D!T"r   c                  H   > TR                  5       n TR                  U 5        g r   )popremover    s    r   pop_current_path(_detect_cycles.<locals>.pop_current_path.   s    !%r   c                     > T S   $ )N )r!   s   r   current_path_head)_detect_cycles.<locals>.current_path_head2   s    Br   output)opzcycle detected in path: zno cycle detected)r   N)	r   setr   
find_nodesclearr   r   r&   
isinstance)r   r   pendingr#   r(   r-   originchildcur_nodeparentr!   r"   s             @@r   _detect_cyclesr:   #   sE    !&L"%%(-G#$ #4 # #& & t   ""h"/ F#*6KENNE?+ L g&{{}H #4#6&#@ " #4#6&#@ h--++##H-1,@@).xQ01 R! g 04 r   c                    U c  gS[         S[        4S jnS[        S[        S[        [            4S jnU R                   H  nS H  nU" X45       H  nU" U5      s  s  s  $    M      UR
                  S	:X  aF  S
 H@  nUR                  U:X  a  Us  s  $ UR                  S:X  d  M+  XcR                  ;   d  M<  Us  s  $    [        UR                  UR                  45      u  pxU H  nU" U5      s  s  $    M     g)Ncpuxr   c                     [        U [        R                  5      (       a  U R                  $ [        U [        R                  5      (       a  U R                  R                  $ g)Nr<   )r4   torchdevicetypeTensor)r=   s    r   _device_type(_graph_device_type.<locals>._device_typeV   s>    a&&66Ma&&88== r   r   keyc                 \    XR                   ;  a  / $ [        U R                   U   5      u  p#U$ r   )metar
   )r   rE   flat_s       r   _flatten_meta)_graph_device_type.<locals>._flatten_meta]   s*    iiItyy~.r   )valexample_valuecall_method)cudaxputo)
r   strr   r   nodesr0   targetr   r
   r   )	r   rC   rJ   r   rE   objgpu	flat_argsrI   s	            r   _graph_device_typerX   R   s    }  D s tCy  +C$T/#C(( 0 ,
 77m#&;;#%J;;$&3))+;J	 ' $TYY$<=	C$$  " r   )collectionsr   typingr   r   r?   torch.fxr   r   r   torch.utils._ordered_setr	   torch.utils._pytreer
   dictr   r   r   rR   r:   rX   r,   r   r   <module>r_      s        ) ) / ,
)-dJt4D.D)E	$Z
)-dJt4D.D)E,,+/j6F0F+G,,^"huo "# "r   