§
    Ÿ²ÅjÝF  ã                   ó²  — 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	m
Z
mZmZmZ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j(        dee&e	f         fd„Z)dej(        dee&e	f         dej        j*        fd„Z+d+dej        j*        d
ej        j*        fd„Z,dej*        d
ej*        fd„Z-dej*        deej(                 deej(                 deej(                 fd„Z.ej/        ej0        ej1        ej2        ej3        ej4        ej5        ej6        ej7        ej8        ej6        ej9        ej:        gZ;ej<        ej=        gZ>ej/        ej?        ej0        ej@        ej1        d„ iZAdeej(                 dee&ej*        f         fd„ZBdeej(                 dee&ej*        f         deej*        ej*        f         fd„ZC G d„ d ¦  «        ZDd,d#„ZEd$eDd
eFfd%„ZG G d&„ d'¦  «        ZHdejI        fdej        j*        d(eee&e	f                  d)eejI                 d
ej        j*        fd*„ZJdS )-é    N)Údefaultdict)ÚEnum)ÚAnyÚcastÚDictÚIterableÚListÚOptionalÚTupleÚType)Ú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                 óP   — |                       dd¦  «        �^ }}|r|d         n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      úSC:\Projects\Historical\venv\Lib\site-packages\torch/fx/experimental/optimization.pyÚ_parent_namer(   $   s3   € ð
 —M’M # qÑ)Ô)�M€VˆTØÐ&ˆ6�!Œ9ˆ9 B¨Ð,Ð,ó    ÚpatternÚnodeÚmodulesc                 ój  — t          |j        ¦  «        dk    rdS |j        d         |f}t          | |¦  «        D ]x\  }}t          |t          j        ¦  «        s dS |j        dk    r dS t          |j        t          ¦  «        s dS |j        |vr dS t          ||j                 ¦  «        |ur dS ŒydS )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�~„~˜ÒÐØˆuØ"&¤)¨A¤,°Ð!5€EÝ'*¨7°EÑ':Ô':ð 
ð 
Ñ#ˆ�|Ý˜,­¬Ñ0Ô0ð 	Ø�5�5ØŒ?˜mÒ+Ð+Ø�5�5Ý˜,Ô-­sÑ3Ô3ð 	Ø�5�5ØÔ gÐ-Ð-Ø�5�5Ý�˜Ô+Ô,Ñ-Ô-°]ÐBÐBØ�5�5ð Càˆ4r)   Ú
new_modulec                 ó®   — t          | j        t          ¦  «        sJ ‚t          | j        ¦  «        \  }}||| j        <   t	          ||         ||¦  «         d S ©N)r2   r   r6   r(   Úsetattr)r+   r,   r;   Úparent_namer&   s        r'   r   r   B   sY   € õ �d”k¥3Ñ'Ô'Ð'Ð'Ð'Ý$ T¤[Ñ1Ô1Ñ€K�Ø%€GˆDŒKÑÝˆG�KÔ  $¨
Ñ3Ô3Ð3Ð3Ð3r)   FÚ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          |                     ¦   «         ¦  «        }t          j	        |j        ¦  «        }|D �]}|j        D �]}t'          |||¦  «        rît)          |j        d         j        ¦  «        dk    rŒ8||j        d         j                 }	||j                 }
|
j        sŒe|d         t           j        t           j        t           j        fv rt3          |	|
¦  «        }nt5          |	|
¦  «        }t7          |j        d         ||¦  «         |                     |j        d         ¦  «         |                     |¦  «         �Œ�Œ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Údeepcopyr2   Útorchr3   ÚGraphModuleÚsymbolic_traceÚdictÚnamed_modulesÚgraphr8   r   r/   r0   Ú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   K   sÏ  € õ 
Œ•B”NÐ#Ý	Œ•B”NÐ#Ý	Œ•B”NÐ#Ý	Œ•B”NÐ#ð	€Hð ð %Ý”˜eÑ$Ô$ˆØð �: e­U¬XÔ-AÑBÔBð ÝÔ$ UÑ+Ô+ˆˆàˆÝ�8×)Ò)Ñ+Ô+Ñ,Ô,€GÝ”˜hœnÑ-Ô-€Iàð +ñ +ˆØ”Oð 	+ñ 	+ˆDÝ% g¨t°WÑ=Ô=ð +Ý�t”y ”|Ô)Ñ*Ô*¨QÒ.Ð.àØ% d¤i°¤lÔ&9Ô:�Ø˜Tœ[Ô)�ØÔ-ð ØØ˜1”:¥"¤)­R¬Y½¼	Ð!BÐBÐBÝ"3°KÀÑ"DÔ"D�K�Kå"5°kÀ2Ñ"FÔ"F�KÝ# D¤I¨a¤L°'¸;ÑGÔGÐGØ×*Ò*¨4¬9°Q¬<Ñ8Ô8Ð8Ø×$Ò$ TÑ*Ô*Ð*ùñ	+õ  Œ>˜( IÑ.Ô.Ð.r)   c                 óž   — t          j        | ¦  «        } G d„ dt          j         j        ¦  «        } ||¦  «                             ¦   «         S )z5
    Removes all dropout layers from the module.
    c                   óP   ‡ — 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   r0   .Úkwargsr   c                 óÎ   •— t          | j        |         t          j        ¦  «        rt	          |¦  «        dk    sJ ‚|d         S t          ¦   «                              |||¦  «        S )Nr"   r   )r2   Ú
