code: def spmm(A: SparseMatrix, X: torch.Tensor) -> torch.Tensor:
      """Multiplies a sparse matrix by a dense matrix, equivalent to ``A @ X``.
  
      Parameters
      ----------
      A : SparseMatrix
          Sparse matrix of shape ``(L, M)`` with scalar values
      X : torch.Tensor
          Dense matrix of shape ``(M, N)`` or ``(M)``
  
      Returns
      -------
      torch.Tensor
          The dense matrix of shape ``(L, N)`` or ``(L)``
  
      Examples
      --------
  
      >>> indices = torch.tensor([[0, 1, 1], [1, 0, 1]])
      >>> val = torch.randn(indices.shape[1])
      >>> A = dglsp.spmatrix(indices, val)
      >>> X = torch.randn(2, 3)
      >>> result = dglsp.spmm(A, X)
      >>> type(result)
      <class 'torch.Tensor'>
      >>> result.shape
      torch.Size([2, 3])
      """
      assert isinstance(
          A, SparseMatrix
      ), f"Expect arg1 to be a SparseMatrix object, got {type(A)}."
      assert isinstance(
          X, torch.Tensor
      ), f"Expect arg2 to be a torch.Tensor, got {type(X)}."
  
      return torch.ops.dgl_sparse.spmm(A.c_sparse_matrix, X)
  
imports: from typing import Union
  import torch
  from .sparse_matrix import SparseMatrix
label_desc: Use image node_id 1 for calling a global function with example usage: spmm(A, X) and returns: torch