§
    ŠŠtj,  ã                  óp  — d dl mZ d dlZd dlZd dlZd dlmZ d dl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 d dlmZmZ d dlmZmZ d d	lmZ d d
lmZ ddlmZ ej        j         Z ej        j!        Z! ej"        e#¦  «        Z$d%d„Z%d&d„Z&d&d„Z' G d„ dej(        ¦  «        Z)d„ Z*d'd!„Z+d(d"„Z,d(d#„Z-d(d$„Z.dS ))é    )ÚannotationsN)ÚAny)Údynamo_timedÚlazy_format_graph_code)ÚMutationType)Úfx_graph_cse)Úconstant_foldÚreplace_node_with_constant)Úenter_freezingÚrecord_has_frozen_params)Úfreezing_passes)Úview_to_reshapeé   )ÚconfigÚgmútorch.fx.GraphModuleÚflat_paramsú	list[Any]Úfw_metadataú1torch._functorch.aot_autograd.ViewAndMutationMetaÚreturnú	list[int]c                ó~  — | j                              d¬¦  «        }|dt          |¦  «        …         }g }d„ |j        D ¦   «         }d„ t	          |j        ¦  «        D ¦   «         }g }d}	t	          t          ||¦  «        ¦  «        D ]_\  }
\  }}|
|v s|
|v r9|                     |
¦  «         |
|j        v r|
|	z
  }|                     |¦  «         ŒIt          | ||¦  «         |	dz  }	Œ`| 
                    t          t          |¦  «        t          |¦  «        ¦  «        ¦  «         ||_        |                      ¦   «          |S )zÂ
    Replaces the parameters of a PyTorch GraphModule with constants wherever possible.
    Returns a list of indices representing the input parameters that were not converted to constants.
    Úplaceholder©ÚopNc                ó*   — g | ]}|j         ®	|j         ‘ŒS ©N)Úbase_idx)Ú.0Úout_infos     úV/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_inductor/freezing.pyú
<listcomp>z1replace_params_with_constants.<locals>.<listcomp>(   s.   € ð ð ð àØÔÐ(ð 	Ôà(Ð(Ð(ó    c                óV   — g | ]&\  }}|j         t          j        t          j        fv ¯$|‘Œ'S © )Úmutation_typer   ÚMUTATED_IN_GRAPHÚMUTATED_OUT_GRAPH)r    ÚiÚms      r"   r#   z1replace_params_with_constants.<locals>.<listcomp>0   sN   € ð ð ð áˆAˆqØŒ?ÝÔ)­<Ô+IÐJðKð Kð 	
ðKð Kð Kr$   r   r   )ÚgraphÚ
find_nodesÚlenÚoutput_infoÚ	enumerateÚ
input_infoÚzipÚappendÚstatic_input_indicesr
   ÚextendÚrangeÚ	recompile)r   r   r   ÚparamsÚfake_inp_nodesÚpreserved_arg_indicesÚaliased_input_argsÚmutated_inpsÚstatic_indices_newÚstatic_indices_offsetr*   Ú
real_inputÚnodeÚnew_static_indexs                 r"   Úreplace_params_with_constantsrB      s{  € ð ŒX× Ò  MÐ Ñ2Ô2€FØ˜M�c &™kœk˜MÔ*€NØÐðð à#Ô/ðñ ô Ððð å˜kÔ4Ñ5Ô5ðñ ô €Lð ÐØÐÝ!*­3¨{¸NÑ+KÔ+KÑ!LÔ!Lð 'ð 'ÑˆÑˆJ˜Ø�ÐÐ Ð%7Ð 7Ð 7Ø!×(Ò(¨Ñ+Ô+Ð+Ø�KÔ4Ð4Ð4Ø#$Ð'<Ñ#<Ð Ø"×)Ò)Ð*:Ñ;Ô;Ð;øå& r¨4°Ñ<Ô<Ð<Ø! QÑ&Ð!Ð!à× Ò ¥¥s¨;Ñ'7Ô'7½¸V¹¼Ñ!EÔ!EÑFÔFÐFà'9€KÔ$Ø‡L‚L�N„N€NØ Ð r$   Ú	dynamo_gmÚaot_autograd_gmÚexample_inputsú"list[torch._subclasses.FakeTensor]ú&tuple[torch.fx.GraphModule, list[int]]c                ót   — t          ¦   «         5  t          | ||¦  «        cddd¦  «         S # 1 swxY w Y   dS )a5  
    Inlines parameters that are not mutated into constants and optimizes the graph through constant propagation
    and other techniques. If enabled, the function also discards the original parameters of the module for memory efficiency.

    Assumes that this function is run in dynamo tracing post aot_autograd.

    Args:
        dynamo_gm (torch.fx.GraphModule): The Dynamo constructed GraphModule.
        aot_autograd_gm (torch.fx.GraphModule): The aot_autograd constructed GraphModule to be frozen.
        example_inputs (List[torch.Tensor]): A list of example input tensors to be used in the freezing process.

    Returns:
        Tuple[torch.fx.GraphModule, List[int]]: A tuple containing the frozen GraphModule and a list of indices
        of the inputs that were preserved (not turned into constants).
    N)r   Ú_freeze)rC   rD   rE   s      r"   ÚfreezerJ   J   s—   € õ( 
Ñ	Ô	ð Cð CÝ�y /°>ÑBÔBðCð Cð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð Cð Cð Cs   �-­1´1c                óØ  ‡— t          |¦  «         t          j        j                             ¦   «         x}r/|j        }|j        €J ‚|j        }|�|€J ‚t          |||¦  «        }nD|j         	                    d¬¦  «        }t          t          t          |¦  «        ¦  «        ¦  «        }t          |j        ¦  «        }||_        |                     ¦   «          ˆfd„|D ¦   «         }	t          ||	¦  «         t!          |¦  «         t"          j        rt'          ¦   «          t)          | ¦  «         t*                               dt/          d|d¬¦  «        ¦  «         t1          |¦  «         ||fS )Nr   r   c                ó    •— g | ]
}‰|         ‘ŒS r&   r&   )r    ÚindrE   s     €r"   r#   z_freeze.<locals>.<listcomp>~   s   ø€ ÐOÐOÐO°#˜.¨Ô-ÐOÐOÐOr$   z%szFROZEN GRAPHT)Úcolored)r   ÚtorchÚ_guardsÚTracingContextÚtry_getr   Úparams_flat_unwrap_subclassesrB   r,   r-   Úlistr6   r.   r   r7   r   r	   r   Úfreezing_discard_parametersÚinvalidate_eager_modulesÚdiscard_traced_gm_paramsÚlogÚdebugr   r   )
rC   rD   rE   Útracing_contextr   Úparams_flatr:   ÚinputsÚ	cse_graphÚaot_example_inputss
     `       r"   rI   rI   b   s„  ø€ õ �OÑ$Ô$Ð$åœ-Ô6×>Ò>Ñ@Ô@Ð@€ð 9Ø%Ô1ˆØÔ<ÐHÐHÐHØ%ÔCˆØÐ&¨;Ð+BÐ+BÐBå =Ø˜[¨+ñ!
