Ë
    f^(húD  ã                   ó  — 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      ú`/var/www/skyplay_api_hub/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J ‚t        | j                  «      \  }}||| j                  <   t	        ||   ||«       y ©N)r.   r   r2   r$   Úsetattr)r'   r(   r7   Úparent_namer"   s        r#   r   r   C   sJ   € ô �d—k‘k¤3Ô'Ð'Ð'Ü$ 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   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k(  sJ ‚|d   S t
        ‰| �  |||«      S )Nr   r   )r.   Ú
submodulesr>   ÚDropoutr+   Úsuperr*   )Úselfr   r,   r]   Ú	__class__s       €r#   r*   z2remove_dropout.<locals>.DropoutRemover.call_module{   sI   ø€ ô ˜$Ÿ/™/¨&Ñ1´2·:±:Ô>Ü˜4“y A’~Ð%�~Ø˜A‘w�ä‘wÑ*¨6°4¸Ó@Ð@r%   )Ú__name__Ú
__module__Ú__qualname__r
   Útupler	   rK   r2   r   r*   Ú__classcell__)rc   s   @r#   ÚDropoutRemoverr\   z   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   t   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 r9   © )ÚxÚenvs    €r#   ú<lambda>z"extract_subgraph.<locals>.<lambda>–   s   ø€ °s¸1±v€ r%   )r/   ÚGraphÚplaceholderr"   Ú	node_copyÚoutputÚlintrI   )
rl   r4   rm   rn   rV   ÚinputÚnew_noder'   rx   rs   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 r9   )Ú	th_mkldnnÚMkldnnBatchNorm)ÚaÚ_s     r#   rt   rt   ´   s   € ¤×!:Ñ!:¸1Ó!=€ r%   c                 ó€  — i }| D ]¶  }|j                   dk(  sŒt        |j                  t        «      sJ ‚||j                     }t	        |«      t
        v sŒPt        t	        |«         |t        j                  «      }t        |t        j                  «      sJ ‚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*   )r1   r.   r   r2   r3   Ú
mkldnn_maprH   Úfloatr>   ÚModulerF   rG   r   )r4   r(   Úold_modulesr'   Ú
cur_moduler7   s         r#   r   r   ¸   s¨   € ð /1€KØò ?ˆØ�7‰7�mÓ#Ü˜dŸk™k¬3Ô/Ð/Ð/Ø  §¡Ñ-ˆJÜ�JÓ¤:Ò-Ü'¬¨ZÓ(8Ñ9¸*ÄeÇkÁkÓR�
Ü! *¬b¯i©iÔ8Ð8Ð8Ü*.¯-©-¸
Ó*C�˜JÑ'Ü# D¨'°:Õ>ð?ð Ðr%   r…   c                 ó²   — | D ]R  }|j                   dk(  sŒt        |j                  t        «      sJ ‚||j                     }||v sŒCt	        ||||   «       ŒT y)za
    Maps each module that's been changed with `modules_to_mkldnn` back to its
    original.
    r*   N)r1   r.   r   r2   r   )r4   r(   r…   r'   r†   s        r#   r   r   Ë   s\   € ð ò LˆØ�7‰7�mÓ#Ü˜dŸk™k¬3Ô/Ð/Ð/Ø  §¡Ñ-ˆ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 r9   )r‰   r4   Ústart_nodesÚ	end_nodes)rb   r‰   s     r#   Ú__init__zMklSubgraph.__init__Ý   s   € Ø ˆŒØ$&ˆŒ
Ø*,ˆÔØ(*ˆ�r%   N)rd   re   rf   r/   ru   r�   rq   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 r9   )Ú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 r9   )Ú	to_mkldnnÚto_dense)ÚiÚsample_inputsÚ	submodules    €€r#   rt   z>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>  s<   ø€ Ù&/ÈÖ1WÀA°!·+±+µ-Ò1WÐ&XöØ!"�—
‘
•ò€ ùÚ1Wùòs	   ˆ?¥Ac                  ó   •—  ‰‰ Ž S r9   rq   )rœ   r�   s   €€r#   rt   z>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>  s   ø€ ©	°=Ð(A€ r%   )r‹   r‰   Úowning_moduler…   r   Ú	propagaterH   ÚrandnÚshaper   Úlistr/   r0   rŒ   r,   r   r4   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×!Ñ!¤4¨	×(?Ñ(?Ó(AÓ#BÀKô	
ñ  Ô AÓBˆØ˜+Ñ%Ð%ùò- JùÚ*Ts   Á&D>Â.E
)r   Úbool)r¨   r•   r–   r©   rU   r…   s   ``` @@r#   r   r   ä   s/   ü€ ð €HØ€Kð&¤ð &´÷ &ñ &ð> Ð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+   r4   )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   € Ø,0¨6°A©:ˆŒØ !˜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 |€J ‚| j                  |«      | j                   |<   t        t        | j                   |   «      S r9   )r!   Úfindr   Úint)rb   r²   Úpars      r#   r¶   zUnionFind.find$  sO   € Ø�k‰k˜!‰nˆØ�Š8ØˆHØˆÐˆØŸ™ 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 r9   )r¶   r°   r!   )rb   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%   N)rd   re   rf   r�   r·   r´   r¶   r»   rq   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                  k(  sJ d«       ‚|j8                  t5        j8                  d«      k(  sSJ d«       ‚|j$                  dk(  r=|j&                  t*        v r|j,                  }	n|j&                  t:        v r|j<                  }	|	|j"                  k7  s�Œ|	|j<                  k(  rt?        d„ |j@                  D «       «      s�Œ>‰jC                  |«      5  t        jD                  |j@                  ˆfd„«      }ddd«       tG        tH        t        jJ                  jL                     «      |_         ‰jO                  |«      5  ‰jQ                  dd|f«      }|jS                  |«       |f|_         ddd«       �Œô tU        t        ‰j                   «      |«      }|‰_+        ‰j                   D ]¹  }|j$                  dk(  sŒ|j&                  dk(  sŒ#|j@                  d   }t        |jX                  «      }|D ]D  }|j$                  dk(  sŒ|j&                  dk(  sŒ#|jS                  |«       ‰j[                  |«       ŒF t]        |jX                  «      dk(  sŒ©‰j[                  |«       Œ» t]        ‰j                   «      }t_        |«      Šˆfd„}ta        ‰j                   «      D �]%  \  }}|j$                  dk(  r(|j&                  dk(  r||_1        ‰je                  |«       Œ>|j$                  dk(  rA|j&                  dk(  r2 ||j@                  d   «      €J ‚ ||j@                  d   «      |_3        ŒŽ|jh                  D �cg c],  }t	        |t        jj                  «      r ||«      � ||«      ‘Œ. }}t]        |«      dk(  rŒÞt?        d„ |D «       «      rJ ‚tm        |«      }|d   |_7        |dd D ]  }‰jq                  |d   |«       Œ �Œ( ts        ˆfd„«      }‰j                   D ]Ì  }tu        |d«      r7|‰jw                  |jn                  «         j                   jy                  |«       tu        |d«      r7|‰jw                  |jb                  «         jz                  jy                  |«       tu        |d«      sŒ–|‰jw                  |jf                  «         j|                  jy                  |«       ŒÎ |j                  «       D ]q  } ||«      rŒ|jz                  |j|                  z   D ]3  }|j@                  d   }|jS                  |«       ‰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   �ŒRx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ÚUNKNOWNrq   r%   r#   Ú
MklSupportrÃ   b  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#   rt   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%   c              3   ó$   K  — | ]  }|d u –— Œ
 y ­wr9   rq   )rÌ   r›   s     r#   rÎ   z)optimize_for_inference.<locals>.<genexpr>Å  s   è ø€ Ò9¨˜1 œ9Ñ9ùs   ‚r   c                  ó   •— t        ‰ «      S r9   )r   )r‰   s   €r#   rt   z(optimize_for_inference.<locals>.<lambda>Ë  s   ø€ ÄÈHÓ@U€ r%   rÒ   rÓ   Ú	end_colorzmkldnn conversions: %s)Fr   Úupdater   r   r.   rK   ÚRuntimeErrorÚtracerF   rG   r/   rI   ÚrootrL   r   r£   r4   rÅ   r1   r   r3   Úmkldnn_supportedrÆ   ÚnextÚ
