Ë
    ÄÓ^jNJ  ã                   óü  — 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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jN                  de(e#ej$                  jR                  f   de*fd„Z+dejN                  de(e#ej$                  jR                  f   dej$                  jR                  ddfd„Z,	 d.dej$                  jR                  de*de*dej$                  jR                  fd„Z-dejR                  dejR                  fd„Z.dejR                  de/ejN                     de/ejN                     de/ejN                     dej`                  f
d„Z1ejd                  ejf                  ejh                  ejj                  ejl                  ejn                  ejp                  ejr                  ejt                  ejv                  ejr                  ejx                  ejz                  gZ>ej~                  ej€                  gZAejd                  ej„                  ejf                  ej†                  ejh                  d„ iZDde/ejN                     de(e#ejR                  f   de(ejR                  ejR                  f   fd„ZEdeejN                     de(e#ejR                  f   de(ejR                  ejR                  f   ddfd „ZF G d!„ d"«      ZG	 d/d#e/ej�                     d$eId%eIdeeGge*f   fd&„ZJd'eGde*fd(„ZK G d)„ d*«      ZLdejš                  fdej$                  jR                  d+e(e#ef   dz  d,e&ejš                     dej$                  jR                  fd-„ZNy)0é    N)Údefaultdict)ÚCallableÚ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      úm/var/www/ramen.bs-engineer-server.com/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ƒ~˜ÒØØ'+§y¡y°¡|°TÐ&:€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   B   sa   € ô �d—k‘k¤3Ô'ÜÐ8¼¸d¿k¹kÓ9JÐ8KÐLÓMÐMÜ$ T§[¡[Ó1Ñ€K�Ø%€GˆD�K‰KÑÜˆG�KÑ  $¨
Õ3r%   ÚmodelÚinplaceÚno_tracec                 ó€  — 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=   r>   r?   ÚpatternsÚfx_modelr(   Ú	new_graphr&   r'   Úfirst_layerÚbnÚfused_layers               r#   r   r   L   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.   Ú
submodulesrA   Ú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	   rN   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/   rM   rK   ÚTransformerÚ	transform)r=   rV   rj   s      r#   r   r   v   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ÚlintrL   )
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_maprK   ÚfloatrA   ÚModulerI   rJ   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                   ó0   — e Zd Zdej                  ddfd„Zy)r   Úfx_graphr   Nc                 ó<   — || _         g | _        g | _        g | _        y rr   )r‹   r4   Ústart_nodesÚ	end_nodes)rc   r‹   s     r#   Ú__init__zMklSubgraph.__init__æ   s   € Ø ˆŒØ$&ˆŒ
Ø*,ˆÔØ(*ˆ�r%   )re   rf   rg   r/   rw   r�   rs   r%   r#   r   r   å   s   „ ð+ §¡ð +¨dô +r%   r   Úexample_inputsÚitersÚwarmupc                 ó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)
    NrP   r   c                 óð  •‡‡— | j                   }‰
€S| j                  j                  Š
‰
€t        d«      ‚| 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        d«      ‚t!        ‰
| j"                  ||«      Šdt$        g t&        f   dt(        fˆˆfd„} |ˆˆfd„«      }t+        ‰j,                  j"                  t/        ‰j1                  «       «      ‰«        |ˆˆfd„«      }||k  S c c}w c c}w )	Nz'fx_graph.owning_module must not be Noner   zfx_model must not be NoneÚfr   c                 ó¶   •— t        ‰«      D ]	  } | «        Œ t        j                  «       }t        ‰«      D ]	  } | «        Œ t        j                  «       |z
  S rr   )ÚrangeÚtime)r•   r‚   Úbeginr‘   r’   s      €€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‡   r   Ú	propagaterK   ÚrandnÚshaper   Úlistr/   r0   rŽ   r,   r   r4   r   Úobjectr…   r   rP   rN   rO   )rP   Úinput_nodesr'   Úoutput_argsrš   Úmkl_timeÚno_mkl_timerŸ   r    r�   rV   r‘   r‡   r’   s          @@€€€€€r#   Úuse_mkl_heuristicz,gen_mkl_autotuner.<locals>.use_mkl_heuristicû   s>  ú€ à×'Ñ'ˆØÐØ—~‘~×3Ñ3ˆHØÐÜ$Ð%NÓOÐOØŸ.™.×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ˆ	ð	'œ "¤f *Ñ-ð 	'´%ö 	'ñ ôó