submodulesrB   ÚDropoutr/   Úsuperr.   )Úselfr   r0   ra   Ú	__class__s       €r'   r.   z2remove_dropout.<locals>.DropoutRemover.call_modulez   sY   ø€ õ ˜$œ/¨&Ô1µ2´:Ñ>Ô>ð AÝ˜4‘y”y A’~�~�~�~Ø˜A”w�å‘w”w×*Ò*¨6°4¸Ñ@Ô@Ð@r)   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r6   r   r.   Ú__classcell__)rg   s   @r'   ÚDropoutRemoverr`   y   s}   ø€ € € € € ð	AØ ð	AØ(-¨h¸¨mÔ(<ð	AØFJÈ3ÐPSÈ8Änð	Aàð	Að 	Að 	Að 	Að 	Að 	Að 	Að 	Að 	Að 	Ar)   rl   )r3   rN   rL   ÚTransformerÚ	transform)r@   rY   rl   s      r'   r   r   s   si   € õ Ô  Ñ'Ô'€HðAð Að Að Að A�œÔ-ñ Aô Að Að ˆ>˜(Ñ#Ô#×-Ò-Ñ/Ô/Ð/r)   Úorig_moduler8   ÚinputsÚoutputsc                 óP  ‡— t          j        ¦   «         }i Š|D ]!}|                     |j        ¦  «        }|‰|<   Œ"|D ] }|                     |ˆfd„¦  «        }|‰|<   Œ!|                     ˆfd„|D ¦   «         ¦  «         |                     ¦   «          t          j        | |¦  «        S )z�
    Given lists of nodes from an existing graph that represent a subgraph, returns a submodule that executes that subgraph.
    c                 ó   •— ‰|          S r=   © )ÚxÚenvs    €r'   ú<lambda>z"extract_subgraph.<locals>.<lambda>•   s   ø€ °s¸1´v€ r)   c                 ó    •— g | ]
}‰|         ‘ŒS rt   rt   )Ú.0Úoutputrv   s     €r'   ú
<listcomp>z$extract_subgraph.<locals>.<listcomp>—   s   ø€ Ð8Ð8Ð8 f�c˜&”kÐ8Ð8Ð8r)   )r3   ÚGraphÚplaceholderr&   Ú	node_copyrz   ÚlintrM   )	ro   r8   rp   rq   rZ   ÚinputÚnew_noder+   rv   s	           @r'   r   r   †   sÈ   ø€ õ ”‘
”
€IØ"$€CØð ð ˆØ×(Ò(¨¬Ñ4Ô4ˆØˆˆE‰
ˆ
Øð ð ˆØ×&Ò& tÐ-=Ð-=Ð-=Ð-=Ñ>Ô>ˆØˆˆD‰	ˆ	Ø×ÒÐ8Ð8Ð8Ð8°Ð8Ñ8Ô8Ñ9Ô9Ð9Ø‡N‚NÑÔÐÝŒ>˜+ yÑ1Ô1Ð1r)   c                 ó*   — t          j        | ¦  «        S r=   )Ú	th_mkldnnÚMkldnnBatchNorm)ÚaÚ_s     r'   rw   rw   ³   s   € ¥Ô!:¸1Ñ!=Ô!=€ r)   c                 óŠ  — i }| D ]½}|j         dk    r°t          |j        t          ¦  «        sJ ‚||j                 }t	          |¦  «        t
          v rqt          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.   )r5   r2   r   r6   r7   Ú
mkldnn_maprL   ÚfloatrB   ÚModulerJ   rK   r   )r8   r,   Úold_modulesr+   Ú
cur_moduler;   s         r'   r   r   ·   s¿   € ð /1€KØð ?ð ?ˆØŒ7�mÒ#Ð#Ý˜dœk­3Ñ/Ô/Ð/Ð/Ð/Ø  ¤Ô-ˆJÝ�JÑÔ¥:Ð-Ð-Ý'­¨ZÑ(8Ô(8Ô9¸*ÅeÄkÑRÔR�
Ý! *­b¬iÑ8Ô8Ð8Ð8Ð8Ý*.¬-¸
Ñ*CÔ*C�˜JÑ'Ý# D¨'°:Ñ>Ô>Ð>øØÐr)   r‹   c                 ó®   — | D ]Q}|j         dk    rDt          |j        t          ¦  «        sJ ‚||j                 }||v rt	          ||||         ¦  «         ŒRdS )za
    Maps each module that's been changed with `modules_to_mkldnn` back to its
    original.
    r.   N)r5   r2   r   r6   r   )r8   r,   r‹   r+   rŒ   s        r'   r   r   Ê   su   € ð ð Lð LˆØŒ7�mÒ#Ð#Ý˜dœk­3Ñ/Ô/Ð/Ð/Ð/Ø  ¤Ô-ˆJØ˜[Ð(Ð(Ý# D¨'°;¸zÔ3JÑKÔKÐKøðLð Lr)   c                   ó$   — e Zd Zdej        fd„ZdS )r   Úfx_graphc                 ó>   — || _         g | _        g | _        g | _        d S r=   )r�   r8   Ústart_nodesÚ	end_nodes)rf   r�   s     r'   Ú__init__zMklSubgraph.__init__Ü   s#   € Ø ˆŒØ$&ˆŒ
Ø*,ˆÔØ(*ˆŒˆˆr)   N)rh   ri   rj   r3   r|   r“   rt   r)   r'   r   r   Û   s1   € € € € € ð+ ¤ð +ð +ð +ð +ð +ð +r)   r   é
   r"   c                 óH   ‡ ‡‡‡‡— 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)
    NrQ   r   c                 ó  •‡‡— | j         }‰	€:| j        j        Š	| j        j        Št	          ‰	¦  «                             ‰¦  «         d„ |D ¦   «         Št          t          t          j	                 d„ | j
        D ¦   «         ¦  «        }t          ‰	| j        ||¦  «        Šˆ
ˆfd„} |ˆˆfd„¦  «        }t          ‰j        j        t          ‰                     ¦   «         ¦  «        ‰¦  «          |ˆˆfd„¦  «        }||k     S )Nc                 ó@   — g | ]}t          j        |j        ¦  «        ‘ŒS rt   )rL   ÚrandnÚshape©ry   r+   s     r'   r{   z@gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<listcomp>ö   s$   € ÐIÐIÐI°T�œ T¤ZÑ0Ô0ÐIÐIÐIr)   c                 ó(   — g | ]}|j         d          ‘ŒS )r   )r0   rš   s     r'   r{   z@gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<listcomp>÷   s   € Ð*TÐ*TÐ*T¸D¨4¬9°Q¬<Ð*TÐ*TÐ*Tr)   c                 óÆ   •— t          ‰¦  «        D ]} | ¦   «          Œt          j        ¦   «         }t          ‰¦  «        D ]} | ¦   «          Œt          j        ¦   «         |z
  S r=   )ÚrangeÚtime)Úfr†   ÚbeginÚitersÚwarmups      €€r'   Ú	benchmarkz?gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.benchmarkú   sc   ø€ Ý˜6‘]”]ð ð �Ø�‘”��Ý”I‘K”KˆEÝ˜5‘\”\ð ð �Ø�‘”��Ý”9‘;”; Ñ&Ð&r)   c                  ó6   •— d„  ‰d„ ‰ D ¦   «         Ž D ¦   «         S )Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS rt   )Úto_dense©ry   Úis     r'   r{   zRgen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>.<locals>.<listcomp>  s-   € ð ð ð Ø!"�—
’
‘”ðð ð r)   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS rt   )Ú	to_mkldnnr§   s     r'   r{   zRgen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>.<locals>.<listcomp>  s    € Ð1WÐ1WÐ1WÀA°!·+²+±-´-Ð1WÐ1WÐ1Wr)   rt   ©Úsample_inputsÚ	submodules   €€r'   rw   z>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>  s7   ø€ ð ð Ø&/ iÐ1WÐ1WÈÐ1WÑ1WÔ1WÐ&Xðñ ô € r)   c                  ó   •—  ‰‰ Ž S r=   rt   r«   s   €€r'   rw   z>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>  s   ø€ ¨	¨	°=Ð(A€ r)   )r‘   r�   Úowning_moduler‹   r   Ú	propagater   r	   r3   r4   r’   r   r8   r   rQ   rO   rP   )rQ   Úinput_nodesÚoutput_argsr£   Úmkl_timeÚno_mkl_timer¬   r­   Úexample_inputsrY   r¡   r‹   r¢   s         @@€€€€€r'   Úuse_mkl_heuristicz,gen_mkl_autotuner.<locals>.use_mkl_heuristicï   s8  øøø€ àÔ'ˆØÐØ”~Ô3ˆHØœ.Ô4ˆKÝ�hÑÔ×)Ò)¨.Ñ9Ô9Ð9ØIÐI¸[ÐIÑIÔIˆÝ�4¥¤œ=Ð*TÐ*TÀEÄOÐ*TÑ*TÔ*TÑUÔUˆÝ$ X¨u¬{¸KÈÑUÔUˆ	ð	'ð 	'ð 	'ð 	'ð 	'ð 	'ð �9ðð ð ð ð ñ
ô 
ˆõ 	ØŒOÔ!¥4¨	×(?Ò(?Ñ(AÔ(AÑ#BÔ#BÀKñ	
ô 	
ð 	
ð  �iÐ AÐ AÐ AÐ AÐ AÑBÔBˆØ˜+Ò%Ð%r)   )r   Úbool)rµ   r¡   r¢   r¶   rY   r‹   s   ``` @@r'   r   r   ã   s[   øøøøø€ ð €HØ€Kð&¥ð &µð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð> Ðr)   rQ   c                 ó2   — t          | j        ¦  «        dk    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/   r8   )rQ   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d	S )
r   c                 ó2   — d g|z  | _         dg|z  | _        d S )Nr   ©r%   Úsize)rf   Úns     r'   r“   zUnionFind.__init__  s    € Ø,0¨6°A©:ˆŒØ !˜s Q™wˆŒ	ˆ	ˆ	r)   Úvc                 ó.   — || j         |<   d| j        |<   d S )Nr"   r¼   )rf   r¿   s     r'   Úmake_setzUnionFind.make_set  s   € ØˆŒ�A‰ØˆŒ	�!‰ˆˆr)   r   c                 ó®   — | j         |         }||k    r|S |€J ‚|                      |¦  «        | j         |<   t          t          | j         |         ¦  «        S r=   )r%   Úfindr   Úint)rf   r¿   Úpars      r'   rÃ   zUnionFind.find#  sO   € ØŒk˜!ŒnˆØ�Š8ˆ8ØˆHØˆˆˆØŸš 3™œˆŒ�A‰Ý•C˜œ QœÑ(Ô(Ð(r)   r…   Úbc                 óþ   — |                       |¦  «        |                       |¦  «        }}||k    r|S | j        |         | j        |         k     r||}}|| j        |<   | j        |xx         | j        |         z  cc<   d S r=   )rÃ   r½   r%   )rf   r…   rÆ   s      r'   ÚjoinzUnionFind.join+  sz   € Ø�yŠy˜‰|Œ|˜TŸYšY q™\œ\ˆ1ˆØ�Š6ˆ6ØˆHØŒ9�QŒ<˜$œ) Aœ,Ò&Ð&Ø�aˆqˆAØˆŒ�A‰ØŒ	�!ˆˆŒ˜œ	 !œÑ$ˆˆ‰ˆˆr)   N)rh   ri   rj   r“   rÄ   rÁ   rÃ   rÈ   rt   r)   r'   r   r     s‚   € € € € € ð'ð 'ð 'ð˜#ð ð ð ð ð)�cð )˜cð )ð )ð )ð )ð%�cð %˜cð %ð %ð %ð %ð %ð %r)   r   Úpass_configÚtracerc                 ó¨  ‡‡‡— dddt           idœ}|€i }|                     |¦  «         |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         } |¦   «         }|                     t          j	        | ¦  «        ¦  «        Št          j        |j        ‰¦  «         t          |                      ¦   «         ¦  «        } G d„ dt          ¦  «        }t          ‰j        ¦  «        D �]ò}|j        }	|j        dk    r•||j                 }
t)          |
¦  «        t*          v rq|j        }	t/          |
                     ¦   «         d¦  «        }|�F|j        t4          j        k    s