parametersÚdtyperH   rƒ   Ú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_nodesr0   ÚsortedrÒ   r»   r   rÔ   r¶   Úappendr‹   rŒ   Úvaluesr   ÚloggingÚ	getLoggerrd   Úinfory   )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   6  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Ð Ø#Ð/à(×.Ñ.´%·+±+Ò=ðCàBóCØ=à+×2Ñ2´e·l±lØó7ò ð ;à:ó;ð ð �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Ù˜TŸY™Y q™\Ó*Ð6Ð6Ð6Ù& t§y¡y°¡|Ó4ˆD�Nð ×-Ñ-öàÜ˜a¤§¡Ô)Ù˜Q“<Ð+ñ ˜!•ðˆJð ô �:‹ !Ò#ØÜÑ9¨jÔ9Ô9Ð9Ð9Ü 
Ó+ˆJØ# A™ˆDŒJØ)¨!¨"˜~ò 4�Ø—‘˜
 1™ {Õ3ò4ð)4ô. -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÷Gñ ú÷'ñ 'üòds   É$]Ë	.]Ó1]"Ý]	Ý]	)FF)é
   r   )LrF   rî   Úoperatorr’   Úcollectionsr   Úcollections.abcr   Úenumr   Útypingr   r   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__r2   rg   r$   r3   r0   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   rq   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÷"+ñ +ó+ð\ ˜+ð  ¨$ó  ÷%ñ %ð: -1Ø Ÿi™iñpØ�8‰8�?‰?ðpà˜$˜s C˜x™.Ñ)ðpð �—‘‰Oðpð ‡X�X‡_�_ô	pr%   