ó
    EñiH  ã                   ó(  • S SK r S SKrS SKrS SKrS SKJr  S SKJr  S SKJ	r	  S SK
JrJrJr  S SKrS SKJr  S SKJr  S SKJs  Jr  S SKJs  Jr  S SKJrJr  S SKJr  S SKJ r J!r!  / S	Qr"S
\#S\$\#\#4   4S jr%S\\&   S\RN                  S\(\#\4   4S jr)S\RN                  S\(\#\4   S\R$                  RT                  4S jr+S)S\R$                  RT                  S\R$                  RT                  4S jjr,S\RT                  S\RT                  4S jr-S\RT                  S\.\RN                     S\.\RN                     S\.\RN                     4S jr/\R`                  \Rb                  \Rd                  \Rf                  \Rh                  \Rj                  \Rl                  \Rn                  \Rp                  \Rr                  \Rn                  \Rt                  \Rv                  /r<\Rz                  \R|                  /r?\R`                  \R€                  \Rb                  \R‚                  \Rd                  S 0rBS\.\RN                     S\(\#\RT                  4   4S jrCS\.\RN                     S\(\#\RT                  4   S\(\RT                  \RT                  4   4S jrD " S S 5      rES*S! jrFS"\ES\G4S# jrH " S$ S%5      rIS\R”                  4S\R$                  RT                  S&\\(\#\4      S'\&\R”                     S\R$                  RT                  4S( jjrKg)+é    N)Údefaultdict)ÚIterable)ÚEnum)ÚAnyÚcastÚOptional)ÚArgumentÚTarget)Ú	ShapeProp)Úfuse_conv_bn_evalÚfuse_linear_bn_eval)Úmatches_module_patternÚreplace_node_moduleÚfuseÚremove_dropoutÚextract_subgraphÚmodules_to_mkldnnÚreset_modulesÚMklSubgraphÚgen_mkl_autotunerÚuse_mkl_lengthÚ	UnionFindÚoptimize_for_inferenceÚtargetÚreturnc                 óN   • U R                  SS5      Gt pU(       a  US   U4$ SU4$ )zd
Splits a qualname into parent path and last atom.
For example, `foo.bar.baz` -> (`foo.bar`, `baz`)
Ú.é   r   Ú )Úrsplit)r   ÚparentÚnames      Ú_/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/fx/experimental/optimization.pyÚ_parent_namer$   %   s1   € ð
 —M‘M # qÓ)�M€VÞˆ6�!‰9¨Ð,Ð, B¨Ð,Ð,ó    ÚpatternÚnodeÚmodulesc                 ó†  • [        UR                  5      S:X  a  gUR                  S   U4n[        X5       H‡  u  pE[        U[        R
                  5      (       d    gUR                  S:w  a    g[        UR                  [        5      (       d    gUR                  U;  a    g[        X%R                     5      ULd  M‡    g   g)Nr   FÚcall_moduleT)
ÚlenÚargsÚzipÚ
isinstanceÚfxÚNodeÚopr   ÚstrÚtype)r&   r'   r(   ÚnodesÚexpected_typeÚcurrent_nodes         r#   r   r   /   s£   € ô ˆ4�9‰9ƒ~˜ÓØØ"&§)¡)¨A¡,°Ð!5€EÜ'*¨7Ö':Ñ#ˆÜ˜,¬¯©×0Ñ0ÙØ�?‰?˜mÓ+ÙÜ˜,×-Ñ-¬s×3Ñ3ÙØ×Ñ gÓ-ÙÜ�×+Ñ+Ñ,Ó-°]ÔBÙñ (;ð r%   Ú
new_modulec                 óê   • [        U R                  [        5      (       d!  [        S[	        U R                  5       35      e[        U R                  5      u  p4X!U R                  '   [        X   XB5        g )NúExpected str target, got )r.   r   r2   ÚAssertionErrorr3   r$   Úsetattr)r'   r(   r7   Úparent_namer"   s        r#   r   r   C   s\   € ô �d—k‘k¤3×'Ñ'ÜÐ8¼¸d¿k¹kÓ9JÐ8KÐLÓMÐMÜ$ T§[¡[Ó1Ñ€KØ%ˆD�K‰KÑÜˆGÑ  $Õ3r%   Úmodelc                 óÀ  • [         R                  [         R                  4[         R                  [         R                  4[         R
                  [         R                  4[         R                  [         R                  4/nU(       d  [        R                  " U 5      n U(       a)  [        U [        R                  R                  5      (       d  [        R                  " U 5      nOU n[        UR!                  5       5      n[        R                  " UR"                  5      nU GH%  nUR$                   GH  n['        XxU5      (       d  M  [)        UR*                  S   R,                  5      S:”  a  M?  XXR*                  S   R.                     n	XXR.                     n
U
R0                  (       d  M{  US   [         R                  [         R                  [         R
                  4;   a  [3        Xš5      nO[5        Xš5      n[7        UR*                  S   X[5        UR9                  UR*                  S   5        UR;                  U5        GM     GM(     [        R                  " XF5      $ )z’
Fuses convolution/BN and linear/BN layers for inference purposes.
Will deepcopy your model by default, but can modify the model inplace as well.
r   r   )ÚnnÚConv1dÚBatchNorm1dÚConv2dÚBatchNorm2dÚConv3dÚBatchNorm3dÚLinearÚcopyÚdeepcopyr.   Útorchr/   ÚGraphModuleÚsymbolic_traceÚdictÚnamed_modulesÚgraphr4   r   r+   r,   Úusersr   Útrack_running_statsr   r   r   Úreplace_all_uses_withÚ
erase_node)r=   ÚinplaceÚno_traceÚpatternsÚfx_modelr(   Ú	new_graphr&   r'   Úfirst_layerÚbnÚfused_layers               r#   r   r   M   sœ  € ô 
�‰”B—N‘NÐ#Ü	�‰”B—N‘NÐ#Ü	�‰”B—N‘NÐ#Ü	�‰”B—N‘NÐ#ð	€Hö Ü—’˜eÓ$ˆÞœ: e¬U¯X©X×-AÑ-A×BÑBÜ×$Ò$ UÓ+‰àˆÜ�8×)Ñ)Ó+Ó,€GÜ—’˜hŸn™nÓ-€IäˆØ—O•OˆDÜ% g°W×=Ó=Ü�t—y‘y ‘|×)Ñ)Ó*¨QÓ.áØ%§i¡i°¡l×&9Ñ&9Ñ:�ØŸ[™[Ñ)�Ø×-×-ÙØ˜1‘:¤"§)¡)¬R¯Y©Y¼¿	¹	Ð!BÓBÜ"3°KÓ"D‘Kä"5°kÓ"F�KÜ# D§I¡I¨a¡L°'ÔGØ×*Ñ*¨4¯9©9°Q©<Ô8Ø×$Ñ$ T×*ô $ñ ô" �>Š>˜(Ó.Ð.r%   c                 ó    • [         R                  " U 5      n " S S[        R                   R                  5      nU" U5      R	                  5       $ )z-
Removes all dropout layers from the module.
c                   óP   ^ • \ rS rSrS\S\\S4   S\\\	4   S\	4U 4S jjr
SrU =r$ )	Ú&remove_dropout.<locals>.DropoutRemoveré{   r   r,   .Úkwargsr   c                 óÒ   >• [        U R                  U   [        R                  5      (       a+  [	        U5      S:w  a  [        S[	        U5       35      eUS   $ [        TU ]  XU5      $ )Nr   z Expected 1 arg for Dropout, got r   )r.   Ú
submodulesr?   ÚDropoutr+   r:   Úsuperr*   )Úselfr   r,   r_   Ú	__class__s       €r#   r*   Ú2remove_dropout.<locals>.DropoutRemover.call_module|   s]   ø€ ô ˜$Ÿ/™/¨&Ñ1´2·:±:×>Ñ>Ü�t“9 “>Ü(Ð+KÌCÐPTËIÈ;Ð)WÓXÐXØ˜A‘w�ä‘wÑ*¨6¸Ó@Ð@r%   © )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r
   Útupler	   rL   r2   r   r*   Ú__static_attributes__Ú__classcell__)re   s   @r#   ÚDropoutRemoverr]   {   sE   ø† ð	AØ ð	AØ(-¨h¸¨mÑ(<ð	AØFJÈ3ÐPSÈ8Ánð	Aà÷	Aõ 	Ar%   ro   )r/   rK   rI   ÚTransformerÚ	transform)r=   rV   ro   s      r#   r   r   u   sB   € ô × Ò  Ó'€Hô	AœŸ™×-Ñ-ô 	Añ ˜(Ó#×-Ñ-Ó/Ð/r%   Úorig_moduler4   ÚinputsÚoutputsc                 ól  ^	• [         R                  " 5       n0 m	U H#  nUR                  UR                  5      nUT	U'   M%     U H  nUR	                  UU	4S j5      nUT	U'   M      UR                  U Vs/ s H  nT	U   PM
     sn5        UR                  5         [         R                  " X5      $ s  snf )zy
Given lists of nodes from an existing graph that represent a subgraph, returns a submodule that executes that subgraph.
c                 ó   >• TU    $ ©Nrg   )ÚxÚenvs    €r#   Ú<lambda>Ú"extract_subgraph.<locals>.<lambda>˜   s	   ø€ °s¸1²vr%   )r/   ÚGraphÚplaceholderr"   Ú	node_copyÚoutputÚlintrJ   )
rr   r4   rs   rt   rW   ÚinputÚnew_noder'   r   ry   s
            @r#   r   r   ‰   s¥   ø€ ô —’“
€IØ"$€CÛˆØ×(Ñ(¨¯©Ó4ˆØˆˆE‹
ñ ó ˆØ×&Ñ& tÔ-=Ó>ˆØˆˆD‹	ñ ð ×Ñ±Ó8² f�c˜&”k±Ñ8Ô9Ø‡N�NÔÜ�>Š>˜+Ó1Ð1ùò 9s   Á5B1c                 ó.   • [         R                  " U 5      $ rw   )Ú	th_mkldnnÚMkldnnBatchNorm)ÚaÚ_s     r#   rz   rz   ¶   s   € ¤×!:Ò!:¸1Ô!=r%   c                 ó  • 0 nU  Hù  nUR                   S:X  d  M  [        UR                  [        5      (       d!  [	        S[        UR                  5       35      eXR                     n[        U5      [        ;   d  Mx  [        [        U5         " U[        R                  5      n[        U[        R                  5      (       d  [	        S[        U5       35      e[        R                  " U5      X%'   [        X1U5        Mû     U$ )z¸
For each node, if it's a module that can be preconverted into MKLDNN,
then we do so and create a mapping to allow us to convert from the MKLDNN
version of the module to the original.
r*   r9   zExpected nn.Module, got )r1   r.   r   r2   r:   r3   Ú
mkldnn_maprI   Úfloatr?   ÚModulerG   rH   r   )r4   r(   Úold_modulesr'   Ú
cur_moduler7   s         r#   r   r   º   sÍ   € ð /1€KÛˆØ�7‰7�mÕ#Ü˜dŸk™k¬3×/Ñ/Ü$Ð'@ÄÀdÇkÁkÓARÐ@SÐ%TÓUÐUØ §¡Ñ-ˆJÜ�JÓ¤:Õ-ä'¬¨ZÓ(8Ò9¸*ÄeÇkÁkÓR�
Ü! *¬b¯i©i×8Ñ8Ü(Ð+CÄDÈÓDTÐCUÐ)VÓWÐWÜ*.¯-ª-¸
Ó*C�Ñ'Ü# D°:Ö>ñ ð Ðr%   rŒ   c                 ó   • U  Hx  nUR                   S:X  d  M  [        UR                  [        5      (       d!  [	        S[        UR                  5       35      eXR                     nXB;   d  Mj  [        X1X$   5        Mz     g)zU
Maps each module that's been changed with `modules_to_mkldnn` back to its
original.
r*   r9   N)r1   r.   r   r2   r:   r3   r   )r4   r(   rŒ   r'   r�   s        r#   r   r   Ð   sg   € ó ˆØ�7‰7�mÕ#Ü˜dŸk™k¬3×/Ñ/Ü$Ð'@ÄÀdÇkÁkÓARÐ@SÐ%TÓUÐUØ §¡Ñ-ˆJØÕ(Ü# D°;Ñ3JÖKò r%   c                   ó6   • \ rS rSrS\R
                  4S jrSrg)r   éâ   Úfx_graphc                 ó:   • Xl         / U l        / U l        / U l        g rw   )r‘   r4   Ústart_nodesÚ	end_nodes)rd   r‘   s     r#   Ú__init__ÚMklSubgraph.__init__ã   s   € Ø ŒØ$&ˆŒ
Ø*,ˆÔØ(*ˆ�r%   )r”   r‘   r4   r“   N)rh   ri   rj   rk   r/   r|   r•   rm   rg   r%   r#   r   r   â   s   † ð+ §¡÷ +r%   r   c                 óH   ^ ^^^^• SmSmS[         S[        4U UUUU4S jjnU$ )a?  
This generates a heuristic that can be passed into `optimize_for_inference` that
determines whether a subgraph should be run in MKL by running it with the example_inputs.

Example usage:
    heuristic = gen_mkl_autotuner(example_inputs, iters=10)
    fast_model = optimization.optimize_for_inference(model, heuristic)
NrN   r   c                 ó   >^^• U R                   nT
cF  U R                  R                  m
U R                  R                  m[	        T
5      R                  T	5        U Vs/ s H#  n[        R                  " UR                  5      PM%     snm[        [        [        R                     U R                   Vs/ s H  o"R                  S   PM     sn5      n[        T
U R                   X5      mUU4S jnU" UU4S j5      n[#        TR$                  R                   ['        TR)                  5       5      T5        U" UU4S j5      nXV:  $ s  snf s  snf )Nr   c                 óÂ   >• [        T5       H
  nU " 5         M     [        R                  " 5       n[        T5       H
  nU " 5         M     [        R                  " 5       U-
  $ rw   )ÚrangeÚtime)Úfr‡   ÚbeginÚitersÚwarmups      €€r#   Ú	benchmarkÚ?gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.benchmark  sE   ø€ Ü˜6–]�Ù–ñ #ä—I’I“KˆEÜ˜5–\�Ù–ñ "ä—9’9“; Ñ&Ð&r%   c                  óš   >• T" T V s/ s H  o R                  5       PM     sn 6  V s/ s H  o R                  5       PM     sn $ s  sn f s  sn f rw   )Ú	to_mkldnnÚto_dense)ÚiÚsample_inputsÚ	submodules    €€r#   rz   Ú>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>
  s?   ø€ Ù&/ÉÓ1WÊÀA·+±+¶-ÉÑ1WÑ&XóÚ&X —
‘
–Ñ&XòùÚ1Wùòs
   ˆA§Ac                  ó   >• T" T 6 $ rw   rg   )r¦   r§   s   €€r#   rz   r¨     s
   ø€ ©	°=Ñ(Ar%   )r“   r‘   Úowning_modulerŒ   r   Ú	propagaterI   ÚrandnÚshaper   Úlistr/   r0   r”   r,   r   r4   r   rN   rL   rM   )rN   Úinput_nodesr'   Úoutput_argsr    Úmkl_timeÚno_mkl_timer¦   r§   Úexample_inputsrV   rž   rŒ   rŸ   s          @@€€€€€r#   Úuse_mkl_heuristicÚ,gen_mkl_autotuner.<locals>.use_mkl_heuristicö   s  ú€ à×'Ñ'ˆØÑØ—~‘~×3Ñ3ˆHØŸ.™.×4Ñ4ˆKÜ�hÓ×)Ñ)¨.Ô9Ù=HÓIº[°TœŸš T§Z¡ZÖ0¹[ÑIˆÜœ4¤§¡™=ÀEÇOÂOÓ*TÂO¸D¯9©9°Q¬<ÁOÑ*TÓUˆÜ$ X¨u¯{©{¸KÓUˆ	ö	'ñ õó
ˆô 	Ø�O‰O×!Ñ!Ü�×(Ñ(Ó*Ó+àô		
ñ  Õ AÓBˆØÑ%Ð%ùò3 JùÚ*Ts   Á*EÂ3E
)r   Úbool)r³   rž   rŸ   r´   rV   rŒ   s   ``` @@r#   r   r   ê   s0   ü€ ð €HØ€Kð &¤ð  &´÷  &ó  &ðD Ðr%   rN   c                 ó2   • [        U R                  5      S:„  $ )z¯
This is a heuristic that can be passed into `optimize_for_inference` that
determines whether a subgraph should be run in MKL by checking if there
are more than 2 nodes in it
é   )r+   r4   )rN   s    r#   r   r     s   € ô ˆu�{‰{Ó˜aÑÐr%   c                   óL   • \ rS rSrS rS\4S jrS\S\4S jrS\S\4S	 jrS
r	g)r   i$  c                 ó0   • S /U-  U l         S/U-  U l        g )Nr   ©r!   Úsize)rd   Úns     r#   r•   ÚUnionFind.__init__%  s   € Ø,0¨6°A©:ˆŒØ !˜s Q™wˆ�	r%   Úvc                 ó>   • XR                   U'   SU R                  U'   g )Nr   r»   )rd   r¿   s     r#   Úmake_setÚUnionFind.make_set)  s   € Ø�‰�A‰Øˆ�	‰	�!Šr%   r   c                 óÀ   • U R                   U   nX:X  a  U$ Uc  [        S5      eU R                  U5      U R                   U'   [        [        U R                   U   5      $ )NzParent is None)r!   r:   Úfindr   Úint)rd   r¿   Úpars      r#   rÄ   ÚUnionFind.find-  sT   € Ø�k‰k˜!‰nˆØ‹8ØˆHØ‰;Ü Ð!1Ó2Ð2ØŸ™ 3›ˆ�‰�A‰Ü”C˜Ÿ™ Q™Ó(Ð(r%   r†   Úbc                 óü   • U R                  U5      U R                  U5      p!X:X  a  U$ U R                  U   U R                  U   :  a  X!p!XR                  U'   U R                  U==   U R                  U   -  ss'   g rw   )rÄ   r¼   r!   )rd   r†   rÈ   s      r#   ÚjoinÚUnionFind.join6  se   € Ø�y‰y˜‹|˜TŸY™Y q›\ˆ1Ø‹6ØˆHØ�9‰9�Q‰<˜$Ÿ)™) A™,Ó&ØˆqØ�‰�A‰Ø�	‰	�!‹˜Ÿ	™	 !™Ñ$Œr%   r»   N)
rh   ri   rj   rk   r•   rÅ   rÁ   rÄ   rÊ   rm   rg   r%   r#   r   r   $  s9   † ò'ð˜#ô ð)�cð )˜cô )ð%�cð %˜c÷ %r%   r   Úpass_configÚtracerc                 ó  ^^• SSS[         0S.nUc  0 nUR                  U5        US   (       a  [        U 5      n US   (       a  [        U 5      n US   SL a  U $ [	        US   [
        5      (       d  [        S	5      eSUS   ;  a  [        S
5      eUS   S   nU" 5       nUR                  [        R                  " U 5      5      m[        R                  " UR                  T5        [        U R                  5       5      n " S S[        5      n[        TR                   5       GH  nUR"                  n	UR$                  S:X  a£  XhR&                     n
[)        U
5      [*        ;   a�  UR,                  n	[/        U
R1                  5       S5      nUbX  UR2                  [4        R6                  :w  a  [9        S5      eUR:                  [4        R:                  " S5      :w  a  [9        S5      eOQUR$                  S:X  aA  UR&                  [*        ;   a  UR,                  n	O UR&                  [<        ;   a  UR>                  n	X—R"                  :w  d  GM&  X—R>                  :X  a$  [A        S URB                   5       5      (       d  GMY  TRE                  U5         [        RF                  " URB                  U4S j5      nSSS5        [I        [J        [        RL                  RN                     W5      Ul!        TRQ                  U5         TRS                  SSU45      nURU                  U5        U4Ul!        SSS5        GM     [W        [        TR                   5      U5      nUTl,        TR                    HÆ  nUR$                  S:X  d  M  UR&                  S:X  d  M'  URB                  S   n[        URZ                  5      nU HI  nUR$                  S:X  d  M  UR&                  S:X  d  M'  URU                  U5        TR]                  U5        MK     [_        URZ                  5      S:X  d  Mµ  TR]                  U5        MÈ     [_        TR                   5      n[a        U5      mU4S jn[c        TR                   5       GHU  u  nnUR$                  S:X  a*  UR&                  S:X  a  UUl2        TRg                  U5        MA  UR$                  S:X  aM  UR&                  S:X  a=  U" URB                  S   5      c  [9        S5      eU" URB                  S   5      Ul4        Mž  URj                   Vs/ s H7  n[	        U[        Rl                  5      (       d  M$  U" U5      c  M/  U" U5      PM9     nn[_        U5      S:X  a  Mý  [A        S U 5       5      (       a  [9        S5      e[o        U5      nUS   Ul8        USS  H  nTRs                  US   U5        M     GMX     [u        U4S j5      nTR                    HÝ  n[w        US5      (       a7  UTRy                  URp                  5         R                   R{                  U5        [w        US5      (       a7  UTRy                  URd                  5         R|                  R{                  U5        [w        US 5      (       d  M¦  UTRy                  URh                  5         R~                  R{                  U5        Mß     UR�                  5        Hy  nU" U5      (       a  M  UR|                  UR~                  -    H4  nURB                  S   nURU                  U5        TR]                  U5        M6     [ƒ        UR                   Xn5        M{     SnTR                    H*  nUR&                  S:X  d  UR&                  S:X  d  M%  US-  nM,     [„        R†                  " [ˆ        5      R‹                  S!U5        TR�                  5         [        R                  " U T5      nU$ ! , (       d  f       GN4= f! , (       d  f       GMß  = fs  snf )"aß  
Performs a set of optimization passes to optimize a model for the
purposes of inference. Specifically, the passes that are run are:
1. Conv/BN fusion
2. Dropout removal
3. MKL layout optimizations

The third optimization takes a function `use_mkl_heuristic` that's used
to determine whether a subgraph should be explicitly run in MKL layout.

Note: As FX does not currently handle aliasing, this pass currently
assumes nothing aliases. If that isn't true, use at your own risk.
TÚ	heuristic)Úconv_bn_fuser   Úmkldnn_layout_optimizeNrÐ   r   rÑ   Fz+mkldnn_layout_optimize config is not a dictz4Heuristic not found in mkldnn_layout_optimize configc                   ó    • \ rS rSrSrSrSrSrg)Ú*optimize_for_inference.<locals>.MklSupportil  r   r¸   é   rg   N)rh   ri   rj   rk   ÚNOÚYESÚUNKNOWNrm   rg   r%   r#   Ú
MklSupportrÓ   l  s   † ØˆØˆØ‹r%   rØ   r*   z)this pass is only for torch.float modulesÚcpuz!this pass is only for CPU modulesÚcall_functionc              3   ó>   #   • U  H  oR                   S :H  v •  M     g7f)r¤   N)r   )Ú.0Úargs     r#   Ú	<genexpr>Ú)optimize_for_inference.<locals>.<genexpr>‹  s   é € ÐIºy¸Ÿ:™:¨Ö3ºyùs   ‚c                 ó*   >• TR                  SU 45      $ )Nr£   )Úcall_method)r½   r‘   s    €r#   rz   Ú(optimize_for_inference.<locals>.<lambda>�  s   ø€ ¨×)=Ñ)=¸kÈAÈ4Ô)Pr%   rá   r¤   r   r£   c                 ó¶   >• [        U S5      (       a  TR                  U R                  5      $ [        U S5      (       a  TR                  U R                  5      $ g )NÚcolorÚstart_color)ÚhasattrrÄ   rä   rå   )r½   Úufs    €r#   Ú	get_colorÚ)optimize_for_inference.<locals>.get_color¬  sF   ø€ Ü�1�g×ÑØ—7‘7˜1Ÿ7™7Ó#Ð#Ü�1�m×$Ñ$Ø—7‘7˜1Ÿ=™=Ó)Ð)Ør%   z!Expected color for to_dense inputc              3   ó(   #   • U  H  oS L v •  M
     g 7frw   rg   )rÜ   r¥   s     r#   rÞ   rß   Ð  s   é € Ð1¢j ˜•9¢jùs   ‚zFound None in cur_colorsr   c                  ó   >• [        T 5      $ rw   )r   )r‘   s   €r#   rz   râ   ×  s
   ø€ ÄÈHÔ@Ur%   rä   rå   Ú	end_colorzmkldnn conversions: %s)Gr   Úupdater   r   r.   rL   ÚRuntimeErrorÚtracerG   rH   r/   rJ   ÚrootrM   r   r®   r4   rÕ   r1   r   r3   Úmkldnn_supportedrÖ   ÚnextÚ
parametersÚdtyperI   rŠ   r:   ÚdeviceÚmkldnn_supported_unknownr×   Úanyr,   Úinserting_beforeÚmap_argr   rl   r'   r	   Úinserting_afterÚcreate_noderQ   r   rŒ   rO   rR   r+   r   Ú	enumeraterå   rÁ   rì   Úall_input_nodesr0   Úsortedrä   rÊ   r   ræ   rÄ   Úappendr“   r”   Úvaluesr   ÚloggingÚ	getLoggerrh   Úinfor€   )r=   rÌ   rÍ   Údefault_pass_configr´   Ú
cur_tracerr(   rØ   r'   Úsupports_mkldnnr�   Úsample_parameterÚmkldnn_argsÚdense_xrŒ   Úprv_noderO   ÚuserÚ	num_nodesrè   Úcur_idxr¥   Ú
cur_colorsÚother_colorÚmkldnn_graphsrN   ÚprvÚmkldnn_conversionsÚresultr‘   rç   s                                @@r#   r   r   @  s€  ù€ ð& ØØ#.´Ð"?ñÐð
 ÑØˆØ×Ñ˜{Ô+à˜>×*Ü�U“ˆØÐ+×,Ü˜uÓ%ˆØÐ3Ñ4¸Ò=ØˆÜÐ)Ð*BÑCÄT×JÑJÜÐHÓIÐIØÐ-Ð.FÑGÓGÜÐQÓRÐRØ+Ð,DÑEÀkÑRÐá“€JØ×Ñ¤§¢¨eÓ 4Ó5€HÜ‡N‚N�:—?‘? HÔ-Ü$(¨×)<Ñ)<Ó)>Ó$?€Gô”Tô ô �X—^‘^×$ˆØ$Ÿ-™-ˆØ�7‰7�mÓ#Ø §¡Ñ-ˆJÜ�JÓÔ#3Ó3Ø",§.¡.�Ü#'¨
×(=Ñ(=Ó(?ÀÓ#FÐ Ø#Ñ/Ø'×-Ñ-´·±Ó<Ü,ØGóð ð (×.Ñ.´%·,²,¸uÓ2EÓEÜ,Ð-PÓQÐQøØ�W‰W˜Ó'Ø�{‰{Ô.Ó.Ø",§.¡.‘Ø—‘Ô 8Ó8Ø",×"4Ñ"4�àŸm™mÖ+Ø×"4Ñ"4Ó4ÜÑI¸t¿yºyÓI×IÑIÚØ×*Ñ*¨4Õ0Ü ŸjšjØ—I‘IÔPó�÷ 1ô
 œU¤2§7¡7×#3Ñ#3Ñ4°kÓBˆDŒIà×)Ñ)¨$Õ/Ø"×.Ñ.¨}¸jÈ4È'ÓR�Ø×*Ñ*¨7Ô3Ø $˜w�”÷ 0Ò/ñ? %ôJ $¤D¨¯©Ó$8¸'ÓB€KØ&€HÔð —”ˆØ�7‰7�mÕ#¨¯©°zÕ(AØ—y‘y ‘|ˆHÜ˜Ÿ™Ó$ˆEÛ�Ø—7‘7˜mÕ+°·±¸{Õ0JØ×.Ñ.¨xÔ8Ø×'Ñ'¨Ö-ñ ô �4—:‘:‹ !Õ#Ø×#Ñ# DÖ)ñ ô �H—N‘NÓ#€IÜ	�9Ó	€Bõô$ # 8§>¡>×2‰ˆ�Ø�7‰7�mÓ#¨¯©°{Ó(BØ&ˆDÔØ�K‰K˜Ö Ø�W‰W˜Ó%¨$¯+©+¸Ó*CÙ˜Ÿ™ 1™Ó&Ñ.Ü$Ð%HÓIÐIÙ& t§y¡y°¡|Ó4ˆDŽNð ×-Ò-óâ-�AÜ˜a¤§¡×)ó ñ ˜Q“<ó ‘	˜!–Ù-ð ð ô �:‹ !Ó#ÙÜÑ1¡jÓ1×1Ñ1Ü$Ð%?Ó@Ð@Ü 
Ó+ˆJØ# A™ˆDŒJØ)¨!¨"›~�Ø—‘˜
 1™ {Ö3ô  .ñ- 3ô2 -8Ô8UÓ,V€MØ—”ˆÜ�4˜×!Ñ!Ø˜"Ÿ'™' $§*¡*Ó-Ñ.×4Ñ4×;Ñ;¸DÔAÜ�4˜×'Ñ'Ø˜"Ÿ'™' $×"2Ñ"2Ó3Ñ4×@Ñ@×GÑGÈÔMÜ�4˜×%Ó%Ø˜"Ÿ'™' $§.¡.Ó1Ñ2×<Ñ<×CÑCÀDÖIñ ð ×%Ñ%Ö'ˆÙ  ×'Ó'Ø×)Ñ)¨E¯O©OÔ;�Ø—i‘i ‘l�Ø×*Ñ*¨3Ô/Ø×#Ñ# DÖ)ñ <ô ˜%Ÿ+™+ wÖ<ñ (ð ÐØ—”ˆØ�;‰;˜+Ó%¨¯©¸
Õ)BØ !Ñ#Òñ ô ×Ò”hÓ×$Ñ$Ð%=Ð?QÔRØ‡M�M„OÜ�^Š^˜E 8Ó,€FØ€M÷K 1Ö0ú÷ 0×/üòfs*   Ê&_Ë;._1Ô#`Õ `Õ`ß
_.	ß1
`	)FF)é
   r   )LrG   r  Úoperatorr›   Úcollectionsr   Úcollections.abcr   Úenumr   Útypingr   r   r   rI   Útorch.fxr/   Útorch.nnr?   Útorch.nn.functionalÚ
functionalÚFÚtorch.utils.mkldnnÚutilsÚmkldnnr„   Útorch.fx.noder	   r
   Útorch.fx.passes.shape_propr   Útorch.nn.utils.fusionr   r   Ú__all__r2   rl   r$   r3   r0   rL   r   r‹   r   r   r   r®   r   rB   rF   rC   ÚReLUÚ	MaxPool2dÚ	AvgPool2dÚAdaptiveAvgPool2dÚreluÚ	transposeÚsigmoidÚ
avg_pool2dÚadaptive_avg_pool2drñ   ÚaddÚmulrö   ÚMkldnnConv2dÚMkldnnLinearr‰   r   r   r   r   r¶   r   r   ÚTracerr   rg   r%   r#   Ú<module>r4     sí  ðã Û Û Û Ý #Ý $Ý ß &Ñ &ã Ý Ý ß Ð ß &Ð &ß *Ý 0ß Hò€ð -˜ð -  s¨C x¡ô -ðØ�d‰^ðØ#%§7¡7ðØ59¸#¸s¸(±^ôð(4Ø
�'‰'ð4Ø   c ™Nð4Ø8=¿¹¿¹ô4ñ%/�—‘—‘ð %/À5Ç8Á8Ç?Á?õ %/ðP0˜"Ÿ)™)ð 0¨¯	©	ô 0ð(2Ø—‘ð2à�—‘‰=ð2ð �—‘‰Mð2ð �"—'‘'‰]ô	2ð. ‡I�IØ‡I�IØ‡N�NØ‡G�GØ‡L�LØ‡L�LØ×ÑØ	‡J�JØ	‡O�OØ	‡M�MØ‡F�FØ‡L�LØ×ÑðÐ ð& %ŸL™L¨(¯,©,Ð7Ð à‡I�Iˆy×%Ñ%Ø‡I�Iˆy×%Ñ%Ø‡N�NÑ=ð€
ð˜T "§'¡'™]ð °T¸#¸r¿y¹y¸.Ñ5Iô ð,LØ�—‘‰=ðLà�#�r—y‘y�.Ñ!ðLð �b—i‘i §¡Ð*Ñ+ôL÷$+ñ +ô.ðb ˜+ð  ¨$ô  ÷%ñ %ð< -1Ø Ÿi™iñrØ�8‰8�?‰?ðrà˜$˜s C˜x™.Ñ)ðrð �—‘‰Oðrð ‡X�X‡_�_ö	rr%   