|
1 |
| -from typing import Any, TypeVar, overload |
| 1 | +from _typeshed import Incomplete |
| 2 | +from typing import Any, Never, TypeAlias, TypeVar, overload |
2 | 3 |
|
3 | 4 | import numpy as np
|
4 | 5 | import optype as op
|
5 | 6 | import optype.numpy as onp
|
| 7 | +import optype.numpy.compat as npc |
6 | 8 |
|
7 |
| -from scipy.sparse._typing import Numeric |
8 |
| -from scipy.sparse.linalg._interface import LinearOperator |
| 9 | +from ._interface import LinearOperator |
| 10 | +from scipy.sparse._base import _spbase, sparray |
9 | 11 |
|
10 | 12 | __all__ = ["expm_multiply"]
|
11 | 13 |
|
12 |
| -_SCT = TypeVar("_SCT", bound=Numeric) |
| 14 | +_ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_) |
| 15 | +_InexactT = TypeVar("_InexactT", bound=npc.inexact) |
| 16 | +_ShapeT = TypeVar("_ShapeT", bound=tuple[Any, ...]) |
| 17 | + |
| 18 | +_ToLinearOperator: TypeAlias = LinearOperator[_ScalarT] | _spbase[_ScalarT, tuple[int, int]] | onp.ArrayND[_ScalarT] |
| 19 | +_SparseOrDense: TypeAlias = sparray[_ScalarT, _ShapeT] | onp.ArrayND[_ScalarT, _ShapeT] |
| 20 | + |
| 21 | +_AsFloat64: TypeAlias = np.float64 | npc.integer | np.bool_ |
| 22 | +_ToFloat64: TypeAlias = _AsFloat64 | np.float32 | np.float16 |
13 | 23 |
|
14 | 24 | ###
|
15 | 25 |
|
| 26 | +@overload # workaround for mypy's and pyright's typing spec non-compliance regarding overloads |
| 27 | +def expm_multiply( |
| 28 | + A: _ToLinearOperator[_AsFloat64], |
| 29 | + B: _SparseOrDense[_ToFloat64, tuple[Never] | tuple[Never, Never]], |
| 30 | + start: onp.ToFloat | None = None, |
| 31 | + stop: onp.ToFloat | None = None, |
| 32 | + num: op.CanIndex | None = None, |
| 33 | + endpoint: bool | None = None, |
| 34 | + traceA: onp.ToComplex | None = None, |
| 35 | +) -> onp.ArrayND[np.float64]: ... |
| 36 | +@overload |
| 37 | +def expm_multiply( |
| 38 | + A: _ToLinearOperator[_InexactT], |
| 39 | + B: _SparseOrDense[_InexactT | npc.integer | np.bool_, tuple[Never] | tuple[Never, Never]], |
| 40 | + start: onp.ToFloat | None = None, |
| 41 | + stop: onp.ToFloat | None = None, |
| 42 | + num: op.CanIndex | None = None, |
| 43 | + endpoint: bool | None = None, |
| 44 | + traceA: onp.ToComplex | None = None, |
| 45 | +) -> onp.ArrayND[_InexactT]: ... |
16 | 46 | @overload # 1-d
|
17 | 47 | def expm_multiply(
|
18 |
| - A: LinearOperator[_SCT], |
19 |
| - B: onp.Array1D[_SCT | np.integer[Any] | np.float16 | np.bool_], |
| 48 | + A: _ToLinearOperator[_AsFloat64], |
| 49 | + B: _SparseOrDense[_ToFloat64, tuple[int]], |
| 50 | + start: onp.ToFloat | None = None, |
| 51 | + stop: onp.ToFloat | None = None, |
| 52 | + num: op.CanIndex | None = None, |
| 53 | + endpoint: bool | None = None, |
| 54 | + traceA: onp.ToComplex | None = None, |
| 55 | +) -> onp.Array1D[np.float64]: ... |
| 56 | +@overload |
| 57 | +def expm_multiply( |
| 58 | + A: _ToLinearOperator[_InexactT], |
| 59 | + B: _SparseOrDense[_InexactT | npc.integer | np.bool_, tuple[int]], |
20 | 60 | start: onp.ToFloat | None = None,
|
21 | 61 | stop: onp.ToFloat | None = None,
|
22 | 62 | num: op.CanIndex | None = None,
|
23 | 63 | endpoint: bool | None = None,
|
24 | 64 | traceA: onp.ToComplex | None = None,
|
25 |
| -) -> onp.Array1D[_SCT]: ... |
| 65 | +) -> onp.Array1D[_InexactT]: ... |
26 | 66 | @overload # 2-d
|
27 | 67 | def expm_multiply(
|
28 |
| - A: LinearOperator[_SCT], |
29 |
| - B: onp.Array2D[_SCT | np.integer[Any] | np.float16 | np.bool_], |
| 68 | + A: _ToLinearOperator[_AsFloat64], |
| 69 | + B: _SparseOrDense[_ToFloat64, tuple[int, int]], |
| 70 | + start: onp.ToFloat | None = None, |
| 71 | + stop: onp.ToFloat | None = None, |
| 72 | + num: op.CanIndex | None = None, |
| 73 | + endpoint: bool | None = None, |
| 74 | + traceA: onp.ToComplex | None = None, |
| 75 | +) -> onp.Array2D[np.float64]: ... |
| 76 | +@overload |
| 77 | +def expm_multiply( |
| 78 | + A: _ToLinearOperator[_InexactT], |
| 79 | + B: _SparseOrDense[_InexactT | npc.integer | np.bool_, tuple[int, int]], |
30 | 80 | start: onp.ToFloat | None = None,
|
31 | 81 | stop: onp.ToFloat | None = None,
|
32 | 82 | num: op.CanIndex | None = None,
|
33 | 83 | endpoint: bool | None = None,
|
34 | 84 | traceA: onp.ToComplex | None = None,
|
35 |
| -) -> onp.Array2D[_SCT]: ... |
| 85 | +) -> onp.Array2D[_InexactT]: ... |
36 | 86 | @overload # 1-d or 2-d
|
37 | 87 | def expm_multiply(
|
38 |
| - A: LinearOperator[_SCT], |
39 |
| - B: onp.ArrayND[_SCT | np.float16 | np.integer[Any] | np.bool_], |
| 88 | + A: _ToLinearOperator[_AsFloat64], |
| 89 | + B: _SparseOrDense[_ToFloat64, tuple[Any, ...]], |
| 90 | + start: onp.ToFloat | None = None, |
| 91 | + stop: onp.ToFloat | None = None, |
| 92 | + num: op.CanIndex | None = None, |
| 93 | + endpoint: bool | None = None, |
| 94 | + traceA: onp.ToComplex | None = None, |
| 95 | +) -> onp.ArrayND[np.float64]: ... |
| 96 | +@overload |
| 97 | +def expm_multiply( |
| 98 | + A: _ToLinearOperator[_InexactT], |
| 99 | + B: _SparseOrDense[_InexactT | npc.integer | np.bool_, tuple[Any, ...]], |
| 100 | + start: onp.ToFloat | None = None, |
| 101 | + stop: onp.ToFloat | None = None, |
| 102 | + num: op.CanIndex | None = None, |
| 103 | + endpoint: bool | None = None, |
| 104 | + traceA: onp.ToComplex | None = None, |
| 105 | +) -> onp.ArrayND[_InexactT]: ... |
| 106 | +@overload # fallback |
| 107 | +def expm_multiply( |
| 108 | + A: _ToLinearOperator[npc.number], |
| 109 | + B: _SparseOrDense[npc.number, tuple[Any, ...]], |
40 | 110 | start: onp.ToFloat | None = None,
|
41 | 111 | stop: onp.ToFloat | None = None,
|
42 | 112 | num: op.CanIndex | None = None,
|
43 | 113 | endpoint: bool | None = None,
|
44 | 114 | traceA: onp.ToComplex | None = None,
|
45 |
| -) -> onp.Array1D[_SCT] | onp.Array2D[_SCT]: ... |
| 115 | +) -> onp.ArrayND[Incomplete]: ... |
0 commit comments