
    qi`                         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     k/home/ubuntu/crypto_trading_bot/.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 	
  3i * - #7EHH,?,?(,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 )zGiven 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    
 'E4=1"D13{1~.<t<<W~%44=((22TT_,UXX=P=P=U=U1U 88==?D$/$8$8DMKTT_,0E88O''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!2A677!UXX__-3A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*6y7G7G*H'K+,@BVW $F=_=01;M3?@%huo@
@$$Y9DII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> 	>
 > 3i> *> -> #7EHH,?,?(,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   