
    sg@                       d dl mZ d dlZd dlZd dl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 d dlmZ d dlmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ erd d	l m!Z!  ee"      jG                         jH                  jH                  Z% G d
 de      Z&dZ'd#dZ( ed      Z) ed      Z*d$dZ+d%dZ,ejZ                  d&d       Z.d'dZ/ ej`                  d      d(d       Z1d)dZ2 G d d      Z3	 d*	 	 	 	 	 d+dZ4	 	 d,	 	 	 	 	 	 	 d-dZ5	 d.	 	 	 	 	 	 	 	 	 d/dZ6	 	 	 	 	 	 	 	 	 	 d0dZ7	 	 	 	 	 	 	 	 	 	 d1dZ8	 	 	 	 	 	 	 	 	 	 	 	 	 	 d2dZ9 G d d       Z: G d! d"ee)         Z;y)3    )annotationsN)fieldsis_dataclass)autoEnum)Path)
AnyCallableGenericIterableIteratorLiteralNoReturnSequenceTYPE_CHECKINGTypeVar)Self)CodeTemplate)	Namespacec                  `    e Zd Z e       Z e       Z e       Z e       Z e       Z e       Z	y)TargetN)
__name__
__module____qualname__r   
DEFINITIONDECLARATIONREGISTRATIONANONYMOUS_DEFINITIONNAMESPACED_DEFINITIONNAMESPACED_DECLARATION     A/var/www/html/venv/lib/python3.12/site-packages/torchgen/utils.pyr   r   -   s/    J&K6L6 F!Vr"   r   z(^|\W){}($|\W)c                    t        j                  d|       }|t        d|        |j                         \  }}}||j	                  d      fS )Nz(\w+)(\.\w+)?\((.*)\)zUnsupported function schema: , )rematchRuntimeErrorgroupssplit)schemamname_paramss        r#   split_name_paramsr0   @   sP    
)62Ay:6(CDDhhjOD!Vd###r"   TSc              #  8   K   |D ]  } | |      }||  y wNr!   )funcxsxrs       r#   mapMayber9   P   s(      G=Gs   c              #  >   K   |D ]  } | |      E d {     y 7 wr4   r!   )r5   r6   r7   s      r#   	concatMapr;   X   s%      7s   c              #     K   	 d  y # t         $ r]} |        }t        j                  |d      }|j                  r|j                  d    d| n|}|f|j                  dd  z   |_         d }~ww xY ww)Nz  r   
   )	Exceptiontextwrapindentargs)msg_fnemsgs      r#   contextrF   `   so      hooc4('(vv2cU#3!&&*$s%   A2	 A2	A/AA**A//A2c                D    t        dt        |       j                         )NzUnhandled type: )AssertionErrortyper   )r7   s    r#   assert_neverrJ   p   s     
+DG,<,<+=>
??r"   )maxsizec                ,    t        j                  |       S r4   )r   	from_file)template_fns    r#   _read_templaterO   t   s    !!+..r"   c                    t        j                  | j                  d            j                         }t        j                  |d      S )Nlatin1little)	byteorder)hashlibsha1encodedigestint
from_bytes)srU   s     r#   string_stable_hashr[   z   s5    <<*+224D>>$(>33r"   c                      e Zd ZU ded<   ded<   ded<   ded<   ddZdd	Z	 	 	 	 	 	 dd
Z	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	ddZ
ddZy)FileManagerstrinstall_dirtemplate_dirbooldry_runset[str]	filenamesc                L    || _         || _        t               | _        || _        y r4   )r_   r`   setrd   rb   )selfr_   r`   rb   s       r#   __init__zFileManager.__init__   s"    &(r"   c                `   	 t        |      5 }|j                         }d d d        |k7  r[t        j                  t        j
                  j                  |      d       t        |d      5 }|j                  |       d d d        y y # 1 sw Y   jxY w# t        $ r d }Y zw xY w# 1 sw Y   y xY w)NT)exist_okw)openreadOSErrorosmakedirspathdirnamewrite)rg   filenamecontentsfold_contentss        r#   _write_if_changedzFileManager._write_if_changed   s    	 h (1 vvx( |#KK1DAh$ "!" " $	( ( 	 L	 
" "s3   B BB +B$BB B! B!$B-c                t   t         j                  j                  | j                  |      } |       }t	        |t
              rd|vrzt        dz  dz  }	 t        t        j                  d   j                  xs |      j                         }	 |j                  t              j                         }i |ddd| d| z   i}t%        |      }|j'                  |      S t	        |t(              r|S t+        |       y # t        t        f$ r |j                         }Y w xY w# t         $ r |j"                  }Y w xY w)Ngenerated_commenttorchgenzgen.py__main__@zgenerated by z from )ro   rq   joinr`   
