Ë
    [^(h¬c  ã            	       óð  — d dl mZmZmZmZ d dlZd dlmZ d dlmZm	Z	 ddl
mZmZmZmZ erd dlmZ eeeeedf   ee   f      Zn
eZeee      Zg d	¢Z ee	j.                  d
«      Z ee	j2                  d«      Z ee	j6                  d«      Zddededee   defd„Z ee	j<                  d«      Z ee	j@                  d«      Z! ee	jD                  d«      Z# ee	jH                  d«      Z% G d„ d«      Z&d„ Z'y)é    )ÚAnyÚOptionalÚTYPE_CHECKINGÚUnionN)ÚTensor)Ú_add_docstrÚ_sparseé   )ÚSparseSemiStructuredTensorÚ$SparseSemiStructuredTensorCUSPARSELTÚ!SparseSemiStructuredTensorCUTLASSÚto_sparse_semi_structured)Ú_dtype.)ÚaddmmÚcheck_sparse_tensor_invariantsÚmmÚsumÚsoftmaxÚsolveÚlog_softmaxr   r   r   r   Úas_sparse_gradchecka%  
sparse.addmm(mat, mat1, mat2, *, beta=1., alpha=1.) -> Tensor

This function does exact same thing as :func:`torch.addmm` in the forward,
except that it supports backward for sparse COO matrix :attr:`mat1`.
When :attr:`mat1` is a COO tensor it must have `sparse_dim = 2`.
When inputs are COO tensors, this function also supports backward for both inputs.

Supports both CSR and COO storage formats.

.. note::
    This function doesn't support computing derivaties with respect to CSR matrices.

Args:
    mat (Tensor): a dense matrix to be added
    mat1 (Tensor): a sparse matrix to be multiplied
    mat2 (Tensor): a dense matrix to be multiplied
    beta (Number, optional): multiplier for :attr:`mat` (:math:`\beta`)
    alpha (Number, optional): multiplier for :math:`mat1 @ mat2` (:math:`\alpha`)
aÃ
  
    Performs a matrix multiplication of the sparse matrix :attr:`mat1`
    and the (sparse or strided) matrix :attr:`mat2`. Similar to :func:`torch.mm`, if :attr:`mat1` is a
    :math:`(n \times m)` tensor, :attr:`mat2` is a :math:`(m \times p)` tensor, out will be a
    :math:`(n \times p)` tensor.
    When :attr:`mat1` is a COO tensor it must have `sparse_dim = 2`.
    When inputs are COO tensors, this function also supports backward for both inputs.

    Supports both CSR and COO storage formats.

.. note::
    This function doesn't support computing derivaties with respect to CSR matrices.

    This function also additionally accepts an optional :attr:`reduce` argument that allows
    specification of an optional reduction operation, mathematically performs the following operation:

.. math::

    z_{ij} = \bigoplus_{k = 0}^{K - 1} x_{ik} y_{kj}

where :math:`\bigoplus` defines the reduce operator. :attr:`reduce` is implemented only for
CSR storage format on CPU device.

Args:
    mat1 (Tensor): the first sparse matrix to be multiplied
    mat2 (Tensor): the second matrix to be multiplied, which could be sparse or dense
    reduce (str, optional): the reduction operation to apply for non-unique indices
        (:obj:`"sum"`, :obj:`"mean"`, :obj:`"amax"`, :obj:`"amin"`). Default :obj:`"sum"`.

Shape:
    The format of the output tensor of this function follows:
    - sparse x sparse -> sparse
    - sparse x dense -> dense

Example::

    >>> a = torch.tensor([[1., 0, 2], [0, 3, 0]]).to_sparse().requires_grad_()
    >>> a
    tensor(indices=tensor([[0, 0, 1],
                           [0, 2, 1]]),
           values=tensor([1., 2., 3.]),
           size=(2, 3), nnz=3, layout=torch.sparse_coo, requires_grad=True)
    >>> b = torch.tensor([[0, 1.], [2, 0], [0, 0]], requires_grad=True)
    >>> b
    tensor([[0., 1.],
            [2., 0.],
            [0., 0.]], requires_grad=True)
    >>> y = torch.sparse.mm(a, b)
    >>> y
    tensor([[0., 1.],
            [6., 0.]], grad_fn=<SparseAddmmBackward0>)
    >>> y.sum().backward()
    >>> a.grad
    tensor(indices=tensor([[0, 0, 1],
                           [0, 2, 1]]),
           values=tensor([1., 0., 2.]),
           size=(2, 3), nnz=3, layout=torch.sparse_coo)
    >>> c = a.detach().to_sparse_csr()
    >>> c
    tensor(crow_indices=tensor([0, 2, 3]),
           col_indices=tensor([0, 2, 1]),
           values=tensor([1., 2., 3.]), size=(2, 3), nnz=3,
           layout=torch.sparse_csr)
    >>> y1 = torch.sparse.mm(c, b, 'sum')
    >>> y1
    tensor([[0., 1.],
            [6., 0.]], grad_fn=<SparseMmReduceImplBackward0>)
    >>> y2 = torch.sparse.mm(c, b, 'max')
    >>> y2
    tensor([[0., 1.],
            [6., 0.]], grad_fn=<SparseMmReduceImplBackward0>)
aë  
sparse.sampled_addmm(input, mat1, mat2, *, beta=1., alpha=1., out=None) -> Tensor

Performs a matrix multiplication of the dense matrices :attr:`mat1` and :attr:`mat2` at the locations
specified by the sparsity pattern of :attr:`input`. The matrix :attr:`input` is added to the final result.

Mathematically this performs the following operation:

.. math::

    \text{out} = \alpha\ (\text{mat1} \mathbin{@} \text{mat2})*\text{spy}(\text{input}) + \beta\ \text{input}

where :math:`\text{spy}(\text{input})` is the sparsity pattern matrix of :attr:`input`, :attr:`alpha`
and :attr:`beta` are the scaling factors.
:math:`\text{spy}(\text{input})` has value 1 at the positions where :attr:`input` has non-zero values, and 0 elsewhere.

.. note::
    :attr:`input` must be a sparse CSR tensor. :attr:`mat1` and :attr:`mat2` must be dense tensors.

Args:
    input (Tensor): a sparse CSR matrix of shape `(m, n)` to be added and used to compute
        the sampled matrix multiplication
    mat1 (Tensor): a dense matrix of shape `(m, k)` to be multiplied
    mat2 (Tensor): a dense matrix of shape `(k, n)` to be multiplied

Keyword args:
    beta (Number, optional): multiplier for :attr:`input` (:math:`\beta`)
    alpha (Number, optional): multiplier for :math:`mat1 @ mat2` (:math:`\alpha`)
    out (Tensor, optional): output tensor. Ignored if `None`. Default: `None`.

Examples::

    >>> input = torch.eye(3, device='cuda').to_sparse_csr()
    >>> mat1 = torch.randn(3, 5, device='cuda')
    >>> mat2 = torch.randn(5, 3, device='cuda')
    >>> torch.sparse.sampled_addmm(input, mat1, mat2)
    tensor(crow_indices=tensor([0, 1, 2, 3]),
        col_indices=tensor([0, 1, 2]),
        values=tensor([ 0.2847, -0.7805, -0.1900]), device='cuda:0',
        size=(3, 3), nnz=3, layout=torch.sparse_csr)
    >>> torch.sparse.sampled_addmm(input, mat1, mat2).to_dense()
    tensor([[ 0.2847,  0.0000,  0.0000],
        [ 0.0000, -0.7805,  0.0000],
        [ 0.0000,  0.0000, -0.1900]], device='cuda:0')
    >>> torch.sparse.sampled_addmm(input, mat1, mat2, beta=0.5, alpha=0.5)
    tensor(crow_indices=tensor([0, 1, 2, 3]),
        col_indices=tensor([0, 1, 2]),
        values=tensor([ 0.1423, -0.3903, -0.0950]), device='cuda:0',
        size=(3, 3), nnz=3, layout=torch.sparse_csr)
ÚinputÚdimÚdtypeÚreturnc                 óÂ   — |€-|�t        j                  | |«      S t        j                  | «      S |�t        j                  | ||¬«      S t        j                  | |¬«      S )a¥	  Return the sum of each row of the given sparse tensor.

    Returns the sum of each row of the sparse tensor :attr:`input` in the given
    dimensions :attr:`dim`. If :attr:`dim` is a list of dimensions,
    reduce over all of them. When sum over all ``sparse_dim``, this method
    returns a dense tensor instead of a sparse tensor.

    All summed :attr:`dim` are squeezed (see :func:`torch.squeeze`), resulting an output
    tensor having :attr:`dim` fewer dimensions than :attr:`input`.

    During backward, only gradients at ``nnz`` locations of :attr:`input`
    will propagate back. Note that the gradients of :attr:`input` is coalesced.

    Args:
        input (Tensor): the input sparse tensor
        dim (int or tuple of ints): a dimension or a list of dimensions to reduce. Default: reduce
            over all dims.
        dtype (:class:`torch.dtype`, optional): the desired data type of returned Tensor.
            Default: dtype of :attr:`input`.

    Example::

        >>> nnz = 3
        >>> dims = [5, 5, 2, 3]
        >>> I = torch.cat([torch.randint(0, dims[0], size=(nnz,)),
                           torch.randint(0, dims[1], size=(nnz,))], 0).reshape(2, nnz)
        >>> V = torch.randn(nnz, dims[2], dims[3])
        >>> size = torch.Size(dims)
        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> S = torch.sparse_coo_tensor(I, V, size)
        >>> S
        tensor(indices=tensor([[2, 0, 3],
                               [2, 4, 1]]),
               values=tensor([[[-0.6438, -1.6467,  1.4004],
                               [ 0.3411,  0.0918, -0.2312]],

                              [[ 0.5348,  0.0634, -2.0494],
                               [-0.7125, -1.0646,  2.1844]],

                              [[ 0.1276,  0.1874, -0.6334],
                               [-1.9682, -0.5340,  0.7483]]]),
               size=(5, 5, 2, 3), nnz=3, layout=torch.sparse_coo)

        # when sum over only part of sparse_dims, return a sparse tensor
        >>> torch.sparse.sum(S, [1, 3])
        tensor(indices=tensor([[0, 2, 3]]),
               values=tensor([[-1.4512,  0.4073],
                              [-0.8901,  0.2017],
                              [-0.3183, -1.7539]]),
               size=(5, 2), nnz=3, layout=torch.sparse_coo)

        # when sum over all sparse dim, return a dense tensor
        # with summed dims squeezed
        >>> torch.sparse.sum(S, [0, 1, 3])
        tensor([-2.6596, -1.1450])
    )r   )ÚtorchÚ_sparse_sum)r   r   r   s      úS/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/sparse/__init__.pyr   r   É   s`   € ðr €}Øˆ?Ü×$Ñ$ U¨CÓ0Ð0ä×$Ñ$ UÓ+Ð+àˆ?Ü×$Ñ$ U¨C°uÔ=Ð=ä×$Ñ$ U°%Ô8Ð8ó    a•  
sparse.softmax(input, dim, *, dtype=None) -> Tensor

Applies a softmax function.

Softmax is defined as:

:math:`\text{Softmax}(x_{i}) = \frac{exp(x_i)}{\sum_j exp(x_j)}`

where :math:`i, j` run over sparse tensor indices and unspecified
entries are ignores. This is equivalent to defining unspecified
entries as negative infinity so that :math:`exp(x_k) = 0` when the
entry with index :math:`k` has not specified.

It is applied to all slices along `dim`, and will re-scale them so
that the elements lie in the range `[0, 1]` and sum to 1.

Args:
    input (Tensor): input
    dim (int): A dimension along which softmax will be computed.
    dtype (:class:`torch.dtype`, optional): the desired data type
        of returned tensor.  If specified, the input tensor is
        casted to :attr:`dtype` before the operation is
        performed. This is useful for preventing data type
        overflows. Default: None
a¡  
sparse.spsolve(input, other, *, left=True) -> Tensor

Computes the solution of a square system of linear equations with
a unique solution. Its purpose is similar to :func:`torch.linalg.solve`,
except that the system is defined by a sparse CSR matrix with layout
`sparse_csr`.

Args:
    input (Tensor): a sparse CSR matrix of shape `(n, n)` representing the
        coefficients of the linear system.
    other (Tensor): a dense matrix of shape `(n, )` representing the right-hand
        side of the linear system.
    left (bool, optional): whether to solve the system for `input @ out = other`
        (default) or `out @ input = other`. Only `left=True` is supported.
a  
sparse.log_softmax(input, dim, *, dtype=None) -> Tensor

Applies a softmax function followed by logarithm.

See :class:`~torch.sparse.softmax` for more details.

Args:
    input (Tensor): input
    dim (int): A dimension along which softmax will be computed.
    dtype (:class:`torch.dtype`, optional): the desired data type
        of returned tensor.  If specified, the input tensor is
        casted to :attr:`dtype` before the operation is
        performed. This is useful for preventing data type
        overflows. Default: None
a(  
sparse.spdiags(diagonals, offsets, shape, layout=None) -> Tensor

Creates a sparse 2D tensor by placing the values from rows of
:attr:`diagonals` along specified diagonals of the output

The :attr:`offsets` tensor controls which diagonals are set.

- If :attr:`offsets[i]` = 0, it is the main diagonal
- If :attr:`offsets[i]` < 0, it is below the main diagonal
- If :attr:`offsets[i]` > 0, it is above the main diagonal

The number of rows in :attr:`diagonals` must match the length of :attr:`offsets`,
and an offset may not be repeated.

Args:
    diagonals (Tensor): Matrix storing diagonals row-wise
    offsets (Tensor): The diagonals to be set, stored as a vector
    shape (2-tuple of ints): The desired shape of the result
Keyword args:
    layout (:class:`torch.layout`, optional): The desired layout of the
        returned tensor. ``torch.sparse_coo``, ``torch.sparse_csc`` and ``torch.sparse_csr``
        are supported. Default: ``torch.sparse_coo``

Examples:

Set the main and first two lower diagonals of a matrix::

    >>> diags = torch.arange(9).reshape(3, 3)
    >>> diags
    tensor([[0, 1, 2],
            [3, 4, 5],
            [6, 7, 8]])
    >>> s = torch.sparse.spdiags(diags, torch.tensor([0, -1, -2]), (3, 3))
    >>> s
    tensor(indices=tensor([[0, 1, 2, 1, 2, 2],
                           [0, 1, 2, 0, 1, 0]]),
           values=tensor([0, 1, 2, 3, 4, 6]),
           size=(3, 3), nnz=6, layout=torch.sparse_coo)
    >>> s.to_dense()
    tensor([[0, 0, 0],
            [3, 1, 0],
            [6, 4, 2]])


Change the output layout::

    >>> diags = torch.arange(9).reshape(3, 3)
    >>> diags
    tensor([[0, 1, 2],[3, 4, 5], [6, 7, 8])
    >>> s = torch.sparse.spdiags(diags, torch.tensor([0, -1, -2]), (3, 3), layout=torch.sparse_csr)
    >>> s
    tensor(crow_indices=tensor([0, 1, 3, 6]),
           col_indices=tensor([0, 0, 1, 0, 1, 2]),
           values=tensor([0, 3, 1, 6, 4, 2]), size=(3, 3), nnz=6,
           layout=torch.sparse_csr)
    >>> s.to_dense()
    tensor([[0, 0, 0],
            [3, 1, 0],
            [6, 4, 2]])

Set partial diagonals of a large output::

    >>> diags = torch.tensor([[1, 2], [3, 4]])
    >>> offsets = torch.tensor([0, -1])
    >>> torch.sparse.spdiags(diags, offsets, (5, 5)).to_dense()
    tensor([[1, 0, 0, 0, 0],
            [3, 2, 0, 0, 0],
            [0, 4, 0, 0, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0]])

.. note::

    When setting the values along a given diagonal the index into the diagonal
    and the index into the row of :attr:`diagonals` is taken as the
    column index in the output. This has the effect that when setting a diagonal
    with a positive offset `k` the first value along that diagonal will be
    the value in position `k` of the row of :attr:`diagonals`

Specifying a positive offset::

    >>> diags = torch.tensor([[1, 2, 3], [1, 2, 3], [1, 2, 3]])
    >>> torch.sparse.spdiags(diags, torch.tensor([0, 1, 2]), (5, 5)).to_dense()
    tensor([[1, 2, 3, 0, 0],
            [0, 2, 3, 0, 0],
            [0, 0, 3, 0, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0]])
c                   óZ   — e Zd ZdZed„ «       Zed„ «       Zed„ «       Zd
d„Zd„ Z	d„ Z
d„ Zy	)r   aÅ  A tool to control checking sparse tensor invariants.

    The following options exists to manage sparsr tensor invariants
    checking in sparse tensor construction:

    1. Using a context manager:

       .. code:: python

           with torch.sparse.check_sparse_tensor_invariants():
               run_my_model()

    2. Using a procedural approach:

       .. code:: python

           prev_checks_enabled = torch.sparse.check_sparse_tensor_invariants.is_enabled()
           torch.sparse.check_sparse_tensor_invariants.enable()

           run_my_model()

           if not prev_checks_enabled:
               torch.sparse.check_sparse_tensor_invariants.disable()

    3. Using function decoration:

       .. code:: python

           @torch.sparse.check_sparse_tensor_invariants()
           def run_my_model():
               ...

           run_my_model()

    4. Using ``check_invariants`` keyword argument in sparse tensor constructor call.
       For example:

       >>> torch.sparse_csr_tensor([0, 1, 3], [0, 1], [1, 2], check_invariants=True)
       Traceback (most recent call last):
         File "<stdin>", line 1, in <module>
       RuntimeError: `crow_indices[..., -1] == nnz` is not satisfied.
    c                  ó>   — t         j                  j                  «       S )a;  Return True if the sparse tensor invariants checking is enabled.

        .. note::

            Use :func:`torch.sparse.check_sparse_tensor_invariants.enable` or
            :func:`torch.sparse.check_sparse_tensor_invariants.disable` to
            manage the state of the sparse tensor invariants checks.
        )r   Ú_CÚ_check_sparse_tensor_invariants© r    r   Ú
is_enabledz)check_sparse_tensor_invariants.is_enabledá  s   € ô �x‰x×7Ñ7Ó9Ð9r    c                  óB   — t         j                  j                  d«       y)ax  Enable sparse tensor invariants checking in sparse tensor constructors.

        .. note::

            By default, the sparse tensor invariants checks are disabled. Use
            :func:`torch.sparse.check_sparse_tensor_invariants.is_enabled` to
            retrieve the current state of sparse tensor invariants checking.

        .. note::

            The sparse tensor invariants check flag is effective to all sparse
            tensor constructors, both in Python and ATen.

        The flag can be locally overridden by the ``check_invariants``
        optional argument of the sparse tensor constructor functions.
        TN©r   r#   Ú#_set_check_sparse_tensor_invariantsr%   r    r   Úenablez%check_sparse_tensor_invariants.enableí  s   € ô$ 	�‰×4Ñ4°TÕ:r    c                  óB   — t         j                  j                  d«       y)z¯Disable sparse tensor invariants checking in sparse tensor constructors.

        See :func:`torch.sparse.check_sparse_tensor_invariants.enable` for more information.
        FNr(   r%   r    r   Údisablez&check_sparse_tensor_invariants.disable  s   € ô 	�‰×4Ñ4°UÕ;r    c                 ó    — || _         d | _        y ©N)ÚstateÚsaved_state)Úselfr*   s     r   Ú__init__z'check_sparse_tensor_invariants.__init__
  s   € ØˆŒ
Ø+/ˆÕr    c                 ó®   — | j                   �t        d«      ‚| j                  «       | _         t        j                  j                  | j                  «       y )NzqThis context manager instance is already activated. Use a different context manager instance for context nesting.)r0   ÚRuntimeErrorr&   r   r#   r)   r/   )r1   s    r   Ú	__enter__z(check_sparse_tensor_invariants.__enter__  sH   € Ø×ÑÐ'ÜðQóð ð  Ÿ?™?Ó,ˆÔÜ�‰×4Ñ4°T·Z±ZÕ@r    c                 ó€   — | j                   €J ‚t        j                  j                  | j                   «       d | _         y r.   )r0   r   r#   r)   )r1   ÚtypeÚvalueÚ	tracebacks       r   Ú__exit__z'check_sparse_tensor_invariants.__exit__  s4   € Ø×ÑÐ+Ð+Ð+Ü�‰×4Ñ4°T×5EÑ5EÔFØˆÕr    c                 ó   ‡ ‡— ˆˆ fd„}|S )Nc                  óv   •—  t        ‰«      ‰j                  «      5   ‰| i |¤Žcd d d «       S # 1 sw Y   y xY wr.   )r7   r/   )ÚargsÚkwargsÚmthr1   s     €€r   Útest_mthz9check_sparse_tensor_invariants.__call__.<locals>.test_mth  s7   ø€ Ø”�d“˜DŸJ™JÓ'ñ ,Ù˜DÐ+ FÑ+÷,÷ ,ò ,ús   �/¯8r%   )r1   r?   r@   s   `` r   Ú__call__z'check_sparse_tensor_invariants.__call__  s   ù€ õ	,ð ˆr    N)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr&   r*   r,   r2   r5   r:   rA   r%   r    r   r   r   µ  sY   „ ñ)ðV ñ	:ó ð	:ð ñ;ó ð;ð& ñ<ó ð<ó0òAò ór    r   c                 ó   ‡ — ˆ fd„}|S )al  Decorate function, to extend gradcheck for sparse tensors.

    Decorator for torch.autograd.gradcheck or its functools.partial
    variants that extends the gradcheck function with support to input
    functions that operate on or/and return sparse tensors.

    The specified gradcheck function itself is guaranteed to operate
    on strided tensors only.

    For example:

    >>> gradcheck = torch.sparse.as_sparse_gradcheck(torch.autograd.gradcheck)
    >>> x = torch.tensor([[0, 1], [2, 3]], dtype=torch.float64).to_sparse_coo().requires_grad_(True)
    >>> gradcheck(lambda x: x.to_sparse_csr(), x)
    True
    c                 óà  •‡ ‡‡‡‡	‡
‡— |j                  dd«      Št        j                  t        j                  t        j                  t        j
                  t        j                  hŠt        j                  t        j                  t        j
                  t        j                  hŠ
t        j
                  t        j                  hŠ	dŠˆˆˆ	ˆfd„}ˆˆ
fd„Šˆ ˆˆˆfd„}| ||«      f} ‰|i |¤ŽS )z©
        Create gradcheck with support for sparse tensors.

        Same as :func:`torch.autograd.gradcheck` but with sparse tensors inputs and outputs support.
        ÚmaskedFÚ__STRIDED_REPRESENTATION__c                 óX  •— t        | t        t        f«      s| f} g }| D �]~  }t        |t        j                  «      �rO|j
                  �rB|j                  ‰v �r3t        |j                  |j                  ¬«      }‰	sä|j                  |j                  «       z
  |j                  «       z
  }|j                  ‰
v r#|j                  «       j                  |dz   |dz    nd}t        j                  |j                  |j                  t        j                  ¬«      j!                  |j                  ||j                  «       ¬«      }|j#                  «       j%                  |«      }|j                  t        j&                  u r@|j)                  |j+                  «       |j-                  «       ¬«       |j/                  «       }n«|j                  t        j0                  t        j2                  hv r@|j)                  |j5                  «       |j7                  «       ¬«       |j                  «       }n?|j)                  |j9                  «       |j;                  «       ¬«       |j                  «       }|j=                  ‰||j?                  d	«      f«       �Œn|jA                  |«       �Œ� t        |«      S )
ziConvert differentiable non-strided tensors to a representation containing differentiable strided tensors.)ÚlayoutÚshaper
   é   N)Údevicer   )rL   Ú	blocksizeÚ	dense_dim)ÚindicesÚis_coalesced)Úcompressed_indicesÚplain_indicesT)!Ú
isinstanceÚlistÚtupler   r   Úrequires_gradrL   ÚdictrM   ÚndimrQ   Ú
sparse_dimÚvaluesÚonesrO   ÚboolÚ	to_sparseÚto_denseÚsparse_maskÚ
sparse_cooÚupdateÚ_indicesrS   Ú_valuesÚ
sparse_csrÚ
sparse_bsrÚcrow_indicesÚcol_indicesÚccol_indicesÚrow_indicesÚextendÚrequires_grad_Úappend)r=   Únew_argsÚobjÚdÚ	batch_dimrP   Ú	full_maskr]   ÚSTRIDED_REPRESENTATIONrI   Úsparse_block_layoutsÚsparse_layoutss           €€€€r   Ú!convert_to_strided_representationzeas_sparse_gradcheck.<locals>.gradcheck_with_sparse_support.<locals>.convert_to_strided_representationN  s#  ø€ ä˜d¤T¬5 MÔ2Ø�w�Ø"$ˆHØó ,)�ä˜s¤E§L¡LÕ1Ø×)Ó)ØŸ
™
 nÒ4ä C§J¡J°c·i±iÔ@�AÙ!à$'§H¡H¨s¯}©}«Ñ$>ÀÇÁÓAQÑ$Q˜	ð  #Ÿz™zÐ-AÑAð  ŸJ™J›L×.Ñ.¨y¸1©}¸yÈ1¹}ÑMà!%ð "ô
 %*§J¡JØŸI™I¨c¯j©jÄÇ
Á
ô%ç#™)Ø#&§:¡:Ø&/Ø&)§m¡m£oð $ó ð "ð "Ÿl™l›n×8Ñ8¸ÓC˜Ø—z‘z¤U×%5Ñ%5Ñ5ØŸ™Ø$'§L¡L£NÀ×AQÑAQÓASð !ô ð "%§¡£™ØŸ™¬×(8Ñ(8¼%×:JÑ:JÐ'KÑKØŸ™Ø/2×/?Ñ/?Ó/AØ*-¯/©/Ó*;ð !ô ð "%§¡£™àŸ™Ø/2×/?Ñ/?Ó/AØ*-¯/©/Ó*;ð !ô ð "%§¡£˜Ø—O‘OØ/°°F×4IÑ4IÈ$Ó4OÐPöð —O‘O CÖ(ðY,)ôZ ˜“?Ð"r    c                 óÀ  •— g }t        | «      } | rÄ| j                  d«      }|‰k(  rš| j                  d«      | j                  d«      }}|d   t        j                  u r#t        j                  |d   ||d   |d   ¬«      }n@|d   ‰v r't        j
                  |d   |d   ||d   |d   ¬	«      }nt        d
|d   › d�«      ‚|j                  |«       | rŒÄt        |«      S )zNRestore non-strided differentiable tensosr from their strided representations.r   rL   rR   rM   rS   )ÚsizerS   rT   rU   )rz   rL   zconversion of z! strided representation to tensor)	rW   Úpopr   rc   Úsparse_coo_tensorÚsparse_compressed_tensorÚNotImplementedErrorro   rX   )r=   rp   Úarr   r]   ru   Úsparse_compressed_layoutss        €€r   Ú#restore_from_strided_representationzgas_sparse_gradcheck.<locals>.gradcheck_with_sparse_support.<locals>.restore_from_strided_representation‚  sþ   ø€ àˆHÜ˜“:ˆDÙØ—H‘H˜Q“K�ØÐ.Ò.Ø $§¡¨£¨T¯X©X°a«[�v�AØ˜‘{¤e×&6Ñ&6Ñ6Ü!×3Ñ3Ø˜i™LØ"Ø!" 7¡Ø)*¨>Ñ):ô	™ð ˜8™Ð(AÑAÜ!×:Ñ:ØÐ2Ñ3Ø˜oÑ.Ø"Ø!" 7¡Ø#$ X¡;ô™ô 2Ø,¨Q¨x©[¨MÐ9ZÐ[óð ð —‘ Ô"ò/ ô0 ˜“?Ð"r    c                  óÐ   •—  ‰| «      } ‰|i |¤Ž}t        |t        t        f«      rt        |«      n|f}t        ˆˆfd„|D «       «      }t        |t        t        f«      r|S |d   S )Nc              3   ó®   •K  — | ]L  }t        |t        j                  «      r,|j                  r |j                  ‰v r|j                  ‰¬ «      n|–— ŒN y­w))Úmasked_gradN)rV   r   r   rY   rL   ra   )Ú.0ÚorI   rw   s     €€r   ú	<genexpr>zcas_sparse_gradcheck.<locals>.gradcheck_with_sparse_support.<locals>.func_wrapper.<locals>.<genexpr>ª  sS   øè ø€ ò 	$ð ô " !¤U§\¡\Ô2ØŸšØŸ™ NÑ2ð —J‘J¨6�JÔ2ð ó	ñ	$ùs   ƒAAr   )rV   rW   rX   )	r=   r>   Úrestored_argsÚoutputsÚstrided_outputsÚfuncrI   r�   rw   s	        €€€€r   Úfunc_wrapperzPas_sparse_gradcheck.<locals>.gradcheck_with_sparse_support.<locals>.func_wrapper   s�   ø€ Ù?ÀÓEˆMñ ˜MÐ4¨VÑ4ˆGô #-¨W´t¼U°mÔ"D”�g”È7È*ð ô $ô 	$ð )ô	$ó 	ˆOô ˜g¬¬e }Ô5ð  ðð % QÑ'ðr    )r{   r   rc   rg   Ú
sparse_cscrh   Ú
sparse_bsc)r‹   Úinputsr>   rx   rŒ   r=   ru   rI   r�   rv   r€   rw   Ú	gradchecks   `     @@@@@@€r   Úgradcheck_with_sparse_supportz:as_sparse_gradcheck.<locals>.gradcheck_with_sparse_support7  sÈ   ÿ€ ð —‘˜H eÓ,ˆä×ÑÜ×ÑÜ×ÑÜ×ÑÜ×Ñð
ˆô ×ÑÜ×ÑÜ×ÑÜ×Ñð	%
Ð!ô !&× 0Ñ 0´%×2BÑ2BÐCÐØ!=Ð÷2	#õh	#÷<	ð6 Ñ?ÀÓGÐHˆá˜$Ð) &Ñ)Ð)r    r%   )r�   r‘   s   ` r   r   r   %  s   ø€ ô$F*ðP )Ð(r    )NN)(Útypingr   r   r   r   r   r   Útorch._Cr   r	   Úsemi_structuredr   r   r   r   Útorch.typesr   ÚDTypeÚintrX   rW   Ú	DimOrDimsÚ__all__Ú_sparse_addmmr   Ú
_sparse_mmr   Úsparse_sampled_addmmÚsampled_addmmr   Ú_sparse_softmaxr   Ú_spsolveÚspsolveÚ_sparse_log_softmaxr   Ú_spdiagsÚspdiagsr   r   r%   r    r   ú<module>r¤      sb  ð÷ 7Ó 6ã Ý ß )÷ó ñ Ý+à˜˜s E¨#¨s¨(¡O°T¸#±YÐ>Ñ?Ñ@�Ið €EØ˜˜s™Ñ$€Iò€ñ 	Ø×Ñðó	€ñ2 Ø×ÑðGóJ€ñZ Ø× Ñ ð1ó4€ñnB9ˆvð B9˜Ið B9°X¸e±_ð B9ÐPVó B9ñJ Ø×Ñðó€ñ> Ø×Ñðó€ñ( Ø×Ñðó€ñ* Ø×ÑðYó\€÷~mñ mó`Z)r    