2022-07-21 17:36:48 +08:00
|
|
|
# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
|
|
|
|
|
#
|
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
|
#
|
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
#
|
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
|
# limitations under the License.
|
|
|
|
|
|
2024-07-10 14:38:34 +08:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
|
|
2022-10-12 10:32:54 +08:00
|
|
|
from paddle import _C_ops
|
2024-08-15 01:10:42 +08:00
|
|
|
from paddle.base.framework import in_dynamic_or_pir_mode
|
2022-07-21 17:36:48 +08:00
|
|
|
|
2024-07-10 14:38:34 +08:00
|
|
|
if TYPE_CHECKING:
|
|
|
|
|
from paddle import Tensor
|
|
|
|
|
|
2022-07-21 17:36:48 +08:00
|
|
|
__all__ = []
|
|
|
|
|
|
|
|
|
|
|
2024-07-10 14:38:34 +08:00
|
|
|
def addmm(
|
|
|
|
|
input: Tensor,
|
|
|
|
|
x: Tensor,
|
|
|
|
|
y: Tensor,
|
|
|
|
|
beta: float = 1.0,
|
|
|
|
|
alpha: float = 1.0,
|
|
|
|
|
name: str | None = None,
|
|
|
|
|
) -> Tensor:
|
2022-07-21 17:36:48 +08:00
|
|
|
"""
|
|
|
|
|
Applies matrix multiplication for `x` and `y` , `input` is added to
|
|
|
|
|
the final result. The equation is:
|
|
|
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
2022-10-18 12:55:54 +08:00
|
|
|
out = alpha * x * y + beta * input
|
2022-09-14 21:56:19 +08:00
|
|
|
|
2022-07-21 17:36:48 +08:00
|
|
|
The supported input/output Tensor layout are as follows:
|
2022-09-14 21:56:19 +08:00
|
|
|
|
2022-07-21 17:36:48 +08:00
|
|
|
Note:
|
|
|
|
|
input[SparseCsrTensor] + x[SparseCsrTensor] @ y[SparseCsrTensor] -> out[SparseCsrTensor]
|
|
|
|
|
input[DenseTensor] + x[SparseCsrTensor] @ y[DenseTensor] -> out[DenseTensor]
|
|
|
|
|
input[SparseCooTensor] + x[SparseCooTensor] @ y[SparseCooTensor] -> out[SparseCooTensor]
|
|
|
|
|
input[DenseTensor] + x[SparseCooTensor] @ y[DenseTensor] -> out[DenseTensor]
|
|
|
|
|
|
|
|
|
|
It supports backward propagation.
|
|
|
|
|
|
|
|
|
|
Dimensions `input` , `x` , `y` must be same and >= 2D. Automatic broadcasting of Tensor is not supported.
|
|
|
|
|
|
|
|
|
|
Args:
|
2022-10-18 12:55:54 +08:00
|
|
|
input (SparseTensor|DenseTensor): The input tensor. Shape is [*, M, N]. The data type can be float32 or float64.
|
|
|
|
|
x (SparseTensor): The input SparseTensor. Shape is [*, M, K]. The data type can be float32 or float64.
|
|
|
|
|
y (SparseTensor|DenseTensor): The input tensor. Shape is [*, K, N]. The data type can be float32 or float64.
|
2022-07-21 17:36:48 +08:00
|
|
|
beta (float, optional): Coefficient of `input` . Default: 1.0
|
|
|
|
|
alpha (float, optional): Coefficient of `x * y` . Default: 1.0
|
|
|
|
|
name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.
|
2022-09-14 21:56:19 +08:00
|
|
|
|
2022-07-21 17:36:48 +08:00
|
|
|
Returns:
|
2022-10-18 12:55:54 +08:00
|
|
|
SparseTensor|DenseTensor: Tensor type, date type and shape is the same with `input` .
|
2022-09-14 21:56:19 +08:00
|
|
|
|
2022-07-21 17:36:48 +08:00
|
|
|
Examples:
|
|
|
|
|
|
2026-02-19 12:42:40 +08:00
|
|
|
.. code-block:: pycon
|
2022-07-21 17:36:48 +08:00
|
|
|
|
2023-08-29 10:38:53 +08:00
|
|
|
>>> # doctest: +REQUIRES(env:GPU)
|
|
|
|
|
>>> import paddle
|
|
|
|
|
>>> paddle.device.set_device('gpu')
|
|
|
|
|
|
|
|
|
|
>>> # dense + csr @ dense -> dense
|
|
|
|
|
>>> input = paddle.rand([3, 2])
|
|
|
|
|
>>> crows = [0, 1, 2, 3]
|
|
|
|
|
>>> cols = [1, 2, 0]
|
2026-02-19 12:42:40 +08:00
|
|
|
>>> values = [1.0, 2.0, 3.0]
|
2023-08-29 10:38:53 +08:00
|
|
|
>>> x = paddle.sparse.sparse_csr_tensor(crows, cols, values, [3, 3])
|
|
|
|
|
>>> y = paddle.rand([3, 2])
|
|
|
|
|
>>> out = paddle.sparse.addmm(input, x, y, 3.0, 2.0)
|
|
|
|
|
|
|
|
|
|
>>> # dense + coo @ dense -> dense
|
|
|
|
|
>>> input = paddle.rand([3, 2])
|
|
|
|
|
>>> indices = [[0, 1, 2], [1, 2, 0]]
|
2026-02-19 12:42:40 +08:00
|
|
|
>>> values = [1.0, 2.0, 3.0]
|
2023-08-29 10:38:53 +08:00
|
|
|
>>> x = paddle.sparse.sparse_coo_tensor(indices, values, [3, 3])
|
|
|
|
|
>>> y = paddle.rand([3, 2])
|
|
|
|
|
>>> out = paddle.sparse.addmm(input, x, y, 3.0, 2.0)
|
2022-09-14 21:56:19 +08:00
|
|
|
|
2022-07-21 17:36:48 +08:00
|
|
|
"""
|
2025-08-21 02:07:41 +08:00
|
|
|
assert in_dynamic_or_pir_mode(), (
|
|
|
|
|
"Currently, Sparse API only support dynamic mode or pir mode."
|
|
|
|
|
)
|
2022-10-31 18:37:56 +08:00
|
|
|
return _C_ops.sparse_addmm(input, x, y, beta, alpha)
|