
    Vho9                         d dl Z d dlmZ d dl mZ d dlmZmZ ddlmZm	Z	 g dZ
 G d de j                  j                        Z G d	 d
e j                  j                        Z G d de      Zy)    N)Tensor)ListOptional   )_hide_packed_params_repr_quantize_weight)EmbeddingPackedParams	EmbeddingEmbeddingBagc                        e Zd ZdZej
                  f fd	Zej                  j                  dej                  ddfd       Z
ej                  j                  d        Zd Z fd	Z fd
Zd Z xZS )r	   r   c                    t         |           || _        | j                  t        j                  t        j
                  fv rt        j                  |t        j                        }t        j                  |t        j                        }t        j                  ||g||d| j                        }| j                  |       y t        d|       )Ndtyper   scaleszero_pointsaxisr   zSUnsupported dtype on quantized embedding! Supports quint8 and quint4x2. Got dtype: )super__init__r   torchquint8quint4x2onesfloatzeros#_empty_per_channel_affine_quantized
set_weightNotImplementedError)selfnum_embeddingsembedding_dimr   r   r   wq	__class__s          [/home/dcms/DCMS/lib/python3.12/site-packages/torch/ao/nn/quantized/modules/embedding_ops.pyr   zEmbeddingPackedParams.__init__   s    
::%,,77ZZekkBF++nEKKHK::/'jjB OOB%efkelm     weightreturnNc                     | j                   t        j                  t        j                  fv r/t        j                  j
                  j                  |      | _        y t        d      )NzPUnsupported dtype for quantized embedding prepack! Supports quint8 and quint4x2.)	r   r   r   r   ops	quantizedembedding_bag_prepack_packed_weightr   )r   r&   s     r$   r   z EmbeddingPackedParams.set_weight$   sH    ::%,,77"'))"5"5"K"KF"SD%b r%   c                     | j                   t        j                  t        j                  fv r3t        j                  j
                  j                  | j                        S t        d      )NzOUnsupported dtype for quantized embedding unpack! Supports quint8 and quint4x2.)	r   r   r   r   r)   r*   embedding_bag_unpackr,   r   r   s    r$   _weightzEmbeddingPackedParams._weight-   sL    ::%,,7799&&;;D<O<OPP%a r%   c                     |S N )r   xs     r$   forwardzEmbeddingPackedParams.forward6   s    r%   c                 x    t         |   |||       | j                  ||dz   <   | j                         ||dz   <   y )Nr   r,   )r   _save_to_state_dictr   r0   )r   destinationprefix	keep_varsr#   s       r$   r7   z)EmbeddingPackedParams._save_to_state_dict>   s=    #KC(,

FW$%15F--.r%   c           	          ||dz      | _         |j                  |dz          ||dz      }|j                  |dz          | j                  |       t        	|   |||d|||       y )Nr   r,   F)r   popr   r   _load_from_state_dict)
r   
state_dictr9   local_metadatastrictmissing_keysunexpected_keys
error_msgsr&   r#   s
            r$   r=   z+EmbeddingPackedParams._load_from_state_dictC   sw       01
v'(F%556v 001%	
r%   c                 >    | j                         j                         S r2   )r0   __repr__r/   s    r$   rE   zEmbeddingPackedParams.__repr__^   s    ||~&&((r%   )__name__
__module____qualname___versionr   r   r   jitexportr   r   r0   r5   r7   r=   rE   __classcell__r#   s   @r$   r	   r	      sw    H<ALL & YY $   YY @

6)r%   r	   c                        e Zd ZdZdZddddddej                  fdededee   d	ee	   d
e	de
de
dee   ddf fdZdedefdZd Zd Zd Zdej                  ddfdZd Zedd       Zed        Z xZS )r
   a-  
    A quantized Embedding module with quantized packed weights as inputs.
    We adopt the same interface as `torch.nn.Embedding`, please see
    https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html for documentation.

    Similar to :class:`~torch.nn.Embedding`, attributes will be randomly
    initialized at module creation time and will be overwritten later

    Attributes:
        weight (Tensor): the non-learnable quantized weights of the module of
                         shape :math:`(\text{num\_embeddings}, \text{embedding\_dim})`.

    Examples::
        >>> m = nn.quantized.Embedding(num_embeddings=10, embedding_dim=12)
        >>> indices = torch.tensor([9, 6, 5, 7, 8, 8, 9, 2, 8])
        >>> output = m(indices)
        >>> print(output.size())
        torch.Size([9, 12])

    r   N       @Fr    r!   padding_idxmax_norm	norm_typescale_grad_by_freqsparser0   r'   c
                    t         |           || _        || _        |	| _        |ut        j                  |t
        j                        }
t        j                  |t
        j                        }t        j                  ||g|
