Ë
    M²jH  ã                   ó
  — d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlZd dlmZ d dlmZ d dlmc mZ d dlmc mZ d dlmZmZ d dlmZ d dlmZm Z  g d	¢Z!d
e"de#e"e"f   fd„Z$dee%   dejL                  de'e"ef   fd„Z(dejL                  de'e"ef   dej"                  jR                  fd„Z*d)dej"                  jR                  dej"                  jR                  fd„Z+dejR                  dejR                  fd„Z,dejR                  de-ejL                     de-ejL                     de-ejL                     fd„Z.ej^                  ej`                  ejb                  ejd                  ejf                  ejh                  ejj                  ejl                  ejn                  ejp                  ejl                  ejr                  ejt                  gZ;ejx                  ejz                  gZ>ej^                  ej~                  ej`                  ej€                  ejb                  d„ iZAde-ejL                     de'e"ejR                  f   fd„ZBde-ejL                     de'e"ejR                  f   de'ejR                  ejR                  f   fd„ZC G d„ d «      ZDd*d!„ZEd"eDdeFfd#„ZG G d$„ d%«      ZHdej’                  fdej"                  jR                  d&e'e"ef   dz  d'e%ej’                     dej"                  jR                  fd(„ZJy)+é    N)Údefaultdict)ÚIterable)ÚEnum)ÚAnyÚcast)Ú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                 óF   — | j                  dd«      �^ }}|r|d   |fS d|fS )zp
    Splits a qualname into parent path and last atom.
    For example, `foo.bar.baz` -> (`foo.bar`, `baz`)
    ú.é   r   Ú )Úrsplit)r   ÚparentÚnames      úa/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/fx/experimental/optimization.pyÚ_parent_namer#   %   s3   € ð
 —M‘M # qÓ)�M€VˆTÙˆ6�!‰9¨Ð,Ð, B¨Ð,Ð,ó    ÚpatternÚnodeÚmodulesc                 ój  — t        |j                  «      dk(  ry|j                  d   |f}t        | |«      D ]z  \  }}t        |t        j
                  «      s y|j                  dk7  r yt        |j                  t        «      s y|j                  |vr yt        ||j                     «      |usŒz y y)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°EÓ':ò 
Ñ#ˆ�|Ü˜,¬¯©Ô0ÙØ�?‰?˜mÒ+ÙÜ˜,×-Ñ-¬sÔ3ÙØ×Ñ gÑ-ÙÜ�˜×+Ñ+Ñ,Ó-°]ÒBÙð
ð r$   Ú
new_modulec                 óè   — t        | j                  t        «      s!t        dt	        | j                  «      › �«      ‚t        | j                  «      \  }}||| j                  <   t        ||   ||«       y )NúExpected str target, got )r-   r   r1   ÚAssertionErrorr2   r#   Úsetattr)r&   r'   r6   Úparent_namer!   s        r"   r   r   C   sa   € ô �d—k‘k¤3Ô'ÜÐ8¼¸d¿k¹kÓ9JÐ8KÐLÓMÐMÜ$ T§[¡[Ó1Ñ€K�Ø%€GˆD�K‰KÑÜˆG�KÑ  $¨
Õ3r$   Úmodelc                 ó€  — t         j                  t         j                  ft         j                  t         j                  ft         j
                  t         j                  ft         j                  t         j                  fg}|st        j                  | «      } |r$t        | t        j                  j                  «      st        j                  | «      }n| }t        |j!                  «       «      }t        j                  |j"                  «      }|D �]  }|j$                  D �]  }t'        |||«      sŒt)        |j*                  d   j,                  «      dkD  rŒ8||j*                  d   j.                     }	||j.                     }
|
j0                  sŒp|d   t         j                  t         j                  t         j
                  fv rt3        |	|
