1
1
from collections .abc import Callable , Mapping , Sequence
2
2
from typing import Any , Concatenate , Final , Literal , Protocol , TypeAlias , TypedDict , TypeVar , overload , type_check_only
3
+ from typing_extensions import LiteralString
3
4
4
5
import numpy as np
5
6
import optype .numpy as onp
7
+ import optype .numpy .compat as npc
6
8
from scipy ._typing import Falsy , Truthy
7
9
from scipy .sparse .linalg import LinearOperator
8
10
from ._hessian_update_strategy import HessianUpdateStrategy
@@ -13,9 +15,13 @@ __all__ = ["minimize", "minimize_scalar"]
13
15
14
16
###
15
17
18
+ _T = TypeVar ("_T" )
19
+ _Tuple2 : TypeAlias = tuple [_T , _T ]
20
+ _Tuple3 : TypeAlias = tuple [_T , _T , _T ]
16
21
_Args : TypeAlias = tuple [object , ...]
17
22
18
23
_Float : TypeAlias = float | np .float64
24
+ _Floating : TypeAlias = float | npc .floating
19
25
_Float1D : TypeAlias = onp .Array1D [np .float64 ]
20
26
_Float2D : TypeAlias = onp .Array2D [np .float64 ]
21
27
@@ -26,6 +32,13 @@ _Fun1Dp: TypeAlias = Callable[Concatenate[_Float1D, _Float1D, ...], _RT]
26
32
27
33
_FDMethod : TypeAlias = Literal ["2-point" , "3-point" , "cs" ]
28
34
35
+ _ToBracket : TypeAlias = Sequence [_Tuple2 [onp .ToFloat ] | _Tuple3 [onp .ToFloat ]]
36
+ _ToBound : TypeAlias = _Tuple2 [onp .ToFloat ]
37
+ _Ignored : TypeAlias = object
38
+
39
+ _MinimizeScalarResultT = TypeVar ("_MinimizeScalarResultT" , bound = _MinimizeScalarResultBase )
40
+ _MinimizeScalarResultT_co = TypeVar ("_MinimizeScalarResultT_co" , bound = _MinimizeScalarResultBase , covariant = True )
41
+
29
42
@type_check_only
30
43
class _CallbackResult (Protocol ):
31
44
def __call__ (self , / , intermediate_result : OptimizeResult ) -> None : ...
@@ -38,88 +51,117 @@ class _CallbackVector(Protocol):
38
51
class _MinimizeMethodFun (Protocol ):
39
52
def __call__ (self , fun : _Fun1D [onp .ToFloat ], x0 : onp .ToFloat1D , / , args : _Args , ** kwargs : Any ) -> OptimizeResult : ...
40
53
54
+ @type_check_only
55
+ class _MinimizeScalarMethodFun (Protocol [_MinimizeScalarResultT_co ]):
56
+ def __call__ (
57
+ self ,
58
+ fun : _Fun0D [onp .ToFloat ],
59
+ / ,
60
+ * ,
61
+ args : _Args ,
62
+ bracket : _ToBracket ,
63
+ bound : _ToBound ,
64
+ ** options : Any ,
65
+ ) -> _MinimizeScalarResultT_co : ...
66
+
41
67
@type_check_only
42
68
class _MinimizeOptions (TypedDict , total = False ):
43
69
# Nelder-Mead, Powell, CG, BFGS, Newton-CG
44
- return_all : bool
70
+ return_all : onp . ToBool
45
71
# Nelder-Mead, Powell, CG, BFGS, L-BFGS-B, Newton-CG, TNC, COBYLA, COBYQA, SLSQP, trust-constr
46
- disp : bool
72
+ disp : onp . ToBool
47
73
# Nelder-Mead, Powell, CG, BFGS, L-BFGS-B, Newton-CG, COBYLA, SLSQP, trust-constr
48
74
maxiter : int
49
75
# Nelder-Mead, Powell, COBYQA
50
76
maxfev : int
51
77
# TNC
52
78
maxCGit : int
53
- offset : float
54
- stepmx : float
55
- accuracy : float
56
- minfev : float
57
- rescale : float
79
+ offset : _Floating
80
+ stepmx : _Floating
81
+ accuracy : _Floating
82
+ minfev : _Floating
83
+ rescale : _Floating
58
84
# L-BFGS-B, TNC
59
85
maxfun : int
60
86
# L-BFGS-B
61
87
maxcor : int
62
88
iprint : int
63
89
maxls : int
64
90
# Nelder-Mead
65
- initial_simplex : onp .ToArrayND
66
- adaptive : bool
67
- xatol : float
68
- fatol : float
91
+ initial_simplex : onp .ToFloatND
92
+ adaptive : onp . ToBool
93
+ xatol : _Floating
94
+ fatol : _Floating
69
95
# CG, BFGS, L-BFGS-B, dogleg, trust-ncg, trust-exact, TNC, trust-constr
70
- gtol : float
96
+ gtol : _Floating
71
97
# Powell, Newton-CG, TNC, trust-constr
72
- xtol : float
98
+ xtol : _Floating
73
99
# Powell, L-BFGS-B, TNC, SLSQP
74
- ftol : float
100
+ ftol : _Floating
75
101
# BFGS
76
- xrtol : float
77
- hess_inv0 : onp .ArrayND [np .floating [ Any ] ]
102
+ xrtol : _Floating
103
+ hess_inv0 : onp .ArrayND [npc .floating ]
78
104
# COBYLA
79
- tol : float
80
- catool : float
81
- rhobeg : float
82
- f_target : float
105
+ tol : _Floating
106
+ catool : _Floating
107
+ rhobeg : _Floating
108
+ f_target : _Floating
83
109
# COBYQA
84
- feasibility_tol : float
85
- final_tr_radius : float
110
+ feasibility_tol : _Floating
111
+ final_tr_radius : _Floating
86
112
# Powell
87
- direc : onp .ArrayND [np .floating [ Any ] ]
113
+ direc : onp .ArrayND [npc .floating ]
88
114
# CG, BFGS, Newton-CG, L-BFGS-B, TNC, SLSQP
89
- eps : float | onp .ArrayND [np .floating [ Any ] ]
115
+ eps : _Floating | onp .ArrayND [npc .floating ]
90
116
# CG, BFGS, Newton-CG
91
- c1 : float
92
- c2 : float
117
+ c1 : _Floating
118
+ c2 : _Floating
93
119
# CG, BFGS
94
- norm : float
120
+ norm : _Floating
95
121
# CG, BFGS, L-BFGS-B, TNC, SLSQP, trust-constr
96
- finite_diff_rel_step : onp .ToFloat | onp .ToArrayND
122
+ finite_diff_rel_step : onp .ToFloat | onp .ToFloatND
97
123
# dogleg, trust-ncg, trust-exact
98
- initial_trust_radius : float
99
- max_trust_radius : float
124
+ initial_trust_radius : _Floating
125
+ max_trust_radius : _Floating
100
126
# COBYQA, trust-constr
101
- initial_tr_radius : float
127
+ initial_tr_radius : _Floating
102
128
# trust-constr
103
- barrier_tol : float
104
- sparse_jacobian : bool
105
- initial_constr_penalty : float
106
- initial_barrier_parameter : float
107
- initial_barrier_tolerance : float
129
+ barrier_tol : _Floating
130
+ sparse_jacobian : onp . ToBool
131
+ initial_constr_penalty : _Floating
132
+ initial_barrier_parameter : _Floating
133
+ initial_barrier_tolerance : _Floating
108
134
factorization_method : Literal ["NormalEquation" , "AugmentedSystem" , "QRFactorization" , "SVDFactorization" ]
109
135
verbose : Literal [0 , 1 , 2 , 3 ]
110
136
# dogleg, trust-ncg, trust-exact, TNC
111
- eta : float
137
+ eta : _Floating
112
138
# trust-krylov
113
- inexact : bool
139
+ inexact : onp . ToBool
114
140
# TNC (list of floats), COBYQA (bool)
115
- scale : Sequence [float ] | bool
141
+ scale : Sequence [_Floating ] | onp .ToBool
142
+
143
+ @type_check_only
144
+ class _MinimizeScalarOptionsCommon (TypedDict , total = False ):
145
+ maxiter : int
146
+ disp : Literal [0 , 1 , 2 , 3 ]
116
147
117
148
@type_check_only
118
- class _MinimizeScalarResult (_OptimizeResult ):
149
+ class _MinimizeScalarOptionsBracketed (_MinimizeScalarOptionsCommon , TypedDict , total = False ):
150
+ xtol : _Floating
151
+
152
+ @type_check_only
153
+ class _MinimizeScalarOptionsBounded (_MinimizeScalarOptionsCommon , TypedDict , total = False ):
154
+ xatol : _Floating
155
+
156
+ @type_check_only
157
+ class _MinimizeScalarResultBase (_OptimizeResult ):
119
158
x : _Float
120
159
fun : _Float
160
+
161
+ @type_check_only
162
+ class _MinimizeScalarResult (_MinimizeScalarResultBase ):
121
163
success : bool
122
- message : str
164
+ message : LiteralString
123
165
nit : int
124
166
nfev : int
125
167
@@ -129,11 +171,11 @@ MINIMIZE_METHODS: Final[list[MethodMimimize]] = ...
129
171
MINIMIZE_METHODS_NEW_CB : Final [list [MethodMimimize ]] = ...
130
172
MINIMIZE_SCALAR_METHODS : Final [list [MethodMinimizeScalar ]] = ...
131
173
132
- # NOTE: This `OptimizeResult` "flavor" is Specific to `minimize`
174
+ # NOTE: This `OptimizeResult` "flavor" is specific to `minimize`
133
175
class OptimizeResult (_OptimizeResult ):
134
176
success : bool
135
177
status : int
136
- message : str
178
+ message : LiteralString
137
179
x : _Float1D
138
180
nit : int
139
181
maxcv : float # requires `bounds`
@@ -180,7 +222,7 @@ def minimize(
180
222
fun : _Fun1D [tuple [onp .ToFloat , onp .ToFloat1D ]],
181
223
x0 : onp .ToFloat1D ,
182
224
args : _Args = (),
183
- method : _MinimizeMethodFun | MethodMimimize | None = None ,
225
+ method : MethodMimimize | _MinimizeMethodFun | None = None ,
184
226
* ,
185
227
jac : Truthy ,
186
228
hess : _Fun1D [onp .ToFloat2D ] | _FDMethod | HessianUpdateStrategy | None = None ,
@@ -193,15 +235,58 @@ def minimize(
193
235
) -> OptimizeResult : ...
194
236
195
237
#
238
+ @overload # method="brent" or method="golden"
196
239
def minimize_scalar (
197
240
fun : _Fun0D [onp .ToFloat ],
198
- bracket : Sequence [ tuple [ onp . ToFloat , onp . ToFloat ] | tuple [ onp . ToFloat , onp . ToFloat , onp . ToFloat ]] | None = None ,
199
- bounds : Bound | None = None ,
241
+ bracket : _ToBracket ,
242
+ bounds : None = None ,
200
243
args : _Args = (),
201
- method : MethodMinimizeScalar | Callable [..., _MinimizeScalarResult ] | None = None ,
244
+ method : Literal [ "brent" , "golden" ] | None = None , # default: "brent"
202
245
tol : onp .ToFloat | None = None ,
203
- options : Mapping [ str , object ] | None = None ,
246
+ options : _MinimizeScalarOptionsBracketed | None = None ,
204
247
) -> _MinimizeScalarResult : ...
248
+ @overload # bound=<given> (positional)
249
+ def minimize_scalar (
250
+ fun : _Fun0D [onp .ToFloat ],
251
+ bracket : _Ignored | None ,
252
+ bounds : _ToBound ,
253
+ args : _Args ,
254
+ method : Literal ["bounded" ] | None = None ,
255
+ tol : onp .ToFloat | None = None ,
256
+ options : _MinimizeScalarOptionsBounded | None = None ,
257
+ ) -> _MinimizeScalarResult : ...
258
+ @overload # bound=<given> (keyword)
259
+ def minimize_scalar (
260
+ fun : _Fun0D [onp .ToFloat ],
261
+ bracket : _Ignored | None = None ,
262
+ * ,
263
+ bounds : _ToBound ,
264
+ args : _Args ,
265
+ method : Literal ["bounded" ] | None = None ,
266
+ tol : onp .ToFloat | None = None ,
267
+ options : _MinimizeScalarOptionsBounded | None = None ,
268
+ ) -> _MinimizeScalarResult : ...
269
+ @overload # method=<custom> (positional)
270
+ def minimize_scalar (
271
+ fun : _Fun0D [onp .ToFloat ],
272
+ bracket : _ToBracket | None ,
273
+ bounds : _ToBound | None ,
274
+ args : _Args ,
275
+ method : _MinimizeScalarMethodFun [_MinimizeScalarResultT ],
276
+ tol : onp .ToFloat | None = None ,
277
+ options : Mapping [str , object ] | None = None ,
278
+ ) -> _MinimizeScalarResultT : ...
279
+ @overload # method=<custom> (keyword)
280
+ def minimize_scalar (
281
+ fun : _Fun0D [onp .ToFloat ],
282
+ bracket : _ToBracket | None = None ,
283
+ bounds : _ToBound | None = None ,
284
+ args : _Args = (),
285
+ * ,
286
+ method : _MinimizeScalarMethodFun [_MinimizeScalarResultT ],
287
+ tol : onp .ToFloat | None = None ,
288
+ options : Mapping [str , object ] | None = None ,
289
+ ) -> _MinimizeScalarResultT : ...
205
290
206
291
# undocumented
207
292
def standardize_bounds (bounds : Bounds , x0 : onp .ToFloat1D , meth : MethodMimimize ) -> Bounds | list [Bound ]: ...
0 commit comments