|dt
        j                        }n#t        |j                        ||gk(  sJ d       |}t        |||	      | _        | j                  j                  |       y )Nr   r   r   z?Shape of weight does not match num_embeddings and embedding_dim)r   r   r    r!   r   r   r   r   r   r   r   listshaper	   _packed_paramsr   )r   r    r!   rP   rQ   rR   rS   rT   r0   r   r   r   qweightr#   s                r$   r   zEmbedding.__init__y   s     	,*
?ZZekkBF++nEKKHK??/'llG &+  Q QQ  G3M5
 	&&w/r%   indicesc                 4   | j                   t        j                  k(  r>t        j                  j                  j                  | j                  j                  |      S t        j                  j                  j                  | j                  j                  |      S r2   )	r   r   r   r)   r*   embedding_4bitrX   r,   embedding_byte)r   rZ   s     r$   r5   zEmbedding.forward   sp    ::'99&&55##22G  99&&55##22G r%   c                      y)NQuantizedEmbeddingr3   r/   s    r$   	_get_namezEmbedding._get_name   s    #r%   c                 "    t        | t              S r2   )r   r	   r/   s    r$   rE   zEmbedding.__repr__   s    '.CDDr%   c           	          d| j                    d| j                   d| j                  j                   d| j	                         j                          }|S )Nznum_embeddings=z, embedding_dim=z, dtype=z
, qscheme=)r    r!   rX   r   r&   qscheme)r   extra_repr_strs     r$   
extra_reprzEmbedding.extra_repr   s_    d1122B4CUCUBV W((../z$++-:O:O:Q9RT 	
 r%   wc                 :    | j                   j                  |       y r2   )rX   r   )r   rf   s     r$   r   zEmbedding.set_weight   s    &&q)r%   c                 6    | j                   j                         S r2   )rX   r0   r/   s    r$   r&   zEmbedding.weight   s    ""**,,r%   c                 L   t        |d      rt        |      t        j                  j                  j
                  j                  k(  sSJ d| j                  z   dz   dz   t        j                  j                  j
                  j                  j                  z          |j                  }nt        |      t        j                  k(  s2J d| j                  z   dz   t        j                  j                  z          t        |d      sJ d       dd	l	m
} |j                  1|j                  j                  |j                  j                         }n|j                         }|j                  }|j                  t        j                  k(  }|sJ d
       |t        j                   k(  s|t        j"                  k(  s
J d|         ||j                         t%        |j                  j'                         |      }t        |j(                  |j*                        }|j-                  |       |S )zCreate a quantized embedding module from a float module

        Args:
            mod (Module): a float module, either produced by torch.ao.quantization
                          utilities or provided by user
        weight_fake_quantnnq.z.from_float zwith fake quant only works for .from_float only works for qconfigz6Embedding input float module must have qconfig definedr   !float_qparams_weight_only_qconfigzPEmbedding quantization is only supported with float_qparams_weight_only_qconfig.zSThe only supported dtype for nnq.Embedding is torch.quint8 and torch.quint4x2, got )hasattrtyper   aonnqatr
   rF   rj   torch.ao.quantizationro   rm   r&   r   rc    per_channel_affine_float_qparamsr   r   r   r   r    r!   r   )	clsmoduse_precomputed_fake_quantweight_observerro   r   is_float_qparams_qconfigrY   
