a
    8Sici)                     @   s   d dl Z d dlmZ d dlZd dl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
lmZ g dZG dd deZG dd deZG dd deZG dd deZG dd deeZdS )    N)Any)Tensor)	ParameterUninitializedParameter   )
functional)init   )Module)LazyModuleMixin)BilinearIdentity
LazyLinearLinearc                       s:   e Zd ZdZeedd fddZeedddZ  ZS )	r   a  A placeholder identity operator that is argument-insensitive.

    Args:
        args: any argument (unused)
        kwargs: any keyword argument (unused)

    Shape:
        - Input: :math:`(*)`, where :math:`*` means any number of dimensions.
        - Output: :math:`(*)`, same shape as the input.

    Examples::

        >>> m = nn.Identity(54, unused_argument1=0.1, unused_argument2=False)
        >>> input = torch.randn(128, 20)
        >>> output = m(input)
        >>> print(output.size())
        torch.Size([128, 20])

    N)argskwargsreturnc                    s   t t|   d S N)superr   __init__)selfr   r   	__class__ S/var/www/html/django/DPS/env/lib/python3.9/site-packages/torch/nn/modules/linear.pyr   )   s    zIdentity.__init__inputr   c                 C   s   |S r   r   r   r   r   r   r   forward,   s    zIdentity.forward)	__name__
__module____qualname____doc__r   r   r   r   __classcell__r   r   r   r   r      s   r   c                       s|   e Zd ZU dZddgZeed< eed< eed< deeedd fdd	Z	dd
ddZ
eedddZed
ddZ  ZS )r   a&  Applies a linear transformation to the incoming data: :math:`y = xA^T + b`

    This module supports :ref:`TensorFloat32<tf32_on_ampere>`.

    On certain ROCm devices, when using float16 inputs this module will use :ref:`different precision<fp16_on_mi200>` for backward.

    Args:
        in_features: size of each input sample
        out_features: size of each output sample
        bias: If set to ``False``, the layer will not learn an additive bias.
            Default: ``True``

    Shape:
        - Input: :math:`(*, H_{in})` where :math:`*` means any number of
          dimensions including none and :math:`H_{in} = \text{in\_features}`.
        - Output: :math:`(*, H_{out})` where all but the last dimension
          are the same shape as the input and :math:`H_{out} = \text{out\_features}`.

    Attributes:
        weight: the learnable weights of the module of shape
            :math:`(\text{out\_features}, \text{in\_features})`. The values are
            initialized from :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})`, where
            :math:`k = \frac{1}{\text{in\_features}}`
        bias:   the learnable bias of the module of shape :math:`(\text{out\_features})`.
                If :attr:`bias` is ``True``, the values are initialized from
                :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
                :math:`k = \frac{1}{\text{in\_features}}`

    Examples::

        >>> m = nn.Linear(20, 30)
        >>> input = torch.randn(128, 20)
        >>> output = m(input)
        >>> print(output.size())
        torch.Size([128, 30])
    in_featuresout_featuresweightTNr$   r%   biasr   c                    sv   ||d}t t|   || _|| _ttj||ffi || _|r^ttj|fi || _	n| 
dd  |   d S Ndevicedtyper(   )r   r   r   r$   r%   r   torchemptyr&   r(   register_parameterreset_parameters)r   r$   r%   r(   r+   r,   factory_kwargsr   r   r   r   Z   s    
zLinear.__init__r   c                 C   s`   t j| jtdd | jd ur\t | j\}}|dkrFdt| nd}t | j| | d S )N   )ar   r	   )r   kaiming_uniform_r&   mathsqrtr(   Z_calculate_fan_in_and_fan_outuniform_)r   fan_in_boundr   r   r   r0   g   s
    
zLinear.reset_parametersr   c                 C   s   t || j| jS r   )Flinearr&   r(   r   r   r   r   r   q   s    zLinear.forwardc                 C   s   d | j| j| jd uS )Nz(in_features={}, out_features={}, bias={})formatr$   r%   r(   r   r   r   r   
extra_reprt   s    zLinear.extra_repr)TNNr   r    r!   r"   Z__constants__int__annotations__r   boolr   r0   r   strr@   r#   r   r   r   r   r   0   s   
$  
r   c                       s*   e Zd Zdeeedd fddZ  ZS )NonDynamicallyQuantizableLinearTNr'   c                    s   t  j|||||d d S )N)r(   r+   r,   )r   r   )r   r$   r%   r(   r+   r,   r   r   r   r      s    z(NonDynamicallyQuantizableLinear.__init__)TNN)r   r    r!   rB   rD   r   r#   r   r   r   r   rF      s
     rF   c                       s   e Zd ZU dZg dZeed< eed< eed< eed< deeeedd	 fd
