
    sh(                     2   % S SK r S SKJrJrJrJr  S SKJs  Js  J	r
  S SKJr  S SKJrJrJr  / SQrS rS rS rS rS	 r0 \R,                  \R.                  4\_\R,                  \R.                  \R0                  4\_\R2                  \R4                  4\_\R2                  \R4                  \R0                  4\_\R6                  \R8                  4\_\R6                  \R8                  \R0                  4\_\R,                  \R0                  4\" \
R:                  5      _\R2                  \R0                  4\" \
R<                  5      _\R6                  \R0                  4\" \
R>                  5      _\R@                  \R.                  4\_\R@                  \R0                  4\" \
RB                  5      _\R4                  \R0                  4\" \
RD                  5      _\R8                  \R0                  4\" \
RF                  5      _\RH                  \R.                  4\_\RJ                  \R4                  4\_\RL                  \R8                  4\_r'\(\)\\RT                  \4   4   \+S
'   SS jr,S r-S r.S r/S\S\(\\\RT                  \4   4   4S jr0g)    N)AnyCallableOptionalUnion)get_combined_dictMatchAllNodePattern)fuse_conv_bnfuse_conv_bn_relufuse_linear_bnfuse_convtranspose_bnget_fuser_methodget_fuser_method_newc                 T   UR                   UR                   :X  d   S5       e[        R                  [        R                  [        R
                  [        R                  [        R                  [        R                  0nU (       a  UR                  UR                  :X  d   S5       eUR                  (       d   S5       eUR                  (       d   S5       eUR                  [        U5      S5      nUb  U" X5      $ [        SX4 35      e[        R                   R#                  X5      $ )a  Return the fused the conv and bn modules.
Given the conv and bn modules, fuses them and returns the fused module

Args:
    is_qat: a flag for whether we are using quantization aware training fusion
    or post training quantization fusion
    conv: Module instance of type conv2d/conv3d
    bn: Spatial BN instance that needs to be fused with the conv

Examples::

    >>> m1 = nn.Conv2d(10, 20, 3)
    >>> b1 = nn.BatchNorm2d(20)
    >>> # xdoctest: +SKIP
    >>> m2 = fuse_conv_bn(m1, b1)
:Conv and BN both must be in the same mode (train or eval).z?Output channel of Conv2d must match num_features of BatchNorm2dz7Only support fusing BatchNorm2d with affine set to TruezGOnly support fusing BatchNorm2d with tracking_running_stats set to TrueNCannot fuse train modules: )trainingnnConv1dnniConvBn1dConv2dConvBn2dConv3dConvBn3dnum_featuresout_channelsaffinetrack_running_statsgettypeNotImplementedErrorutilsfuse_conv_bn_eval)is_qatconvbnfused_module_class_mapfused_module_classs        /Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/ao/quantization/fuser_method_mappings.pyr
   r
      s    $ 	$DCD$ 			3<<
		3<<
		3<< OOt000	ML	M0yySSSy""	UT	U"377ddK)%d//%(CTJ<&PQQxx))$33    c                    UR                   UR                   s=:X  a  UR                   :X  d    S5       e   S5       eSnU (       a  [        R                  [        R                  [        R
                  [        R                  [        R                  [        R                  0nUR                  UR                  :X  d   S5       eUR                  (       d   S5       eUR                  (       d   S5       eUR                  [        U5      S5      nUb	  U" XU5      $ [        SXU4 35      e[        R                  [        R                   [        R
                  [        R"                  [        R                  [        R$                  0nUR                  [        U5      S5      nUb1  [        R&                  R(                  R+                  X5      nU" Xs5      $ [        SXU4 35      e)a  Return the fused conv and bv modules.

Given the conv and bn modules, fuses them and returns the fused module

Args:
    is_qat: a flag for whether we are using quantization aware training fusion
    or post training quantization fusion
    conv: Module instance of type conv2d/conv3d
    bn: Spatial BN instance that needs to be fused with the conv

Examples::

    >>> m1 = nn.Conv2d(10, 20, 3)
    >>> b1 = nn.BatchNorm2d(20)
    >>> r1 = nn.ReLU(inplace=False)
    >>> # xdoctest: +SKIP
    >>> m2 = fuse_conv_bn_relu(m1, b1, r1)
r   Nz;Output channel of Conv must match num_features of BatchNormz5Only support fusing BatchNorm with affine set to TruezEOnly support fusing BatchNorm with tracking_running_stats set to Truer   zCannot fuse eval modules: )r   r   r   r   ConvBnReLU1dr   ConvBnReLU2dr   ConvBnReLU3dr   r   r   r   r    r!   r"   
ConvReLU1d
ConvReLU2d
ConvReLU3dr#   fusionr$   )r%   r&   r'   relufused_modulemap_to_fused_module_trainmap_to_fused_module_eval
fused_convs           r*   r   r   @   s   ( 	55DCD5DCD526LIIs''IIs''IIs''%
! OOt000	IH	I0yyQQQy""	SR	S"044T$ZF#$//%(CTtDTCU&VWW IIs~~IIs~~IIs~~$
 
 033DJE#::4DJ
11%(BDdCSBT&UVVr+   c                 r   UR                   UR                   :X  d   S5       eU (       ag  UR                  UR                  :X  d   S5       eUR                  (       d   S5       eUR                  (       d   S5       e[
        R                  " X5      $ [        R                  R                  R                  X5      $ )a  Return the fused linear and bn modules.
Given the linear and bn modules, fuses them and returns the fused module

Args:
    is_qat: a flag for whether we are using quantization aware training fusion
    or post training quantization fusion
    linear: Module instance of type Linear
    bn: BatchNorm1d instance that needs to be fused with the linear layer

Examples::

    >>> m1 = nn.Linear(20, 10)
    >>> b1 = nn.BatchNorm1d(10)
    >>> # xdoctest: +SKIP
    >>> m2 = fuse_linear_bn(m1, b1)
z<Linear and BN both must be in the same mode (train or eval).z@Output features of Linear must match num_features of BatchNorm1dz7Only support fusing BatchNorm1d with affine set to TruezGOnly support fusing BatchNorm1d with tracking_running_stats set to True)r   r   out_featuresr   r   r   
LinearBn1dr   r#   r3   fuse_linear_bn_eval)r%   linearr'   s      r*   r   r   w   s    $ 	2;;&FEF& OOv222	NM	N2yySSSy""	UT	U"~~f))xx226>>r+   c                     UR                   UR                   :X  d   S5       eU (       a  [        S5      e[        R                  R                  R                  XSS9$ )a  Return the fused ConvTranspose and bn modules.
Given ConvTranspose and bn modules, fuses them and returns the fused module

Args:
    convt: Module instance of type ConvTransposeNd
    bn: BatchNormNd instance that needs to be fused with the linear layer.
        batch norm N should match the ConvTranspose N

Examples::

    >>> m1 = nn.ConvTranspose2d(10, 20, 3)
    >>> b1 = nn.BatchNorm2d(20)
    >>> # xdoctest: +SKIP
    >>> m2 = fuse_convtranspose_bn(m1, b1)
zCConvTranspose and BN both must be in the same mode (train or eval).z8Fusing ConvTranspose+BatchNorm not yet supported in QAT.T)	transpose)r   	Exceptionr   r#   r3   r$   )r%   convtr'   s      r*   r   r      s[    " 	"++%MLM% F
 	
 xx00d0KKr+   c                    ^  U 4S jnU$ )a  Return a sequential wrapped that for is_qat and two modules.
Given a sequential class for two modules, return a function that takes
is_qat, and then two modules as argument, that ignores the is_qat flag
and always returns the sequential that combines the two input modules
c                    > T" X5      $ N )r%   m1m2
sequentials      r*   fuser_method*_sequential_wrapper2.<locals>.fuser_method   s    "!!r+   rE   )rH   rI   s   ` r*   _sequential_wrapper2rK      s    " r+    _DEFAULT_OP_LIST_TO_FUSER_METHODc                 p    Uc  0 n[        [        U5      nUR                  U S5      nUc   SU  S35       eU$ )zGet fuser method for the given list of module types.

Get fuser method for the given list of module types,
return None if fuser method does not exist
Ndid not find fuser method for:  )r   rL   r    )op_listadditional_fuser_method_mappingall_mappingsrI   s       r*   r   r      sU     '.*,'$(*IL  ##GT2L#Q'Fwiq%QQ#r+   c                    ^  U 4S jnU$ )Nc                    > T" XU5      $ rD   rE   )r%   xyfs      r*   reversed_reverse2.<locals>.reversed   s    Ar+   rE   rW   rX   s   ` r*   	_reverse2r[      s     Or+   c                    ^  U 4S jnU$ )Nc                    > Uu  p4T" XX15      $ rD   rE   )r%   rU   wrV   zrW   s        r*   rX   _reverse3.<locals>.reversed   s    A!!r+   rE   rZ   s   ` r*   	_reverse3ra      s    " Or+   c                     [        U [        [        45      (       a9  U  Vs/ s H  n[        U5      PM     nn[        [        R
                  " U6 5      nU$ U [        /nU$ s  snf )a  Return a list of valid patterns generated from the op_pattern.

Returns a list of valid patterns generated from the op_pattern,
since MatchAllNode can match all types of nodes,
e.g. pattern (torch.nn.Conv2d, torch.add) should also be able to match keys like
(MatchAllNode, torch.add) and (torch.nn.Conv2d, MatchAllNode)

Example Input:
(torch.add, (torch.nn.ReLU, torch.nn.Conv2d))

Example Output:
[(torch.add, (torch.nn.ReLU, torch.nn.Conv2d)),
 (torch.add, (torch.nn.ReLU, MatchAllNode)),
 (torch.add, (MatchAllNode, torch.nn.Conv2d)),
 (torch.add, (MatchAllNode, MatchAllNode)),
 (MatchAllNode, (torch.nn.ReLU, torch.nn.Conv2d)),
 (MatchAllNode, (torch.nn.ReLU, MatchAllNode)),
 (MatchAllNode, (MatchAllNode, torch.nn.Conv2d)),
 (MatchAllNode, (MatchAllNode, MatchAllNode)),
]
)
isinstancetuplelist_get_valid_patterns	itertoolsproductr   )
op_patternsub_pattern	sub_combsresults       r*   rf   rf      sb    . *udm,,IST+(5	Ti''34 M l+M	 Us   Ari   fuser_method_mappingc                 |    [        U 5      nSnU H  n UR                  U S5      nUc  M    O   Uc   SU  S35       eU$ )zGet fuser method.

This will be made default after we deprecate the get_fuser_method
Would like to implement this first and have a separate PR for deprecation
NrN   rO   )rf   r    )ri   rm   op_patternsrI   s       r*   r   r     s\     &j1KL!
+//
DA# " #T'FzlRS%TT#r+   rD   )1rg   typingr   r   r   r   torch.ao.nn.intrinsicaor   	intrinsicr   torch.nntorch.ao.quantization.utilsr   r   r	   __all__r
   r   r   r   rK   r   BatchNorm1dReLUr   BatchNorm2dr   BatchNorm3dr0   r1   r2   Linear
LinearReLUBNReLU2dBNReLU3dConvTranspose1dConvTranspose2dConvTranspose3drL   dictrd   
Sequential__annotations__r   r[   ra   rf   r   rE   r+   r*   <module>r      s    1 1 # #  P P)4X4Wn?DL8
QYYQYY(*;Q YYQ YY(*;	Q
 YYQ YY(*;Q YY.s~~>Q YY.s~~>Q YY.s~~>Q YYQ YY.s~~>Q ^^RWW3CLLAQ ^^RWW3CLLAQ (*?Q (*?Q  (*?!Q  $ueBMM84K.L'L"M ( >wbmmX.E(FFGr+   