qembeddings	            r$   
from_floatzEmbedding.from_float   s    3+,9 9 99 ,, ! 44 ((++//++44	59 "33O9, ,,/0 ,,''(, Y HGH  P{{&3;;+=+=+I"%++"4"4"6"C"J"J"L%%##u'M'MM 	! %	^]	^$ U\\!Uenn%<	i`af`gh	i< 	

#"3::#3#3#5G s1133D3DE
g&r%   c                      | |j                   |j                  |j                  |j                  |j                  |j
                  |j                  |j                         |j                  	      }|S r2   )	r    r!   rP   rQ   rR   rS   rT   get_quantized_weightweight_dtype)rw   ref_embeddingr|   s      r$   from_referencezEmbedding.from_reference   sh    ((''%%""##,,  ..0&&


 r%   F)rF   rG   rH   __doc__rI   r   r   intr   r   boolr   r   r5   r`   rE   re   r   r&   classmethodr}   r   rL   rM   s   @r$   r
   r
   b   s    ( H &*$(#($(ll%0%0 %0 c]	%0
 5/%0 %0 !%0 %0 &!%0 
%0Nv & $E*ELL *T *- 4 4l  r%   r
   c                        e Zd ZdZdZdddddddej                  fdeded	ee	   d
e	de
dede
dee   de
ddf fdZ	 	 	 ddedee   dee   dee   def
dZd Zedd       Zed        Z xZS )r   a  
    A quantized EmbeddingBag module with quantized packed weights as inputs.
    We adopt the same interface as `torch.nn.EmbeddingBag`, please see
    https://pytorch.org/docs/stable/generated/torch.nn.EmbeddingBag.html for documentation.

    Similar to :class:`~torch.nn.EmbeddingBag`, attributes will be randomly
    initialized at module creation time and will be overwritten later

    Attributes:
        weight (Tensor): the non-learnable quantized weights of the module of
                         shape :math:`(\text{num\_embeddings}, \text{embedding\_dim})`.

    Examples::
        >>> m = nn.quantized.EmbeddingBag(num_embeddings=10, embedding_dim=12, include_last_offset=True, mode='sum')
        >>> indices = torch.tensor([9, 6, 5, 7, 8, 8, 9, 2, 8, 6, 6, 9, 1, 6, 8, 8, 3, 2, 3, 6, 3, 6, 5, 7, 0, 8, 4, 6, 5, 8, 2, 3])
        >>> offsets = torch.tensor([0, 19, 20, 28, 28, 32])
        >>> output = m(indices, offsets)
        >>> print(output.size())
        torch.Size([5, 12])

    r   NrO   Fsumr    r!   rQ   rR   rS   moderT   r0   include_last_offsetr'   c                 d    t         |   ||||
       || _        d| _        |	| _        |
| _        y )N)r0   r   F)r   r   r   pruned_weightsr   r   )r   r    r!   rQ   rR   rS   r   rT   r0   r   r   r#   s              r$   r   zEmbeddingBag.__init__  s9     	uU	##6 
r%   rZ   offsetsper_sample_weightscompressed_indices_mappingc                    | j                   t        j                  k(  rYt        j                  j                  j                  | j                  j                  ||dd| j                  ||| j                  	      S t        j                  j                  j                  | j                  j                  ||dd| j                  ||| j                  	      S )NFr   )r   r   r   r)   r*   embedding_bag_4bitrX   r,   r   r   embedding_bag_byte)r   rZ   r   r   r   s        r$   r5   zEmbeddingBag.forward1  s     ::'99&&99##22##"*((
 
 99&&99##22##"*((
 
r%   c                      y)NQuantizedEmbeddingBagr3   r/   s    r$   r`   zEmbeddingBag._get_nameQ  s    &r%   c                    t        |d      r|j                  }nt        |      t        j                  k(  s2J d| j
                  z   dz   t        j                  j
                  z          t        |d      sJ d       ddlm} |j                  1|j                  j                  |j                  j                         }n|j                         }|j                  }|j                  t        j                  k(  }|sJ d       |t        j                  k(  s|t        j                  k(  s
J d	|         ||j                         t!        |j                  j#                         |      }t	        |j$                  |j&                  |j(                  |j*                  |j,                  |j.                  |j0                  |j2                  |
	      }|j5                  |       |S )zCreate a quantized embedding_bag module from a float module

        Args:
            mod (Module): a float module, either produced by torch.ao.quantization
                          utilities or provided by user
        rj   rk   rl   rm   z9EmbeddingBag input float module must have qconfig definedr   rn   zSEmbeddingBag quantization is only supported with float_qparams_weight_only_qconfig.zVThe only supported dtype for nnq.EmbeddingBag is torch.quint8 and torch.quint4x2, got )rQ   rR   rS   r   rT   r   r   )rp   rj   rq   rs   r   rF   torch.ao.quantization.qconfigro   rm   r&   r   rc   r   rv   r   r   r   r   r    r!   rQ   rR   rS   r   rT   r   r   )	rw   rx   ry   rz   ro   r   r{   rY   qembedding_bags	            r$   r}   zEmbeddingBag.from_floatT  s    3+,!33O9/ ,,/0 //**+/ Y KJK  X{{&3;;+=+=+I"%++"4"4"6"C"J"J"L%%##u'M'MM 	! %	a`	a$ U\\!Uenn%<	lcdicjk	l< 	

#"3::#3#3#5G &\\mm"55:: # 7 7

 	!!'*r%   c                      | |j                   |j                  |j                  |j                  |j                  |j
                  |j                  |j                         |j                  |j                  
      }|S r2   )
r    r!   rQ   rR   rS   r   rT   r   r   r   )rw   ref_embedding_bagr   s      r$   r   zEmbeddingBag.from_reference  sq    ,,++&&''00""$$22411**
 r%   )NNNr   )rF   rG   rH   r   rI   r   r   r   r   r   r   strr   r   r5   r`   r   r}   r   rL   rM   s   @r$   r   r     s   * H %)#($($)ll  5/	
  !   &! " 
. %)/37; &! %V,	
 %-V$4 
@' 7 7r  r%   r   )r   torch.nnrs   r   torch._jit_internalr   r   utilsr   r   __all__Moduler	   r
   r   r3   r%   r$   <module>r      sZ       . = AQ)EHHOO Q)h` `FW9 Wr%   