
    h                        S SK r S SKJr  S SKJr  SS/r\ R                  R                  r " S S\5      r\R                  r	\	" \ R                  R                  R                  5      S 5       r\	" \R                  R                  5      S 5       r\	" \R                   R"                  5      S	 5       r\R$                  r\ R(                  R+                  \/5        g)
    N)return_and_correct_aliasing)TorchAOBaseTensor-WeightTensorWithLinearActivationScaleMetadata6to_weight_tensor_with_linear_activation_scale_metadatac                   >   \ rS rSrSrSS/r/ rS\R                  S\R                  4S jr	S\R                  S\R                  4S jr
S r\S\R                  S	\R                  S
\R                  4S j5       r\S\R                  S\R                  4S j5       rSrg)r      a  
Tensor subclass that wraps a weight tensor and provides metadata for linear activation scaling.
Right now we hardcode how we apply the scale:
   scaled_linear_act = input_act / scale
   out = F.linear(scaled_linear_act, weight, ...)

We can generalize this to accept a function as well if needed.

Args:
    original_weight_tensor (torch.Tensor): The weight tensor to be wrapped.
    scale (torch.Tensor): The scale tensor to be applied to activation.
original_weight_tensorscalec                     0 nUR                   nXCS'   SUS'   UR                  US'   UR                  n[        R                  R
                  " X40 UD6$ )NdtypeFrequires_graddevice)r   r   shapetorchTensor_make_wrapper_subclass)clsr	   r
   kwargsr   r   s         f/home/james-whalen/.local/lib/python3.13/site-packages/torchao/quantization/linear_activation_scale.py__new__5WeightTensorWithLinearActivationScaleMetadata.__new__$   sZ    
 &,,w"'188x&,,||223HHH    c                     Xl         X l        g Nr	   r
   )selfr	   r
   s      r   __init__6WeightTensorWithLinearActivationScaleMetadata.__init__1   s    
 '=#
r   c                     U R                    $ r   )	__class__)r   s    r   _quantization_type@WeightTensorWithLinearActivationScaleMetadata._quantization_type9   s    ..!"r   input_tensorweight_tensorbiasc                     UR                   nUR                  nX-  n[        R                  R                  R                  XSU5      $ r   )r	   r
   r   nn
functionallinear)r#   r$   r%   r	   r
   scaled_input_acts         r   _quantized_linear_opBWeightTensorWithLinearActivationScaleMetadata._quantized_linear_op<   sF     "/!E!E##'/xx""))d
 	
r   input_floatc                     U " X5      $ r    )r   r-   r
   s      r   
from_float8WeightTensorWithLinearActivationScaleMetadata.from_floatH   s     ;&&r   r   N)__name__
__module____qualname____firstlineno____doc__tensor_data_namestensor_attribute_namesr   r   r   r   r!   staticmethodr+   classmethodr0   __static_attributes__r/   r   r   r   r      s     27;I %I ||I % ||# 	
ll	
38<<	
GL||	
 	
 '\\' ||' 'r   c                     US   US   [        U5      S:  a  US   OS pen[        U[        5      (       a  UR                  XEU5      $ [	        S5      e)Nr         zLLinearActivationQuantizedTensor: No specialized dispatch found for linear op)len
isinstancer   r+   NotImplementedError)functypesargsr   r#   r$   r%   s          r   _rE   T   s_     	QQt9q=Qd "&L
 -!NOO11,tTT
V r   c                     US   nUR                  U " UR                  /USS  Q70 UD6UR                  5      n[        XX55      $ )Nr   r=   )r    r	   r
   r   )rB   rC   rD   r   r   news         r   rE   rE   c   sL    7D
..T((>48>v>

C 't6??r   c                 Z    [        XX2S   R                  [        R                  5      5      $ )Nr   )r   _apply_fn_to_datar   t)rB   rC   rD   r   s       r   rE   rE   l   s'    &FG55egg> r   )r   torch.utils._python_dispatchr   torchao.utilsr   __all__opsatenr   
implementsr'   r(   r)   rE   slicer   rJ   defaultr0   r   serializationadd_safe_globalsr/   r   r   <module>rU      s     D + 4<
 yy~~;'4E ;'| ;EE
 EHH&&' ( DJJ@ @ DFFNN  2<< 7
    $ $&S%T Ur   