ô !
ÐÐð !Ô&×1Ò1°]Ð1ÑCÔCˆÝ $¥U­3¨v©;¬;Ñ%7Ô%7Ñ 8Ô 8Ðõ ˜_Ô2Ñ3Ô3€IØ%€OÔØ×ÒÑÔÐàOÐOÐOÐOÐ9NÐOÑOÔOÐÝ�OÐ%7Ñ8Ô8Ð8å�/Ñ"Ô"Ð"åÔ)ð ,Ý Ñ"Ô"Ð"Ý  Ñ+Ô+Ð+å‡I‚IØÕ$ ^°_ÈdÐSÑSÔSñô ð õ ˜_Ñ-Ô-Ð-ØÐ1Ð1Ð1r$   c                  óN   ‡ — e Zd Zeˆ fd„¦   «         Zd
d„Zedd	„¦   «         Zˆ xZS )ÚErasedTensorc                óp   •— t          ¦   «                              | |                     d¬¦  «        ¦  «        S )NÚmeta)Údevice)ÚsuperÚ__new__Úto)ÚclsÚelemÚnameÚ
owning_modÚ	__class__s       €r"   re   zErasedTensor.__new__�   s)   ø€ å‰wŒw�Š˜s D§G¢G°6 GÑ$:Ô$:Ñ;Ô;Ð;r$   ri   ú
str | Noner   ÚNonec                óF   — || _         t          j        |¦  «        | _        d S r   )Úerased_nameÚweakrefÚrefÚowning_mod_ref)Úselfrh   ri   Úmods       r"   Ú__init__zErasedTensor.__init__”   s"   € ØˆÔÝ%œk¨#Ñ.Ô.ˆÔÐÐr$   r&   Nc           	     óÐ   — d„ t          j        |i |¤ŽD ¦   «         }t          |¦  «        dk    sJ ‚|d         }t          d|› d|j        › d|                     ¦   «         › �¦  «        ‚)Nc                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS r&   )Ú
isinstancer`   )r    Úes     r"   r#   z3ErasedTensor.__torch_dispatch__.<locals>.<listcomp>š   s:   € ð 
ð 
ð 
ð Ý˜!�\Ñ*Ô*ð	
Øð
ð 
ð 
r$   r   z‰Trying to run Pytorch Eager Module after Dynamo Freezing. The original parameters have been discarded for memory efficiency. Found in op z for erased parameter z of )ÚpytreeÚarg_tree_leavesr.   ÚRuntimeErrorro   rr   )rg   ÚfuncÚtypesÚargsÚkwargsÚerased_tensorsry   s          r"   Ú__torch_dispatch__zErasedTensor.__torch_dispatch__˜   sª   € ð
ð 
õ Ô+¨TÐ<°VÐ<Ð<ð
ñ 
ô 
ˆõ �>Ñ"Ô" QÒ&Ð&Ð&Ð&Ø˜1Ôˆåð_àð_ð _à78´}ð_ð _àJK×JZÒJZÑJ\ÔJ\ð_ð _ñ
ô 
ð 	
r$   )ri   rl   r   rm   )r&   N)	Ú__name__Ú
__module__Ú__qualname__Ústaticmethodre   ru   Úclassmethodr‚   Ú__classcell__)rk   s   @r"   r`   r`   �   sv   ø€ € € € € Øð<ð <ð <ð <ñ „\ð<ð/ð /ð /ð /ð ð
ð 
ð 
ñ „[ð
ð 
ð 
ð 
ð 
r$   r`   c            
     ó  — t           j        j                             ¦   «         5  t           j        j                             ¦   «         j        j         	                    ¦   «         D �]} t          | t           j        j        ¦  «        sŒ#t          t          j        |                      d¬¦  «        |                      d¬¦  «        ¦  «        ¦  «        D ]�\  }}t           j        j                             ¦   «         5  t+          ||| ¦  «        }d d d ¦  «         n# 1 swxY w Y   t          |t           j        j        ¦  «        r|                     d¦  «         d|_        t3          | ||¦  «         Œž�Œ	 d d d ¦  «         d S # 1 swxY w Y   d S ©NF)ÚrecurseT)rO   ÚutilsÚ_python_dispatchÚ_disable_current_modesrP   rQ   ÚgetÚmodule_contextÚ