«      }nt5        |	|
«      }t7        |j*                  d   ||«       |j9                  |j*                  d   «       |j;                  |«       �Œ �Œ t        j                  ||«      S )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Úgraphr3   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Ü×$Ñ$ UÓ+‰àˆÜ�8×)Ñ)Ó+Ó,€GÜ—‘˜hŸn™nÓ-€Iàó +ˆØ—O‘Oó 	+ˆDÜ% g¨t°WÕ=Ü�t—y‘y ‘|×)Ñ)Ó*¨QÒ.àØ% d§i¡i°¡l×&9Ñ&9Ñ:�Ø˜TŸ[™[Ñ)�Ø×-Ò-ØØ˜1‘:¤"§)¡)¬R¯Y©Y¼¿	¹	Ð!BÑBÜ"3°KÀÓ"D‘Kä"5°kÀ2Ó"F�KÜ# D§I¡I¨a¡L°'¸;ÔGØ×*Ñ*¨4¯9©9°Q©<Ô8Ø×$Ñ$ TÖ*ò	+ð+ô" �>‰>˜( IÓ.Ð.r$   c                 óž   — t        j                  | «      } G d„ dt        j                   j                  «      } ||«      j	                  «       S )z5
    Removes all dropout layers from the module.
    c                   óD   ‡ — e Zd Zdedeedf   deeef   defˆ fd„Z	ˆ xZ
S )ú&remove_dropout.<locals>.DropoutRemoverr   r+   .Úkwargsr   c                 óÈ   •— t        | j                  |   t        j                  «      r*t	        |«      dk7  rt        dt	        |«      › �«      ‚|d   S t        ‰| �  |||«      S )Nr   z Expected 1 arg for Dropout, got r   )r-   Ú
submodulesr>   ÚDropoutr*   r9   Úsuperr)   )Úselfr   r+   r]   Ú	__class__s       €r"   r)   z2remove_dropout.<locals>.DropoutRemover.call_module|   s\   ø€ ô ˜$Ÿ/™/¨&Ñ1´2·:±:Ô>Ü�t“9 ’>Ü(Ð+KÌCÐPTËIÈ;Ð)WÓXÐXØ˜A‘w�ä‘wÑ*¨6°4¸Ó@Ð@r$   )Ú__name__Ú
__module__Ú__qualname__r	   Útupler   rK   r1   r   r)   Ú__classcell__)rc   s   @r"   ÚDropoutRemoverr\   {   sE   ø„ ð	AØ ð	AØ(-¨h¸¨mÑ(<ð	AØFJÈ3ÐPSÈ8Ánð	Aà÷	Añ 	Ar$   ri   )r.   rJ   rH   ÚTransformerÚ	transform)r<   rU   ri   s      r"   r   r   u   sB   € ô × Ñ  Ó'€Hô	AœŸ™×-Ñ-ô 	Añ ˜(Ó#×-Ñ-Ó/Ð/r$   Úorig_moduler3   ÚinputsÚoutputsc                 óZ  ‡	— t        j                  «       }i Š	|D ]"  }|j                  |j                  «      }|‰	|<   Œ$ |D ]  }|j	                  |ˆ	fd„«      }|‰	|<   Œ |j                  |D �cg c]  }‰	|   ‘Œ	 c}«       |j                  «        t        j                  | |«      S c c}w )z�
    Given lists of nodes from an existing graph that represent a subgraph, returns a submodule that executes that subgraph.
    c                 ó   •— ‰|    S ©N© )ÚxÚenvs    €r"   ú<lambda>z"extract_subgraph.<locals>.<lambda>˜   s   ø€ °s¸1±v€ r$   )r.   ÚGraphÚplaceholderr!   Ú	node_copyÚoutputÚlintrI   )
rl   r3   rm   rn   rV   ÚinputÚnew_noder&   ry   rt   s
            @r"   r   r   ‰   s­   ø€ ô —‘“