isinstancedict	REPO_ROOTr   sysmodules__file__absoluteKeyErrorAttributeErrorrelative_toas_posix
ValueErrorr-   rO   
substituter^   rJ   )	rg   rN   env_callabletemplate_pathenvgenerator_default	generatorgenerator_pathtemplates	            r#   substitute_with_templatez$FileManager.substitute_with_template   s4    T%6%6Dnc4 "#-$-
$:X$E!= $J/88M<M!hj 4%.%:%:9%E%N%N%PN'n-=VK=QQ &m4H&&s++S!J' !.1 = 1 : : <I=
 " 4%.^^N4s$   8C: #D :DDD76D7c                    | j                    d| }|| j                  vsJ d       | j                  j                  |       | j                  s'| j	                  ||      }| j                  ||       y y )N/zduplicate file write {filename})rN   r   )rt   ru   )r_   rd   addrb   r   rx   )rg   rt   rN   r   substitute_outs        r#   write_with_templatezFileManager.write_with_template   s     &&'q
3t~~-P/PP-8$||!::') ; N ""H~"N r"   c                *    | j                  |||       y r4   )r   )rg   rt   r   s      r#   rs   zFileManager.write   s    
 	  8\Br"   N)base_envc                  ddi}t        |      D 	cg c]	  }	dd|	 i }
}	|g|
z   }||D ]  j                  |        D ]C  }|D ]<  |v r1t        |   t              sJ d       |   j	                         |<   8g |<   > E dfd}| j
                  rd}|D ]5  } ||      }t        |      |z  } ||      } ||
|   |        |||       7 |j                  d      }|dk(  rt        |      }|d | }||d  }|D ]#  d   }| j                  | | | |fd	       % | j                  j                  | j                   d
| d|        y c c}	w )Nshard_id
Everythingr.   z'sharded keys in base_env must be a listc                l    |j                         D ]   \  }}|v s
J d|        | |xx   |z  cc<   " y )Nzundeclared sharded key )items)intofrom_kvsharded_keyss       r#   	merge_envz,FileManager.write_sharded.<locals>.merge_env   sD     1L(G,CA3*GG(Q1r"   r!   .c                      S r4   r!   )shards   r#   <lambda>z+FileManager.write_sharded.<locals>.<lambda>  s    5 r"   r   )r   dict[str, list[str]]r   r   returnNone)rangeupdater   listcopyrb   r[   rfindlenr   rd   discardr_   )rg   rt   r   key_fnr   
num_shardsr   r   
everythingishards
all_shardskeyr   itemsidr   dot_posbase_filename	extensionr   r   s          `             @r#   write_shardedzFileManager.write_sharded   s    '1,%?
+0+<(
&'Z1QC!(
 (
 !\F*
# 'X&'   	$C# $%<%c
D A@A  "'s!2E#J!#E#J$	$	
 <<E 	'D,C$S)J6Ct$CfSk3'j#&	' ..%b=(mG '*WX&	 	EZ(H$$ /(I;7=	 	 -
9+F	
c(
s   Ec           	         dj                  |dj                  d t        | j                        D                    }| j	                  ||       y)z[Write a file containing the list of all outputs which are
        generated by this script.zset({}
    {})z
    c              3  ,   K   | ]  }d |z   d z     yw)"Nr!   ).0r-   s     r#   	<genexpr>z,FileManager.write_outputs.<locals>.<genexpr>  s     Nt#*s*Ns   N)formatr~   sortedrd   rx   )rg   variable_namert   contents       r#   write_outputszFileManager.write_outputs  sD     $**MMNvdnn7MNN
 	x1r"   c                    t         j                  j                  | j                  t         j                  j	                  t
                    S )z
        This needs to be deterministic. The template dir is an absolute path
        that varies across builds. So, just use the path relative to this file,
        which will point to the codegen source but will be stable.
        )ro   rq   relpathr`   rr   r   rg   s    r#   template_dir_for_commentsz%FileManager.template_dir_for_comments  s,     wwt00"''//(2KLLr"   )r_   r^   r`   r^   rb   ra   r   r   )rt   r^   ru   r^   r   r   )rN   r^   r   "Callable[[], str | dict[str, Any]]r   r^   )rt   r^   rN   r^   r   r   r   r   )rt   r^   r   r   r   r   )rt   r^   r   Iterable[T]r   zCallable[[T], str]r   z#Callable[[T], dict[str, list[str]]]r   rX   r   zdict[str, Any] | Noner   rc   r   r   )r   r^   rt   r^   r   r   r   r^   )r   r   r   __annotations__rh   rx   r   r   rs   r   r   r   r!   r"   r#   r]   r]      s    M".P	BOO O 9	O
 
O CC 9C 
	C +/?