nn_modulesÚvaluesrx   ÚnnÚModulerT   Ú	itertoolsÚchainÚnamed_parametersÚnamed_buffersÚ	_dispatchÚpythonÚno_python_dispatcherr`   Ú	ParameterÚrequires_grad_Ú	_is_paramÚsetattr©rt   Ú	attr_nameÚtensorÚe_ts       r"   rV   rV   ª   sð  € Ý	ŒÔ	%×	<Ò	<Ñ	>Ô	>ð -ð -õ Œ]Ô)×-Ò-Ñ/Ô/Ô>ÔI×PÒPÑRÔRð	-ñ 	-Øå˜c¥5¤8¤?Ñ3Ô3ð Øå%)Ý”Ø×(Ò(°Ð(Ñ7Ô7à×%Ò%¨eÐ%Ñ4Ô4ñô ñ&ô &ð -ð -Ñ!�	˜6õ ”_Ô+×@Ò@ÑBÔBð ?ð ?Ý& v¨y¸#Ñ>Ô>�Cð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?å˜f¥e¤hÔ&8Ñ9Ô9ð )Ø×&Ò& tÑ,Ô,Ð,Ø$(�C”MÝ˜˜Y¨Ñ,Ô,Ð,Ð,ñ-ð	-ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -s7   ¤CE?Ã9D	ÄE?ÄDÄE?ÄDÄAE?Å?FÆFrt   c           	     óP  — t           j        j                             ¦   «         5  t	          t          j        |                      d¬¦  «        |                      d¬¦  «        ¦  «        ¦  «        D ]�\  }}t           j	        j
                             ¦   «         5  t          ||| ¦  «        }d d d ¦  «         n# 1 swxY w Y   t          |t           j        j        ¦  «        r|                     d¦  «         d|_        t%          | ||¦  «         Œž	 d d d ¦  «         d S # 1 swxY w Y   d S rŠ   )rO   rŒ   r�   rŽ   rT   r•   r–   r—   r˜   r™   rš   r›   r`   rx   r“   rœ   r�   rž   rŸ   r    s       r"   rW   rW   Á   s�  € Ý	ŒÔ	%×	<Ò	<Ñ	>Ô	>ð )ð )Ý!%ÝŒOØ×$Ò$¨UÐ$Ñ3Ô3à×!Ò!¨%Ð!Ñ0Ô0ñô ñ"
