§
    ŠŠtjNJ  ã                   óT  — 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j'        de(e#ej        j)        f         de*fd„Z+dej'        de(e#ej        j)        f         dej        j)        ddfd„Z,	 d1dej        j)        de*de*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'                 dej0        f
d„Z1ej2        ej3        ej4        ej5        ej6        ej7        ej8        ej9        ej:        ej;        ej9        ej<        ej=        gZ>ej?        ej@        gZAej2        ejB        ej3        ejC        ej4        d„ iZDde/ej'                 de(e#ej)        f         de(ej)        ej)        f         fd„ZEdeej'                 de(e#ej)        f         d e(ej)        ej)        f         ddfd!„ZF G d"„ d#¦  «        ZG	 d2d&e/ejH                 d'eId(eIdeeGge*f         fd)„ZJd*eGde*fd+„ZK G d,„ d-¦  «        ZLdejM        fdej        j)        d.e(e#ef         dz  d/e&ejM                 dej        j)        fd0„ZNdS )3é    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                 ó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      ú`/var/www/html/CA-Chatbot/venv/lib/python3.11/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Ø'+¤y°¤|°TÐ&:€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$t          dt	          | j        ¦  «        › �¦  «        ‚t          | j        ¦  «        \  }}||| j        <   t          ||         ||¦  «         d S )NúExpected str target, got )r.   r   r2   ÚAssertionErrorr3   r$   Úsetattr)r'   r(   r7   Úparent_namer"   s        r#   r   r   B   sw   € õ �d”k¥3Ñ'Ô'ð NÝÐL½¸d¼kÑ9JÔ9JÐLÐLÑMÔMÐMÝ$ T¤[Ñ1Ô1Ñ€K�Ø%€GˆDŒKÑÝˆG�KÔ  $¨
Ñ3Ô3Ð3Ð3Ð3r%   FÚ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          |                     ¦   «         ¦  «        }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Ú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Ð#Ý	Œ•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   r,   .Úkwargsr   c                 ó  •— t          | j        |         t          j        ¦  «        r:t	          |¦  «        dk    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}   ss   ø€ õ ˜$œ/¨&Ô1µ2´:Ñ>Ô>ð AÝ�t‘9”9 ’>�>Ý(Ð)WÍCÐPTÉIÌIÐ)WÐ)WÑXÔXÐXØ˜A”w�å‘w”w×*Ò*¨6°4¸Ñ@Ô@Ð@r%   )Ú__name__Ú
__module__Ú__qualname__r
   Útupler	   rN   r2   r   r*   Ú__classcell__)rd   s   @r#   ÚDropoutRemoverr]   |   s}   ø€ € € € € ð	AØ ð	AØ(-¨h¸¨mÔ(<ð	AØFJÈ3ÐPSÈ8Änð	Aàð	Að 	Að 	Að 	Að 	Að 	Að 	Að 	Að 	Að 	Ar%   rj   )r/   rM   rK   ÚTransformerÚ	transform)r=   rV   rj   s      r#   r   r   v   si   € õ Ô  Ñ'Ô'€Hð	Að 	Að 	Að 	Að 	A�œÔ-ñ 	Aô 	Að 	Að ˆ>˜(Ñ#Ô#×-Ò-Ñ/Ô/Ð/r%   Úorig_moduler4   Ú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 ©N© )ÚxÚenvs    €r#   ú<lambda>z"extract_subgraph.<locals>.<lambda>™   s   ø€ °s¸1´v€ r%   c                 ó    •— g | ]
}‰|         ‘ŒS rs   rs   )Ú.0Úoutputru   s     €r#   ú
<listcomp>z$extract_subgraph.<locals>.<listcomp>›   s   ø€ Ð8Ð8Ð8 f�c˜&”kÐ8Ð8Ð8r%   )r/   ÚGraphÚplaceholderr"   Ú	node_copyry   ÚlintrL   )	rm   r4   rn   ro   rW   ÚinputÚnew_noder'   ru   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 rr   )Ú	th_mkldnnÚMkldnnBatchNorm)ÚaÚ_s     r#   rv   rv   ·   s   € ¥Ô!:¸1Ñ!=Ô!=€ r%   c                 ó  — i }| D ]ü}|j         dk    rït          |j        t          ¦  «        s$t	          dt          |j        ¦  «        › �¦  «        ‚||j                 }t          |¦  «        t          v rŽt          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�mÒ#Ð#Ý˜dœk­3Ñ/Ô/ð VÝ$Ð%TÅÀdÄkÑARÔARÐ%TÐ%TÑUÔUÐUØ  ¤Ô-ˆJÝ�JÑÔ¥:Ð-Ð-å'­¨ZÑ(8Ô(8Ô9¸*ÅeÄkÑRÔR�
Ý! *­b¬iÑ8Ô8ð XÝ(Ð)VÅDÈÑDTÔDTÐ)VÐ)VÑWÔWÐWÝ*.¬-¸
Ñ*CÔ*C�˜JÑ'Ý# D¨'°:Ñ>Ô>Ð>øØÐr%   rŠ   c                 óò   — | D ]s}|j         dk    rft          |j        t          ¦  «        s$t	          dt          |j        ¦  «        › �¦  «        ‚||j                 }||v rt          ||||         ¦  «         ŒtdS )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   Ó   s“   € ð ð Lð LˆØŒ7�mÒ#Ð#Ý˜dœk­3Ñ/Ô/ð VÝ$Ð%TÅÀdÄkÑARÔARÐ%TÐ%TÑUÔUÐUØ  ¤Ô-ˆJØ˜[Ð(Ð(Ý# D¨'°;¸zÔ3JÑKÔKÐKøðLð Lr%   c                   ó(   — e Zd Zdej        ddfd„ZdS )r   Úfx_graphr   Nc                 ó>   — || _         g | _        g | _        g | _        d S rr   )rŽ   r4   Ústart_nodesÚ	end_nodes)rc   rŽ   s     r#   Ú__init__zMklSubgraph.__init__æ   s#   € Ø ˆŒØ$&ˆŒ
Ø*,ˆÔØ(*ˆŒˆˆr%   )re   rf   rg   r/   r{   r’   rs   r%   r#   r   r   å   s8   € € € € € ð+ ¤ð +¨dð +ð +ð +ð +ð +ð +r%   r   é
   r   Úexample_inputsÚitersÚwarmupc                 ó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)
    NrP   r   c                 ó€  •‡‡— | j         }‰	€K| j        j        Š	‰	€t          d¦  «        ‚| j        j        Št          ‰	¦  «                             ‰¦  «         d„ |D ¦   «         Št          t          t          j
                 d„ | j        D ¦   «         ¦  «        }‰	€t          d¦  «        ‚t          ‰	| j        ||¦  «        Šdt          g t          f         dt           fˆ