?
 ?

 #?
 :?
 ?
 (?
 ?
 
?
B2Mr"   r]   c                    t         j                  j                  | j                  d      }|r|n| j                  }t        ||| j                        S )N	templates)r_   r`   rb   )ro   rq   r~   source_pathr_   r]   rb   )optionsr_   r`   s      r#   make_file_managerr   (  sE     77<< 3 3[AL!,+'2E2EKlGOO r"   c                d    t         j                  dk\  rddlm}  || ||      S t	        | ||      S )N)   
   r   )pformat)rA   width)r   version_infopprintr   _pformat)objrA   r   r   s       r#   dataclass_reprr   3  s3     7""sFE**Ce44r"   c                   t        |       sJ dt        |               | j                  j                  }|t	        |      dz   z  }t        |       D cg c]1  }|j                  s|j                  t        | |j                        f3 }}g }|D ]  \  }}	|t	        |      z   dz   }
t        |	      rt        |	|||
      }nTt        |	t              rt        |	|||
      }n5t        |	t        t        t        f      rt!        |	|||
      }nt        |	      }|j#                  | d|         |dz  }d| j%                  |      }| d| dS c c}w )Nz%obj should be a dataclass, received: r>   = z,
())r   rI   	__class__r   r   r   reprr-   getattrr   r   r   _format_dictr   rf   tuple_format_listappendr~   )r   rA   r   curr_indent
class_namerv   fields_list
fields_strr-   attr_curr_indentstr_repr
indent_strbodys                 r#   r   r   A  sT    Q Ed3i[QQ''J3z?Q&&K;A#;Qa!&&AFFGC01QKQJ! 0
d #SY.2fe\BHd##D&%FHtS%01#D&%FHDzHTF!H:./0 s"J"":.D\4&"") Rs   E%$Ec           
        ||dz   z  }g }| j                         D ]V  \  }}t        |      }t        |      rt        ||||t	        |      z         n
t        |      }|j                  | d|        X t        ||||dd      S )Nr   z: {})r   r   r   r   r   r   _format)	r   rA   r   r   	dict_reprr   r   k_reprv_strs	            r#   r   r   d  s     6A:KI

 /1a A Q{S['@Aa 	
 	F82eW-./ 9fe[#sCCr"   c           	         ||dz   z  }| D cg c]&  }t        |      rt        ||||      n
t        |      ( }}t        | t              rdnd\  }}t        ||||||      S c c}w )Nr>   )[])r   r   )r   r   r   r   r   r   )r   rA   r   r   l	list_reprstartends           r#   r   r   x  s|     6A:K  4@?FE;/QOI   *$5:JE39fe[%EEs   +A!c                    d\  }}t        t        |             |k\  rd}d|z  }d|z  }d| | j                  |       }	| | |	 | S )N) r  r=   r   r%   )r   r   r~   )
r   rA   r   r   r  r  	delimitercurr_indent_strr   r   s
             r#   r   r     sk     "(I
4
%	+vJ	{?+,11*=DWZLse,,r"   c                      e Zd ZdZ	 d		 	 	 	 	 	 	 d
dZe	 d	 	 	 	 	 dd       Zedd       Zedd       Z	edd       Z
dddZy)NamespaceHelpera  A helper for constructing the namespace open and close strings for a nested set of namespaces.

    e.g. for namespace_str torch::lazy,

    prologue:
    namespace torch {
    namespace lazy {

    epilogue:
    } // namespace lazy
    } // namespace torch
    c                L   |j                  d      }t        |      |k  sJ d| d| d       || _        dj                  |D cg c]  }d| d
 c}      | _        dj                  t        |      D cg c]  }d| 	 c}      | _        || _        || _        y c c}w c c}w )	N::z"Codegen doesn't support more than z# level(s) of custom namespace. Got r   r=   z
namespace z {z} // namespace )	r*   r   cpp_namespace_r~   	prologue_reversed	epilogue_namespaces_entity_name_)rg   namespace_strentity_name	max_levelcpp_namespacesns         r#   rh   zNamespaceHelper.__init__  s     ',,T29,	o/	{:]^k]llmn	o,+#PAj3$7#PQ-5n-EFs#F
 *' $QFs   B5B!c                r    | j                  d      }|d   }dj                  |dd       }t        |||      S )zq
        Generate helper from nested namespaces as long as class/function name. E.g.: "torch::lazy::add"
        r  r   N)r  r  r  )r*   r~   r  )namespaced_entityr  namesr  r  s        r#   from_namespaced_entityz&NamespaceHelper.from_namespaced_entity  sE     "''-Bi		%*-'[I
 	