dZ	ddddZ
eeedddZedddZ  ZS )r   a  Applies a bilinear transformation to the incoming data:
    :math:`y = x_1^T A x_2 + b`

    Args:
        in1_features: size of each first input sample
        in2_features: size of each second input sample
        out_features: size of each output sample
        bias: If set to False, the layer will not learn an additive bias.
            Default: ``True``

    Shape:
        - Input1: :math:`(*, H_{in1})` where :math:`H_{in1}=\text{in1\_features}` and
          :math:`*` means any number of additional dimensions including none. All but the last dimension
          of the inputs should be the same.
        - Input2: :math:`(*, H_{in2})` where :math:`H_{in2}=\text{in2\_features}`.
        - Output: :math:`(*, H_{out})` where :math:`H_{out}=\text{out\_features}`
          and all but the last dimension are the same shape as the input.

    Attributes:
        weight: the learnable weights of the module of shape
            :math:`(\text{out\_features}, \text{in1\_features}, \text{in2\_features})`.
            The values are initialized from :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})`, where
            :math:`k = \frac{1}{\text{in1\_features}}`
        bias:   the learnable bias of the module of shape :math:`(\text{out\_features})`.
                If :attr:`bias` is ``True``, the values are initialized from
                :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})`, where
                :math:`k = \frac{1}{\text{in1\_features}}`

    Examples::

        >>> m = nn.Bilinear(20, 30, 40)
        >>> input1 = torch.randn(128, 20)
        >>> input2 = torch.randn(128, 30)
        >>> output = m(input1, input2)
        >>> print(output.size())
        torch.Size([128, 40])
    )in1_featuresin2_featuresr%   rG   rH   r%   r&   TN)rG   rH   r%   r(   r   c                    s~   ||d}t t|   || _|| _|| _ttj|||ffi || _	|rfttj|fi || _
n| dd  |   d S r)   )r   r   r   rG   rH   r%   r   r-   r.   r&   r(   r/   r0   )r   rG   rH   r%   r(   r+   r,   r1   r   r   r   r      s    
zBilinear.__init__r2   c                 C   sH   dt | jd }t| j| | | jd urDt| j| | d S )Nr	   )r6   r7   r&   sizer   r8   r(   )r   r;   r   r   r   r0      s    
zBilinear.reset_parameters)input1input2r   c                 C   s   t ||| j| jS r   )r<   bilinearr&   r(   )r   rJ   rK   r   r   r   r      s    zBilinear.forwardc                 C   s   d | j| j| j| jd uS )Nz:in1_features={}, in2_features={}, out_features={}, bias={})r>   rG   rH   r%   r(   r?   r   r   r   r@      s    zBilinear.extra_repr)TNNrA   r   r   r   r   r      s   
%  
r   c                       sb   e Zd ZU dZeZeed< eed< dee	dd fddZ
dd	 fd
dZdd	ddZ  ZS )r   a  A :class:`torch.nn.Linear` module where `in_features` is inferred.

    In this module, the `weight` and `bias` are of :class:`torch.nn.UninitializedParameter`
    class. They will be initialized after the first call to ``forward`` is done and the
    module will become a regular :class:`torch.nn.Linear` module. The ``in_features`` argument
    of the :class:`Linear` is inferred from the ``input.shape[-1]``.

    Check the :class:`torch.nn.modules.lazy.LazyModuleMixin` for further documentation
    on lazy modules and their limitations.

    Args:
        out_features: size of each output sample
        bias: If set to ``False``, the layer will not learn an additive bias.
            Default: ``True``

    Attributes:
        weight: the learnable weights of the module of shape
            :math:`(\text{out\_features}, \text{in\_features})`. The values are
            initialized from :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})`, where
            :math:`k = \frac{1}{\text{in\_features}}`
        bias:   the learnable bias of the module of shape :math:`(\text{out\_features})`.
                If :attr:`bias` is ``True``, the values are initialized from
                :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
                :math:`k = \frac{1}{\text{in\_features}}`


    r&   r(   TN)r%   r(   r   c                    sH   ||d}t  ddd tf i || _|| _|rDtf i || _d S )Nr*   r   F)r   r   r   r&   r%   r(   )r   r%   r(   r+   r,   r1   r   r   r   r      s    
zLazyLinear.__init__r2   c                    s    |   s| jdkrt   d S )Nr   )has_uninitialized_paramsr$   r   r0   r?   r   r   r   r0      s    zLazyLinear.reset_parametersc                 C   sv   |   rrt R |jd | _| j| j| jf | jd urL| j| jf | 	  W d    n1 sh0    Y  d S )N)
rM   r-   no_gradshaper$   r&   materializer%   r(   r0   r   r   r   r   initialize_parameters   s    

z LazyLinear.initialize_parameters)TNN)r   r    r!   r"   r   cls_to_becomer   rC   rB   rD   r   r0   rR   r#   r   r   r   r   r      s   
  r   )r6   typingr   r-   r   Ztorch.nn.parameterr   r    r   r<   r   moduler
   lazyr   __all__r   r   rF   r   r   r   r   r   r   <module>   s   OJ