J d¦   «         ‚|j        t5          j        d¦  «        k    s
J d¦   «         ‚n6|j        dk    r+|j        t*          v r|j        }	n|j        t:          v r|j        }	|	|j        k    �r|	|j        k    r t?          d„ |j         D ¦   «         ¦  «        s�Œ‰ !                    |¦  «        5  t          j"        |j         ˆfd„¦  «        }ddd¦  «         n# 1 swxY w Y   tG          tH          t          j%        j&                 |¦  «        |_         ‰ '                    |¦  «        5  ‰ (                    dd|f¦  «        }| )                    |¦  «         |f|_         ddd¦  «         n# 1 swxY w Y   �ŒôtU          t          ‰j        ¦  «        |¦  «        }|‰_+        ‰j        D ]«}|j        dk    rž|j        dk    r“|j         d         }t          |j,        ¦  «        }|D ]B}|j        dk    r5|j        dk    r*| )                    |¦  «         ‰ -                    |¦  «         ŒCt]          |j,        ¦  «        dk    r‰ -                    |¦  «         Œ¬t]          ‰j        ¦  «        }t_          |¦  «        Šˆfd„Šta          ‰j        ¦  «        D �]
\  }}|j        dk    r(|j        dk    r||_1        ‰ 2                    |¦  «         Œ9|j        dk    r?|j        dk    r4 ‰|j         d         ¦  «        €J ‚ ‰|j         d         ¦  «        |_3        Œƒˆfd„|j4        D ¦   «         }t]          |¦  «        dk    rŒªt?          d„ |D ¦   «         ¦  «        rJ ‚tk          |¦  «        }|d         |_6        |dd…         D ]}‰ 7                    |d         |¦  «         Œ�Œtq          ˆfd„¦  «        }‰j        D ]Ú}ts          |d¦  «        r8|‰ :                    |j6        ¦  «                 j         ;                    |¦  «         ts          |d¦  «        r8|‰ :                    |j1        ¦  «                 j<         ;                    |¦  «         ts          |d¦  «        r8|‰ :                    |j3        ¦  «                 j=         ;                    |¦  «         ŒÛ| >                    ¦   «         D ]l} ||¦  «        s_|j<        |j=        z   D ]9}|j         d         }| )                    |¦  «         ‰ -                    |¦  «         Œ:t          |j        ||¦  «         Œmd}‰j        D ]}|j        dk    s|j        dk    r|dz  }Œt�          jA        t„          ¦  «         C                    d |¦  «         ‰ D                    ¦   «          t          j        | ‰¦  «        }|S )!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dS )ú*optimize_for_inference.<locals>.MklSupportr"   r¹   é   N)rh   ri   rj   ÚNOÚYESÚUNKNOWNrt   r)   r'   Ú
MklSupportrÐ   a  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    V — ŒdS )r¦   N)r   )ry   Úargs     r'   ú	<genexpr>z)optimize_for_inference.<locals>.<genexpr>€  s)   è è € ÐIÐI¸˜3œ:¨Ò3ÐIÐIÐIÐIÐIÐIr)   c                 ó2   •— ‰                      d| f¦  «        S )Nrª   )Úcall_method)r¾   r�   s    €r'   rw   z(optimize_for_inference.<locals>.<lambda>„  s   ø€ ¨×)=Ò)=¸kÈAÈ4Ñ)PÔ)P€ r)   rÜ   r¦   r   rª   c                 ó°   •— t          | d¦  «        r‰                     | j        ¦  «        S t          | d¦  «        r‰                     | j        ¦  «        S d S )NÚcolorÚstart_color)ÚhasattrrÃ   rÞ   rß   )r¾   Úufs    €r'   Ú	get_colorz)optimize_for_inference.<locals>.get_color¡  sT   ø€ Ý�1�gÑÔð 	$Ø—7’7˜1œ7Ñ#Ô#Ð#Ý�1�mÑ$Ô$ð 	*Ø—7’7˜1œ=Ñ)Ô)Ð)Øˆtr)   c                 óp   •— g | ]2}t          |t          j        ¦  «        r ‰|¦  «        ®' ‰|¦  «        ‘Œ3S r=   )r2   r3   r4   )ry   r¨   râ   s     €r'   r{   z*optimize_for_inference.<locals>.<listcomp>»  sQ   ø€ ð ð ð àÝ˜a¥¤Ñ)Ô)ðð �9˜Q‘<”<Ð+ð �	˜!‘”ð ,Ð+Ð+r)   c              3   ó   K  — | ]}|d u V — Œ	d S r=   rt   r§   s     r'   rÚ   z)optimize_for_inference.<locals>.<genexpr>Ä  s&   è è € Ð9Ð9¨˜1 ˜9Ð9Ð9Ð9Ð9Ð9Ð9r)   r"   c                  ó"   •— t          ‰ ¦  «        S r=   )r   )r�   s   €r'   rw   z(optimize_for_inference.<locals>.<lambda>Ê  s   ø€ ÅÈHÑ@UÔ@U€ r)   rÞ   rß   Ú	end_colorzmkldnn conversions: %s)Er   Úupdater   r   r2   rO   ÚRuntimeErrorÚtracerJ   rK   r3   rM   ÚrootrP   r   Úlistr8   rÒ   r5   r   r7   Úmkldnn_supportedrÓ   ÚnextÚ
parametersÚdtyperL   r‰   ÚdeviceÚmkldnn_supported_unknownrÔ   Úanyr0   Úinserting_beforeÚmap_argr   r   r+   r   Úinserting_afterÚcreate_noderT   r   r‹   rR   rU   r/   r   Ú	enumeraterß   rÁ   ræ   Úall_input_nodesÚsortedrÞ   rÈ   r   rà   rÃ   Úappendr‘   r’   Úvaluesr   ÚloggingÚ	getLoggerrh   Úinfor   )r@   rÉ   rÊ   Údefault_pass_configr¶   Ú
cur_tracerr,   rÕ   r+   Úsupports_mkldnnrŒ   Úsample_parameterÚmkldnn_argsÚdense_xr‹   Úprv_noderR   ÚuserÚ	num_nodesÚcur_idxÚ
cur_colorsÚother_colorÚmkldnn_graphsrQ   ÚprvÚmkldnn_conversionsÚresultr�   râ   rá   s                              @@@r'   r   r   5  sc  øøø€ ð& ØØ#.µÐ"?ðð Ðð
 ÐØˆØ×Ò˜{Ñ+Ô+Ð+à˜>Ô*ð Ý�U‘”ˆØÐ+Ô,ð &Ý˜uÑ%Ô%ˆØÐ3Ô4¸Ð=Ð=ØˆÝÐ)Ð*BÔCÅTÑJÔJð JÝÐHÑIÔIÐIØÐ-Ð.FÔGÐGÐGÝÐQÑRÔRÐRØ+Ð,DÔEÀkÔRÐà�‘”€JØ×Ò¥¤¨eÑ 4Ô 4Ñ5Ô5€HÝ„N�:”? HÑ-Ô-Ð-Ý$(¨×)<Ò)<Ñ)>Ô)>Ñ$?Ô$?€Gðð ð ð ð •Tñ ô ð õ �X”^Ñ$Ô$ð "'ñ "'ˆØ$œ-ˆØŒ7�mÒ#Ð#Ø  ¤Ô-ˆJÝ�JÑÔÕ#3Ð3Ð3Ø",¤.�Ý#'¨
