Ë
    ÄÓ^j`  ã                   óâ   — d dl mZmZ d dlmZ d dlmZ d dlZd dlm	Z	 d dl
mZ d dlmZ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 ddgZ G d„ de«      Z G d„ de«      Zde	deeef   fd„Zy)é    )ÚABCÚabstractmethod)ÚCallable)ÚAnyN)ÚBackendConfig)Úget_fuser_method_new)Ú_parent_nameÚNodePatternÚPattern)ÚGraphÚNode)Útype_before_parametrizationsé   )ÚFuseCustomConfig)ÚMatchAllNodeÚDefaultFuseHandlerÚFuseHandlerc                   óÐ   — e Zd ZdZedefd„«       Zededee	e
j                  j                  f   dededee   d	ed
edeee
j                  j&                  ez  f   dedefd„«       Zy)r   z*Base handler class for the fusion patternsÚnodec                  ó   — y ©N© )Úselfr   s     úp/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/ao/quantization/fx/fuse_handler.pyÚ__init__zFuseHandler.__init__    s   € àó    Úload_argÚnamed_modulesÚfused_graphÚ	root_nodeÚextra_inputsÚmatched_node_patternÚfuse_custom_configÚfuser_method_mappingÚis_qatÚreturnc
                  ó   — y r   r   )
r   r   r   r   r    r!   r"   r#   r$   r%   s
             r   ÚfusezFuseHandler.fuse$   s   € ð 	r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   ÚdictÚstrÚtorchÚnnÚModuler   Úlistr   r
   r   r   Ú
SequentialÚboolr(   r   r   r   r   r      sÃ   „ Ù4àð˜Tò ó ðð ðàðð ˜C §¡§¡Ð0Ñ1ðð ð	ð
 ðð ˜3‘iðð *ðð -ðð # 7¨E¯H©H×,?Ñ,?À(Ñ,JÐ#JÑKðð ðð 
òó ñr   c                   óÄ   ‡ — e Zd Zdefˆ fd„Zdedeeej                  j                  f   dededee   ded	ed
eeej                  j"                  ez  f   dedefd„Zˆ xZS )r   r   c                 ó$   •— t         ‰| �  |«       y r   )Úsuperr   )r   r   Ú	__class__s     €r   r   zDefaultFuseHandler.__init__5   s   ø€ Ü‰Ñ˜Õr   r   r   r   r    r!   r"   r#   r$   r%   r&   c
                 óè  ‡‡‡‡— |j                   dk7  rt        d«      ‚‰t        |j                  «         Šˆˆˆfd„Š ‰|«      }
ˆfd„Š ‰|
«      }t	        |j                  «      \  }}t        ||«      } ||	g|
¢­Ž }t        ‰|   ||«       |D �cg c]
  } ||«      ‘Œ }}|j                  ||«      }t        |j                  «      }|j                  |«       t        |«      |_	        |S c c}w )NÚcall_modulez.Expecting module node to be a call_module Nodec                 ó4  •— t        | t        t        f«      rB| ^}}g }|j                   ‰|«      «       |j	                  ˆfd„|D «       «       t        |«      S | }|j
                  dk(  r‰|j                     S |j
                  dk(  ra|j                  t        j                  j                  j                  u r1t        j                  j                  «       }‰j                  |_        |S |j
                  dk(  s|j
                  dk(  r|j                  S t        S )z¿Given a node pattern, extract the corresponding modules
            e.g. input: (relu_node, (bn_node, conv_node))
                 output: (relu_module, (bn_module, conv_module))
            c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr   r   )Ú.0ÚaÚget_moduless     €r   ú	<genexpr>z?DefaultFuseHandler.fuse.<locals>.get_modules.<locals>.<genexpr>Q   s   øè ø€ Ò<°!™{¨1Ÿ~Ñ<ùs   ƒr:   Úcall_functionÚcall_method)Ú
isinstanceÚtupler2   ÚappendÚextendÚopÚtargetr/   r0   Ú
functionalÚreluÚReLUÚtrainingr   )ÚpatternÚnÚargsÚmodulesrJ   r?   r   Úroot_modules        €€€r   r?   z,DefaultFuseHandler.fuse.<locals>.get_modulesH   sÛ   ø€ ô
 ˜'¤E¬4 =Ô1Ø"���DØ13�Ø—‘™{¨1›~Ô.Ø—‘Ó<°tÔ<Ô<Ü˜W“~Ð%à�Ø—4‘4˜=Ò(Ø(¨¯©Ñ2Ð2Ø—T‘T˜_Ò,°·±¼U¿X¹X×=PÑ=P×=UÑ=UÑ1UÜ Ÿ8™8Ÿ=™=›?�DØ$/×$8Ñ$8�D”MØ�KØ—T‘T˜_Ò,°·±¸Ò0EØŸ8™8�Oä'Ð'r   c                 ó°   •— t        | t        «      rt        t        ‰| «      «      S t        | t        j                  j
                  «      rt        | «      S | S r   )rC   rD   Úmapr/   r0   r1   r   )ÚmÚget_matched_typess    €r   rU   z2DefaultFuseHandler.fuse.<locals>.get_matched_typesc   sB   ø€ Ü˜!œUÔ#ÜœSÐ!2°AÓ6Ó7Ð7Ü˜!œUŸX™XŸ_™_Ô-Ü3°AÓ6Ð6ØˆHr   )rG   ÚAssertionErrorr.   rH   r	   r   ÚsetattrÚ	node_copyr2   rO   rF   rD   )r   r   r   r   r    r!   r"   r#   r$   r%   Úmatched_modulesÚmatched_module_typesÚmodule_parent_nameÚmodule_nameÚfuser_methodÚfused_moduleÚinputÚ
extra_argsr   rO   rU   r?   rQ   s     `                 @@@r   r(   zDefaultFuseHandler.fuse8   sõ   û€ ð �<‰<˜=Ò(Ü Ð!QÓRÐRØ#¤C¨	×(8Ñ(8Ó$9Ñ:ˆö	(ñ2 &Ð&:Ó;ˆô	ñ  1°ÓAÐÜ*6°y×7GÑ7GÓ*HÑ'Ð˜KÜ+Ð,@ÐBVÓWˆñ $ FÐ=¨_Ò=ˆÜ�Ð0Ñ1°;ÀÔMØ3?Ö@¨%‘h˜u•oÐ@ˆ
Ð@Ø×$Ñ$ Y°Ó9ˆÜ�D—I‘I‹ˆØ�‰�JÔÜ˜$“KˆŒ	Øˆùò As   ÂC/)r)   r*   r+   r   r   r   r-   r.   r/   r0   r1   r   r2   r   r
   r   r   r3   r4   r(   Ú__classcell__)r8   s   @r   r   r   4   s¥   ø„ ð˜Tõ ð>àð>ð ˜C §¡§¡Ð0Ñ1ð>ð ð	>ð
 ð>ð ˜3‘ið>ð *ð>ð -ð>ð # 7¨E¯H©H×,?Ñ,?À(Ñ,JÐ#JÑKð>ð ð>ð 
÷>r   Úbackend_configr&   c                 óz   — i }| j                   j                  «       D ]  \  }}|j                  €Œt        ||<   Œ |S r   )Ú!_pattern_complex_format_to_configÚitemsr]   r   )rb   Úfusion_pattern_to_fuse_handlersrM   Úconfigs       r   Ú'_get_fusion_pattern_to_fuse_handler_clsrh   y   sO   € ð @BÐ#Ø)×KÑK×QÑQÓSò J‰ˆ�Ø×ÑÑ*ä7IÐ+¨GÒ4ðJð +Ð*r   )Úabcr   r   Úcollections.abcr   Útypingr   r/   Ú$torch.ao.quantization.backend_configr   Ú+torch.ao.quantization.fuser_method_mappingsr   Útorch.ao.quantization.utilsr	   r
   r   Útorch.fx.graphr   r   Útorch.nn.utils.parametrizer   Úcustom_configr   Úmatch_utilsr   Ú__all__r   r   r-   rh   r   r   r   ú<module>rt      sr   ðç #Ý $Ý ã Ý >Ý Lß JÑ Jß &Ý Cå +Ý %ð Øð€ô�#ô ô.B˜ô BðJ+Ø!ð+à	ˆ'�8Ð
Ñô+r   