@@ -17,8 +17,15 @@ _ScalarT = TypeVar("_ScalarT", bound=npc.number | np.bool_)
17
17
_Inexact64T = TypeVar ("_Inexact64T" , bound = np .float64 | np .complex128 )
18
18
_Inexact64T_co = TypeVar ("_Inexact64T_co" , bound = np .float64 | np .complex128 , default = np .float64 | np .complex128 , covariant = True )
19
19
20
- _FuncSol : TypeAlias = Callable [[np .float64 ], onp .ArrayND [_Inexact64T ]]
21
- _FuncEvent : TypeAlias = Callable [[np .float64 , onp .ArrayND [_Inexact64T ], * _Ts ], float ]
20
+ # numpy <2.2 workarounds
21
+ _Float : TypeAlias = np .float64 | float
22
+ _FloatT = TypeVar ("_FloatT" , bound = _Float )
23
+
24
+ _FuncSol : TypeAlias = Callable [[np .float64 ], onp .ArrayND [_Inexact64T ]] | Callable [[float ], onp .ArrayND [_Inexact64T ]]
25
+ _FuncEvent : TypeAlias = (
26
+ Callable [[np .float64 , onp .ArrayND [_Inexact64T ], * _Ts ], _Float ]
27
+ | Callable [[float , onp .ArrayND [_Inexact64T ], * _Ts ], _Float ]
28
+ ) # fmt: skip
22
29
_Events : TypeAlias = Sequence [_FuncEvent [_Inexact64T , * _Ts ]] | _FuncEvent [_Inexact64T , * _Ts ]
23
30
24
31
_Int1D : TypeAlias = onp .Array1D [np .int_ ]
@@ -27,6 +34,9 @@ _Float2D: TypeAlias = onp.Array2D[np.float64]
27
34
_Complex1D : TypeAlias = onp .Array1D [np .complex128 ]
28
35
_Complex2D : TypeAlias = onp .Array2D [np .complex128 ]
29
36
37
+ _ToFloatMax1D : TypeAlias = onp .ToFloat1D | onp .ToFloat
38
+ _ToComplexMax1D : TypeAlias = onp .ToComplex1D | onp .ToComplex
39
+
30
40
_Sparse2D : TypeAlias = _spbase [_ScalarT , tuple [int , int ]] | sparray [_ScalarT , tuple [int , int ]] | spmatrix [_ScalarT ]
31
41
_ToJac : TypeAlias = onp .ToArray2D [complex , npc .inexact ] | _Sparse2D [npc .inexact ]
32
42
@@ -75,10 +85,10 @@ def handle_events(
75
85
) -> tuple [_Int1D , _Float1D , bool ]: ...
76
86
def find_active_events (g : onp .ToFloat1D , g_new : onp .ToFloat1D , direction : onp .ArrayND [np .float64 ]) -> _Int1D : ...
77
87
78
- #
88
+ # NOTE: The *free* `_FloatT` type variable works around `float64` not being a subtype of `float` on `numpy <2.2`.
79
89
@overload # float, vectorized=False (default), args=None (default)
80
90
def solve_ivp (
81
- fun : Callable [[np . float64 , _Float1D ], onp . ToFloat1D | float ],
91
+ fun : Callable [[_FloatT , _Float1D ], _ToFloatMax1D ],
82
92
t_span : Sequence [float ],
83
93
y0 : onp .ToFloat1D ,
84
94
method : _IVPMethod = "RK45" ,
@@ -91,7 +101,7 @@ def solve_ivp(
91
101
) -> OdeResult [np .float64 ]: ...
92
102
@overload # float, vectorized=False (default), args=<given>
93
103
def solve_ivp (
94
- fun : Callable [[np . float64 , _Float1D , * _Ts ], onp . ToFloat1D | float ],
104
+ fun : Callable [[_FloatT , _Float1D , * _Ts ], _ToFloatMax1D ],
95
105
t_span : Sequence [float ],
96
106
y0 : onp .ToFloat1D ,
97
107
method : _IVPMethod = "RK45" ,
@@ -133,7 +143,7 @@ def solve_ivp(
133
143
) -> OdeResult [np .float64 ]: ...
134
144
@overload # complex, vectorized=False (default), args=None (default)
135
145
def solve_ivp (
136
- fun : Callable [[np . float64 , _Complex1D ], onp . ToComplex1D | complex ],
146
+ fun : Callable [[_FloatT , _Complex1D ], _ToComplexMax1D ],
137
147
t_span : Sequence [float ],
138
148
y0 : onp .ToComplex1D ,
139
149
method : _IVPMethod = "RK45" ,
@@ -146,7 +156,7 @@ def solve_ivp(
146
156
) -> OdeResult [np .complex128 ]: ...
147
157
@overload # complex, vectorized=False (default), args=<given>
148
158
def solve_ivp (
149
- fun : Callable [[np . float64 , _Complex1D , * _Ts ], onp . ToComplex1D | complex ],
159
+ fun : Callable [[_FloatT , _Complex1D , * _Ts ], _ToComplexMax1D ],
150
160
t_span : Sequence [float ],
151
161
y0 : onp .ToComplex1D ,
152
162
method : _IVPMethod = "RK45" ,
0 commit comments