ô "
ð 	)ð 	)ÑˆI�võ ”Ô'×<Ò<Ñ>Ô>ð ;ð ;Ý" 6¨9°cÑ:Ô:�ð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;å˜&¥%¤(Ô"4Ñ5Ô5ð %Ø×"Ò" 4Ñ(Ô(Ð(Ø $�”Ý�C˜ CÑ(Ô(Ð(Ð(ð	)ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð )ð )s7   ¤A3DÂB5Â)DÂ5B9Â9DÂ<B9Â=ADÄDÄ"Dc                ó¸  — | j         j        �^ }}|j        d         }| j                              |¦  «        5  |D ]Ú}t	          |j        d         t          j        ¦  «        r*t          j         	                    |j        d         ¦  «        sŒR|j        d         }t          | j                              |                     ¦   «         ¦  «        ¦  «        }| j                              t          j        j        ||f¦  «        }|                     ||¦  «         ŒÛ	 ddd¦  «         n# 1 swxY w Y   | j                              ¦   «          |                      ¦   «          dS )zì
    Make sure the output node's layout does not change due to compiler optimizations
    by adding aten.as_strided nodes with the expected strides.

    Only used for inference so we can assume all graph outputs are model outputs.
    r   ÚvalN)r,   Únodesr   Úinserting_beforerx   rb   rO   ÚTensorÚ_prims_commonÚ%is_non_overlapping_and_dense_or_falseÚtupleÚmaterialize_symintsÚstrideÚcall_functionÚprimsÚinductor_force_stride_orderÚdefaultÚreplace_input_withÚlintr7   )r   Ú_Úoutput_nodeÚout_listÚnÚftÚstride_argsÚnew_nodes           r"   Úenforce_output_layoutr¼   Ò   s{  € ð ”h”n�O€QˆØÔ Ô"€HØ	Œ×	"Ò	" ;Ñ	/Ô	/ð 8ð 8Øð 	8ð 	8ˆAÝØ”�u”�uœ|ñô ð åÔ(×NÒNØ”�u”ñô ðð
 ð ”˜”ˆBÝ ¤× <Ò <¸R¿YºY¹[¼[Ñ IÔ IÑJÔJˆKØ”x×-Ò-ÝÔ1Ô9¸A¸{Ð;Kñô ˆHð ×*Ò*¨1¨hÑ7Ô7Ð7Ð7ð%	8ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð* „H‡M‚M�O„O€OØ‡L‚L�N„N€N€N€Ns   ·CD"Ä"D&Ä)D&c                óò  ‡— t           j        j        j        j        t           j        j        j        j        t           j        j        j        j        gŠˆfd„| j        j        D ¦   «         }|D ]Ý}| j         	                    |¦  «        5  |j
        d         j        d         }t          | j                             |                     ¦   «         ¦  «        ¦  «        }| j                             t           j        j        |j
        d         |f¦  «        }ddd¦  «         n# 1 swxY w Y   |                     |j
        d         |¦  «         ŒÞ| j                             ¦   «          |                      ¦   «          dS )z´
    Make sure the as_strided node's input's layout does not change due to compiler
    optimizations, because the as_strided strides info depends on input tensor stride info.
    c                ó&   •— g | ]}|j         ‰v ¯|‘ŒS r&   )Útarget)r    r¸   Úas_strided_opss     €r"   r#   z3enforce_as_strided_input_layout.<locals>.<listcomp>ÿ   s%   ø€ ÐMÐMÐM˜1°!´(¸nÐ2LÐ2L�QÐ2LÐ2LÐ2Lr$   r   r¦   N)rO   ÚopsÚatenÚ