€IØ"$€CØò ˆØ×(Ñ(¨¯©Ó4ˆØˆˆEŠ
ðð ò ˆØ×&Ñ& tÓ-=Ó>ˆØˆˆDŠ	ðð ×Ñ°Ö8 f�c˜&“kÒ8Ô9Ø‡N�NÔÜ�>‰>˜+ yÓ1Ð1ùò 9s   Á/B(c                 ó,   — t        j                  | «      S rq   )Ú	th_mkldnnÚMkldnnBatchNorm)ÚaÚ_s     r"   ru   ru   ¶   s   € ¤×!:Ñ!:¸1Ó!=€ r$   c                 óè  — i }| D ]ê  }|j                   dk(  sŒt        |j                  t        «      s!t	        dt        |j                  «      › �«      ‚||j                     }t        |«      t        v sŒot        t        |«         |t        j                  «      }t        |t        j                  «      st	        dt        |«      › �«      ‚t        j                  |«      ||<   t        |||«       Œì |S )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)   r8   zExpected nn.Module, got )r0   r-   r   r1   r9   r2   Ú
mkldnn_maprH   Úfloatr>   ÚModulerF   rG   r   )r3   r'   Úold_modulesr&   Ú
cur_moduler6   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Ü(Ð+CÄDÈÓDTÐCUÐ)VÓWÐWÜ*.¯-©-¸
Ó*C�˜JÑ'Ü# D¨'°:Õ>ð?ð Ðr$   r†   c                 óð   — | D ]q  }|j                   dk(  sŒt        |j                  t        «      s!t	        dt        |j                  «      › �«      ‚||j                     }||v sŒbt        ||||   «       Œs y)za
    Maps each module that's been changed with `modules_to_mkldnn` back to its
    original.
    r)   r8   N)r0   r-   r   r1   r9   r2   r   )r3   r'   r†   r&   r‡   s        r"   r   r   Ð   ss   € ð ò LˆØ�7‰7�mÓ#Ü˜dŸk™k¬3Ô/Ü$Ð'@ÄÀdÇkÁkÓARÐ@SÐ%TÓUÐUØ  §¡Ñ-ˆJØ˜[Ò(Ü# D¨'°;¸zÑ3JÕKñLr$   c                   ó,   — e Zd Zdej                  fd„Zy)r   Úfx_graphc                 ó<   — || _         g | _        g | _        g | _        y rq   )rŠ   r3   Ústart_nodesÚ	end_nodes)rb   rŠ   s     r"   Ú__init__zMklSubgraph.__init__ã   s   € Ø ˆŒØ$&ˆŒ
Ø*,ˆÔØ(*ˆ�r$   N)rd   re   rf   r.   rv   rŽ   rr   r$   r"   r   r   â   s   „ ð+ §¡ô +r$   r   c                 óD   ‡ ‡‡‡‡— dŠdŠdt         dt        fˆ ˆˆˆˆfd„}|S )aW  
    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)
    NrM   r   c                 ó�  •‡‡— | j                   }‰
€F| j                  j                  Š
| j                  j                  Št	        ‰
«      j                  ‰	«       |D �cg c]!  }t        j                  |j                  «      ‘Œ# c}Št        t        t        j                     | j                  D �cg c]  }|j                  d   ‘Œ c}«      }t        ‰
| j                   ||«      Šˆˆfd„} |ˆˆfd„«      }t#        ‰j$                  j                   t'        ‰j)                  «       «      ‰«        |ˆˆfd„«      }||k  S c c}w c c}w )Nr   c                 ó¶   •— t        ‰«      D ]	  } | «        Œ t        j                  «       }t        ‰«      D ]	  } | «        Œ t        j                  «       |z
  S rq   )ÚrangeÚtime)Úfr�   ÚbeginÚitersÚwarmups      €€r"   Ú	benchmarkz?gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.benchmark  sO   ø€ Ü˜6“]ò �Ù•ðä—I‘I“KˆEÜ˜5“\ò �Ù•ðä—9‘9“; Ñ&Ð&r$   c                  ó’   •—  ‰‰D � cg c]  } | j                  «       ‘Œ c} Ž D � cg c]  } | j                  «       ‘Œ c} S c c} w c c} w rq   )Ú	to_mkldnnÚto_dense)ÚiÚsample_inputsÚ	submodules    €€r"   ru   z>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>
  s<   ø€ Ù&/ÈÖ1WÀA°!·+±+µ-Ò1WÐ&XöØ!"�—
‘
•ò€ ùÚ1Wùòs	   ˆ?¥Ac                  ó   •—  ‰‰ Ž S rq   rr   )r�   rž   s   €€r"   ru   z>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>  s   ø€ ©	°=Ð(A€ r$   )rŒ   rŠ   Úowning_moduler†   r
   Ú	propagaterH   ÚrandnÚshaper   Úlistr.   r/   r�   r+   r   r3   r   rM   rK   rL   )rM   Úinput_nodesr&   Úoutput_argsr˜   Úmkl_timeÚno_mkl_timer�   rž   Úexample_inputsrU   r–   r†   r—   s          @@€€€€€r"   Úuse_mkl_heuristicz,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¸D¨4¯9©9°Q«<Ò*TÓUˆÜ$ X¨u¯{©{¸KÈÓUˆ	õ	'ñ ôó
