Ë
    *êñi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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jN                  de(e#ef   fd„Z)dejN                  de(e#ef   dej$                  jT                  fd„Z+d)dej$                  jT                  dej$                  jT                  fd„Z,dejT                  dejT                  fd„Z-dejT                  de.ejN                     de.ejN                     de.ejN                     fd„Z/ej`                  ejb                  ejd                  ejf                  ejh                  ejj                  ejl                  ejn                  ejp                  ejr                  ejn                  ejt                  ejv                  gZ<ejz                  ej|                  gZ?ej`                  ej€                  ejb                  ej‚                  ejd                  d„ iZBde.ejN                     de(e#ejT                  f   fd„ZCde.ejN                     de(e#ejT                  f   de(ejT                  ejT                  f   fd„ZD G d„ d «      ZEd*d!„ZFd"eEdeGfd#„ZH G d$„ d%«      ZIdej”                  fdej$                  jT                  d&ee(e#ef      d'e&ej”                     dej$                  jT                  fd(„ZKy)+é    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                 ó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      úd/var/www/pod-logistic/pod-ai/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   r2   ÚAssertionErrorr3   r$   Úsetattr)r'   r(   r7   Ú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Ú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Ü×$Ñ$ 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+   r:   Ú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	   rL   r2   r   r*   Ú__classcell__)rd   s   @r#   ÚDropoutRemoverr]   {   sE   ø„ ð	AØ ð	AØ(-¨h¸¨mÑ(<ð	AØFJÈ3ÐPSÈ8Ánð	Aà÷	Añ 	Ar%   rj   )r/   rK   rI   ÚTransformerÚ	transform)r=   rV   rj   s      r#   r   r   u   sB   € ô × Ñ  Ó'€Hô	AœŸ™×-Ñ-ô 	Añ ˜(Ó#×-Ñ-Ó/Ð/r%   Úorig_moduler4   Ú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ÚlintrJ   )
rm   r4   rn   ro   rW   ÚinputÚnew_noder'   rz   ru   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 rr   )Ú	th_mkldnnÚMkldnnBatchNorm)ÚaÚ_s     r#   rv   rv   ¶   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*   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Ü(Ð+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*   r9   N)r1   r.   r   r2   r:   r3   r   )r4   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 rr   )r‹   r4   Ústart_nodesÚ	end_nodes)rc   r‹   s     r#   Ú__init__zMklSubgraph.__init__ã   s   € Ø ˆŒØ$&ˆŒ
Ø*,ˆÔØ(*ˆ�r%   N)re   rf   rg   r/   rw   r�   rs   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)
    NrN   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 rr   )Ú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 rr   )Ú	to_mkldnnÚto_dense)ÚiÚsample_inputsÚ	submodules    €€r#   rv   z>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>
  s<   ø€ Ù&/ÈÖ1WÀA°!·+±+µ-Ò1WÐ&XöØ!"�—
‘
•ò€ ùÚ1Wùòs	   ˆ?¥Ac                  ó   •—  ‰‰ Ž S rr   rs   )rž   rŸ   s   €€r#   rv   z>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>  s   ø€ ©	°=Ð(A€ r%   )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_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«   rV   r‡   s   ``` @@r#   r   r   ê   s0   ü€ ð €HØ€Kð &¤ð  &´÷  &ñ  &ðD Ðr%   rN   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+   r4   )rN   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)rc   Úns     r#   r�   zUnionFind.__init__%  s   € Ø,0¨6°A©:ˆŒØ !˜s Q™wˆ�	r%   Úvc                 ó@   — || j                   |<   d| j                  |<   y )Nr   r±   )rc   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!   r:   Úfindr   Úint)rc   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 rr   )r¸   r²   r!   )rc   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)re   rf   rg   r�   r¹   r¶   r¸   r½   rs   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)re   rf   rg   ÚNOÚYESÚUNKNOWNrs   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#   rv   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rr   rs   )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 rr   )r   )r‹   s   €r#   rv   z(optimize_for_inference.<locals>.<lambda>×  s   ø€ ÄÈHÓ@U€ r%   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   rh   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Ú	getLoggerre   Ú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ÜÐ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   )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   rh   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   rs   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 ˜+ð  ¨$ó  ÷%ñ %ð< -1Ø Ÿi™iñrØ�8‰8�?‰?ðrà˜$˜s C˜x™.Ñ)ðrð �—‘‰Oðrð ‡X�X‡_�_ô	rr%   