as_stridedr²   Úas_strided_Úas_strided_scatterr,   r§   r¨   r   rb   r¬   r­   r®   r¯   r°   r±   r³   r´   r7   )r   Ústrided_nodesr¸   r¹   rº   r»   rÀ   s         @r"   Úenforce_as_strided_input_layoutrÇ   ô   sr  ø€ õ 	Œ	ŒÔ!Ô)ÝŒ	ŒÔ"Ô*ÝŒ	ŒÔ)Ô1ð€Nð
 NÐMÐMÐM ¤¤ÐMÑMÔM€MØð 2ð 2ˆØŒX×&Ò& qÑ)Ô)ð 	ð 	à”˜”” Ô&ˆBÝ ¤× <Ò <¸R¿YºY¹[¼[Ñ IÔ IÑJÔJˆKØ”x×-Ò-ÝÔ1Ô9¸A¼FÀ1¼IÀ{Ð;Sñô ˆHð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	
×Ò˜QœV AœY¨Ñ1Ô1Ð1Ð1à„H‡M‚M�O„O€OØ‡L‚L�N„N€N€N€Ns   ÂB	DÄD!	Ä$D!	c           	     óš  — t          d¦  «        5  d„ | j        j        D ¦   «         }|D ]ë}|j        d         }t	          |j        d                              ¦   «         ¦  «        dk    s+|j        d                              t          j	        ¬¦  «        rŒk| j         
                    |¦  «        5  | j                             t          j        j        |fdt          j	        i¦  «        }|                     ||¦  «         ddd¦  «         n# 1 swxY w Y   Œìt!          | ¦  «         t#          | ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )	z®
    Convert 4d convolution weight tensor to channels last format.

    This pass is performed before freezing so the added nodes can be constant
    folded by freezing.
    Ú%convert_conv_weights_to_channels_lastc                óB   — g | ]}|j         t          j        j        u ¯|‘ŒS r&   )r¿   rÂ   Úconvolutionr²   )r    r¸   s     r"   r#   z9convert_conv_weights_to_channels_last.<locals>.<listcomp>  s*   € ÐSÐSÐS�q¨a¬h½$Ô:JÔ:RÐ.RÐ.R�Ð.RÐ.RÐ.Rr$   r   r¦   é   )Úmemory_formatrÍ   N)r   r,   r§   r   r.   rb   ÚsizeÚis_contiguousrO   Úchannels_lastr¨   r¯   rÂ   Úcloner²   r³   rÇ   r¼   )r   ÚconvsÚconvÚweight_noder»   s        r"   rÉ   rÉ     sÉ  € õ 
Ð=Ñ	>Ô	>ð "ð "ØSÐS˜BœHœNÐSÑSÔSˆØð 	?ð 	?ˆDØœ) Aœ,ˆKÝ�;Ô# EÔ*×/Ò/Ñ1Ô1Ñ2Ô2°aÒ7Ð7¸;Ô;KØô<çŠm­%Ô*=ˆmÑ>Ô>ð 8ð à”×*Ò*¨4Ñ0Ô0ð ?ð ?Øœ8×1Ò1Ý”JÔ&Ø �NØ$¥eÔ&9Ð:ñô �ð
 ×'Ò'¨°XÑ>Ô>Ð>ð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?øõ 	(¨Ñ+Ô+Ð+Ý˜bÑ!Ô!Ð!ð'"ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ð "ð "s7   �BE Â.AD	Ã=E Ä	DÄE ÄDÄ"E Å EÅE)r   r   r   r   r   r   r   r   )rC   r   rD   r   rE   rF   r   rG   )rt   r   )r   r   )/Ú
__future__r   r•   Úloggingrp   Útypingr   rO   Útorch.utils._pytreerŒ   Ú_pytreerz   Útorch._dynamo.utilsr   r   Útorch._functorch.aot_autogradr   Útorch._functorch.compile_utilsr   Ú torch._inductor.constant_foldingr	   r
   Útorch._inductor.freezing_utilsr   r   Ú+torch._inductor.fx_passes.freezing_patternsr   Ú#torch._inductor.fx_passes.post_gradr   Ú r   rÁ   rÂ   r°   Ú	getLoggerrƒ   rX   rB   rJ   rI   r©   r`   rV   rW   r¼   rÇ   rÉ   r&   r$   r"   ú<module>rã      s  ðà "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à €€€Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SØ GÐ GÐ GÐ GÐ GÐ GØ ?Ð ?Ð ?Ð ?Ð ?Ð ?à Ð Ð Ð Ð Ð ð „y„~€ØŒ	Œ€à€gÔ˜Ñ!Ô!€ð+!ð +!ð +!ð +!ð\Cð Cð Cð Cð0*2ð *2ð *2ð *2ðZ
ð 
ð 
ð 
ð 
�5”<ñ 
ô 
ð 
ð6-ð -ð -ð.)ð )ð )ð )ð"ð ð ð ðDð ð ð ð4"ð "ð "ð "ð "ð "r$   