From 581c5cb593e1241a6da2fa8ef47fa4cc30f40ccc Mon Sep 17 00:00:00 2001 From: juvdnbro Date: Tue, 29 Jul 2025 16:11:09 +0200 Subject: [PATCH 01/15] Improved stubs for `block_array` and `bmat` --- scipy-stubs/sparse/_construct.pyi | 213 ++++++++++++++++++++++-------- tests/sparse/test_construct.pyi | 23 +++- 2 files changed, 177 insertions(+), 59 deletions(-) diff --git a/scipy-stubs/sparse/_construct.pyi b/scipy-stubs/sparse/_construct.pyi index 9c86dba7..065d530b 100644 --- a/scipy-stubs/sparse/_construct.pyi +++ b/scipy-stubs/sparse/_construct.pyi @@ -76,7 +76,12 @@ _Offsets: TypeAlias = onp.ToInt | onp.ToInt1D _DataRVS: TypeAlias = Callable[[int], onp.ArrayND[_Numeric]] -_ToBlocks: TypeAlias = Seq[Seq[_spbase[_SCT] | None]] | onp.ArrayND[np.object_] +_ToBlocksArray: TypeAlias = onp.ArrayND[np.object_] +_ToBlocksSPArray: TypeAlias = Seq[Seq[_SpArray2D[_SCT] | None]] +_ToBlocksSPMatrix: TypeAlias = Seq[Seq[_SpMatrix[_SCT] | None]] +_ToBlocksCanStack: TypeAlias = Seq[Seq[_CanStack[_T] | None]] +_ToBlocksCanStackAs: TypeAlias = Seq[Seq[_CanStackAs[_SCT0, _T] | None]] +_ToBlocksUnkown: TypeAlias = _ToBlocksSPArray | _ToBlocksArray @type_check_only class _DataSampler(Protocol): @@ -1378,19 +1383,19 @@ def kronsum(A: onp.ToComplex2D, B: onp.ToComplex2D, format: _Format | None = Non @overload # sparray, format: , dtype: def hstack(blocks: Seq[_CanStack[_T]], format: None = None, dtype: None = None) -> _T: ... @overload # sparray, format: "bsr", dtype: -def hstack(blocks: Seq[sparray[_SCT0]], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT0]: ... +def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... @overload # sparray, format: "coo", dtype: -def hstack(blocks: Seq[sparray[_SCT0]], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT0]: ... +def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT]: ... @overload # sparray, format: "csc", dtype: -def hstack(blocks: Seq[sparray[_SCT0]], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT0]: ... +def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... @overload # sparray, format: "csr", dtype: -def hstack(blocks: Seq[sparray[_SCT0]], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT0]: ... +def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... @overload # sparray, format: "dia", dtype: -def hstack(blocks: Seq[sparray[_SCT0]], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT0]: ... +def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... @overload # sparray, format: "dok", dtype: -def hstack(blocks: Seq[sparray[_SCT0]], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT0]: ... +def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... @overload # sparray, format: "lil", dtype: -def hstack(blocks: Seq[sparray[_SCT0]], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT0]: ... +def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... # @overload # sparray, format: , dtype: bool-like @@ -1509,19 +1514,19 @@ def hstack(blocks: Seq[_spbase], format: _Format, dtype: npt.DTypeLike | None = @overload # sparray, format: , dtype: def vstack(blocks: Seq[_CanStack[_T]], format: None = None, dtype: None = None) -> _T: ... @overload # sparray, format: "bsr", dtype: -def vstack(blocks: Seq[sparray[_SCT0]], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT0]: ... +def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... @overload # sparray, format: "coo", dtype: -def vstack(blocks: Seq[sparray[_SCT0]], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT0]: ... +def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT]: ... @overload # sparray, format: "csc", dtype: -def vstack(blocks: Seq[sparray[_SCT0]], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT0]: ... +def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... @overload # sparray, format: "csr", dtype: -def vstack(blocks: Seq[sparray[_SCT0]], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT0]: ... +def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... @overload # sparray, format: "dia", dtype: -def vstack(blocks: Seq[sparray[_SCT0]], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT0]: ... +def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... @overload # sparray, format: "dok", dtype: -def vstack(blocks: Seq[sparray[_SCT0]], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT0]: ... +def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... @overload # sparray, format: "lil", dtype: -def vstack(blocks: Seq[sparray[_SCT0]], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT0]: ... +def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... # @overload # sparray, format: , dtype: bool-like @@ -1636,52 +1641,152 @@ def vstack(blocks: Seq[sparray], format: _FmtLIL, dtype: npt.DTypeLike) -> _LILA def vstack(blocks: Seq[_spbase], format: _Format, dtype: npt.DTypeLike | None = None) -> Incomplete: ... ### -# TODO(jorenham): Use `_CanStack` here, which requires a way to map matrix types to array types. @overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocks[_SCT], *, format: _FmtCOO | None = None, dtype: None = None) -> _COOArray2D[_SCT]: ... -@overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocks[_SCT], *, format: _FmtNonCOO, dtype: None = None) -> _SpArray2D[_SCT]: ... - -# -@overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocks, *, format: _FmtCOO | None = None, dtype: onp.ToDType[_SCT]) -> _COOArray2D[_SCT]: ... -@overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocks, *, format: _FmtNonCOO, dtype: onp.ToDType[_SCT]) -> _SpArray2D[_SCT]: ... - -# -@overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocks, *, format: _FmtCOO | None = None, dtype: npt.DTypeLike) -> _COOArray2D: ... -@overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocks, *, format: _FmtNonCOO, dtype: npt.DTypeLike) -> _SpArray2D: ... +def block_array(blocks: _ToBlocksCanStack[_T], format: None = None, dtype: None = None) -> _T: ... +@overload # blocks: , format: "bsr", dtype: +def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... +@overload # blocks: , format: "coo", dtype: +def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT]: ... +@overload # blocks: , format: "csc", dtype: +def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... +@overload # blocks: , format: "csr", dtype: +def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... +@overload # blocks: , format: "dia", dtype: +def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... +@overload # blocks: , format: "dok", dtype: +def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... +@overload # blocks: , format: "lil", dtype: +def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... + +# +@overload # blocks: , format: , dtype: bool-like +def block_array(blocks: _ToBlocksCanStackAs[np.bool_, _T], format: None = None, *, dtype: onp.AnyBoolDType) -> _T: ... +@overload # blocks: , format: "bsr", dtype: bool-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyBoolDType) -> _BSRArray[np.bool_]: ... +@overload # blocks: , format: "coo", dtype: bool-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyBoolDType) -> _COOArray2D[np.bool_]: ... +@overload # blocks: , format: "csc", dtype: bool-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyBoolDType) -> _CSCArray[np.bool_]: ... +@overload # blocks: , format: "csr", dtype: bool-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyBoolDType) -> _CSRArray2D[np.bool_]: ... +@overload # blocks: , format: "dia", dtype: bool-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyBoolDType) -> _DIAArray[np.bool_]: ... +@overload # blocks: , format: "dok", dtype: bool-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyBoolDType) -> _DOKArray2D[np.bool_]: ... +@overload # blocks: , format: "lil", dtype: bool-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyBoolDType) -> _LILArray[np.bool_]: ... + +# +@overload # blocks: , format: , dtype: int-like +def block_array(blocks: _ToBlocksCanStackAs[np.int_, _T], format: None = None, *, dtype: onp.AnyIntDType) -> _T: ... +@overload # blocks: , format: "bsr", dtype: int-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyIntDType) -> _BSRArray[np.int_]: ... +@overload # blocks: , format: "coo", dtype: int-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyIntDType) -> _COOArray2D[np.int_]: ... +@overload # blocks: , format: "csc", dtype: int-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyIntDType) -> _CSCArray[np.int_]: ... +@overload # blocks: , format: "csr", dtype: int-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyIntDType) -> _CSRArray2D[np.int_]: ... +@overload # blocks: , format: "dia", dtype: int-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyIntDType) -> _DIAArray[np.int_]: ... +@overload # blocks: , format: "dok", dtype: int-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyIntDType) -> _DOKArray2D[np.int_]: ... +@overload # blocks: , format: "lil", dtype: int-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyIntDType) -> _LILArray[np.int_]: ... + +# +@overload # blocks: , format: , dtype: float64-like +def block_array(blocks: _ToBlocksCanStackAs[np.float64, _T], format: None = None, *, dtype: onp.AnyFloat64DType) -> _T: ... +@overload # blocks: , format: "bsr", dtype: float64-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyFloat64DType) -> _BSRArray[np.float64]: ... +@overload # blocks: , format: "coo", dtype: float64-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyFloat64DType) -> _COOArray2D[np.float64]: ... +@overload # blocks: , format: "csc", dtype: float64-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyFloat64DType) -> _CSCArray[np.float64]: ... +@overload # blocks: , format: "csr", dtype: float64-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyFloat64DType) -> _CSRArray2D[np.float64]: ... +@overload # blocks: , format: "dia", dtype: float64-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyFloat64DType) -> _DIAArray[np.float64]: ... +@overload # blocks: , format: "dok", dtype: float64-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyFloat64DType) -> _DOKArray2D[np.float64]: ... +@overload # blocks: , format: "lil", dtype: float64-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyFloat64DType) -> _LILArray[np.float64]: ... + +# +@overload # blocks: , format: , dtype: complex128-like +def block_array(blocks: _ToBlocksCanStackAs[np.complex128, _T], format: None = None, *, dtype: onp.AnyComplex128DType) -> _T: ... +@overload # blocks: , format: "bsr", dtype: complex128-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyComplex128DType) -> _BSRArray[np.complex128]: ... +@overload # blocks: , format: "coo", dtype: complex128-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyComplex128DType) -> _COOArray2D[np.complex128]: ... +@overload # blocks: , format: "csc", dtype: complex128-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyComplex128DType) -> _CSCArray[np.complex128]: ... +@overload # blocks: , format: "csr", dtype: complex128-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyComplex128DType) -> _CSRArray2D[np.complex128]: ... +@overload # blocks: , format: "dia", dtype: complex128-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyComplex128DType) -> _DIAArray[np.complex128]: ... +@overload # blocks: , format: "dok", dtype: complex128-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyComplex128DType) -> _DOKArray2D[np.complex128]: ... +@overload # blocks: , format: "lil", dtype: complex128-like +def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyComplex128DType) -> _LILArray[np.complex128]: ... + +# +@overload # blocks: , format: , dtype: +def block_array(blocks: _ToBlocksCanStackAs[_SCT0, _T], format: None = None, *, dtype: onp.ToDType[_SCT0]) -> _T: ... +@overload # blocks: , format: "bsr", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.ToDType[_SCT0]) -> _BSRArray[_SCT0]: ... +@overload # blocks: , format: "coo", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.ToDType[_SCT0]) -> _COOArray2D[_SCT0]: ... +@overload # blocks: , format: "csc", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.ToDType[_SCT0]) -> _CSCArray[_SCT0]: ... +@overload # blocks: , format: "csr", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.ToDType[_SCT0]) -> _CSRArray2D[_SCT0]: ... +@overload # blocks: , format: "dia", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.ToDType[_SCT0]) -> _DIAArray[_SCT0]: ... +@overload # blocks: , format: "dok", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.ToDType[_SCT0]) -> _DOKArray2D[_SCT0]: ... +@overload # blocks: , format: "lil", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.ToDType[_SCT0]) -> _LILArray[_SCT0]: ... + +# +@overload # blocks: , format: , dtype: +def block_array(blocks: _ToBlocksCanStackAs[Any, _T], format: None = None, *, dtype: npt.DTypeLike) -> _T: ... +@overload # blocks: , format: "bsr", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: npt.DTypeLike) -> _BSRArray: ... +@overload # blocks: , format: "coo", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: npt.DTypeLike) -> _COOArray2D: ... +@overload # blocks: , format: "csc", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: npt.DTypeLike) -> _CSCArray: ... +@overload # blocks: , format: "csr", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: npt.DTypeLike) -> _CSRArray2D: ... +@overload # blocks: , format: "dia", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: npt.DTypeLike) -> _DIAArray: ... +@overload # blocks: , format: "dok", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: npt.DTypeLike) -> _DOKArray2D: ... +@overload # blocks: , format: "lil", dtype: +def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: npt.DTypeLike) -> _LILArray: ... ### -# TODO(jorenham): Use `_CanStack` here, which requires a way to map array types to matrix types. -@overload # blocks: , format: , dtype: -def bmat(blocks: Seq[Seq[sparray[_SCT]]], format: _FmtCOO | None = None, dtype: None = None) -> _COOArray2D[_SCT]: ... -@overload # blocks: , format: , dtype: -def bmat(blocks: Seq[Seq[sparray[_SCT]]], format: _FmtNonCOO, dtype: None = None) -> _SpArray2D[_SCT]: ... - -# -@overload # blocks: , format: , dtype: -def bmat(blocks: Seq[Seq[spmatrix[_SCT]]], format: _FmtCOO | None = None, dtype: None = None) -> coo_matrix[_SCT]: ... -@overload # blocks: , format: , dtype: -def bmat(blocks: Seq[Seq[spmatrix[_SCT]]], format: _FmtNonCOO, dtype: None = None) -> spmatrix[_SCT]: ... +@overload # blocks: , format: , dtype: +def bmat(blocks: _ToBlocksCanStack[_T], format: None = None, dtype: None = None) -> _T: ... +@overload # blocks: , format: , dtype: +def bmat(blocks:_ToBlocksSPMatrix[_SCT], format: _Format, dtype: None = None) -> _SpMatrix[_SCT]: ... # -@overload # blocks: , format: , dtype: -def bmat( - blocks: _ToBlocks, format: _FmtCOO | None = None, *, dtype: onp.ToDType[_SCT] -) -> _COOArray2D[_SCT] | coo_matrix[_SCT]: ... -@overload # blocks: , format: , dtype: -def bmat(blocks: _ToBlocks, format: _FmtNonCOO, dtype: onp.ToDType[_SCT]) -> _SpBase2D[_SCT]: ... +@overload # blocks: , format: , dtype: +def bmat(blocks: _ToBlocksCanStackAs[_SCT0, _T], format: None = None, *, dtype: onp.ToDType[_SCT0]) -> _T: ... +@overload # blocks: , format: , dtype: +def bmat(blocks: _ToBlocksSPMatrix[_SCT0], format: _Format, dtype: onp.ToDType[_SCT0]) -> _SpMatrix[_SCT0]: ... +@overload # blocks: , format: , dtype: +def bmat(blocks: _ToBlocksUnkown, format: _Format, dtype: onp.ToDType[_SCT0]) -> _SpMatrix[_SCT0] | _SpArray2D[_SCT0]: ... # -@overload # blocks: , format: , dtype: -def bmat( - blocks: _ToBlocks[_SCT], format: _FmtCOO | None = None, dtype: npt.DTypeLike | None = None -) -> _COOArray2D[_SCT] | coo_matrix[_SCT]: ... -@overload # blocks: , format: , dtype: -def bmat(blocks: _ToBlocks[_SCT], format: _FmtNonCOO, dtype: npt.DTypeLike) -> _SpBase2D[_SCT]: ... +@overload # blocks: , format: , dtype: +def bmat(blocks: _ToBlocksCanStackAs[Any, _T], format: None = None, *, dtype: npt.DTypeLike) -> _T: ... +@overload # blocks: , format: , dtype: +def bmat(blocks: _ToBlocksSPMatrix, format: _Format, *, dtype: npt.DTypeLike) -> _SpMatrix: ... +@overload # blocks: , format: , dtype: +def bmat(blocks: _ToBlocksUnkown, format: _Format, *, dtype: npt.DTypeLike) -> _SpMatrix | _SpArray2D: ... ### # TODO(jorenham): Add support for non-COO formats. diff --git a/tests/sparse/test_construct.pyi b/tests/sparse/test_construct.pyi index ccee466a..a79e972a 100644 --- a/tests/sparse/test_construct.pyi +++ b/tests/sparse/test_construct.pyi @@ -263,11 +263,24 @@ assert_type(sparse.hstack([csc_arr, csc_arr], format="lil", dtype=np.complex64), ### # block_array -assert_type(sparse.block_array([[any_mat]]), sparse.coo_array[ScalarType, tuple[int, int]]) -assert_type(sparse.block_array([[any_mat]], dtype=sctype), sparse.coo_array[ScalarType, tuple[int, int]]) -# bmat (legacy, `block_array` is preferred) -assert_type(sparse.bmat([[any_mat]]), sparse.coo_matrix[ScalarType]) -assert_type(sparse.bmat([[any_arr]]), sparse.coo_array[ScalarType, tuple[int, int]]) +assert_type(sparse.block_array([[bsr_mat]]), sparse.coo_matrix[ScalarType]) +assert_type(sparse.block_array([[bsr_arr]]), sparse.coo_array[ScalarType, tuple[int, int]]) +assert_type(sparse.block_array([[csr_arr, None], [None, dok_arr]], format="dia"), sparse.dia_array[ScalarType]) +assert_type(sparse.block_array([[coo_arr]], dtype=int), sparse.coo_array[np.int_, tuple[int, int]]) +assert_type(sparse.block_array([[csr_arr]], dtype=sctype), sparse.csr_array[ScalarType, tuple[int, int]]) +assert_type(sparse.block_array([[lil_arr]], dtype=np.complex64), sparse.coo_array[np.complex64, tuple[int, int]]) +assert_type(sparse.block_array([[csr_arr]], format="lil"), sparse.lil_array[ScalarType]) +assert_type(sparse.block_array([[coo_arr, None]], format="bsr", dtype="float"), sparse.bsr_array[np.float64]) +assert_type(sparse.block_array([[dia_arr], [None]], format="dok", dtype=complex), sparse.dok_array[np.complex128]) +# bmat (legacy, `block_array` is p`referred) +assert_type(sparse.bmat([[bsr_mat]]), sparse.coo_matrix[ScalarType]) +assert_type(sparse.bmat([[csr_mat], [None]]), sparse.csr_matrix[ScalarType]) +assert_type(sparse.bmat([[dia_mat]], dtype=np.int_), sparse.coo_matrix[np.int_]) +assert_type(sparse.bmat([[dok_mat], [None]], dtype=np.complex64), sparse.coo_matrix[np.complex64]) +assert_type(sparse.bmat([[bsr_arr]]), sparse.coo_array[ScalarType, tuple[int, int]]) +assert_type(sparse.bmat([[csr_arr], [None]]), sparse.csr_array[ScalarType, tuple[int, int]]) +assert_type(sparse.bmat([[dia_arr]], dtype=np.int_), sparse.coo_array[np.int_, tuple[int, int]]) +assert_type(sparse.bmat([[dok_arr], [None]], dtype=np.complex64), sparse.coo_array[np.complex64, tuple[int, int]]) # block_diag assert_type(sparse.block_diag([any_mat, any_mat]), sparse.coo_matrix[ScalarType]) From e1f85fcb082150cd9895d00aa29f961806b65483 Mon Sep 17 00:00:00 2001 From: juvdnbro Date: Tue, 29 Jul 2025 16:17:24 +0200 Subject: [PATCH 02/15] Better comments --- scipy-stubs/sparse/_construct.pyi | 126 +++++++++++++++--------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/scipy-stubs/sparse/_construct.pyi b/scipy-stubs/sparse/_construct.pyi index 065d530b..782b5ec2 100644 --- a/scipy-stubs/sparse/_construct.pyi +++ b/scipy-stubs/sparse/_construct.pyi @@ -1641,151 +1641,151 @@ def vstack(blocks: Seq[sparray], format: _FmtLIL, dtype: npt.DTypeLike) -> _LILA def vstack(blocks: Seq[_spbase], format: _Format, dtype: npt.DTypeLike | None = None) -> Incomplete: ... ### -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def block_array(blocks: _ToBlocksCanStack[_T], format: None = None, dtype: None = None) -> _T: ... -@overload # blocks: , format: "bsr", dtype: +@overload # blocks: , format: "bsr", dtype: def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... -@overload # blocks: , format: "coo", dtype: +@overload # blocks: , format: "coo", dtype: def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT]: ... -@overload # blocks: , format: "csc", dtype: +@overload # blocks: , format: "csc", dtype: def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... -@overload # blocks: , format: "csr", dtype: +@overload # blocks: , format: "csr", dtype: def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... -@overload # blocks: , format: "dia", dtype: +@overload # blocks: , format: "dia", dtype: def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... -@overload # blocks: , format: "dok", dtype: +@overload # blocks: , format: "dok", dtype: def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... -@overload # blocks: , format: "lil", dtype: +@overload # blocks: , format: "lil", dtype: def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... # -@overload # blocks: , format: , dtype: bool-like +@overload # blocks: , format: , dtype: bool-like def block_array(blocks: _ToBlocksCanStackAs[np.bool_, _T], format: None = None, *, dtype: onp.AnyBoolDType) -> _T: ... -@overload # blocks: , format: "bsr", dtype: bool-like +@overload # blocks: , format: "bsr", dtype: bool-like def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyBoolDType) -> _BSRArray[np.bool_]: ... -@overload # blocks: , format: "coo", dtype: bool-like +@overload # blocks: , format: "coo", dtype: bool-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyBoolDType) -> _COOArray2D[np.bool_]: ... -@overload # blocks: , format: "csc", dtype: bool-like +@overload # blocks: , format: "csc", dtype: bool-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyBoolDType) -> _CSCArray[np.bool_]: ... -@overload # blocks: , format: "csr", dtype: bool-like +@overload # blocks: , format: "csr", dtype: bool-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyBoolDType) -> _CSRArray2D[np.bool_]: ... -@overload # blocks: , format: "dia", dtype: bool-like +@overload # blocks: , format: "dia", dtype: bool-like def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyBoolDType) -> _DIAArray[np.bool_]: ... -@overload # blocks: , format: "dok", dtype: bool-like +@overload # blocks: , format: "dok", dtype: bool-like def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyBoolDType) -> _DOKArray2D[np.bool_]: ... -@overload # blocks: , format: "lil", dtype: bool-like +@overload # blocks: , format: "lil", dtype: bool-like def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyBoolDType) -> _LILArray[np.bool_]: ... # -@overload # blocks: , format: , dtype: int-like +@overload # blocks: , format: , dtype: int-like def block_array(blocks: _ToBlocksCanStackAs[np.int_, _T], format: None = None, *, dtype: onp.AnyIntDType) -> _T: ... -@overload # blocks: , format: "bsr", dtype: int-like +@overload # blocks: , format: "bsr", dtype: int-like def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyIntDType) -> _BSRArray[np.int_]: ... -@overload # blocks: , format: "coo", dtype: int-like +@overload # blocks: , format: "coo", dtype: int-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyIntDType) -> _COOArray2D[np.int_]: ... -@overload # blocks: , format: "csc", dtype: int-like +@overload # blocks: , format: "csc", dtype: int-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyIntDType) -> _CSCArray[np.int_]: ... -@overload # blocks: , format: "csr", dtype: int-like +@overload # blocks: , format: "csr", dtype: int-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyIntDType) -> _CSRArray2D[np.int_]: ... -@overload # blocks: , format: "dia", dtype: int-like +@overload # blocks: , format: "dia", dtype: int-like def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyIntDType) -> _DIAArray[np.int_]: ... -@overload # blocks: , format: "dok", dtype: int-like +@overload # blocks: , format: "dok", dtype: int-like def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyIntDType) -> _DOKArray2D[np.int_]: ... -@overload # blocks: , format: "lil", dtype: int-like +@overload # blocks: , format: "lil", dtype: int-like def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyIntDType) -> _LILArray[np.int_]: ... # -@overload # blocks: , format: , dtype: float64-like +@overload # blocks: , format: , dtype: float64-like def block_array(blocks: _ToBlocksCanStackAs[np.float64, _T], format: None = None, *, dtype: onp.AnyFloat64DType) -> _T: ... -@overload # blocks: , format: "bsr", dtype: float64-like +@overload # blocks: , format: "bsr", dtype: float64-like def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyFloat64DType) -> _BSRArray[np.float64]: ... -@overload # blocks: , format: "coo", dtype: float64-like +@overload # blocks: , format: "coo", dtype: float64-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyFloat64DType) -> _COOArray2D[np.float64]: ... -@overload # blocks: , format: "csc", dtype: float64-like +@overload # blocks: , format: "csc", dtype: float64-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyFloat64DType) -> _CSCArray[np.float64]: ... -@overload # blocks: , format: "csr", dtype: float64-like +@overload # blocks: , format: "csr", dtype: float64-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyFloat64DType) -> _CSRArray2D[np.float64]: ... -@overload # blocks: , format: "dia", dtype: float64-like +@overload # blocks: , format: "dia", dtype: float64-like def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyFloat64DType) -> _DIAArray[np.float64]: ... -@overload # blocks: , format: "dok", dtype: float64-like +@overload # blocks: , format: "dok", dtype: float64-like def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyFloat64DType) -> _DOKArray2D[np.float64]: ... -@overload # blocks: , format: "lil", dtype: float64-like +@overload # blocks: , format: "lil", dtype: float64-like def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyFloat64DType) -> _LILArray[np.float64]: ... # -@overload # blocks: , format: , dtype: complex128-like +@overload # blocks: , format: , dtype: complex128-like def block_array(blocks: _ToBlocksCanStackAs[np.complex128, _T], format: None = None, *, dtype: onp.AnyComplex128DType) -> _T: ... -@overload # blocks: , format: "bsr", dtype: complex128-like +@overload # blocks: , format: "bsr", dtype: complex128-like def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyComplex128DType) -> _BSRArray[np.complex128]: ... -@overload # blocks: , format: "coo", dtype: complex128-like +@overload # blocks: , format: "coo", dtype: complex128-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyComplex128DType) -> _COOArray2D[np.complex128]: ... -@overload # blocks: , format: "csc", dtype: complex128-like +@overload # blocks: , format: "csc", dtype: complex128-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyComplex128DType) -> _CSCArray[np.complex128]: ... -@overload # blocks: , format: "csr", dtype: complex128-like +@overload # blocks: , format: "csr", dtype: complex128-like def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyComplex128DType) -> _CSRArray2D[np.complex128]: ... -@overload # blocks: , format: "dia", dtype: complex128-like +@overload # blocks: , format: "dia", dtype: complex128-like def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyComplex128DType) -> _DIAArray[np.complex128]: ... -@overload # blocks: , format: "dok", dtype: complex128-like +@overload # blocks: , format: "dok", dtype: complex128-like def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyComplex128DType) -> _DOKArray2D[np.complex128]: ... -@overload # blocks: , format: "lil", dtype: complex128-like +@overload # blocks: , format: "lil", dtype: complex128-like def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyComplex128DType) -> _LILArray[np.complex128]: ... # -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def block_array(blocks: _ToBlocksCanStackAs[_SCT0, _T], format: None = None, *, dtype: onp.ToDType[_SCT0]) -> _T: ... -@overload # blocks: , format: "bsr", dtype: +@overload # blocks: , format: "bsr", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.ToDType[_SCT0]) -> _BSRArray[_SCT0]: ... -@overload # blocks: , format: "coo", dtype: +@overload # blocks: , format: "coo", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.ToDType[_SCT0]) -> _COOArray2D[_SCT0]: ... -@overload # blocks: , format: "csc", dtype: +@overload # blocks: , format: "csc", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.ToDType[_SCT0]) -> _CSCArray[_SCT0]: ... -@overload # blocks: , format: "csr", dtype: +@overload # blocks: , format: "csr", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.ToDType[_SCT0]) -> _CSRArray2D[_SCT0]: ... -@overload # blocks: , format: "dia", dtype: +@overload # blocks: , format: "dia", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.ToDType[_SCT0]) -> _DIAArray[_SCT0]: ... @overload # blocks: , format: "dok", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.ToDType[_SCT0]) -> _DOKArray2D[_SCT0]: ... -@overload # blocks: , format: "lil", dtype: +@overload # blocks: , format: "lil", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.ToDType[_SCT0]) -> _LILArray[_SCT0]: ... # -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def block_array(blocks: _ToBlocksCanStackAs[Any, _T], format: None = None, *, dtype: npt.DTypeLike) -> _T: ... -@overload # blocks: , format: "bsr", dtype: +@overload # blocks: , format: "bsr", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: npt.DTypeLike) -> _BSRArray: ... -@overload # blocks: , format: "coo", dtype: +@overload # blocks: , format: "coo", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: npt.DTypeLike) -> _COOArray2D: ... -@overload # blocks: , format: "csc", dtype: +@overload # blocks: , format: "csc", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: npt.DTypeLike) -> _CSCArray: ... -@overload # blocks: , format: "csr", dtype: +@overload # blocks: , format: "csr", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: npt.DTypeLike) -> _CSRArray2D: ... -@overload # blocks: , format: "dia", dtype: +@overload # blocks: , format: "dia", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: npt.DTypeLike) -> _DIAArray: ... -@overload # blocks: , format: "dok", dtype: +@overload # blocks: , format: "dok", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: npt.DTypeLike) -> _DOKArray2D: ... -@overload # blocks: , format: "lil", dtype: +@overload # blocks: , format: "lil", dtype: def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: npt.DTypeLike) -> _LILArray: ... ### -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksCanStack[_T], format: None = None, dtype: None = None) -> _T: ... -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def bmat(blocks:_ToBlocksSPMatrix[_SCT], format: _Format, dtype: None = None) -> _SpMatrix[_SCT]: ... # -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksCanStackAs[_SCT0, _T], format: None = None, *, dtype: onp.ToDType[_SCT0]) -> _T: ... -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksSPMatrix[_SCT0], format: _Format, dtype: onp.ToDType[_SCT0]) -> _SpMatrix[_SCT0]: ... -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksUnkown, format: _Format, dtype: onp.ToDType[_SCT0]) -> _SpMatrix[_SCT0] | _SpArray2D[_SCT0]: ... # -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksCanStackAs[Any, _T], format: None = None, *, dtype: npt.DTypeLike) -> _T: ... -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksSPMatrix, format: _Format, *, dtype: npt.DTypeLike) -> _SpMatrix: ... -@overload # blocks: , format: , dtype: +@overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksUnkown, format: _Format, *, dtype: npt.DTypeLike) -> _SpMatrix | _SpArray2D: ... ### From be391cff30cf17cf1f3f1fcef352d33fcf5e53d9 Mon Sep 17 00:00:00 2001 From: juvdnbro Date: Tue, 29 Jul 2025 17:20:13 +0200 Subject: [PATCH 03/15] Improved stubs for `block_diag` --- scipy-stubs/sparse/_construct.pyi | 236 ++++++++++++++++++++++++------ tests/sparse/test_construct.pyi | 15 +- 2 files changed, 208 insertions(+), 43 deletions(-) diff --git a/scipy-stubs/sparse/_construct.pyi b/scipy-stubs/sparse/_construct.pyi index 782b5ec2..7035017f 100644 --- a/scipy-stubs/sparse/_construct.pyi +++ b/scipy-stubs/sparse/_construct.pyi @@ -1750,27 +1750,27 @@ def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.ToDType[_SC # @overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocksCanStackAs[Any, _T], format: None = None, *, dtype: npt.DTypeLike) -> _T: ... +def block_array(blocks: _ToBlocksCanStackAs[Any, _T], format: None = None, *, dtype: npt.DTypeLike | None = None) -> _T: ... @overload # blocks: , format: "bsr", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: npt.DTypeLike) -> _BSRArray: ... +def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: npt.DTypeLike | None = None) -> _BSRArray: ... @overload # blocks: , format: "coo", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: npt.DTypeLike) -> _COOArray2D: ... +def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: npt.DTypeLike | None = None) -> _COOArray2D: ... @overload # blocks: , format: "csc", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: npt.DTypeLike) -> _CSCArray: ... +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: npt.DTypeLike | None = None) -> _CSCArray: ... @overload # blocks: , format: "csr", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: npt.DTypeLike) -> _CSRArray2D: ... +def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: npt.DTypeLike | None = None) -> _CSRArray2D: ... @overload # blocks: , format: "dia", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: npt.DTypeLike) -> _DIAArray: ... +def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: npt.DTypeLike | None = None) -> _DIAArray: ... @overload # blocks: , format: "dok", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: npt.DTypeLike) -> _DOKArray2D: ... +def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: npt.DTypeLike | None = None) -> _DOKArray2D: ... @overload # blocks: , format: "lil", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: npt.DTypeLike) -> _LILArray: ... +def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: npt.DTypeLike | None = None) -> _LILArray: ... ### @overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksCanStack[_T], format: None = None, dtype: None = None) -> _T: ... @overload # blocks: , format: , dtype: -def bmat(blocks:_ToBlocksSPMatrix[_SCT], format: _Format, dtype: None = None) -> _SpMatrix[_SCT]: ... +def bmat(blocks: _ToBlocksSPMatrix[_SCT], format: _Format, dtype: None = None) -> _SpMatrix[_SCT]: ... # @overload # blocks: , format: , dtype: @@ -1789,55 +1789,179 @@ def bmat(blocks: _ToBlocksSPMatrix, format: _Format, *, dtype: npt.DTypeLike) -> def bmat(blocks: _ToBlocksUnkown, format: _Format, *, dtype: npt.DTypeLike) -> _SpMatrix | _SpArray2D: ... ### -# TODO(jorenham): Add support for non-COO formats. @overload # mats: , format: , dtype: None def block_diag(mats: Iterable[sparray[_SCT]], format: _FmtCOO | None = None, dtype: None = None) -> _COOArray2D[_SCT]: ... - -# -@overload # mats: , format: , dtype: None -def block_diag(mats: Iterable[spmatrix[_SCT]], format: _FmtCOO | None = None, dtype: None = None) -> coo_matrix[_SCT]: ... +@overload # mats: , format: "bsr", dtype: None +def block_diag(mats: Iterable[sparray[_SCT]], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... +@overload # mats: , format: "csc", dtype: None +def block_diag(mats: Iterable[sparray[_SCT]], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... +@overload # mats: , format: "csr", dtype: None +def block_diag(mats: Iterable[sparray[_SCT]], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... +@overload # mats: , format: "dia", dtype: None +def block_diag(mats: Iterable[sparray[_SCT]], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... +@overload # mats: , format: "dok", dtype: None +def block_diag(mats: Iterable[sparray[_SCT]], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... +@overload # mats: , format: "lil", dtype: None +def block_diag(mats: Iterable[sparray[_SCT]], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... + +# +@overload # mats: , format: , dtype: bool-like +def block_diag(mats: Iterable[sparray], format: _FmtCOO | None = None, *, dtype: onp.AnyBoolDType) -> _COOArray2D[np.bool_]: ... +@overload # mats: , format: "bsr", dtype: bool-like +def block_diag(mats: Iterable[sparray], format: _FmtBSR, dtype: onp.AnyBoolDType) -> _BSRArray[np.bool_]: ... +@overload # mats: , format: "csc", dtype: bool-like +def block_diag(mats: Iterable[sparray], format: _FmtCSC, dtype: onp.AnyBoolDType) -> _CSCArray[np.bool_]: ... +@overload # mats: , format: "csr", dtype: bool-like +def block_diag(mats: Iterable[sparray], format: _FmtCSR, dtype: onp.AnyBoolDType) -> _CSRArray2D[np.bool_]: ... +@overload # mats: , format: "dia", dtype: bool-like +def block_diag(mats: Iterable[sparray], format: _FmtDIA, dtype: onp.AnyBoolDType) -> _DIAArray[np.bool_]: ... +@overload # mats: , format: "dok", dtype: bool-like +def block_diag(mats: Iterable[sparray], format: _FmtDOK, dtype: onp.AnyBoolDType) -> _DOKArray2D[np.bool_]: ... +@overload # mats: , format: "lil", dtype: bool-like +def block_diag(mats: Iterable[sparray], format: _FmtLIL, dtype: onp.AnyBoolDType) -> _LILArray[np.bool_]: ... + +# +@overload # mats: , format: , dtype: int-like +def block_diag(mats: Iterable[sparray], format: _FmtCOO | None = None, *, dtype: onp.AnyIntDType) -> _COOArray2D[np.int_]: ... +@overload # mats: , format: "bsr", dtype: int-like +def block_diag(mats: Iterable[sparray], format: _FmtBSR, dtype: onp.AnyIntDType) -> _BSRArray[np.int_]: ... +@overload # mats: , format: "csc", dtype: int-like +def block_diag(mats: Iterable[sparray], format: _FmtCSC, dtype: onp.AnyIntDType) -> _CSCArray[np.int_]: ... +@overload # mats: , format: "csr", dtype: int-like +def block_diag(mats: Iterable[sparray], format: _FmtCSR, dtype: onp.AnyIntDType) -> _CSRArray2D[np.int_]: ... +@overload # mats: , format: "dia", dtype: int-like +def block_diag(mats: Iterable[sparray], format: _FmtDIA, dtype: onp.AnyIntDType) -> _DIAArray[np.int_]: ... +@overload # mats: , format: "dok", dtype: int-like +def block_diag(mats: Iterable[sparray], format: _FmtDOK, dtype: onp.AnyIntDType) -> _DOKArray2D[np.int_]: ... +@overload # mats: , format: "lil", dtype: int-like +def block_diag(mats: Iterable[sparray], format: _FmtLIL, dtype: onp.AnyIntDType) -> _LILArray[np.int_]: ... + +# +@overload # mats: , format: , dtype: float64-like +def block_diag( + mats: Iterable[sparray], format: _FmtCOO | None = None, *, dtype: onp.AnyFloat64DType +) -> _COOArray2D[np.float64]: ... +@overload # mats: , format: "bsr", dtype: float64-like +def block_diag(mats: Iterable[sparray], format: _FmtBSR, dtype: onp.AnyFloat64DType) -> _BSRArray[np.float64]: ... +@overload # mats: , format: "csc", dtype: float64-like +def block_diag(mats: Iterable[sparray], format: _FmtCSC, dtype: onp.AnyFloat64DType) -> _CSCArray[np.float64]: ... +@overload # mats: , format: "csr", dtype: float64-like +def block_diag(mats: Iterable[sparray], format: _FmtCSR, dtype: onp.AnyFloat64DType) -> _CSRArray2D[np.float64]: ... +@overload # mats: , format: "dia", dtype: float64-like +def block_diag(mats: Iterable[sparray], format: _FmtDIA, dtype: onp.AnyFloat64DType) -> _DIAArray[np.float64]: ... +@overload # mats: , format: "dok", dtype: float64-like +def block_diag(mats: Iterable[sparray], format: _FmtDOK, dtype: onp.AnyFloat64DType) -> _DOKArray2D[np.float64]: ... +@overload # mats: , format: "lil", dtype: float64-like +def block_diag(mats: Iterable[sparray], format: _FmtLIL, dtype: onp.AnyFloat64DType) -> _LILArray[np.float64]: ... + +# +@overload # mats: , format: , dtype: complex128-like +def block_diag( + mats: Iterable[sparray], format: _FmtCOO | None = None, *, dtype: onp.AnyComplex128DType +) -> _COOArray2D[np.complex128]: ... +@overload # mats: , format: "bsr", dtype: complex128-like +def block_diag(mats: Iterable[sparray], format: _FmtBSR, dtype: onp.AnyComplex128DType) -> _BSRArray[np.complex128]: ... +@overload # mats: , format: "csc", dtype: complex128-like +def block_diag(mats: Iterable[sparray], format: _FmtCSC, dtype: onp.AnyComplex128DType) -> _CSCArray[np.complex128]: ... +@overload # mats: , format: "csr", dtype: complex128-like +def block_diag(mats: Iterable[sparray], format: _FmtCSR, dtype: onp.AnyComplex128DType) -> _CSRArray2D[np.complex128]: ... +@overload # mats: , format: "dia", dtype: complex128-like +def block_diag(mats: Iterable[sparray], format: _FmtDIA, dtype: onp.AnyComplex128DType) -> _DIAArray[np.complex128]: ... +@overload # mats: , format: "dok", dtype: complex128-like +def block_diag(mats: Iterable[sparray], format: _FmtDOK, dtype: onp.AnyComplex128DType) -> _DOKArray2D[np.complex128]: ... +@overload # mats: , format: "lil", dtype: complex128-like +def block_diag(mats: Iterable[sparray], format: _FmtLIL, dtype: onp.AnyComplex128DType) -> _LILArray[np.complex128]: ... + +# +@overload # mats: , format: , dtype: +def block_diag(mats: Iterable[sparray], format: _FmtCOO | None = None, *, dtype: onp.ToDType[_SCT]) -> _COOArray2D[_SCT]: ... +@overload # mats: , format: "bsr", dtype: +def block_diag(mats: Iterable[sparray], format: _FmtBSR, dtype: onp.ToDType[_SCT]) -> _BSRArray[_SCT]: ... +@overload # mats: , format: "csc", dtype: +def block_diag(mats: Iterable[sparray], format: _FmtCSC, dtype: onp.ToDType[_SCT]) -> _CSCArray[_SCT]: ... +@overload # mats: , format: "csr", dtype: +def block_diag(mats: Iterable[sparray], format: _FmtCSR, dtype: onp.ToDType[_SCT]) -> _CSRArray2D[_SCT]: ... +@overload # mats: , format: "dia", dtype: +def block_diag(mats: Iterable[sparray], format: _FmtDIA, dtype: onp.ToDType[_SCT]) -> _DIAArray[_SCT]: ... +@overload # mats: , format: "dok", dtype: +def block_diag(mats: Iterable[sparray], format: _FmtDOK, dtype: onp.ToDType[_SCT]) -> _DOKArray2D[_SCT]: ... +@overload # mats: , format: "lil", dtype: +def block_diag(mats: Iterable[sparray], format: _FmtLIL, dtype: onp.ToDType[_SCT]) -> _LILArray[_SCT]: ... # @overload # mats: , format: , dtype: None def block_diag( - mats: Iterable[_spbase[_SCT] | onp.ArrayND[_SCT]], format: _FmtCOO | None = None, dtype: None = None + mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtCOO | None = None, dtype: None = None ) -> _COOArray2D[_SCT] | coo_matrix[_SCT]: ... +@overload # mats: , format: "bsr", dtype: None +def block_diag( + mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtBSR, dtype: None = None +) -> _BSRArray[_SCT] | bsr_matrix[_SCT]: ... +@overload # mats: , format: "csc", dtype: None +def block_diag( + mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtCSC, dtype: None = None +) -> _CSCArray[_SCT] | csc_matrix[_SCT]: ... +@overload # mats: , format: "csr", dtype: None +def block_diag( + mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtCSR, dtype: None = None +) -> _CSRArray2D[_SCT] | csr_matrix[_SCT]: ... +@overload # mats: , format: "dia", dtype: None +def block_diag( + mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtDIA, dtype: None = None +) -> _DIAArray[_SCT] | dia_matrix[_SCT]: ... +@overload # mats: , format: "dok", dtype: None +def block_diag( + mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtDOK, dtype: None = None +) -> _DOKArray2D[_SCT] | dok_matrix[_SCT]: ... +@overload # mats: , format: "lil", dtype: None +def block_diag( + mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtLIL, dtype: None = None +) -> _LILArray[_SCT] | lil_matrix[_SCT]: ... # -@overload # mats: , format: , dtype: (keyword) -def block_diag(mats: Iterable[sparray], format: _FmtCOO | None = None, *, dtype: onp.ToDType[_SCT]) -> _COOArray2D[_SCT]: ... -@overload # mats: , format: , dtype: (positional) -def block_diag(mats: Iterable[sparray], format: _FmtCOO | None, dtype: onp.ToDType[_SCT]) -> _COOArray2D[_SCT]: ... - -# -@overload # mats: , format: , dtype: (keyword) +@overload # mats: , format: , dtype: def block_diag( - mats: Iterable[spmatrix | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], + mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], format: _FmtCOO | None = None, *, dtype: onp.ToDType[_SCT], -) -> coo_matrix[_SCT]: ... -@overload # mats: , format: , dtype: (positional) +) -> _COOArray2D[_SCT] | coo_matrix[_SCT]: ... +@overload # mats: , format: "bsr", dtype: def block_diag( - mats: Iterable[spmatrix | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtCOO | None, + mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], + format: _FmtBSR, dtype: onp.ToDType[_SCT], -) -> coo_matrix[_SCT]: ... - -# -@overload # mats: , format: , dtype: (keyword) +) -> _BSRArray[_SCT] | bsr_matrix[_SCT]: ... +@overload # mats: , format: "csc", dtype: def block_diag( mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtCOO | None = None, - *, + format: _FmtCSC, dtype: onp.ToDType[_SCT], -) -> _COOArray2D[_SCT] | coo_matrix[_SCT]: ... -@overload # mats: , format: , dtype: (positional) +) -> _CSCArray[_SCT] | csc_matrix[_SCT]: ... +@overload # mats: , format: "csr", dtype: def block_diag( mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtCOO | None, + format: _FmtCSR, dtype: onp.ToDType[_SCT], -) -> _COOArray2D[_SCT] | coo_matrix[_SCT]: ... +) -> _CSRArray2D[_SCT] | csr_matrix[_SCT]: ... +@overload # mats: , format: "dia", dtype: +def block_diag( + mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], + format: _FmtDIA, + dtype: onp.ToDType[_SCT], +) -> _DIAArray[_SCT] | dia_matrix[_SCT]: ... +@overload # mats: , format: "dok", dtype: +def block_diag( + mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], + format: _FmtDOK, + dtype: onp.ToDType[_SCT], +) -> _DOKArray2D[_SCT] | dok_matrix[_SCT]: ... +@overload # mats: , format: "lil", dtype: +def block_diag( + mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], + format: _FmtLIL, + dtype: onp.ToDType[_SCT], +) -> _LILArray[_SCT] | lil_matrix[_SCT]: ... # @overload # mats: , format: , dtype: @@ -1845,13 +1969,43 @@ def block_diag( mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], format: _FmtCOO | None = None, dtype: npt.DTypeLike | None = None, -) -> _COOArray2D[_SCT] | coo_matrix[Any]: ... -@overload # mats: , format: , dtype: +) -> _COOArray2D | coo_matrix: ... +@overload # mats: , format: "bsr", dtype: +def block_diag( + mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], + format: _FmtBSR, + dtype: npt.DTypeLike | None = None, +) -> _BSRArray | bsr_matrix: ... +@overload # mats: , format: "csc", dtype: +def block_diag( + mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], + format: _FmtCSC, + dtype: npt.DTypeLike | None = None, +) -> _CSCArray | csc_matrix: ... +@overload # mats: , format: "csr", dtype: +def block_diag( + mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], + format: _FmtCSR, + dtype: npt.DTypeLike | None = None, +) -> _CSRArray2D | csr_matrix: ... +@overload # mats: , format: "dia", dtype: def block_diag( mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtNonCOO | None = None, + format: _FmtDIA, + dtype: npt.DTypeLike | None = None, +) -> _DIAArray | dia_matrix: ... +@overload # mats: , format: "dok", dtype: +def block_diag( + mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], + format: _FmtDOK, + dtype: npt.DTypeLike | None = None, +) -> _DOKArray2D | dok_matrix: ... +@overload # mats: , format: "lil", dtype: +def block_diag( + mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], + format: _FmtLIL, dtype: npt.DTypeLike | None = None, -) -> Incomplete: ... +) -> _LILArray | lil_matrix: ... ### @overload # shape: T, format: , dtype: diff --git a/tests/sparse/test_construct.pyi b/tests/sparse/test_construct.pyi index a79e972a..a16fc100 100644 --- a/tests/sparse/test_construct.pyi +++ b/tests/sparse/test_construct.pyi @@ -283,9 +283,20 @@ assert_type(sparse.bmat([[dia_arr]], dtype=np.int_), sparse.coo_array[np.int_, t assert_type(sparse.bmat([[dok_arr], [None]], dtype=np.complex64), sparse.coo_array[np.complex64, tuple[int, int]]) # block_diag -assert_type(sparse.block_diag([any_mat, any_mat]), sparse.coo_matrix[ScalarType]) assert_type(sparse.block_diag([any_arr, any_arr]), sparse.coo_array[ScalarType, tuple[int, int]]) -assert_type(sparse.block_diag([any_arr, any_mat]), sparse.coo_array[ScalarType, tuple[int, int]] | sparse.coo_matrix[ScalarType]) +assert_type(sparse.block_diag([any_arr, any_mat]), sparse.coo_matrix[ScalarType] | sparse.coo_array[ScalarType, tuple[int, int]]) +assert_type(sparse.block_diag([any_arr, any_arr], dtype="bool"), sparse.coo_array[np.bool_, tuple[int, int]]) +assert_type(sparse.block_diag([any_arr, any_arr], dtype=int), sparse.coo_array[np.int_, tuple[int, int]]) +assert_type( + sparse.block_diag([any_arr, any_mat], dtype=np.complex64), + sparse.coo_matrix[np.complex64] | sparse.coo_array[np.complex64, tuple[int, int]], +) +assert_type(sparse.block_diag([any_arr, any_arr], format="bsr"), sparse.bsr_array[ScalarType]) +assert_type(sparse.block_diag([any_arr, any_arr], format="csc", dtype=float), sparse.csc_array[np.float64]) +assert_type(sparse.block_diag([any_arr, any_arr], format="csr", dtype=complex), sparse.csr_array[np.complex128, tuple[int, int]]) +assert_type(sparse.block_diag([any_arr, any_arr], format="dia", dtype=np.int32), sparse.dia_array[np.int32]) +assert_type(sparse.block_diag([any_arr, any_arr], format="dok", dtype="bool"), sparse.dok_array[np.bool_, tuple[int, int]]) +assert_type(sparse.block_diag([any_arr, any_arr], format="lil", dtype=np.complex64), sparse.lil_array[np.complex64]) ### # random_array From 5ef27ec308220a391ddbc62e123d473a83718318 Mon Sep 17 00:00:00 2001 From: juvdnbro Date: Wed, 30 Jul 2025 11:59:59 +0200 Subject: [PATCH 04/15] Removed test cases that cause problems with `mypy` --- tests/sparse/test_construct.pyi | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/sparse/test_construct.pyi b/tests/sparse/test_construct.pyi index a16fc100..b33bb673 100644 --- a/tests/sparse/test_construct.pyi +++ b/tests/sparse/test_construct.pyi @@ -265,22 +265,21 @@ assert_type(sparse.hstack([csc_arr, csc_arr], format="lil", dtype=np.complex64), # block_array assert_type(sparse.block_array([[bsr_mat]]), sparse.coo_matrix[ScalarType]) assert_type(sparse.block_array([[bsr_arr]]), sparse.coo_array[ScalarType, tuple[int, int]]) -assert_type(sparse.block_array([[csr_arr, None], [None, dok_arr]], format="dia"), sparse.dia_array[ScalarType]) assert_type(sparse.block_array([[coo_arr]], dtype=int), sparse.coo_array[np.int_, tuple[int, int]]) assert_type(sparse.block_array([[csr_arr]], dtype=sctype), sparse.csr_array[ScalarType, tuple[int, int]]) assert_type(sparse.block_array([[lil_arr]], dtype=np.complex64), sparse.coo_array[np.complex64, tuple[int, int]]) assert_type(sparse.block_array([[csr_arr]], format="lil"), sparse.lil_array[ScalarType]) -assert_type(sparse.block_array([[coo_arr, None]], format="bsr", dtype="float"), sparse.bsr_array[np.float64]) -assert_type(sparse.block_array([[dia_arr], [None]], format="dok", dtype=complex), sparse.dok_array[np.complex128]) +assert_type(sparse.block_array([[coo_arr]], format="bsr", dtype="float"), sparse.bsr_array[np.float64]) +assert_type(sparse.block_array([[dia_arr]], format="dok", dtype=complex), sparse.dok_array[np.complex128]) # bmat (legacy, `block_array` is p`referred) assert_type(sparse.bmat([[bsr_mat]]), sparse.coo_matrix[ScalarType]) -assert_type(sparse.bmat([[csr_mat], [None]]), sparse.csr_matrix[ScalarType]) +assert_type(sparse.bmat([[csr_mat]]), sparse.csr_matrix[ScalarType]) assert_type(sparse.bmat([[dia_mat]], dtype=np.int_), sparse.coo_matrix[np.int_]) -assert_type(sparse.bmat([[dok_mat], [None]], dtype=np.complex64), sparse.coo_matrix[np.complex64]) +assert_type(sparse.bmat([[dok_mat]], dtype=np.complex64), sparse.coo_matrix[np.complex64]) assert_type(sparse.bmat([[bsr_arr]]), sparse.coo_array[ScalarType, tuple[int, int]]) -assert_type(sparse.bmat([[csr_arr], [None]]), sparse.csr_array[ScalarType, tuple[int, int]]) +assert_type(sparse.bmat([[csr_arr]]), sparse.csr_array[ScalarType, tuple[int, int]]) assert_type(sparse.bmat([[dia_arr]], dtype=np.int_), sparse.coo_array[np.int_, tuple[int, int]]) -assert_type(sparse.bmat([[dok_arr], [None]], dtype=np.complex64), sparse.coo_array[np.complex64, tuple[int, int]]) +assert_type(sparse.bmat([[dok_arr]], dtype=np.complex64), sparse.coo_array[np.complex64, tuple[int, int]]) # block_diag assert_type(sparse.block_diag([any_arr, any_arr]), sparse.coo_array[ScalarType, tuple[int, int]]) From 43bf8f52c1dcc814b582e80095783afc7bc5bb03 Mon Sep 17 00:00:00 2001 From: juvdnbro Date: Wed, 30 Jul 2025 12:34:23 +0200 Subject: [PATCH 05/15] Fixed missing `*`s in overloads for `block_diag` --- scipy-stubs/sparse/_construct.pyi | 112 +++++++++++++++--------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/scipy-stubs/sparse/_construct.pyi b/scipy-stubs/sparse/_construct.pyi index 7035017f..8321bbd0 100644 --- a/scipy-stubs/sparse/_construct.pyi +++ b/scipy-stubs/sparse/_construct.pyi @@ -1642,129 +1642,129 @@ def vstack(blocks: Seq[_spbase], format: _Format, dtype: npt.DTypeLike | None = ### @overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocksCanStack[_T], format: None = None, dtype: None = None) -> _T: ... +def block_array(blocks: _ToBlocksCanStack[_T], *, format: None = None, dtype: None = None) -> _T: ... @overload # blocks: , format: "bsr", dtype: -def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... +def block_array(blocks: _ToBlocksSPArray[_SCT], *, format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... @overload # blocks: , format: "coo", dtype: -def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT]: ... +def block_array(blocks: _ToBlocksSPArray[_SCT], *, format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT]: ... @overload # blocks: , format: "csc", dtype: -def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... +def block_array(blocks: _ToBlocksSPArray[_SCT], *, format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... @overload # blocks: , format: "csr", dtype: -def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... +def block_array(blocks: _ToBlocksSPArray[_SCT], *, format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... @overload # blocks: , format: "dia", dtype: -def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... +def block_array(blocks: _ToBlocksSPArray[_SCT], *, format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... @overload # blocks: , format: "dok", dtype: -def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... +def block_array(blocks: _ToBlocksSPArray[_SCT], *, format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... @overload # blocks: , format: "lil", dtype: -def block_array(blocks: _ToBlocksSPArray[_SCT], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... +def block_array(blocks: _ToBlocksSPArray[_SCT], *, format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... # @overload # blocks: , format: , dtype: bool-like -def block_array(blocks: _ToBlocksCanStackAs[np.bool_, _T], format: None = None, *, dtype: onp.AnyBoolDType) -> _T: ... +def block_array(blocks: _ToBlocksCanStackAs[np.bool_, _T], *, format: None = None, dtype: onp.AnyBoolDType) -> _T: ... @overload # blocks: , format: "bsr", dtype: bool-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyBoolDType) -> _BSRArray[np.bool_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtBSR, dtype: onp.AnyBoolDType) -> _BSRArray[np.bool_]: ... @overload # blocks: , format: "coo", dtype: bool-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyBoolDType) -> _COOArray2D[np.bool_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCOO, dtype: onp.AnyBoolDType) -> _COOArray2D[np.bool_]: ... @overload # blocks: , format: "csc", dtype: bool-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyBoolDType) -> _CSCArray[np.bool_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSC, dtype: onp.AnyBoolDType) -> _CSCArray[np.bool_]: ... @overload # blocks: , format: "csr", dtype: bool-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyBoolDType) -> _CSRArray2D[np.bool_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSR, dtype: onp.AnyBoolDType) -> _CSRArray2D[np.bool_]: ... @overload # blocks: , format: "dia", dtype: bool-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyBoolDType) -> _DIAArray[np.bool_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDIA, dtype: onp.AnyBoolDType) -> _DIAArray[np.bool_]: ... @overload # blocks: , format: "dok", dtype: bool-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyBoolDType) -> _DOKArray2D[np.bool_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDOK, dtype: onp.AnyBoolDType) -> _DOKArray2D[np.bool_]: ... @overload # blocks: , format: "lil", dtype: bool-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyBoolDType) -> _LILArray[np.bool_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: onp.AnyBoolDType) -> _LILArray[np.bool_]: ... # @overload # blocks: , format: , dtype: int-like -def block_array(blocks: _ToBlocksCanStackAs[np.int_, _T], format: None = None, *, dtype: onp.AnyIntDType) -> _T: ... +def block_array(blocks: _ToBlocksCanStackAs[np.int_, _T], *, format: None = None, dtype: onp.AnyIntDType) -> _T: ... @overload # blocks: , format: "bsr", dtype: int-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyIntDType) -> _BSRArray[np.int_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtBSR, dtype: onp.AnyIntDType) -> _BSRArray[np.int_]: ... @overload # blocks: , format: "coo", dtype: int-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyIntDType) -> _COOArray2D[np.int_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCOO, dtype: onp.AnyIntDType) -> _COOArray2D[np.int_]: ... @overload # blocks: , format: "csc", dtype: int-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyIntDType) -> _CSCArray[np.int_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSC, dtype: onp.AnyIntDType) -> _CSCArray[np.int_]: ... @overload # blocks: , format: "csr", dtype: int-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyIntDType) -> _CSRArray2D[np.int_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSR, dtype: onp.AnyIntDType) -> _CSRArray2D[np.int_]: ... @overload # blocks: , format: "dia", dtype: int-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyIntDType) -> _DIAArray[np.int_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDIA, dtype: onp.AnyIntDType) -> _DIAArray[np.int_]: ... @overload # blocks: , format: "dok", dtype: int-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyIntDType) -> _DOKArray2D[np.int_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDOK, dtype: onp.AnyIntDType) -> _DOKArray2D[np.int_]: ... @overload # blocks: , format: "lil", dtype: int-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyIntDType) -> _LILArray[np.int_]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: onp.AnyIntDType) -> _LILArray[np.int_]: ... # @overload # blocks: , format: , dtype: float64-like -def block_array(blocks: _ToBlocksCanStackAs[np.float64, _T], format: None = None, *, dtype: onp.AnyFloat64DType) -> _T: ... +def block_array(blocks: _ToBlocksCanStackAs[np.float64, _T], *, format: None = None, dtype: onp.AnyFloat64DType) -> _T: ... @overload # blocks: , format: "bsr", dtype: float64-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyFloat64DType) -> _BSRArray[np.float64]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtBSR, dtype: onp.AnyFloat64DType) -> _BSRArray[np.float64]: ... @overload # blocks: , format: "coo", dtype: float64-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyFloat64DType) -> _COOArray2D[np.float64]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCOO, dtype: onp.AnyFloat64DType) -> _COOArray2D[np.float64]: ... @overload # blocks: , format: "csc", dtype: float64-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyFloat64DType) -> _CSCArray[np.float64]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSC, dtype: onp.AnyFloat64DType) -> _CSCArray[np.float64]: ... @overload # blocks: , format: "csr", dtype: float64-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyFloat64DType) -> _CSRArray2D[np.float64]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSR, dtype: onp.AnyFloat64DType) -> _CSRArray2D[np.float64]: ... @overload # blocks: , format: "dia", dtype: float64-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyFloat64DType) -> _DIAArray[np.float64]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDIA, dtype: onp.AnyFloat64DType) -> _DIAArray[np.float64]: ... @overload # blocks: , format: "dok", dtype: float64-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyFloat64DType) -> _DOKArray2D[np.float64]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDOK, dtype: onp.AnyFloat64DType) -> _DOKArray2D[np.float64]: ... @overload # blocks: , format: "lil", dtype: float64-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyFloat64DType) -> _LILArray[np.float64]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: onp.AnyFloat64DType) -> _LILArray[np.float64]: ... # @overload # blocks: , format: , dtype: complex128-like -def block_array(blocks: _ToBlocksCanStackAs[np.complex128, _T], format: None = None, *, dtype: onp.AnyComplex128DType) -> _T: ... +def block_array(blocks: _ToBlocksCanStackAs[np.complex128, _T], *, format: None = None, dtype: onp.AnyComplex128DType) -> _T: ... @overload # blocks: , format: "bsr", dtype: complex128-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.AnyComplex128DType) -> _BSRArray[np.complex128]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtBSR, dtype: onp.AnyComplex128DType) -> _BSRArray[np.complex128]: ... @overload # blocks: , format: "coo", dtype: complex128-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.AnyComplex128DType) -> _COOArray2D[np.complex128]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCOO, dtype: onp.AnyComplex128DType) -> _COOArray2D[np.complex128]: ... @overload # blocks: , format: "csc", dtype: complex128-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.AnyComplex128DType) -> _CSCArray[np.complex128]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSC, dtype: onp.AnyComplex128DType) -> _CSCArray[np.complex128]: ... @overload # blocks: , format: "csr", dtype: complex128-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.AnyComplex128DType) -> _CSRArray2D[np.complex128]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSR, dtype: onp.AnyComplex128DType) -> _CSRArray2D[np.complex128]: ... @overload # blocks: , format: "dia", dtype: complex128-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.AnyComplex128DType) -> _DIAArray[np.complex128]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDIA, dtype: onp.AnyComplex128DType) -> _DIAArray[np.complex128]: ... @overload # blocks: , format: "dok", dtype: complex128-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.AnyComplex128DType) -> _DOKArray2D[np.complex128]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDOK, dtype: onp.AnyComplex128DType) -> _DOKArray2D[np.complex128]: ... @overload # blocks: , format: "lil", dtype: complex128-like -def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.AnyComplex128DType) -> _LILArray[np.complex128]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: onp.AnyComplex128DType) -> _LILArray[np.complex128]: ... # @overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocksCanStackAs[_SCT0, _T], format: None = None, *, dtype: onp.ToDType[_SCT0]) -> _T: ... +def block_array(blocks: _ToBlocksCanStackAs[_SCT0, _T], *, format: None = None, dtype: onp.ToDType[_SCT0]) -> _T: ... @overload # blocks: , format: "bsr", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: onp.ToDType[_SCT0]) -> _BSRArray[_SCT0]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtBSR, dtype: onp.ToDType[_SCT0]) -> _BSRArray[_SCT0]: ... @overload # blocks: , format: "coo", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: onp.ToDType[_SCT0]) -> _COOArray2D[_SCT0]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCOO, dtype: onp.ToDType[_SCT0]) -> _COOArray2D[_SCT0]: ... @overload # blocks: , format: "csc", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: onp.ToDType[_SCT0]) -> _CSCArray[_SCT0]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSC, dtype: onp.ToDType[_SCT0]) -> _CSCArray[_SCT0]: ... @overload # blocks: , format: "csr", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: onp.ToDType[_SCT0]) -> _CSRArray2D[_SCT0]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSR, dtype: onp.ToDType[_SCT0]) -> _CSRArray2D[_SCT0]: ... @overload # blocks: , format: "dia", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: onp.ToDType[_SCT0]) -> _DIAArray[_SCT0]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDIA, dtype: onp.ToDType[_SCT0]) -> _DIAArray[_SCT0]: ... @overload # blocks: , format: "dok", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: onp.ToDType[_SCT0]) -> _DOKArray2D[_SCT0]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDOK, dtype: onp.ToDType[_SCT0]) -> _DOKArray2D[_SCT0]: ... @overload # blocks: , format: "lil", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: onp.ToDType[_SCT0]) -> _LILArray[_SCT0]: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: onp.ToDType[_SCT0]) -> _LILArray[_SCT0]: ... # @overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocksCanStackAs[Any, _T], format: None = None, *, dtype: npt.DTypeLike | None = None) -> _T: ... +def block_array(blocks: _ToBlocksCanStackAs[Any, _T], *, format: None = None, dtype: npt.DTypeLike | None = None) -> _T: ... @overload # blocks: , format: "bsr", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtBSR, dtype: npt.DTypeLike | None = None) -> _BSRArray: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtBSR, dtype: npt.DTypeLike | None = None) -> _BSRArray: ... @overload # blocks: , format: "coo", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtCOO, dtype: npt.DTypeLike | None = None) -> _COOArray2D: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCOO, dtype: npt.DTypeLike | None = None) -> _COOArray2D: ... @overload # blocks: , format: "csc", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSC, dtype: npt.DTypeLike | None = None) -> _CSCArray: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSC, dtype: npt.DTypeLike | None = None) -> _CSCArray: ... @overload # blocks: , format: "csr", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtCSR, dtype: npt.DTypeLike | None = None) -> _CSRArray2D: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSR, dtype: npt.DTypeLike | None = None) -> _CSRArray2D: ... @overload # blocks: , format: "dia", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtDIA, dtype: npt.DTypeLike | None = None) -> _DIAArray: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDIA, dtype: npt.DTypeLike | None = None) -> _DIAArray: ... @overload # blocks: , format: "dok", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtDOK, dtype: npt.DTypeLike | None = None) -> _DOKArray2D: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDOK, dtype: npt.DTypeLike | None = None) -> _DOKArray2D: ... @overload # blocks: , format: "lil", dtype: -def block_array(blocks: _ToBlocksUnkown, format: _FmtLIL, dtype: npt.DTypeLike | None = None) -> _LILArray: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: npt.DTypeLike | None = None) -> _LILArray: ... ### @overload # blocks: , format: , dtype: From 59f1aa46877f04b703b39f3909c2b83a0559a7b3 Mon Sep 17 00:00:00 2001 From: juvdnbro Date: Wed, 30 Jul 2025 14:49:56 +0200 Subject: [PATCH 06/15] Re-added problematic tests with notes --- tests/sparse/test_construct.pyi | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tests/sparse/test_construct.pyi b/tests/sparse/test_construct.pyi index b33bb673..9b32e74f 100644 --- a/tests/sparse/test_construct.pyi +++ b/tests/sparse/test_construct.pyi @@ -269,17 +269,21 @@ assert_type(sparse.block_array([[coo_arr]], dtype=int), sparse.coo_array[np.int_ assert_type(sparse.block_array([[csr_arr]], dtype=sctype), sparse.csr_array[ScalarType, tuple[int, int]]) assert_type(sparse.block_array([[lil_arr]], dtype=np.complex64), sparse.coo_array[np.complex64, tuple[int, int]]) assert_type(sparse.block_array([[csr_arr]], format="lil"), sparse.lil_array[ScalarType]) -assert_type(sparse.block_array([[coo_arr]], format="bsr", dtype="float"), sparse.bsr_array[np.float64]) -assert_type(sparse.block_array([[dia_arr]], format="dok", dtype=complex), sparse.dok_array[np.complex128]) +assert_type(sparse.block_array([[coo_arr, None]], format="bsr", dtype="float"), sparse.bsr_array[np.float64]) +assert_type(sparse.block_array([[dia_arr], [None]], format="dok", dtype=complex), sparse.dok_array[np.complex128]) +# NOTE: mypy reports false positive errors here, because of join vs. union approach +assert_type(sparse.block_array([[csr_arr, None], [None, dok_arr]], format="dia"), sparse.dia_array[ScalarType]) # type: ignore[assert-type] + # bmat (legacy, `block_array` is p`referred) assert_type(sparse.bmat([[bsr_mat]]), sparse.coo_matrix[ScalarType]) -assert_type(sparse.bmat([[csr_mat]]), sparse.csr_matrix[ScalarType]) assert_type(sparse.bmat([[dia_mat]], dtype=np.int_), sparse.coo_matrix[np.int_]) -assert_type(sparse.bmat([[dok_mat]], dtype=np.complex64), sparse.coo_matrix[np.complex64]) assert_type(sparse.bmat([[bsr_arr]]), sparse.coo_array[ScalarType, tuple[int, int]]) -assert_type(sparse.bmat([[csr_arr]]), sparse.csr_array[ScalarType, tuple[int, int]]) assert_type(sparse.bmat([[dia_arr]], dtype=np.int_), sparse.coo_array[np.int_, tuple[int, int]]) -assert_type(sparse.bmat([[dok_arr]], dtype=np.complex64), sparse.coo_array[np.complex64, tuple[int, int]]) +# NOTE: mypy reports false positive errors here, because of join vs. union approach +assert_type(sparse.bmat([[csr_mat], [None]]), sparse.csr_matrix[ScalarType]) # type: ignore[assert-type,arg-type] +assert_type(sparse.bmat([[dok_mat], [None]], dtype=np.complex64), sparse.coo_matrix[np.complex64]) # type: ignore[assert-type,arg-type] +assert_type(sparse.bmat([[csr_arr], [None]]), sparse.csr_array[ScalarType, tuple[int, int]]) # type: ignore[assert-type,arg-type] +assert_type(sparse.bmat([[dok_arr], [None]], dtype=np.complex64), sparse.coo_array[np.complex64, tuple[int, int]]) # type: ignore[assert-type,arg-type] # block_diag assert_type(sparse.block_diag([any_arr, any_arr]), sparse.coo_array[ScalarType, tuple[int, int]]) From 64fca16a33a97a8569c8a26619e2e80ba33106c1 Mon Sep 17 00:00:00 2001 From: juvdnbro Date: Wed, 30 Jul 2025 14:57:40 +0200 Subject: [PATCH 07/15] Cleaned up overloads with type aliases --- scipy-stubs/sparse/_construct.pyi | 110 +++++++----------------------- 1 file changed, 24 insertions(+), 86 deletions(-) diff --git a/scipy-stubs/sparse/_construct.pyi b/scipy-stubs/sparse/_construct.pyi index 8321bbd0..91d2bb30 100644 --- a/scipy-stubs/sparse/_construct.pyi +++ b/scipy-stubs/sparse/_construct.pyi @@ -83,6 +83,9 @@ _ToBlocksCanStack: TypeAlias = Seq[Seq[_CanStack[_T] | None]] _ToBlocksCanStackAs: TypeAlias = Seq[Seq[_CanStackAs[_SCT0, _T] | None]] _ToBlocksUnkown: TypeAlias = _ToBlocksSPArray | _ToBlocksArray +_ToMatsDiagKnown: TypeAlias = Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]] +_ToMatsDiagUnknown: TypeAlias = Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]] + @type_check_only class _DataSampler(Protocol): def __call__(self, /, *, size: int) -> onp.ArrayND[_Numeric]: ... @@ -1891,121 +1894,56 @@ def block_diag(mats: Iterable[sparray], format: _FmtLIL, dtype: onp.ToDType[_SCT # @overload # mats: , format: , dtype: None def block_diag( - mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtCOO | None = None, dtype: None = None + mats: _ToMatsDiagKnown[_SCT], format: _FmtCOO | None = None, dtype: None = None ) -> _COOArray2D[_SCT] | coo_matrix[_SCT]: ... @overload # mats: , format: "bsr", dtype: None -def block_diag( - mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtBSR, dtype: None = None -) -> _BSRArray[_SCT] | bsr_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT] | bsr_matrix[_SCT]: ... @overload # mats: , format: "csc", dtype: None -def block_diag( - mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtCSC, dtype: None = None -) -> _CSCArray[_SCT] | csc_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT] | csc_matrix[_SCT]: ... @overload # mats: , format: "csr", dtype: None -def block_diag( - mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtCSR, dtype: None = None -) -> _CSRArray2D[_SCT] | csr_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT] | csr_matrix[_SCT]: ... @overload # mats: , format: "dia", dtype: None -def block_diag( - mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtDIA, dtype: None = None -) -> _DIAArray[_SCT] | dia_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT] | dia_matrix[_SCT]: ... @overload # mats: , format: "dok", dtype: None -def block_diag( - mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtDOK, dtype: None = None -) -> _DOKArray2D[_SCT] | dok_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT] | dok_matrix[_SCT]: ... @overload # mats: , format: "lil", dtype: None -def block_diag( - mats: Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]], format: _FmtLIL, dtype: None = None -) -> _LILArray[_SCT] | lil_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT] | lil_matrix[_SCT]: ... # @overload # mats: , format: , dtype: def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtCOO | None = None, - *, - dtype: onp.ToDType[_SCT], + mats: _ToMatsDiagUnknown, format: _FmtCOO | None = None, *, dtype: onp.ToDType[_SCT] ) -> _COOArray2D[_SCT] | coo_matrix[_SCT]: ... @overload # mats: , format: "bsr", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtBSR, - dtype: onp.ToDType[_SCT], -) -> _BSRArray[_SCT] | bsr_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtBSR, dtype: onp.ToDType[_SCT]) -> _BSRArray[_SCT] | bsr_matrix[_SCT]: ... @overload # mats: , format: "csc", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtCSC, - dtype: onp.ToDType[_SCT], -) -> _CSCArray[_SCT] | csc_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtCSC, dtype: onp.ToDType[_SCT]) -> _CSCArray[_SCT] | csc_matrix[_SCT]: ... @overload # mats: , format: "csr", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtCSR, - dtype: onp.ToDType[_SCT], -) -> _CSRArray2D[_SCT] | csr_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtCSR, dtype: onp.ToDType[_SCT]) -> _CSRArray2D[_SCT] | csr_matrix[_SCT]: ... @overload # mats: , format: "dia", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtDIA, - dtype: onp.ToDType[_SCT], -) -> _DIAArray[_SCT] | dia_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtDIA, dtype: onp.ToDType[_SCT]) -> _DIAArray[_SCT] | dia_matrix[_SCT]: ... @overload # mats: , format: "dok", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtDOK, - dtype: onp.ToDType[_SCT], -) -> _DOKArray2D[_SCT] | dok_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtDOK, dtype: onp.ToDType[_SCT]) -> _DOKArray2D[_SCT] | dok_matrix[_SCT]: ... @overload # mats: , format: "lil", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtLIL, - dtype: onp.ToDType[_SCT], -) -> _LILArray[_SCT] | lil_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtLIL, dtype: onp.ToDType[_SCT]) -> _LILArray[_SCT] | lil_matrix[_SCT]: ... # @overload # mats: , format: , dtype: def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtCOO | None = None, - dtype: npt.DTypeLike | None = None, + mats: _ToMatsDiagUnknown, format: _FmtCOO | None = None, dtype: npt.DTypeLike | None = None ) -> _COOArray2D | coo_matrix: ... @overload # mats: , format: "bsr", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtBSR, - dtype: npt.DTypeLike | None = None, -) -> _BSRArray | bsr_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtBSR, dtype: npt.DTypeLike | None = None) -> _BSRArray | bsr_matrix: ... @overload # mats: , format: "csc", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtCSC, - dtype: npt.DTypeLike | None = None, -) -> _CSCArray | csc_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtCSC, dtype: npt.DTypeLike | None = None) -> _CSCArray | csc_matrix: ... @overload # mats: , format: "csr", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtCSR, - dtype: npt.DTypeLike | None = None, -) -> _CSRArray2D | csr_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtCSR, dtype: npt.DTypeLike | None = None) -> _CSRArray2D | csr_matrix: ... @overload # mats: , format: "dia", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtDIA, - dtype: npt.DTypeLike | None = None, -) -> _DIAArray | dia_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtDIA, dtype: npt.DTypeLike | None = None) -> _DIAArray | dia_matrix: ... @overload # mats: , format: "dok", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtDOK, - dtype: npt.DTypeLike | None = None, -) -> _DOKArray2D | dok_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtDOK, dtype: npt.DTypeLike | None = None) -> _DOKArray2D | dok_matrix: ... @overload # mats: , format: "lil", dtype: -def block_diag( - mats: Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]], - format: _FmtLIL, - dtype: npt.DTypeLike | None = None, -) -> _LILArray | lil_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtLIL, dtype: npt.DTypeLike | None = None) -> _LILArray | lil_matrix: ... ### @overload # shape: T, format: , dtype: From 93dd0e923fc4287b5d4ed4cd8b48074ae46c4059 Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 30 Jul 2025 19:59:01 +0200 Subject: [PATCH 08/15] =?UTF-8?q?=F0=9F=93=8C=20pin=20`uv`=20to=20`0.8.3`?= =?UTF-8?q?=20in=20CI=20(for=20now)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d594939..cf275581 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,6 +39,7 @@ jobs: with: activate-environment: true python-version: "3.13" + version: "0.8.3" - name: ruff run: | @@ -65,8 +66,7 @@ jobs: steps: - uses: actions/checkout@v4.2.2 - - name: setup uv - uses: astral-sh/setup-uv@v6.4.3 + - uses: astral-sh/setup-uv@v6.4.3 with: activate-environment: true python-version: ${{ matrix.py }} From aa7d30f45265ebec9c3de4d5286d6c6d1850ddae Mon Sep 17 00:00:00 2001 From: jorenham Date: Wed, 30 Jul 2025 17:00:45 +0200 Subject: [PATCH 09/15] =?UTF-8?q?=F0=9F=92=9A=20fix=20CI=20numpy=20testing?= =?UTF-8?q?=20matrix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf275581..9788954a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,7 +39,6 @@ jobs: with: activate-environment: true python-version: "3.13" - version: "0.8.3" - name: ruff run: | From cfa225276affbf392fa0cfef4c6f48207ddef0aa Mon Sep 17 00:00:00 2001 From: juvdnbro Date: Tue, 29 Jul 2025 16:11:09 +0200 Subject: [PATCH 10/15] Improved stubs for `block_array` and `bmat` --- scipy-stubs/sparse/_construct.pyi | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/scipy-stubs/sparse/_construct.pyi b/scipy-stubs/sparse/_construct.pyi index 91d2bb30..b14e7c73 100644 --- a/scipy-stubs/sparse/_construct.pyi +++ b/scipy-stubs/sparse/_construct.pyi @@ -47,6 +47,7 @@ _Numeric: TypeAlias = npc.number | np.bool_ _SpBase2D: TypeAlias = _spbase[_SCT, tuple[int, int]] _SpArray2D: TypeAlias = sparray[_SCT, tuple[int, int]] +_SpMatrix: TypeAlias = spmatrix[_SCT] _BSRArray: TypeAlias = bsr_array[_SCT] _COOArray2D: TypeAlias = coo_array[_SCT, tuple[int, int]] @@ -1386,19 +1387,19 @@ def kronsum(A: onp.ToComplex2D, B: onp.ToComplex2D, format: _Format | None = Non @overload # sparray, format: , dtype: def hstack(blocks: Seq[_CanStack[_T]], format: None = None, dtype: None = None) -> _T: ... @overload # sparray, format: "bsr", dtype: -def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... +def hstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... @overload # sparray, format: "coo", dtype: -def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT]: ... +def hstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT]: ... @overload # sparray, format: "csc", dtype: -def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... +def hstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... @overload # sparray, format: "csr", dtype: -def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... +def hstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... @overload # sparray, format: "dia", dtype: -def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... +def hstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... @overload # sparray, format: "dok", dtype: -def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... +def hstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... @overload # sparray, format: "lil", dtype: -def hstack(blocks: Seq[_SpArray[_SCT]], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... +def hstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... # @overload # sparray, format: , dtype: bool-like @@ -1517,19 +1518,19 @@ def hstack(blocks: Seq[_spbase], format: _Format, dtype: npt.DTypeLike | None = @overload # sparray, format: , dtype: def vstack(blocks: Seq[_CanStack[_T]], format: None = None, dtype: None = None) -> _T: ... @overload # sparray, format: "bsr", dtype: -def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... +def vstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT]: ... @overload # sparray, format: "coo", dtype: -def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT]: ... +def vstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtCOO, dtype: None = None) -> _COOArray2D[_SCT]: ... @overload # sparray, format: "csc", dtype: -def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... +def vstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT]: ... @overload # sparray, format: "csr", dtype: -def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... +def vstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT]: ... @overload # sparray, format: "dia", dtype: -def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... +def vstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT]: ... @overload # sparray, format: "dok", dtype: -def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... +def vstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT]: ... @overload # sparray, format: "lil", dtype: -def vstack(blocks: Seq[_SpArray[_SCT]], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... +def vstack(blocks: Seq[_SpArray2D[_SCT]], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT]: ... # @overload # sparray, format: , dtype: bool-like From b6f5b130f7f80f6ad77e86fd7859b4bde7b38fa6 Mon Sep 17 00:00:00 2001 From: Jul Van den Broeck Date: Thu, 31 Jul 2025 19:17:52 +0200 Subject: [PATCH 11/15] Fixed errors for `numpy<2.2` --- tests/sparse/test_construct.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sparse/test_construct.pyi b/tests/sparse/test_construct.pyi index 9b32e74f..84f49823 100644 --- a/tests/sparse/test_construct.pyi +++ b/tests/sparse/test_construct.pyi @@ -297,7 +297,7 @@ assert_type( assert_type(sparse.block_diag([any_arr, any_arr], format="bsr"), sparse.bsr_array[ScalarType]) assert_type(sparse.block_diag([any_arr, any_arr], format="csc", dtype=float), sparse.csc_array[np.float64]) assert_type(sparse.block_diag([any_arr, any_arr], format="csr", dtype=complex), sparse.csr_array[np.complex128, tuple[int, int]]) -assert_type(sparse.block_diag([any_arr, any_arr], format="dia", dtype=np.int32), sparse.dia_array[np.int32]) +assert_type(sparse.block_diag([any_arr, any_arr], format="dia", dtype="int"), sparse.dia_array[np.int_]) assert_type(sparse.block_diag([any_arr, any_arr], format="dok", dtype="bool"), sparse.dok_array[np.bool_, tuple[int, int]]) assert_type(sparse.block_diag([any_arr, any_arr], format="lil", dtype=np.complex64), sparse.lil_array[np.complex64]) From 78447030fb5379f365a5ccaf8f2508b5bf0c2e1c Mon Sep 17 00:00:00 2001 From: Jul Van den Broeck Date: Fri, 1 Aug 2025 09:33:12 +0200 Subject: [PATCH 12/15] Removed accidental workflow change --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9788954a..8d594939 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,7 +65,8 @@ jobs: steps: - uses: actions/checkout@v4.2.2 - - uses: astral-sh/setup-uv@v6.4.3 + - name: setup uv + uses: astral-sh/setup-uv@v6.4.3 with: activate-environment: true python-version: ${{ matrix.py }} From e4d3ed505aa504e86bcba4bcb719b84571f756b1 Mon Sep 17 00:00:00 2001 From: Jul Van den Broeck Date: Fri, 1 Aug 2025 09:45:26 +0200 Subject: [PATCH 13/15] Cleaned up type aliases + changed `int_` to `int64` to work around version-specific numpy errors --- scipy-stubs/sparse/_construct.pyi | 38 +++++++++++++++---------------- tests/sparse/test_construct.pyi | 2 +- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/scipy-stubs/sparse/_construct.pyi b/scipy-stubs/sparse/_construct.pyi index b14e7c73..4c4a9b70 100644 --- a/scipy-stubs/sparse/_construct.pyi +++ b/scipy-stubs/sparse/_construct.pyi @@ -47,7 +47,6 @@ _Numeric: TypeAlias = npc.number | np.bool_ _SpBase2D: TypeAlias = _spbase[_SCT, tuple[int, int]] _SpArray2D: TypeAlias = sparray[_SCT, tuple[int, int]] -_SpMatrix: TypeAlias = spmatrix[_SCT] _BSRArray: TypeAlias = bsr_array[_SCT] _COOArray2D: TypeAlias = coo_array[_SCT, tuple[int, int]] @@ -77,14 +76,15 @@ _Offsets: TypeAlias = onp.ToInt | onp.ToInt1D _DataRVS: TypeAlias = Callable[[int], onp.ArrayND[_Numeric]] +_ToBlocks: TypeAlias = Seq[Seq[_T | None]] +_ToBlocksSPArray: TypeAlias = _ToBlocks[_SpArray2D[_SCT]] +_ToBlocksSPMatrix: TypeAlias = _ToBlocks[spmatrix[_SCT]] +_ToBlocksCanStack: TypeAlias = _ToBlocks[_CanStack[_T]] +_ToBlocksCanStackAs: TypeAlias = _ToBlocks[_CanStackAs[_SCT0, _T]] _ToBlocksArray: TypeAlias = onp.ArrayND[np.object_] -_ToBlocksSPArray: TypeAlias = Seq[Seq[_SpArray2D[_SCT] | None]] -_ToBlocksSPMatrix: TypeAlias = Seq[Seq[_SpMatrix[_SCT] | None]] -_ToBlocksCanStack: TypeAlias = Seq[Seq[_CanStack[_T] | None]] -_ToBlocksCanStackAs: TypeAlias = Seq[Seq[_CanStackAs[_SCT0, _T] | None]] _ToBlocksUnkown: TypeAlias = _ToBlocksSPArray | _ToBlocksArray -_ToMatsDiagKnown: TypeAlias = Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]] +_ToMatsDiag: TypeAlias = Iterable[_spbase[_SCT] | onp.ToArrayND[_SCT]] _ToMatsDiagUnknown: TypeAlias = Iterable[_spbase | onp.ArrayND[_Numeric] | complex | Seq[onp.ToComplex] | Seq[onp.ToComplex1D]] @type_check_only @@ -1682,7 +1682,7 @@ def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: onp.AnyBoolD # @overload # blocks: , format: , dtype: int-like -def block_array(blocks: _ToBlocksCanStackAs[np.int_, _T], *, format: None = None, dtype: onp.AnyIntDType) -> _T: ... +def block_array(blocks: _ToBlocksCanStackAs[np.int64, _T], *, format: None = None, dtype: onp.AnyIntDType) -> _T: ... @overload # blocks: , format: "bsr", dtype: int-like def block_array(blocks: _ToBlocksUnkown, *, format: _FmtBSR, dtype: onp.AnyIntDType) -> _BSRArray[np.int_]: ... @overload # blocks: , format: "coo", dtype: int-like @@ -1774,23 +1774,23 @@ def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: npt.DTypeLik @overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksCanStack[_T], format: None = None, dtype: None = None) -> _T: ... @overload # blocks: , format: , dtype: -def bmat(blocks: _ToBlocksSPMatrix[_SCT], format: _Format, dtype: None = None) -> _SpMatrix[_SCT]: ... +def bmat(blocks: _ToBlocksSPMatrix[_SCT], format: _Format, dtype: None = None) -> spmatrix[_SCT]: ... # @overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksCanStackAs[_SCT0, _T], format: None = None, *, dtype: onp.ToDType[_SCT0]) -> _T: ... @overload # blocks: , format: , dtype: -def bmat(blocks: _ToBlocksSPMatrix[_SCT0], format: _Format, dtype: onp.ToDType[_SCT0]) -> _SpMatrix[_SCT0]: ... +def bmat(blocks: _ToBlocksSPMatrix[_SCT0], format: _Format, dtype: onp.ToDType[_SCT0]) -> spmatrix[_SCT0]: ... @overload # blocks: , format: , dtype: -def bmat(blocks: _ToBlocksUnkown, format: _Format, dtype: onp.ToDType[_SCT0]) -> _SpMatrix[_SCT0] | _SpArray2D[_SCT0]: ... +def bmat(blocks: _ToBlocksUnkown, format: _Format, dtype: onp.ToDType[_SCT0]) -> spmatrix[_SCT0] | _SpArray2D[_SCT0]: ... # @overload # blocks: , format: , dtype: def bmat(blocks: _ToBlocksCanStackAs[Any, _T], format: None = None, *, dtype: npt.DTypeLike) -> _T: ... @overload # blocks: , format: , dtype: -def bmat(blocks: _ToBlocksSPMatrix, format: _Format, *, dtype: npt.DTypeLike) -> _SpMatrix: ... +def bmat(blocks: _ToBlocksSPMatrix, format: _Format, *, dtype: npt.DTypeLike) -> spmatrix: ... @overload # blocks: , format: , dtype: -def bmat(blocks: _ToBlocksUnkown, format: _Format, *, dtype: npt.DTypeLike) -> _SpMatrix | _SpArray2D: ... +def bmat(blocks: _ToBlocksUnkown, format: _Format, *, dtype: npt.DTypeLike) -> spmatrix | _SpArray2D: ... ### @overload # mats: , format: , dtype: None @@ -1895,20 +1895,20 @@ def block_diag(mats: Iterable[sparray], format: _FmtLIL, dtype: onp.ToDType[_SCT # @overload # mats: , format: , dtype: None def block_diag( - mats: _ToMatsDiagKnown[_SCT], format: _FmtCOO | None = None, dtype: None = None + mats: _ToMatsDiag[_SCT], format: _FmtCOO | None = None, dtype: None = None ) -> _COOArray2D[_SCT] | coo_matrix[_SCT]: ... @overload # mats: , format: "bsr", dtype: None -def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT] | bsr_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiag[_SCT], format: _FmtBSR, dtype: None = None) -> _BSRArray[_SCT] | bsr_matrix[_SCT]: ... @overload # mats: , format: "csc", dtype: None -def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT] | csc_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiag[_SCT], format: _FmtCSC, dtype: None = None) -> _CSCArray[_SCT] | csc_matrix[_SCT]: ... @overload # mats: , format: "csr", dtype: None -def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT] | csr_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiag[_SCT], format: _FmtCSR, dtype: None = None) -> _CSRArray2D[_SCT] | csr_matrix[_SCT]: ... @overload # mats: , format: "dia", dtype: None -def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT] | dia_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiag[_SCT], format: _FmtDIA, dtype: None = None) -> _DIAArray[_SCT] | dia_matrix[_SCT]: ... @overload # mats: , format: "dok", dtype: None -def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT] | dok_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiag[_SCT], format: _FmtDOK, dtype: None = None) -> _DOKArray2D[_SCT] | dok_matrix[_SCT]: ... @overload # mats: , format: "lil", dtype: None -def block_diag(mats: _ToMatsDiagKnown[_SCT], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT] | lil_matrix[_SCT]: ... +def block_diag(mats: _ToMatsDiag[_SCT], format: _FmtLIL, dtype: None = None) -> _LILArray[_SCT] | lil_matrix[_SCT]: ... # @overload # mats: , format: , dtype: diff --git a/tests/sparse/test_construct.pyi b/tests/sparse/test_construct.pyi index 84f49823..eb0ea1d2 100644 --- a/tests/sparse/test_construct.pyi +++ b/tests/sparse/test_construct.pyi @@ -265,7 +265,7 @@ assert_type(sparse.hstack([csc_arr, csc_arr], format="lil", dtype=np.complex64), # block_array assert_type(sparse.block_array([[bsr_mat]]), sparse.coo_matrix[ScalarType]) assert_type(sparse.block_array([[bsr_arr]]), sparse.coo_array[ScalarType, tuple[int, int]]) -assert_type(sparse.block_array([[coo_arr]], dtype=int), sparse.coo_array[np.int_, tuple[int, int]]) +assert_type(sparse.block_array([[coo_arr]], dtype=int), sparse.coo_array[np.int64, tuple[int, int]]) assert_type(sparse.block_array([[csr_arr]], dtype=sctype), sparse.csr_array[ScalarType, tuple[int, int]]) assert_type(sparse.block_array([[lil_arr]], dtype=np.complex64), sparse.coo_array[np.complex64, tuple[int, int]]) assert_type(sparse.block_array([[csr_arr]], format="lil"), sparse.lil_array[ScalarType]) From 01c8711f6244c43574a1ce28724b6ddfe6c3cbb0 Mon Sep 17 00:00:00 2001 From: Jul Van den Broeck Date: Sun, 3 Aug 2025 11:13:50 +0200 Subject: [PATCH 14/15] (Re)defined type aliases to improve perfomance --- scipy-stubs/sparse/_construct.pyi | 162 +++++++++++++++--------------- 1 file changed, 82 insertions(+), 80 deletions(-) diff --git a/scipy-stubs/sparse/_construct.pyi b/scipy-stubs/sparse/_construct.pyi index 4c4a9b70..b0d2aafd 100644 --- a/scipy-stubs/sparse/_construct.pyi +++ b/scipy-stubs/sparse/_construct.pyi @@ -45,6 +45,8 @@ _ShapeT = TypeVar("_ShapeT", bound=tuple[int, *tuple[int, ...]]) _Numeric: TypeAlias = npc.number | np.bool_ +_ToDType: TypeAlias = type[complex | _Numeric] | np.dtype[_Numeric] | str + _SpBase2D: TypeAlias = _spbase[_SCT, tuple[int, int]] _SpArray2D: TypeAlias = sparray[_SCT, tuple[int, int]] @@ -56,7 +58,7 @@ _DIAArray: TypeAlias = dia_array[_SCT] _DOKArray2D: TypeAlias = dok_array[_SCT, tuple[int, int]] _LILArray: TypeAlias = lil_array[_SCT] -_ToArray1D2D: TypeAlias = onp.ToArray1D[Never, _SCT] | onp.ToArray2D[Never, _SCT] +_ToArray1D2D: TypeAlias = onp.CanArray[tuple[int] | tuple[int, int], np.dtype[_SCT]] | Seq[_SCT | Seq[_SCT]] _ToSpMatrix: TypeAlias = spmatrix[_SCT] | onp.ToArray2D[Never, _SCT] _ToSparse2D: TypeAlias = _SpBase2D[_SCT] | onp.ToArray2D[Never, _SCT] @@ -568,31 +570,31 @@ def diags_array( offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtDIA | None = None, - dtype: npt.DTypeLike, + dtype: _ToDType, ) -> _DIAArray: ... @overload # diagonals: , format: "bsr", dtype: def diags_array( - diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtBSR, dtype: npt.DTypeLike + diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtBSR, dtype: _ToDType ) -> _BSRArray: ... @overload # diagonals: , format: "coo", dtype: def diags_array( - diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtCOO, dtype: npt.DTypeLike + diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtCOO, dtype: _ToDType ) -> _COOArray2D: ... @overload # diagonals: , format: "csc", dtype: def diags_array( - diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtCSC, dtype: npt.DTypeLike + diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtCSC, dtype: _ToDType ) -> _CSCArray: ... @overload # diagonals: , format: "csr", dtype: def diags_array( - diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtCSR, dtype: npt.DTypeLike + diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtCSR, dtype: _ToDType ) -> _CSRArray2D: ... @overload # diagonals: , format: "dok", dtype: def diags_array( - diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtDOK, dtype: npt.DTypeLike + diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtDOK, dtype: _ToDType ) -> _DOKArray2D: ... @overload # diagonals: , format: "lil", dtype: def diags_array( - diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtLIL, dtype: npt.DTypeLike + diagonals: _ToComplex1D2D, /, *, offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtLIL, dtype: _ToDType ) -> _LILArray: ... ### @@ -672,7 +674,7 @@ def diags( offsets: _Offsets = 0, shape: _ToShape2D | None = None, format: _FmtDIA | None = None, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, ) -> dia_matrix: ... @overload # diagonals: , format: "bsr", dtype: def diags( @@ -681,7 +683,7 @@ def diags( shape: _ToShape2D | None = None, *, format: _FmtBSR, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, ) -> bsr_matrix: ... @overload # diagonals: , format: "coo", dtype: def diags( @@ -690,7 +692,7 @@ def diags( shape: _ToShape2D | None = None, *, format: _FmtCOO, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, ) -> coo_matrix: ... @overload # diagonals: , format: "csr", dtype: def diags( @@ -699,7 +701,7 @@ def diags( shape: _ToShape2D | None = None, *, format: _FmtCSR, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, ) -> csr_matrix: ... @overload # diagonals: , format: "csc", dtype: def diags( @@ -708,7 +710,7 @@ def diags( shape: _ToShape2D | None = None, *, format: _FmtCSC, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, ) -> csc_matrix: ... @overload # diagonals: , format: "dok", dtype: def diags( @@ -717,7 +719,7 @@ def diags( shape: _ToShape2D | None = None, *, format: _FmtDOK, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, ) -> dok_matrix: ... @overload # diagonals: , format: "lil", dtype: def diags( @@ -726,7 +728,7 @@ def diags( shape: _ToShape2D | None = None, *, format: _FmtLIL, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, ) -> lil_matrix: ... ### @@ -906,19 +908,19 @@ def identity(n: opt.AnyInt, dtype: onp.ToDType[_SCT], format: _FmtLIL) -> lil_ma # @overload # dtype: , format: "dia" | None -def identity(n: opt.AnyInt, dtype: npt.DTypeLike, format: _FmtDIA | None = None) -> dia_matrix[Incomplete]: ... +def identity(n: opt.AnyInt, dtype: _ToDType, format: _FmtDIA | None = None) -> dia_matrix[Incomplete]: ... @overload # dtype: , format: "bsr" -def identity(n: opt.AnyInt, dtype: npt.DTypeLike, format: _FmtBSR) -> bsr_matrix[Incomplete]: ... +def identity(n: opt.AnyInt, dtype: _ToDType, format: _FmtBSR) -> bsr_matrix[Incomplete]: ... @overload # dtype: , format: "coo" -def identity(n: opt.AnyInt, dtype: npt.DTypeLike, format: _FmtCOO) -> coo_matrix[Incomplete]: ... +def identity(n: opt.AnyInt, dtype: _ToDType, format: _FmtCOO) -> coo_matrix[Incomplete]: ... @overload # dtype: , format: "csc" -def identity(n: opt.AnyInt, dtype: npt.DTypeLike, format: _FmtCSC) -> csc_matrix[Incomplete]: ... +def identity(n: opt.AnyInt, dtype: _ToDType, format: _FmtCSC) -> csc_matrix[Incomplete]: ... @overload # dtype: , format: "csr" -def identity(n: opt.AnyInt, dtype: npt.DTypeLike, format: _FmtCSR) -> csr_matrix[Incomplete]: ... +def identity(n: opt.AnyInt, dtype: _ToDType, format: _FmtCSR) -> csr_matrix[Incomplete]: ... @overload # dtype: , format: "dok" -def identity(n: opt.AnyInt, dtype: npt.DTypeLike, format: _FmtDOK) -> dok_matrix[Incomplete]: ... +def identity(n: opt.AnyInt, dtype: _ToDType, format: _FmtDOK) -> dok_matrix[Incomplete]: ... @overload # dtype: , format: "lil" -def identity(n: opt.AnyInt, dtype: npt.DTypeLike, format: _FmtLIL) -> lil_matrix[Incomplete]: ... +def identity(n: opt.AnyInt, dtype: _ToDType, format: _FmtLIL) -> lil_matrix[Incomplete]: ... ### @overload # dtype: float64-like (default), format: "dia" | None @@ -1073,31 +1075,31 @@ def eye_array( # @overload # dtype: , format: "dia" | None def eye_array( - m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: npt.DTypeLike, format: _FmtDIA | None = None + m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: _ToDType, format: _FmtDIA | None = None ) -> _DIAArray[Incomplete]: ... @overload # dtype: , format: "bsr" def eye_array( - m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: npt.DTypeLike, format: _FmtBSR + m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: _ToDType, format: _FmtBSR ) -> _BSRArray[Incomplete]: ... @overload # dtype: , format: "coo" def eye_array( - m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: npt.DTypeLike, format: _FmtCOO + m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: _ToDType, format: _FmtCOO ) -> _COOArray2D[Incomplete]: ... @overload # dtype: , format: "csc" def eye_array( - m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: npt.DTypeLike, format: _FmtCSC + m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: _ToDType, format: _FmtCSC ) -> _CSCArray[Incomplete]: ... @overload # dtype: , format: "csr" def eye_array( - m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: npt.DTypeLike, format: _FmtCSR + m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: _ToDType, format: _FmtCSR ) -> _CSRArray2D[Incomplete]: ... @overload # dtype: , format: "dok" def eye_array( - m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: npt.DTypeLike, format: _FmtDOK + m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: _ToDType, format: _FmtDOK ) -> _DOKArray2D[Incomplete]: ... @overload # dtype: , format: "lil" def eye_array( - m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: npt.DTypeLike, format: _FmtLIL + m: opt.AnyInt, n: opt.AnyInt | None = None, *, k: int = 0, dtype: _ToDType, format: _FmtLIL ) -> _LILArray[Incomplete]: ... ### @@ -1254,31 +1256,31 @@ def eye( # @overload # dtype: , format: "dia" | None def eye( - m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: npt.DTypeLike, format: _FmtDIA | None = None + m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: _ToDType, format: _FmtDIA | None = None ) -> dia_matrix[Incomplete]: ... @overload # dtype: , format: "bsr" def eye( - m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: npt.DTypeLike, format: _FmtBSR + m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: _ToDType, format: _FmtBSR ) -> bsr_matrix[Incomplete]: ... @overload # dtype: , format: "coo" def eye( - m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: npt.DTypeLike, format: _FmtCOO + m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: _ToDType, format: _FmtCOO ) -> coo_matrix[Incomplete]: ... @overload # dtype: , format: "csc" def eye( - m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: npt.DTypeLike, format: _FmtCSC + m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: _ToDType, format: _FmtCSC ) -> csc_matrix[Incomplete]: ... @overload # dtype: , format: "csr" def eye( - m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: npt.DTypeLike, format: _FmtCSR + m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: _ToDType, format: _FmtCSR ) -> csr_matrix[Incomplete]: ... @overload # dtype: , format: "dok" def eye( - m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: npt.DTypeLike, format: _FmtDOK + m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: _ToDType, format: _FmtDOK ) -> dok_matrix[Incomplete]: ... @overload # dtype: , format: "lil" def eye( - m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: npt.DTypeLike, format: _FmtLIL + m: opt.AnyInt, n: opt.AnyInt | None = None, k: int = 0, *, dtype: _ToDType, format: _FmtLIL ) -> lil_matrix[Incomplete]: ... ### @@ -1493,25 +1495,25 @@ def hstack(blocks: Seq[sparray], format: _FmtLIL, dtype: onp.ToDType[_SCT0]) -> # @overload # sparray, format: , dtype: -def hstack(blocks: Seq[_CanStackAs[Any, _T]], format: None = None, *, dtype: npt.DTypeLike) -> _T: ... +def hstack(blocks: Seq[_CanStackAs[Any, _T]], format: None = None, *, dtype: _ToDType) -> _T: ... @overload # sparray, format: "bsr", dtype: -def hstack(blocks: Seq[sparray], format: _FmtBSR, dtype: npt.DTypeLike) -> _BSRArray: ... +def hstack(blocks: Seq[sparray], format: _FmtBSR, dtype: _ToDType) -> _BSRArray: ... @overload # sparray, format: "coo", dtype: -def hstack(blocks: Seq[sparray], format: _FmtCOO, dtype: npt.DTypeLike) -> _COOArray2D: ... +def hstack(blocks: Seq[sparray], format: _FmtCOO, dtype: _ToDType) -> _COOArray2D: ... @overload # sparray, format: "csc", dtype: -def hstack(blocks: Seq[sparray], format: _FmtCSC, dtype: npt.DTypeLike) -> _CSCArray: ... +def hstack(blocks: Seq[sparray], format: _FmtCSC, dtype: _ToDType) -> _CSCArray: ... @overload # sparray, format: "csr", dtype: -def hstack(blocks: Seq[sparray], format: _FmtCSR, dtype: npt.DTypeLike) -> _CSRArray2D: ... +def hstack(blocks: Seq[sparray], format: _FmtCSR, dtype: _ToDType) -> _CSRArray2D: ... @overload # sparray, format: "dia", dtype: -def hstack(blocks: Seq[sparray], format: _FmtDIA, dtype: npt.DTypeLike) -> _DIAArray: ... +def hstack(blocks: Seq[sparray], format: _FmtDIA, dtype: _ToDType) -> _DIAArray: ... @overload # sparray, format: "dok", dtype: -def hstack(blocks: Seq[sparray], format: _FmtDOK, dtype: npt.DTypeLike) -> _DOKArray2D: ... +def hstack(blocks: Seq[sparray], format: _FmtDOK, dtype: _ToDType) -> _DOKArray2D: ... @overload # sparray, format: "lil", dtype: -def hstack(blocks: Seq[sparray], format: _FmtLIL, dtype: npt.DTypeLike) -> _LILArray: ... +def hstack(blocks: Seq[sparray], format: _FmtLIL, dtype: _ToDType) -> _LILArray: ... # @overload -def hstack(blocks: Seq[_spbase], format: _Format, dtype: npt.DTypeLike | None = None) -> Incomplete: ... +def hstack(blocks: Seq[_spbase], format: _Format, dtype: _ToDType | None = None) -> Incomplete: ... ### # NOTE: keep in sync with `hstack` @@ -1624,25 +1626,25 @@ def vstack(blocks: Seq[sparray], format: _FmtLIL, dtype: onp.ToDType[_SCT0]) -> # @overload # sparray, format: , dtype: -def vstack(blocks: Seq[_CanStackAs[Any, _T]], format: None = None, *, dtype: npt.DTypeLike) -> _T: ... +def vstack(blocks: Seq[_CanStackAs[Any, _T]], format: None = None, *, dtype: _ToDType) -> _T: ... @overload # sparray, format: "bsr", dtype: -def vstack(blocks: Seq[sparray], format: _FmtBSR, dtype: npt.DTypeLike) -> _BSRArray: ... +def vstack(blocks: Seq[sparray], format: _FmtBSR, dtype: _ToDType) -> _BSRArray: ... @overload # sparray, format: "coo", dtype: -def vstack(blocks: Seq[sparray], format: _FmtCOO, dtype: npt.DTypeLike) -> _COOArray2D: ... +def vstack(blocks: Seq[sparray], format: _FmtCOO, dtype: _ToDType) -> _COOArray2D: ... @overload # sparray, format: "csc", dtype: -def vstack(blocks: Seq[sparray], format: _FmtCSC, dtype: npt.DTypeLike) -> _CSCArray: ... +def vstack(blocks: Seq[sparray], format: _FmtCSC, dtype: _ToDType) -> _CSCArray: ... @overload # sparray, format: "csr", dtype: -def vstack(blocks: Seq[sparray], format: _FmtCSR, dtype: npt.DTypeLike) -> _CSRArray2D: ... +def vstack(blocks: Seq[sparray], format: _FmtCSR, dtype: _ToDType) -> _CSRArray2D: ... @overload # sparray, format: "dia", dtype: -def vstack(blocks: Seq[sparray], format: _FmtDIA, dtype: npt.DTypeLike) -> _DIAArray: ... +def vstack(blocks: Seq[sparray], format: _FmtDIA, dtype: _ToDType) -> _DIAArray: ... @overload # sparray, format: "dok", dtype: -def vstack(blocks: Seq[sparray], format: _FmtDOK, dtype: npt.DTypeLike) -> _DOKArray2D: ... +def vstack(blocks: Seq[sparray], format: _FmtDOK, dtype: _ToDType) -> _DOKArray2D: ... @overload # sparray, format: "lil", dtype: -def vstack(blocks: Seq[sparray], format: _FmtLIL, dtype: npt.DTypeLike) -> _LILArray: ... +def vstack(blocks: Seq[sparray], format: _FmtLIL, dtype: _ToDType) -> _LILArray: ... # @overload -def vstack(blocks: Seq[_spbase], format: _Format, dtype: npt.DTypeLike | None = None) -> Incomplete: ... +def vstack(blocks: Seq[_spbase], format: _Format, dtype: _ToDType | None = None) -> Incomplete: ... ### @overload # blocks: , format: , dtype: @@ -1754,21 +1756,21 @@ def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: onp.ToDType[ # @overload # blocks: , format: , dtype: -def block_array(blocks: _ToBlocksCanStackAs[Any, _T], *, format: None = None, dtype: npt.DTypeLike | None = None) -> _T: ... +def block_array(blocks: _ToBlocksCanStackAs[Any, _T], *, format: None = None, dtype: _ToDType | None = None) -> _T: ... @overload # blocks: , format: "bsr", dtype: -def block_array(blocks: _ToBlocksUnkown, *, format: _FmtBSR, dtype: npt.DTypeLike | None = None) -> _BSRArray: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtBSR, dtype: _ToDType | None = None) -> _BSRArray: ... @overload # blocks: , format: "coo", dtype: -def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCOO, dtype: npt.DTypeLike | None = None) -> _COOArray2D: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCOO, dtype: _ToDType | None = None) -> _COOArray2D: ... @overload # blocks: , format: "csc", dtype: -def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSC, dtype: npt.DTypeLike | None = None) -> _CSCArray: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSC, dtype: _ToDType | None = None) -> _CSCArray: ... @overload # blocks: , format: "csr", dtype: -def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSR, dtype: npt.DTypeLike | None = None) -> _CSRArray2D: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtCSR, dtype: _ToDType | None = None) -> _CSRArray2D: ... @overload # blocks: , format: "dia", dtype: -def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDIA, dtype: npt.DTypeLike | None = None) -> _DIAArray: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDIA, dtype: _ToDType | None = None) -> _DIAArray: ... @overload # blocks: , format: "dok", dtype: -def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDOK, dtype: npt.DTypeLike | None = None) -> _DOKArray2D: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtDOK, dtype: _ToDType | None = None) -> _DOKArray2D: ... @overload # blocks: , format: "lil", dtype: -def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: npt.DTypeLike | None = None) -> _LILArray: ... +def block_array(blocks: _ToBlocksUnkown, *, format: _FmtLIL, dtype: _ToDType | None = None) -> _LILArray: ... ### @overload # blocks: , format: , dtype: @@ -1786,11 +1788,11 @@ def bmat(blocks: _ToBlocksUnkown, format: _Format, dtype: onp.ToDType[_SCT0]) -> # @overload # blocks: , format: , dtype: -def bmat(blocks: _ToBlocksCanStackAs[Any, _T], format: None = None, *, dtype: npt.DTypeLike) -> _T: ... +def bmat(blocks: _ToBlocksCanStackAs[Any, _T], format: None = None, *, dtype: _ToDType) -> _T: ... @overload # blocks: , format: , dtype: -def bmat(blocks: _ToBlocksSPMatrix, format: _Format, *, dtype: npt.DTypeLike) -> spmatrix: ... +def bmat(blocks: _ToBlocksSPMatrix, format: _Format, *, dtype: _ToDType) -> spmatrix: ... @overload # blocks: , format: , dtype: -def bmat(blocks: _ToBlocksUnkown, format: _Format, *, dtype: npt.DTypeLike) -> spmatrix | _SpArray2D: ... +def bmat(blocks: _ToBlocksUnkown, format: _Format, *, dtype: _ToDType) -> spmatrix | _SpArray2D: ... ### @overload # mats: , format: , dtype: None @@ -1931,20 +1933,20 @@ def block_diag(mats: _ToMatsDiagUnknown, format: _FmtLIL, dtype: onp.ToDType[_SC # @overload # mats: , format: , dtype: def block_diag( - mats: _ToMatsDiagUnknown, format: _FmtCOO | None = None, dtype: npt.DTypeLike | None = None + mats: _ToMatsDiagUnknown, format: _FmtCOO | None = None, dtype: _ToDType | None = None ) -> _COOArray2D | coo_matrix: ... @overload # mats: , format: "bsr", dtype: -def block_diag(mats: _ToMatsDiagUnknown, format: _FmtBSR, dtype: npt.DTypeLike | None = None) -> _BSRArray | bsr_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtBSR, dtype: _ToDType | None = None) -> _BSRArray | bsr_matrix: ... @overload # mats: , format: "csc", dtype: -def block_diag(mats: _ToMatsDiagUnknown, format: _FmtCSC, dtype: npt.DTypeLike | None = None) -> _CSCArray | csc_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtCSC, dtype: _ToDType | None = None) -> _CSCArray | csc_matrix: ... @overload # mats: , format: "csr", dtype: -def block_diag(mats: _ToMatsDiagUnknown, format: _FmtCSR, dtype: npt.DTypeLike | None = None) -> _CSRArray2D | csr_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtCSR, dtype: _ToDType | None = None) -> _CSRArray2D | csr_matrix: ... @overload # mats: , format: "dia", dtype: -def block_diag(mats: _ToMatsDiagUnknown, format: _FmtDIA, dtype: npt.DTypeLike | None = None) -> _DIAArray | dia_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtDIA, dtype: _ToDType | None = None) -> _DIAArray | dia_matrix: ... @overload # mats: , format: "dok", dtype: -def block_diag(mats: _ToMatsDiagUnknown, format: _FmtDOK, dtype: npt.DTypeLike | None = None) -> _DOKArray2D | dok_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtDOK, dtype: _ToDType | None = None) -> _DOKArray2D | dok_matrix: ... @overload # mats: , format: "lil", dtype: -def block_diag(mats: _ToMatsDiagUnknown, format: _FmtLIL, dtype: npt.DTypeLike | None = None) -> _LILArray | lil_matrix: ... +def block_diag(mats: _ToMatsDiagUnknown, format: _FmtLIL, dtype: _ToDType | None = None) -> _LILArray | lil_matrix: ... ### @overload # shape: T, format: , dtype: @@ -2025,7 +2027,7 @@ def random_array( *, density: float | npc.floating = 0.01, format: _FmtCOO = "coo", - dtype: npt.DTypeLike, + dtype: _ToDType, rng: onp.random.ToRNG | None = None, random_state: onp.random.ToRNG | None = None, data_sampler: _DataSampler | None = None, @@ -2036,7 +2038,7 @@ def random_array( *, density: float | npc.floating = 0.01, format: _FmtNonCOO, - dtype: npt.DTypeLike, + dtype: _ToDType, rng: onp.random.ToRNG | None = None, random_state: onp.random.ToRNG | None = None, data_sampler: _DataSampler | None = None, @@ -2180,7 +2182,7 @@ def random( n: opt.AnyInt, density: float | npc.floating = 0.01, format: _FmtCOO = "coo", - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, rng: onp.random.ToRNG | None = None, data_rvs: _DataRVS | None = None, *, @@ -2193,7 +2195,7 @@ def random( density: float | npc.floating = 0.01, *, format: _FmtNonCOO, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, rng: onp.random.ToRNG | None = None, data_rvs: _DataRVS | None = None, random_state: onp.random.ToRNG | None = None, @@ -2204,7 +2206,7 @@ def random( n: opt.AnyInt, density: float | npc.floating, format: _FmtNonCOO, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, rng: onp.random.ToRNG | None = None, data_rvs: _DataRVS | None = None, *, @@ -2339,7 +2341,7 @@ def rand( n: opt.AnyInt, density: float | npc.floating = 0.01, format: _FmtCOO = "coo", - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, rng: onp.random.ToRNG | None = None, *, random_state: onp.random.ToRNG | None = None, @@ -2351,7 +2353,7 @@ def rand( density: float | npc.floating = 0.01, *, format: _FmtNonCOO, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, rng: onp.random.ToRNG | None = None, random_state: onp.random.ToRNG | None = None, ) -> spmatrix: ... @@ -2361,7 +2363,7 @@ def rand( n: opt.AnyInt, density: float | npc.floating, format: _FmtNonCOO, - dtype: npt.DTypeLike | None = None, + dtype: _ToDType | None = None, rng: onp.random.ToRNG | None = None, *, random_state: onp.random.ToRNG | None = None, From 3f64a1a1ca8f680771b4c32c9362ffcac5cccc29 Mon Sep 17 00:00:00 2001 From: Jul Van den Broeck Date: Sun, 3 Aug 2025 11:15:18 +0200 Subject: [PATCH 15/15] Removed unused import --- scipy-stubs/sparse/_construct.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/scipy-stubs/sparse/_construct.pyi b/scipy-stubs/sparse/_construct.pyi index b0d2aafd..460a5994 100644 --- a/scipy-stubs/sparse/_construct.pyi +++ b/scipy-stubs/sparse/_construct.pyi @@ -3,7 +3,6 @@ from collections.abc import Callable, Iterable, Sequence as Seq from typing import Any, Literal, Never, Protocol, TypeAlias, TypeVar, overload, type_check_only import numpy as np -import numpy.typing as npt import optype.numpy as onp import optype.numpy.compat as npc import optype.typing as opt