r"   c                    | j                   S r4   )r  r   s    r#   prologuezNamespaceHelper.prologue      ~~r"   c                    | j                   S r4   )r  r   s    r#   epiloguezNamespaceHelper.epilogue  r  r"   c                    | j                   S r4   )r  r   s    r#   r  zNamespaceHelper.entity_name  s       r"   c                6    | j                   r| j                   S |S )z
        Return the namespace string from joining all the namespaces by "::" (hence no leading "::").
        Return default if namespace string is empty.
        )r  )rg   defaults     r#   get_cpp_namespacez!NamespaceHelper.get_cpp_namespace  s    
 '+&9&9t""FwFr"   N)r     )r  r^   r  r^   r  rX   r   r   )r&  )r  r^   r  rX   r   r  r   )r  )r$  r^   r   r^   )r   r   r   __doc__rh   staticmethodr  propertyr  r!  r  r%  r!   r"   r#   r  r    s     KL( (/2(DG(	(  12

+.
	
 
     ! !Gr"   r  c                  t    e Zd ZU ded<   dddZddZddZddZddZdd	Z	e
dd
       ZddZddZddZy)
OrderedSetzdict[T, Literal[None]]storageNc                L    |i | _         y t        j                  |      | _         y r4   )r,  r   fromkeys)rg   iterables     r#   rh   zOrderedSet.__init__  s    DL==2DLr"   c                    || j                   v S r4   r,  rg   r   s     r#   __contains__zOrderedSet.__contains__  s    t||##r"   c                H    t        | j                  j                               S r4   )iterr,  keysr   s    r#   __iter__zOrderedSet.__iter__  s    DLL%%'((r"   c                N    | j                   j                  |j                          y r4   )r,  r   )rg   r   s     r#   r   zOrderedSet.update  s    EMM*r"   c                "    d | j                   |<   y r4   r1  r2  s     r#   r   zOrderedSet.add  s    !Tr"   c                X    t               }| j                  j                         |_        |S r4   )r+  r,  r   )rg   rets     r#   r   zOrderedSet.copy  s"    '\ll'')
r"   c                 b    | d   j                         }| dd  D ]  }|j                  |        |S )Nr   r>   )r   r   )rB   r;  rZ   s      r#   unionzOrderedSet.union  s6    1gllnab 	AJJqM	
r"   c                .    t         j                  | |      S r4   )r+  r=  rg   others     r#   __or__zOrderedSet.__or__  s    e,,r"   c                (    | j                  |       | S r4   )r   r?  s     r#   __ior__zOrderedSet.__ior__  s    Er"   c                    t        |t              r| j                  |j                  k(  S t        | j                  j	                               |k(  S r4   )r   r+  r,  rf   r6  r?  s     r#   __eq__zOrderedSet.__eq__  s<    eZ(<<5==00t||((*+u44r"   r4   )r/  zIterable[T] | Noner   r   )r   r1   r   ra   )r   zIterator[T])r   OrderedSet[T]r   r   )r   r1   r   r   )r   rF  )rB   rF  r   rF  )r@  rF  r   rF  )r@  rF  r   r   )r@  objectr   ra   )r   r   r   r   rh   r3  r7  r   r   r   r(  r=  rA  rC  rE  r!   r"   r#   r+  r+    sI    ##3$)+"
  -5r"   r+  )r+   r^   r   ztuple[str, list[str]])r5   zCallable[[T], S | None]r6   r   r   Iterator[S])r5   zCallable[[T], Sequence[S]]r6   r   r   rH  )rC   zCallable[[], str]r   zIterator[None])r7   r   r   r   )rN   r^   r   r   )rZ   r^   r   rX   r4   )r   r   r_   z
str | Noner   r]   )r   P   )r   r	   rA   rX   r   rX   r   r^   )r   )
r   r	   rA   rX   r   rX   r   rX   r   r^   )
r   zdict[Any, Any]rA   rX   r   rX   r   rX   r   r^   )
r   z&list[Any] | set[Any] | tuple[Any, ...]rA   rX   r   rX   r   rX   r   r^   )r   z	list[str]rA   rX   r   rX   r   rX   r  r^   r  r^   r   r^   )<
__future__r   
contextlib	functoolsrT   ro   r&   r   r@   dataclassesr   r   enumr   r   pathlibr   typingr	   r
   r   r   r   r   r   r   r   r   typing_extensionsr   torchgen.code_templater   argparser   r   r   parentr   r   IDENT_REGEXr0   r1   r2   r9   r;   contextmanagerrF   rJ   	lru_cacherO   r[   r]   r   r   r   r   r   r   r  r+  r!   r"   r#   <module>rX     sR   "    	 	 
  ,     # / " N##%,,33	
$T 
$  $ CLCL 	 	@ T"/ #/
4bM bMN 37%/ 5	55 5 		5$ 	 #	 # #  # 	 #
 	 #FD
DD D 	D
 	D(F
0FF F 	F
 	F--- - 	-
 - 
- 	-&>G >GB,5 ,5r"   