ˆô 	Ø�O‰O×!Ñ!Ü�×(Ñ(Ó*Ó+àô		
ñ  Ô AÓBˆØ˜+Ñ%Ð%ùò7 JùÚ*Ts   Á)&E.Â;E3
)r   Úbool)r�   r‘   r’   r¬   rV   r‡   s   ``` @@r#   r   r   í   s0   ü€ ð €HØ€Kð$&¤ð $&´÷ $&ñ $&ðL Ðr%   rP   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   )rP   s    r#   r   r   $  s   € ô ˆu�{‰{Ó˜aÑÐr%   c                   óV   — e Zd Zdeddfd„Zdeddfd„Zdedefd„Zded	ededz  fd
„Zy)r   Únr   Nc                 ó0   — d g|z  | _         dg|z  | _        y )Nr   ©r!   Úsize)rc   r±   s     r#   r�   zUnionFind.__init__.  s   € Ø)-¨°©
ˆŒØ !˜s Q™wˆ�	r%   Úvc                 ó@   — || j                   |<   d| j                  |<   y )Nr   r³   )rc   rµ   s     r#   Úmake_setzUnionFind.make_set2  s   € Øˆ�‰�A‰Øˆ�	‰	�!Š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.find6  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.join?  so   € Ø�y‰y˜‹|˜TŸY™Y q›\ˆ1ˆØ�Š6ØˆHØ�9‰9�Q‰<˜$Ÿ)™) A™,Ò&Ø�aˆqˆAØˆ�‰�A‰Ø�	‰	�!‹˜Ÿ	™	 !™Ñ$Œr%   )re   rf   rg   rº   r�   r·   r¹   r¾   rs   r%   r#   r   r   -  sY   „ ð'˜#ð ' $ó 'ð˜#ð  $ó ð)�cð )˜có )ð%�cð %˜cð % c¨D¡jô %r%   r   Úpass_configÚtracerc                 ó6  ‡‡— 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        |«      Šdt        jb                  dtd        dz  fˆfd„}tg        ‰j                   «      D �]7  \  }}|j$                  dk(  r(|j&                  dk(  r||_4        ‰jk                  |«       Œ>|j$                  dk(  rJ|j&                  dk(  r; ||jB                  d   «      €t9        d«      ‚ ||jB                  d   «      |_6        Œ—|jn                  D �cg c],  }t	        |t        jb                  «      r ||«      � ||«      ‘Œ. }}t_        |«      dk(  rŒçtA        d„ |D «       «      rt9        d«      ‚tq        |«      }|d   |_9        |dd D ]  }‰ju                  |d   |«       Œ �Œ: tw        ˆfd„«      }‰j                   D ]Ì  }ty        |d «      r7|‰j{                  |jr                  «         j                   j}                  |«       ty        |d!«      r7|‰j{                  |jh                  «         j~                  j}                  |«       ty        |d"«      sŒ–|‰j{                  |jl                  «         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   �Œ†x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Æ   u  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œ   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)Hr   Úupdater   r   r.   rN   ÚRuntimeErrorÚtracerI   rJ   r/   rL   ÚrootrO   r   r¦   r4   rÈ   r1   r   r3   Úmkldnn_supportedrÉ   ÚnextÚ
parametersÚdtyperK   r…   r:   ÚdeviceÚmkldnn_supported_unknownrÊ   Úanyr,   Úinserting_beforeÚmap_argr   rh   r'   r	   Úinserting_afterÚcreate_noderS   r   r‡   rQ   rT   r+   r   r0   rº   Ú	enumeraterÖ   r·   rÜ   Úall_input_nodesÚ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_noderQ   ÚuserÚ	num_nodesrÙ   Úcur_idxrž   Ú
cur_colorsÚsorted_colorsÚother_colorÚmkldnn_graphsrP   ÚprvÚmkldnn_conversionsÚresultr‹   rØ   s                                  @@r#   r   r   I  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ð”R—W‘Wð ¤ t¡õ ô$ # 8§>¡>Ó2ó 7‰ˆ�Ø�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Ó'9ˆMØ& qÑ)ˆDŒJØ,¨Q¨RÐ0ò 7�Ø—‘˜ aÑ(¨+Õ6ò7ð-7ô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   É$$]<Ë.^	Ó11^Ý<^	Þ	^	)FF)é
   r   )OrI   rñ   Úoperatorr˜   Úcollectionsr   Úcollections.abcr   r   Úenumr   Útypingr   r   rK   Útorch.fxr/   Útorch.nnrA   Ú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   rN   r†   r­   r   r   r   r   r¦   rL   r   rD   rH   rE   ÚReLUÚ	MaxPool2dÚ	AvgPool2dÚAdaptiveAvgPool2dÚreluÚ	transposeÚsigmoidÚ
avg_pool2dÚadaptive_avg_pool2drá   ÚaddÚmulræ   ÚMkldnnConv2dÚMkldnnLinearr„   r   r   r   ÚTensorrº   r   r   r   ÚTracerr   rs   r%   r#   ú<module>r&     s™  ðÛ Û Û Û Ý #ß .Ý ß ã Ý Ý ß Ð ß &Ð &ß *Ý 0ß Hò€ð -˜ð -  s¨C x¡ó -ðØ�d‰^ðØ#%§7¡7ðØ59¸#¸u¿x¹x¿¹Ð:NÑ5Oðà	óð(4Ø
�'‰'ð4Ø   e§h¡h§o¡oÐ!5Ñ6ð4ØDIÇHÁHÇOÁOð4à	ó4ð EJñ'/Ø�8‰8�?‰?ð'/Ø%)ð'/Ø=Að'/à
‡X�X‡_�_ó'/ðT0˜"Ÿ)™)ð 0¨¯	©	ó 0ð(2Ø—‘ð2à�—‘‰=ð2ð �—‘‰Mð2ð �"—'‘'‰]ð	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Ñ=ð€
ðØ�—‘‰=ðØ#'¨¨R¯Y©Y¨Ñ#7ðà	ˆ"�)‰)�R—Y‘YÐ
Ñóð0LØ�B—G‘GÑðLà�#�r—y‘y�.Ñ!ðLð �b—i‘i §¡Ð*Ñ+ðLð 
ó	L÷$+ñ +ð HIñ4Ø˜Ÿ™Ñ&ð4Ø/2ð4ØADð4àˆ{ˆm˜TÐ!Ñ"ó4ðn ˜+ð  ¨$ó  ÷%ñ %ð< *.Ø Ÿi™iñrØ�8‰8�?‰?ðrà�c˜3�h‘ $Ñ&ðrð �—‘‰Oðrð ‡X�X‡_�_ô	rr%   