ˆfd„} |ˆˆfd„¦  «        }t#          ‰j        j        t'          ‰                     ¦   «         ¦  «        ‰¦  «          |ˆˆfd	„¦  «        }||k     S )
Nz'fx_graph.owning_module must not be Nonec                 ó@   — g | ]}t          j        |j        ¦  «        ‘ŒS rs   )rK   ÚrandnÚshape©rx   r'   s     r#   rz   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   )r,   rœ   s     r#   rz   z@gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<listcomp>  s   € Ð*TÐ*TÐ*T¸D¨4¬9°Q¬<Ð*TÐ*TÐ*Tr%   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
  sc   ø€ Ý˜6‘]”]ð ð �Ø�‘”��Ý”I‘K”KˆEÝ˜5‘\”\ð ð �Ø�‘”��Ý”9‘;”; Ñ&Ð&r%   c                  ó6   •— d„  ‰d„ ‰ D ¦   «         Ž D ¦   «         S )Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS rs   )Úto_dense©rx   Úis     r#   rz   zRgen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>.<locals>.<listcomp>  s-   € ð ð ð Ø!"�—
’
‘”ðð ð r%   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS rs   )Ú	to_mkldnnr§   s     r#   rz   zRgen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>.<locals>.<listcomp>  s    € Ð1WÐ1WÐ1WÀA°!·+²+±-´-Ð1WÐ1WÐ1Wr%   rs   ©Úsample_inputsÚ	submodules   €€r#   rv   z>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>  s7   ø€ ð ð Ø&/ iÐ1WÐ1WÈÐ1WÑ1WÔ1WÐ&Xðñ ô € r%   c                  ó   •—  ‰‰ Ž S rr   rs   r«   s   €€r#   rv   z>gen_mkl_autotuner.<locals>.use_mkl_heuristic.<locals>.<lambda>  s   ø€ ¨	¨	°=Ð(A€ r%   )r�   rŽ   Úowning_moduler:   rŠ   r   Ú	propagater   Úlistr/   r0   r‘   r   r4   r   Úobjectrˆ   r   rP   rN   rO   )rP   Úinput_nodesÚ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ˆHØÐÝ$Ð%NÑOÔOÐOØœ.Ô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ˆ	ð	'� "¥f *Ô-ð 	'µ%ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð �9ðð ð ð ð ñ
ô 
ˆõ 	ØŒOÔ!Ý�×(Ò(Ñ*Ô*Ñ+Ô+àñ		
ô 	
ð 	
ð  �iÐ AÐ AÐ AÐ AÐ AÑBÔBˆØ˜+Ò%Ð%r%   )r   Úbool)r”   r•   r–   r·   rV   rŠ   s   ``` @@r#   r   r   í   s\   øøøøø€ ð €HØ€Kð$&¥ð $&µð $&ð $&ð $&ð $&ð $&ð $&ð $&ð $&ð $&ð $&ðL Ðr%   rP   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+   r4   )rP   s    r#   r   r   $  s   € õ ˆuŒ{ÑÔ˜aÒÐr%   c                   óX   — 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dS )r   Únr   Nc                 ó2   — d g|z  | _         dg|z  | _        d S )Nr   ©r!   Úsize)rc   r¼   s     r#   r’   zUnionFind.__init__.  s    € Ø)-¨°©
ˆŒØ !˜s Q™wˆŒ	ˆ	ˆ	r%   Úvc                 ó.   — || j         |<   d| j        |<   d S )Nr   r¾   )rc   rÀ   s     r#   Úmake_setzUnionFind.make_set2  s   € ØˆŒ�A‰ØˆŒ	�!‰ˆˆr%   c                 óÈ   — | j         |         }||k    r|S |€t          d¦  «        ‚|                      |¦  «        | j         |<   t          t          | j         |         ¦  «        S )NzParent is None)r!   r:   Úfindr   Úint)rc   rÀ   Úpars      r#   rÄ   zUnionFind.find6  sZ   € ØŒk˜!ŒnˆØ�Š8ˆ8ØˆHØˆ;Ý Ð!1Ñ2Ô2Ð2ØŸš 3™œˆŒ�A‰Ý•C˜œ QœÑ(Ô(Ð(r%   r„   Úbc                 óþ   — |                       |¦  «        |                       |¦  «        }}||k    r|S | j        |         | j        |         k     r||}}|| j        |<   | j        |xx         | j        |         z  cc<   d S rr   )rÄ   r¿   r!   )rc   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%   )re   rf   rg   rÅ   r’   rÂ   rÄ   rÉ   rs   r%   r#   r   r   -  s§   € € € € € ð'˜#ð ' $ð 'ð 'ð 'ð 'ð˜#ð  $ð ð ð ð ð)�cð )˜cð )ð )ð )ð )ð%�cð %˜cð % c¨D¡jð %ð %ð %ð %ð %ð %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 r{|j        }	t/          |
                     ¦   «         d¦  «        }|�P|j        t4          j        k    rt9          d¦  «        ‚|j        t5          j        d¦  «        k    rt9          d¦  «        ‚n6|j        dk    r+|j        t*          v r|j        }	n|j        t<          v r|j        }	|	|j        k    �r|	|j        k    r tA          d„ |j!        D ¦   «         ¦  «        s�Œ!‰ "                    |¦  «        5  t          j#        |j!        ˆfd„¦  «        }ddd¦  «         n# 1 swxY w Y   tI          tJ          t          j&        j'                 |¦  «        |_!        ‰ (                    |¦  «        5  ‰ )                    dd|f¦  «        }| *                    |¦  «         |f|_!        ddd¦  «         n# 1 swxY w Y   �ŒþtW          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        ¦  «        }ta          |¦  «        Šdt          j1        dtd          dz  fˆfd„Štg          ‰j        ¦  «        D �]$\  }}|j        dk    r(|j        dk    r||_4        ‰ 5                    |¦  «         Œ9|j        dk    rL|j        dk    rA ‰|j!        d         ¦  «        €t9          d¦  «        ‚ ‰|j!        d         ¦  «        |_6        Œ�ˆfd„|j7        D ¦   «         }t_          |¦  «        dk    rŒ·tA          d„ |D ¦   «         ¦  «        rt9          d¦  «        ‚tq          |¦  «        }|d         |_9        |dd…         D ]}‰ :                    |d         |¦  «         Œ�Œ&tw          ˆfd „¦  «        }‰j        D ]Ú}ty          |d!¦  «        r8|‰ =                    |j9        ¦  «                 j         >                    |¦  «         ty          |d"¦  «        r8|‰ =                    |j4        ¦  «                 j?         >                    |¦  «         ty          |d#¦  «        r8|‰ =                    |j6        ¦  «                 j@         >                    |¦  «         ŒÛ| A                    ¦   «         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‡          jD        tŠ          ¦  «         F                    d$|¦  «         ‰ G                    ¦   «          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)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    V — ŒdS )r¦   N)r   )rx   Ú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#   rv   z(optimize_for_inference.<locals>.<lambda>˜  s   ø€ ¨×)=Ò)=¸kÈAÈ4Ñ)PÔ)P€ r%   rÝ   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%   z!Expected color for to_dense inputc                 óp   •— g | ]2}t          |t          j        ¦  «        r ‰|¦  «        ®' ‰|¦  «        ‘Œ3S rr   )r.   r/   r0   )rx   r¨   rã   s     €r#   rz   z*optimize_for_inference.<locals>.<listcomp>Ð  sQ   ø€ ð ð ð àÝ˜a¥¤Ñ)Ô)ðð �9˜Q‘<”<Ð+ð �	˜!‘”ð ,Ð+Ð+r%   c              3   ó   K  — | ]}|d u V — Œ	d S rr   rs   r§   s     r#   rÛ   z)optimize_for_inference.<locals>.<genexpr>Ù  s&   è è € Ð1Ð1 �1˜�9Ð1Ð1Ð1Ð1Ð1Ð1r%   zFound None in cur_colorsr   c                  ó"   •— t          ‰ ¦  «        S rr   )r   )rŽ   s   €r#   rv   z(optimize_for_inference.<locals>.<lambda>à  s   ø€ ÅÈHÑ@UÔ@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_nodesÚcur_idxÚ
cur_colorsÚsorted_colorsÚother_colorÚmkldnn_graphsrP   ÚprvÚmkldnn_conversionsÚresultrŽ   rã   râ   s                               @@@r#   r   r   I  s‡  øøø€ ð& ØØ#.µÐ"?ðð Ðð
 ÐØˆØ×Ò˜{Ñ+Ô+Ð+à˜>Ô*ð Ý�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Ð Ø#Ð/Ø'Ô-µ´Ò<Ð<Ý,ØGñô ð ð (Ô.µ%´,¸uÑ2EÔ2EÒEÐEÝ,Ð-PÑQÔQÐQøØŒ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ð•R”Wð ¥ t¡ð ð ð ð ð ð õ$ # 8¤>Ñ2Ô2ð 7ñ 7‰ˆ�ØŒ7�mÒ#Ð#¨¬°{Ò(BÐ(BØ&ˆDÔØ�KŠK˜Ñ Ô Ð Ð ØŒW˜Ò%Ð%¨$¬+¸Ò*CÐ*CØˆy˜œ 1œÑ&Ô&Ð.Ý$Ð%HÑIÔIÐIØ&˜Y t¤y°¤|Ñ4Ô4ˆDŒNˆNðð ð ð àÔ-ðñ ô ˆJõ �:‰Œ !Ò#Ð#ØÝÐ1Ð1 jÐ1Ñ1Ô1Ñ1Ô1ð AÝ$Ð%?Ñ@Ô@Ð@Ý'-¨jÑ'9Ô'9ˆMØ& qÔ)ˆDŒJØ,¨Q¨R¨RÔ0ð 7ð 7�Ø—’˜ aÔ(¨+Ñ6Ô6Ð6Ð6ñ7õ -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$   É>J(Ê(J,	Ê/J,	Ë76L9Ì9L=	Í L=	)FF)r“   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>r0     s   ðØ €€€Ø €€€Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hðð ð €ð -˜ð -  s¨C x¤ð -ð -ð -ð -ðØ�dŒ^ðØ#%¤7ðØ59¸#¸u¼x¼Ð:NÔ5Oðà	ðð ð ð ð(4Ø
Œ'ð4Ø   e¤h¤oÐ!5Ô6ð4ØDIÄHÄOð4à	ð4ð 4ð 4ð 4ð EJð'/ð '/ØŒ8Œ?ð'/Ø%)ð'/Ø=Að'/à
„X„_ð'/ð '/ð '/ð '/ðT0˜"œ)ð 0¨¬	ð 0ð 0ð 0ð 0ð(2Ø”ð2à�”Œ=ð2ð �”ŒMð2ð �"”'Œ]ð	2ð
 „^ð2ð 2ð 2ð 2ð. „IØ„IØ„NØ„GØ„LØ„LØÔØ	„JØ	„OØ	„MØ„FØ„LØÔðÐ ð& %œL¨(¬,Ð7Ð à„IˆyÔ%Ø„IˆyÔ%Ø„NÐ=Ð=ð€
ðØ�”Œ=ðØ#'¨¨R¬Y¨Ô#7ðà	ˆ"Œ)�R”YÐ
Ôðð ð ð ð0LØ�B”GÔðLà�#�r”y�.Ô!ðLð �b”i ¤Ð*Ô+ðLð 
ð	Lð Lð Lð Lð$+ð +ð +ð +ð +ñ +ô +ð +ð HIð4ð 4Ø˜œÔ&ð4Ø/2ð4ØADð4àˆ{ˆm˜TÐ!Ô"ð4ð 4ð 4ð 4ðn ˜+ð  ¨$ð  ð  ð  ð  ð%ð %ð %ð %ð %ñ %ô %ð %ð< *.Ø œiðrð rØŒ8Œ?ðrà�c˜3�h” $Ñ&ðrð �”ŒOðrð „X„_ð	rð rð rð rð rð rr%   