×(=Ò(=Ñ(?Ô(?ÀÑ#FÔ#FÐ Ø#Ð/à(Ô.µ%´+Ò=Ð=Ð=ØBñ >Ô=Ð=à+Ô2µe´lØñ7ô 7ò ð ð à:ñô ð øð ŒW˜Ò'Ð'ØŒ{Õ.Ð.Ð.Ø",¤.��Ø”Õ 8Ð8Ð8Ø",Ô"4�à˜jœmÒ+Ñ+Ø *Ô"4Ò4Ð4ÝÐIÐI¸t¼yÐIÑIÔIÑIÔIð ÙØ×*Ò*¨4Ñ0Ô0ð ð Ý œjØ”IÐPÐPÐPÐPñô �ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ
 �U¥2¤7Ô#3Ô4°kÑBÔBˆDŒIà×)Ò)¨$Ñ/Ô/ð 'ð 'Ø"×.Ò.¨}¸jÈ4È'ÑRÔR�Ø×*Ò*¨7Ñ3Ô3Ð3Ø $˜w�”ð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'ùõ $¥D¨¬Ñ$8Ô$8¸'ÑBÔB€KØ&€HÔð ”ð 	*ð 	*ˆØŒ7�mÒ#Ð#¨¬°zÒ(AÐ(AØ”y ”|ˆHÝ˜œÑ$Ô$ˆEØð .ð .�Ø”7˜mÒ+Ð+°´¸{Ò0JÐ0JØ×.Ò.¨xÑ8Ô8Ð8Ø×'Ò'¨Ñ-Ô-Ð-øÝ�4”:‰Œ !Ò#Ð#Ø×#Ò# DÑ)Ô)Ð)øå�H”NÑ#Ô#€IÝ	�9Ñ	Ô	€Bðð ð ð ð õ$ # 8¤>Ñ2Ô2ð 4ñ 4‰ˆ�ØŒ7�mÒ#Ð#¨¬°{Ò(BÐ(BØ&ˆDÔØ�KŠK˜Ñ Ô Ð Ð ØŒW˜Ò%Ð%¨$¬+¸Ò*CÐ*CØ�9˜TœY qœ\Ñ*Ô*Ð6Ð6Ð6Ø&˜Y t¤y°¤|Ñ4Ô4ˆDŒNˆNðð ð ð àÔ-ðñ ô ˆJõ �:‰Œ !Ò#Ð#ØÝÐ9Ð9¨jÐ9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ý 
Ñ+Ô+ˆJØ# AœˆDŒJØ)¨!¨"¨"œ~ð 4ð 4�Ø—’˜
 1œ {Ñ3Ô3Ð3Ð3ñ4õ -8Ð8UÐ8UÐ8UÐ8UÑ,VÔ,V€MØ”ð Jð JˆÝ�4˜Ñ!Ô!ð 	BØ˜"Ÿ'š' $¤*Ñ-Ô-Ô.Ô4×;Ò;¸DÑAÔAÐAÝ�4˜Ñ'Ô'ð 	NØ˜"Ÿ'š' $Ô"2Ñ3Ô3Ô4Ô@×GÒGÈÑMÔMÐMÝ�4˜Ñ%Ô%ð 	JØ˜"Ÿ'š' $¤.Ñ1Ô1Ô2Ô<×CÒCÀDÑIÔIÐIøð ×%Ò%Ñ'Ô'ð =ð =ˆØ Ð  Ñ'Ô'ð 	=ØÔ)¨E¬OÑ;ð *ð *�Ø”i ”l�Ø×*Ò*¨3Ñ/Ô/Ð/Ø×#Ò# DÑ)Ô)Ð)Ð)Ý˜%œ+ w°Ñ<Ô<Ð<øàÐØ”ð $ð $ˆØŒ;˜+Ò%Ð%¨¬¸
Ò)BÐ)BØ !Ñ#ÐøåÔ•hÑÔ×$Ò$Ð%=Ð?QÑRÔRÐRØ‡M‚M�O„O€OÝŒ^˜E 8Ñ,Ô,€FØ€Ms$   É4JÊJ"	Ê%J"	Ë-6L/Ì/L3	Ì6L3	)FF)r”   r"   )KrJ   rü   Úoperatorrž   Úcollectionsr   Úenumr   Útypingr   r   r   r   r	   r
   r   r   rL   Útorch.fxr3   Útorch.nnrB   Ú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__r6   r(   r4   r   rŠ   r   r   r   r   rE   rI   rF   ÚReLUÚ	MaxPool2dÚ	AvgPool2dÚAdaptiveAvgPool2dÚreluÚ	transposeÚsigmoidÚ
avg_pool2dÚadaptive_avg_pool2drì   ÚaddÚmulrñ   ÚMkldnnConv2dÚMkldnnLinearrˆ   r   r   r   r   r·   r   r   ÚTracerr   rt   r)   r'   ú<module>r-     sˆ  ðà €€€Ø €€€Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ Ià €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hðð ð €ð -˜ð -  s¨C x¤ð -ð -ð -ð -ðØ�dŒ^ðØ#%¤7ðØ59¸#¸s¸(´^ðð ð ð ð(4Ø
Œ'ð4Ø   c œNð4Ø8=¼¼ð4ð 4ð 4ð 4ð%/ð %/�””ð %/À5Ä8Ä?ð %/ð %/ð %/ð %/ðP0˜"œ)ð 0¨¬	ð 0ð 0ð 0ð 0ð&2Ø”ð2à�”Œ=ð2ð �”ŒMð2ð �"”'Œ]ð	2ð 2ð 2ð 2ð. „IØ„IØ„NØ„GØ„LØ„LØÔØ	„JØ	„OØ	„MØ„FØ„LØÔðÐ ð& %œL¨(¬,Ð7Ð à„IˆyÔ%Ø„IˆyÔ%Ø„NÐ=Ð=ð€
ð˜T "¤'œ]ð °T¸#¸r¼y¸.Ô5Ið ð ð ð ð&LØ�”Œ=ðLà�#�r”y�.Ô!ðLð �b”i ¤Ð*Ô+ðLð Lð Lð Lð"+ð +ð +ð +ð +ñ +ô +ð +ð+ð +ð +ð +ð\ ˜+ð  ¨$ð  ð  ð  ð  ð%ð %ð %ð %ð %ñ %ô %ð %ð: -1Ø œiðpð pØŒ8Œ?ðpà˜$˜s C˜xœ.Ô)ðpð �”ŒOðpð „X„_ð	pð pð pð pð pð pr)   