
    qi*                     &   U d dl Z d dlmZ d dlmZ d dlmc mc mZ	 d dl
mZ d dlmZmZmZ g dZd Zd Zd Zd	 Zd
 Zi ej*                  ej,                  feej*                  ej,                  ej.                  feej0                  ej2                  feej0                  ej2                  ej.                  feej4                  ej6                  feej4                  ej6                  ej.                  feej*                  ej.                  f ee	j8                        ej0                  ej.                  f ee	j:                        ej4                  ej.                  f ee	j<                        ej>                  ej,                  feej>                  ej.                  f ee	j@                        ej2                  ej.                  f ee	jB                        ej6                  ej.                  f ee	jD                        ejF                  ej,                  feejH                  ej2                  feejJ                  ej6                  feZ&e'e(ejR                  ez  f   e*d<   ddZ+d Z,d Z-d Z.dede'eejR                  ez  f   fdZ/y)    N)Callable)Any)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                 V   |j                   |j                   k7  rt        d      t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  i}| r|j                  |j                  k7  rt        d      |j                  st        d      |j                  st        d      |j                  t        |      d      }|	 |||      S t!        d||f       t        j"                  j%                  ||      S )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 BatchNorm2d.7Only support fusing BatchNorm2d with affine set to TrueGOnly support fusing BatchNorm2d with tracking_running_stats set to TrueNCannot fuse train modules: )trainingAssertionError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        q/home/ubuntu/crypto_trading_bot/.venv/lib/python3.12/site-packages/torch/ao/quantization/fuser_method_mappings.pyr   r      s
   " }}#H
 	

 			3<<
		3<<
		3<< ??d/// R  yy I  %% Y  477ddK)%dB//%(CT2J<&PQQxx))$33    c                    |j                   |j                   cxk(  r|j                   k(  st        d       t        d      d}| rt        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  i}|j                  |j                  k7  rt        d      |j                  st        d      |j                  st        d      |j                  t        |      d      }|
 ||||      S t!        d|||f       t        j                  t        j"                  t        j                  t        j$                  t        j                  t        j&                  i}|j                  t        |      d      }|3t        j(                  j*                  j-                  ||      } |||      S t!        d|||f       )aJ  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 Conv2d must match num_features of BatchNorm2dr   r   r   zCannot fuse eval modules: )r   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	   G   s   & MMR[[9DMM9H
 	
 :H
 	
 04LIIs''IIs''IIs''%
!
 ??d/// Q  yy I  %% Y  144T$ZF#b$//%(CT2tDTCU&VWW IIs~~IIs~~IIs~~$
 
 033DJE#::4DJ
D11%(BD"dCSBT&UVVr,   c                 r   |j                   |j                   k7  rt        d      | rh|j                  |j                  k7  rt        d      |j                  st        d      |j
                  st        d      t        j                  ||      S t        j                  j                  j                  ||      S )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   r   out_featuresr   r    r   
LinearBn1dr   r$   r4   fuse_linear_bn_eval)r&   linearr(   s      r+   r
   r
      s    " "++%J
 	
 ??f111 R  yy I  %% Y  ~~fb))xx2262>>r,   c                     |j                   |j                   k7  rt        d      | rt        d      t        j                  j
                  j                  ||d      S )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   r   	Exceptionr   r$   r4   r%   )r&   convtr(   s      r+   r   r      s[      ~~$Q
 	
 F
 	
 xx00d0KKr,   c                       fd}|S )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                      ||      S N )r&   m1m2
sequentials      r+   fuser_methodz*_sequential_wrapper2.<locals>.fuser_method   s    "b!!r,   rF   )rI   rJ   s   ` r+   _sequential_wrapper2rK      s    " r,    _DEFAULT_OP_LIST_TO_FUSER_METHODc                 t    |i }t        t        |      }|j                  | d      }|t        d|  d      |S )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!   r   )op_listadditional_fuser_method_mappingall_mappingsrJ   s       r+   r   r      sU     '.*,'$(*IL  ##GT2L>wiqIJJr,   c                       fd}|S )Nc                      | ||      S rE   rF   )r&   xyfs      r+   reversedz_reverse2.<locals>.reversed   s    Ar,   rF   rW   rX   s   ` r+   	_reverse2rZ      s     Or,   c                       fd}|S )Nc                 $    |\  }} | |||      S rE   rF   )r&   rU   wrV   zrW   s        r+   rX   z_reverse3.<locals>.reversed  s    1Aq!!r,   rF   rY   s   ` r+   	_reverse3r_     s    " Or,   c                     t        | t        t        f      r5| D cg c]  }t        |       }}t        t	        j
                  |       }|S | t        g}|S c c}w )aQ  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+   rd   rd   
  s^    . *udm,IST+(5T	Ti''34 M l+M	 Us   Arg   fuser_method_mappingc                 z    t        |       }d}|D ]  } |j                  |       }| n |t        d|  d      |S )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   )rd   r!   r   )rg   rk   op_patternsrJ   s       r+   r   r   )  s^     &j1KL! 
+//
;# >zl!LMMr,   rE   )0re   collections.abcr   typingr   torch.ao.nn.intrinsicaor   	intrinsicr   torch.nntorch.ao.quantization.utilsr   r   r   __all__r   r	   r
   r   rK   r   BatchNorm1dReLUr   BatchNorm2dr   BatchNorm3dr1   r2   r3   Linear
LinearReLUBNReLU2dBNReLU3dConvTranspose1dConvTranspose2dConvTranspose3drL   dictrb   
Sequential__annotations__r   rZ   r_   rd   r   rF   r,   r+   <module>r      s    $  # #  P P/4d:Wz%?PL:
KYYKYY(*;K YYK YY(*;	K
 YYK YY(*;K YY.s~~>K YY.s~~>K YY.s~~>K YYK YY.s~~>K ^^RWW3CLLAK ^^RWW3CLLAK (*?K (*?K  (*?!K  $ubmmh.F'F"G (">w(@@Ar,   