ˆô 	Ø�O‰O×!Ñ!Ü�×(Ñ(Ó*Ó+àô		
ñ  Ô AÓBˆØ˜+Ñ%Ð%ùò3 JùÚ*Ts   Á&D>Â.E
)r   Úbool)r©   r–   r—   rª   rU   r†   s   ``` @@r"   r   r   ê   s0   ü€ ð €HØ€Kð &¤ð  &´÷  &ñ  &ðD Ðr$   rM   c                 ó2   — t        | j                  «      dkD  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*   r3   )rM   s    r"   r   r     s   € ô ˆu�{‰{Ó˜aÑÐr$   c                   ó>   — e Zd Zd„ Zdefd„Zdedefd„Zdedefd„Zy	)
r   c                 ó0   — d g|z  | _         dg|z  | _        y )Nr   ©r    Úsize)rb   Úns     r"   rŽ   zUnionFind.__init__%  s   € Ø)-¨°©
ˆŒØ !˜s Q™wˆ�	r$   Úvc                 ó@   — || j                   |<   d| j                  |<   y )Nr   r°   )rb   r³   s     r"   Úmake_setzUnionFind.make_set)  s   € Øˆ�‰�A‰Øˆ�	‰	�!Šr$   r   c                 ó¾   — | j                   |   }||k(  r|S |€t        d«      ‚| j                  |«      | j                   |<   t        t        | j                   |   «      S )NzParent is None)r    r9   Úfindr   Úint)rb   r³   Úpars      r"   r·   zUnionFind.find-  sV   € Ø�k‰k˜!‰nˆØ�Š8ØˆHØˆ;Ü Ð!1Ó2Ð2ØŸ™ 3›ˆ�‰�A‰Ü”C˜Ÿ™ Q™Ó(Ð(r$   r€   Úbc                 ó  — | j                  |«      | j                  |«      }}||k(  r|S | j                  |   | j                  |   k  r||}}|| j                  |<   | j                  |xx   | j                  |   z  cc<   y rq   )r·   r±   r    )rb   r€   rº   s      r"   ÚjoinzUnionFind.join6  so   € Ø�y‰y˜‹|˜TŸY™Y q›\ˆ1ˆØ�Š6ØˆHØ�9‰9�Q‰<˜$Ÿ)™) A™,Ò&Ø�aˆqˆAØˆ�‰�A‰Ø�	‰	�!‹˜Ÿ	™	 !™Ñ$Œr$   N)rd   re   rf   rŽ   r¸   rµ   r·   r¼   rr   r$   r"   r   r   $  s9   „ ò'ð˜#ó ð)�cð )˜có )ð%�cð %˜cô %r$   r   Úpass_configÚtracerc                 ó  ‡‡— dddt         idœ}|€i }|j                  |«       |d   rt        | «      } |d   rt        | «      } |d   du r| S t	        |d   t
        «      st        d	«      ‚d|d   vrt        d
«      ‚|d   d   } |«       }|j                  t        j                  | «      «      Št        j                  |j                  ‰«       t        | j                  «       «      } G d„ dt        «      }t        ‰j                   «      D �]ù  }|j"                  }	|j$                  dk(  r�||j&                     }
t)        |
«      t*        v rÉ|j,                  }	t/        |
j1                  «       d«      }|�¡|j2                  t4        j6                  k7  rt9        d«      ‚|j:                  t5        j:                  d«      k7  rWt9        d«      ‚|j$                  dk(  r=|j&                  t*        v r|j,                  }	n|j&                  t<        v r|j>                  }	|	|j"                  k7  s�Œ|	|j>                  k(  rtA        d„ |jB                  D «       «      s�ŒF‰jE                  |«      5  t        jF                  |jB                  ˆfd„«      }ddd«       tI        tJ        t        jL                  jN                     «      |_!        ‰jQ                  |«      5  ‰jS                  dd|f«      }|jU                  |«       |f|_!        ddd«       �Œü tW        t        ‰j                   «      |«      }|‰_,        ‰j                   D ]¹  }|j$                  dk(  sŒ|j&                  dk(  sŒ#|jB                  d   }t        |jZ                  «      }|D ]D  }|j$                  dk(  sŒ|j&                  dk(  sŒ#|jU                  |«       ‰j]                  |«       ŒF t_        |jZ                  «      dk(  sŒ©‰j]                  |«       Œ» t_        ‰j                   «      }ta        |«      Šˆfd„}tc        ‰j                   «      D �]7  \  }}|j$                  dk(  r(|j&                  dk(  r||_2        ‰jg                  |«       Œ>|j$                  dk(  rJ|j&                  dk(  r; ||jB                  d   «      €t9        d«      ‚ ||jB                  d   «      |_4        Œ—|jj                  D �cg c],  }t	        |t        jl                  «      r ||«      � ||«      ‘Œ. }}t_        |«      dk(  rŒçtA        d„ |D «       «      rt9        d«      ‚to        |«      }|d   |_8        |dd D ]  }‰js                  |d   |«       Œ �Œ: tu        ˆfd„«      }‰j                   D ]Ì  }tw        |d«      r7|‰jy                  |jp                  «         j                   j{                  |«       tw        |d«      r7|‰jy                  |jd                  «         j|                  j{                  |«       tw        |d «      sŒ–|‰jy                  |jh                  «         j~                  j{                  |«       ŒÎ |j�                  «       D ]q  } ||«      rŒ|j|                  |j~                  z   D ]3  }|jB                  d   }|jU                  |«       ‰j]                  |«       Œ5 tƒ        |j                   ||«       Œs d}‰j                   D ]&  }|j&                  dk(  s|j&                  dk(  sŒ"|dz  }Œ( t…        j†                  tˆ        «      j‹                  d!|«       ‰j�                  «        t        j                  | ‰«      }|S # 1 sw Y   �ŒÜxY w# 1 sw Y   �ŒlxY wc c}w )"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                   ó   — e Zd ZdZdZdZy)ú*optimize_for_inference.<locals>.MklSupportr   r­   é   N)rd   re   rf   ÚNOÚYESÚUNKNOWNrr   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   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)r›   N)r   )Ú.0Úargs     r"   ú	<genexpr>z)optimize_for_inference.<locals>.<genexpr>‹  s   è ø€ ÒI¸˜3Ÿ:™:¨Õ3ÑIùs   ‚c                 ó*   •— ‰j                  d| f«      S )Nrš   )Úcall_method)r²   rŠ   s    €r"   ru   z(optimize_for_inference.<locals>.<lambda>�  s   ø€ ¨×)=Ñ)=¸kÈAÈ4Ó)P€ r$   rÑ   r›   r   rš   c                 ó¢   •— t        | d«      r‰j                  | j                  «      S t        | d«      r‰j                  | j                  «      S y )NÚcolorÚstart_color)Úhasattrr·   rÓ   rÔ   )r²   Úufs    €r"   Ú	get_colorz)optimize_for_inference.<locals>.get_color¬  s@   ø€ Ü�1�gÔØ—7‘7˜1Ÿ7™7Ó#Ð#Ü�1�mÔ$Ø—7‘7˜1Ÿ=™=Ó)Ð)Ør$   z!Expected color for to_dense inputc              3   ó$   K  — | ]  }|d u –— Œ
 y ­wrq   rr   )rÍ   rœ   s     r"   rÏ   z)optimize_for_inference.<locals>.<genexpr>Ð  s   è ø€ Ò1 �1˜”9Ñ1ùs   ‚zFound None in cur_colorsr   c                  ó   •— t        ‰ «      S rq   )r   )rŠ   s   €r"   ru   z(optimize_for_inference.<locals>.<lambda>×  s   ø€ ÄÈHÓ@U€ r$   rÓ   rÔ   Ú	end_colorzmkldnn conversions: %s)Gr   Úupdater   r   r-   rK   ÚRuntimeErrorÚtracerF   rG   r.   rI   ÚrootrL   r   r¤   r3   rÆ   r0   r   r2   Úmkldnn_supportedrÇ   ÚnextÚ
parametersÚdtyperH   r„   r9   ÚdeviceÚmkldnn_supported_unknownrÈ   Úanyr+   Úinserting_beforeÚmap_argr   rg   r&   r   Úinserting_afterÚcreate_noderP   r   r†   rN   rQ   r*   r   Ú	enumeraterÔ   rµ   rÚ   Úall_input_nodesr/   ÚsortedrÓ   r¼   r   rÕ   r·   ÚappendrŒ   r�   Úvaluesr   ÚloggingÚ	getLoggerrd   Úinforz   )r<   r½   r¾   Údefault_pass_configrª   Ú
cur_tracerr'   rÉ   r&   Úsupports_mkldnnr‡   Úsample_parameterÚmkldnn_argsÚdense_xr†   Úprv_noderN   ÚuserÚ	num_nodesr×   Úcur_idxrœ   Ú
cur_colorsÚother_colorÚmkldnn_graphsrM   ÚprvÚmkldnn_conversionsÚresultrŠ   rÖ   s                                @@r"   r   r   @  s¨  ù€ ð& ØØ#.´Ð"?ñÐð
 ÐØˆØ×Ñ˜{Ô+à˜>Ò*Ü�U“ˆØÐ+Ò,Ü˜uÓ%ˆØÐ3Ñ4¸Ñ=ØˆÜÐ)Ð*BÑCÄTÔ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�à˜jŸm™mÔ+Ø *×"4Ñ"4Ò4ÜÑI¸t¿y¹yÔIÔIÙØ×*Ñ*¨4Ó0ñ Ü Ÿj™jØ—I‘IÓPó�÷ô
 œU¤2§7¡7×#3Ñ#3Ñ4°kÓBˆDŒIà×)Ñ)¨$Ó/ñ 'Ø"×.Ñ.¨}¸jÈ4È'ÓR�Ø×*Ñ*¨7Ô3Ø $˜w�”÷'ñ 'ð?"'ô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ó 4‰ˆ�Ø�7‰7�mÒ#¨¯©°{Ò(BØ&ˆDÔØ�K‰K˜Õ Ø�W‰W˜Ò%¨$¯+©+¸Ò*CÙ˜Ÿ™ 1™Ó&Ð.Ü$Ð%HÓIÐIÙ& t§y¡y°¡|Ó4ˆD�Nð ×-Ñ-öàÜ˜a¤§¡Ô)Ù˜Q“<Ð+ñ ˜!•ðˆJð ô �:‹ !Ò#ØÜÑ1 jÔ1Ô1Ü$Ð%?Ó@Ð@Ü 
Ó+ˆJØ# A™ˆDŒJØ)¨!¨"˜~ò 4�Ø—‘˜
 1™ {Õ3ò4ð-4ô2 -8Ó8UÓ,V€MØ—‘ò JˆÜ�4˜Ô!Ø˜"Ÿ'™' $§*¡*Ó-Ñ.×4Ñ4×;Ñ;¸DÔAÜ�4˜Ô'Ø˜"Ÿ'™' $×"2Ñ"2Ó3Ñ4×@Ñ@×GÑGÈÔMÜ�4˜Õ%Ø˜"Ÿ'™' $§.¡.Ó1Ñ2×<Ñ<×CÑCÀDÕIðJð ×%Ñ%Ó'ò =ˆÙ  Õ'Ø×)Ñ)¨E¯O©OÑ;ò *�Ø—i‘i ‘l�Ø×*Ñ*¨3Ô/Ø×#Ñ# DÕ)ð*ô ˜%Ÿ+™+ w°Õ<ð=ð ÐØ—‘ò $ˆØ�;‰;˜+Ò%¨¯©¸
Ó)BØ !Ñ#Ñð$ô ×Ñ”hÓ×$Ñ$Ð%=Ð?QÔRØ‡M�M„OÜ�^‰^˜E 8Ó,€FØ€M÷Kñ ú÷'ñ 'üòfs   É$$]"Ë.]/Ó1]<Ý"],	Ý/]9	)FF)é
   r   )KrF   rï   Úoperatorr“   Úcollectionsr   Úcollections.abcr   Úenumr   Útypingr   r   rH   Ú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__r1   rg   r#   r2   r/   rK   r   r…   r   r   r   r¤   r   rA   rE   rB   ÚReLUÚ	MaxPool2dÚ	AvgPool2dÚAdaptiveAvgPool2dÚreluÚ	transposeÚsigmoidÚ
avg_pool2dÚadaptive_avg_pool2drß   ÚaddÚmulrä   ÚMkldnnConv2dÚMkldnnLinearrƒ   r   r   r   r   r«   r   r   ÚTracerr   rr   r$   r"   ú<module>r"     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 ˜+ð  ¨$ó  ÷%ñ %ð< *.Ø Ÿi™iñrØ�8‰8�?‰?ðrà�c˜3�h‘ $Ñ&ðrð �—‘‰Oðrð ‡X�X‡_�_ô	rr$   