better-optimize 0.0.3__tar.gz → 0.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {better_optimize-0.0.3 → better_optimize-0.0.4}/PKG-INFO +1 -1
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize/_version.py +3 -3
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize/constants.py +24 -12
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize/minimize.py +1 -1
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize/root.py +1 -1
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize/utilities.py +12 -5
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize/wrapper.py +7 -2
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize.egg-info/PKG-INFO +1 -1
- {better_optimize-0.0.3 → better_optimize-0.0.4}/README.md +0 -0
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize/__init__.py +0 -0
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize.egg-info/SOURCES.txt +0 -0
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize.egg-info/dependency_links.txt +0 -0
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize.egg-info/requires.txt +0 -0
- {better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize.egg-info/top_level.txt +0 -0
- {better_optimize-0.0.3 → better_optimize-0.0.4}/pyproject.toml +0 -0
- {better_optimize-0.0.3 → better_optimize-0.0.4}/setup.cfg +0 -0
- {better_optimize-0.0.3 → better_optimize-0.0.4}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: better_optimize
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.4
|
|
4
4
|
Summary: A drop-in replacement for scipy optimize functions with quality of life improvements
|
|
5
5
|
License: MIT License
|
|
6
6
|
Project-URL: Homepage, https://github.com/jessegrabowski/better_optimize
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2024-08-
|
|
11
|
+
"date": "2024-08-21T05:49:44+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "0.0.
|
|
14
|
+
"full-revisionid": "f51ee88e4ef9f5f8708d8a8e910e04dd4d6e3bde",
|
|
15
|
+
"version": "0.0.4"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -37,6 +37,7 @@ MINIMIZE_MODE_KWARGS = {
|
|
|
37
37
|
"uses_grad": False,
|
|
38
38
|
"uses_hess": False,
|
|
39
39
|
"uses_hessp": False,
|
|
40
|
+
"f_maxiter_default": lambda n: 200 * n,
|
|
40
41
|
"valid_options": [
|
|
41
42
|
"disp",
|
|
42
43
|
"maxiter",
|
|
@@ -53,12 +54,14 @@ MINIMIZE_MODE_KWARGS = {
|
|
|
53
54
|
"uses_grad": False,
|
|
54
55
|
"uses_hess": False,
|
|
55
56
|
"uses_hessp": False,
|
|
57
|
+
"f_maxiter_default": lambda n: 1000 * n,
|
|
56
58
|
"valid_options": ["disp", "xtol", "ftol", "maxiter", "maxfev", "direc", "return_all"],
|
|
57
59
|
},
|
|
58
60
|
"CG": {
|
|
59
61
|
"uses_grad": True,
|
|
60
62
|
"uses_hess": False,
|
|
61
63
|
"uses_hessp": False,
|
|
64
|
+
"f_maxiter_default": lambda n: 200 * n,
|
|
62
65
|
"valid_options": [
|
|
63
66
|
"disp",
|
|
64
67
|
"maxiter",
|
|
@@ -75,6 +78,7 @@ MINIMIZE_MODE_KWARGS = {
|
|
|
75
78
|
"uses_grad": True,
|
|
76
79
|
"uses_hess": False,
|
|
77
80
|
"uses_hessp": False,
|
|
81
|
+
"f_maxiter_default": lambda n: 200 * n,
|
|
78
82
|
"valid_options": [
|
|
79
83
|
"disp",
|
|
80
84
|
"maxiter",
|
|
@@ -93,12 +97,14 @@ MINIMIZE_MODE_KWARGS = {
|
|
|
93
97
|
"uses_grad": True,
|
|
94
98
|
"uses_hess": True,
|
|
95
99
|
"uses_hessp": True,
|
|
100
|
+
"f_maxiter_default": lambda n: 200 * n,
|
|
96
101
|
"valid_options": ["disp", "xtol", "maxiter", "eps", "return_all", "c1", "c2"],
|
|
97
102
|
},
|
|
98
103
|
"L-BFGS-B": {
|
|
99
104
|
"uses_grad": True,
|
|
100
105
|
"uses_hess": False,
|
|
101
106
|
"uses_hessp": False,
|
|
107
|
+
"f_maxiter_default": lambda n: 200 * n,
|
|
102
108
|
"valid_options": [
|
|
103
109
|
"disp",
|
|
104
110
|
"maxcor",
|
|
@@ -116,6 +122,7 @@ MINIMIZE_MODE_KWARGS = {
|
|
|
116
122
|
"uses_grad": True,
|
|
117
123
|
"uses_hess": False,
|
|
118
124
|
"uses_hessp": False,
|
|
125
|
+
"f_maxiter_default": lambda n: max(100, 10 * n),
|
|
119
126
|
"valid_options": [
|
|
120
127
|
"eps",
|
|
121
128
|
"scale",
|
|
@@ -138,12 +145,14 @@ MINIMIZE_MODE_KWARGS = {
|
|
|
138
145
|
"uses_grad": False,
|
|
139
146
|
"uses_hess": False,
|
|
140
147
|
"uses_hessp": False,
|
|
148
|
+
"f_maxiter_default": lambda n: 1000,
|
|
141
149
|
"valid_options": ["rhobeg", "tol", "disp", "maxiter", "catol"],
|
|
142
150
|
},
|
|
143
151
|
"SLSQP": {
|
|
144
152
|
"uses_grad": True,
|
|
145
153
|
"uses_hess": False,
|
|
146
154
|
"uses_hessp": False,
|
|
155
|
+
"f_maxiter_default": lambda n: 100,
|
|
147
156
|
"valid_options": [
|
|
148
157
|
"ftol",
|
|
149
158
|
"eps",
|
|
@@ -156,6 +165,7 @@ MINIMIZE_MODE_KWARGS = {
|
|
|
156
165
|
"uses_grad": True,
|
|
157
166
|
"uses_hess": True,
|
|
158
167
|
"uses_hessp": True,
|
|
168
|
+
"f_maxiter_default": lambda n: 1000,
|
|
159
169
|
"valid_options": [
|
|
160
170
|
"gtol",
|
|
161
171
|
"xtol",
|
|
@@ -176,52 +186,47 @@ MINIMIZE_MODE_KWARGS = {
|
|
|
176
186
|
"uses_grad": True,
|
|
177
187
|
"uses_hess": True,
|
|
178
188
|
"uses_hessp": False,
|
|
189
|
+
"f_maxiter_default": lambda n: 200 * n,
|
|
179
190
|
"valid_options": ["initial_trust_radius", "max_trust_radius", "eta", "gtol"],
|
|
180
191
|
},
|
|
181
192
|
"trust-ncg": {
|
|
182
193
|
"uses_grad": True,
|
|
183
194
|
"uses_hess": True,
|
|
184
195
|
"uses_hessp": True,
|
|
196
|
+
"f_maxiter_default": lambda n: 200 * n,
|
|
185
197
|
"valid_options": ["initial_trust_radius", "max_trust_radius", "eta", "gtol"],
|
|
186
198
|
},
|
|
187
199
|
"trust-exact": {
|
|
188
200
|
"uses_grad": True,
|
|
189
201
|
"uses_hess": True,
|
|
190
202
|
"uses_hessp": False,
|
|
203
|
+
"f_maxiter_default": lambda n: 200 * n,
|
|
191
204
|
"valid_options": ["initial_trust_radius", "max_trust_radius", "eta", "gtol"],
|
|
192
205
|
},
|
|
193
206
|
"trust-krylov": {
|
|
194
207
|
"uses_grad": True,
|
|
195
208
|
"uses_hess": True,
|
|
196
209
|
"uses_hessp": True,
|
|
210
|
+
"f_maxiter_default": lambda n: 200 * n,
|
|
197
211
|
"valid_options": ["inexact"],
|
|
198
212
|
},
|
|
199
213
|
}
|
|
200
214
|
|
|
201
|
-
root_method = Literal[
|
|
202
|
-
"hybr",
|
|
203
|
-
"lm",
|
|
204
|
-
"broyden1",
|
|
205
|
-
"broyden2",
|
|
206
|
-
"anderson",
|
|
207
|
-
"linearmixing",
|
|
208
|
-
"diagbroyden",
|
|
209
|
-
"excitingmixing",
|
|
210
|
-
"krylov",
|
|
211
|
-
"df-sane",
|
|
212
|
-
]
|
|
213
215
|
|
|
214
216
|
ROOT_MODE_KWARGS = {
|
|
215
217
|
"hybr": {
|
|
216
218
|
"uses_jac": True,
|
|
219
|
+
"f_maxiter_default": lambda n: 100 * (n + 1),
|
|
217
220
|
"valid_options": ["col_deriv", "xtol", "maxfev", "band", "eps", "factor", "diag"],
|
|
218
221
|
},
|
|
219
222
|
"lm": {
|
|
220
223
|
"uses_jac": True,
|
|
224
|
+
"f_maxiter_default": lambda n: 100 * (n + 1),
|
|
221
225
|
"valid_options": ["col_deriv", "ftol", "xtol", "gtol", "maxiter", "eps", "factor", "diag"],
|
|
222
226
|
},
|
|
223
227
|
"broyden1": {
|
|
224
228
|
"uses_jac": False,
|
|
229
|
+
"f_maxiter_default": lambda n: 100 * (n + 1),
|
|
225
230
|
"valid_options": [
|
|
226
231
|
"nit",
|
|
227
232
|
"disp",
|
|
@@ -239,6 +244,7 @@ ROOT_MODE_KWARGS = {
|
|
|
239
244
|
},
|
|
240
245
|
"broyden2": {
|
|
241
246
|
"uses_jac": False,
|
|
247
|
+
"f_maxiter_default": lambda n: 100 * (n + 1),
|
|
242
248
|
"valid_options": [
|
|
243
249
|
"nit",
|
|
244
250
|
"disp",
|
|
@@ -256,6 +262,7 @@ ROOT_MODE_KWARGS = {
|
|
|
256
262
|
},
|
|
257
263
|
"anderson": {
|
|
258
264
|
"uses_jac": False,
|
|
265
|
+
"f_maxiter_default": lambda n: 100 * (n + 1),
|
|
259
266
|
"valid_options": [
|
|
260
267
|
"nit",
|
|
261
268
|
"disp",
|
|
@@ -272,6 +279,7 @@ ROOT_MODE_KWARGS = {
|
|
|
272
279
|
},
|
|
273
280
|
"linearmixing": {
|
|
274
281
|
"uses_jac": False,
|
|
282
|
+
"f_maxiter_default": lambda n: 100 * (n + 1),
|
|
275
283
|
"valid_options": [
|
|
276
284
|
"nit",
|
|
277
285
|
"disp",
|
|
@@ -288,6 +296,7 @@ ROOT_MODE_KWARGS = {
|
|
|
288
296
|
},
|
|
289
297
|
"diagbroyden": {
|
|
290
298
|
"uses_jac": False,
|
|
299
|
+
"f_maxiter_default": lambda n: 100 * (n + 1),
|
|
291
300
|
"valid_options": [
|
|
292
301
|
"nit",
|
|
293
302
|
"disp",
|
|
@@ -304,6 +313,7 @@ ROOT_MODE_KWARGS = {
|
|
|
304
313
|
},
|
|
305
314
|
"excitingmixing": {
|
|
306
315
|
"uses_jac": False,
|
|
316
|
+
"f_maxiter_default": lambda n: 100 * (n + 1),
|
|
307
317
|
"valid_options": [
|
|
308
318
|
"nit",
|
|
309
319
|
"disp",
|
|
@@ -320,6 +330,7 @@ ROOT_MODE_KWARGS = {
|
|
|
320
330
|
},
|
|
321
331
|
"krylov": {
|
|
322
332
|
"uses_jac": False,
|
|
333
|
+
"f_maxiter_default": lambda n: 100 * (n + 1),
|
|
323
334
|
"valid_options": [
|
|
324
335
|
"nit",
|
|
325
336
|
"disp",
|
|
@@ -343,6 +354,7 @@ ROOT_MODE_KWARGS = {
|
|
|
343
354
|
},
|
|
344
355
|
"df-sane": {
|
|
345
356
|
"uses_jac": False,
|
|
357
|
+
"f_maxiter_default": lambda n: 100 * (n + 1),
|
|
346
358
|
"valid_options": [
|
|
347
359
|
"ftol",
|
|
348
360
|
"fatol",
|
|
@@ -72,7 +72,7 @@ def minimize(
|
|
|
72
72
|
optimizer_kwargs["options"] = options
|
|
73
73
|
|
|
74
74
|
optimizer_kwargs = kwargs_to_options(optimizer_kwargs, method)
|
|
75
|
-
maxiter, optimizer_kwargs = determine_maxiter(optimizer_kwargs, method)
|
|
75
|
+
maxiter, optimizer_kwargs = determine_maxiter(optimizer_kwargs, method, len(x0))
|
|
76
76
|
optimizer_kwargs = determine_tolerance(optimizer_kwargs, method)
|
|
77
77
|
|
|
78
78
|
# Test hessian function -- if it returns a LinearOperator, it can't be used inside the wrapper
|
|
@@ -71,7 +71,7 @@ def root(
|
|
|
71
71
|
optimizer_kwargs = kwargs_to_options(optimizer_kwargs, method)
|
|
72
72
|
optimizer_kwargs = kwargs_to_jac_options(optimizer_kwargs, method)
|
|
73
73
|
|
|
74
|
-
maxiter, optimizer_kwargs = determine_maxiter(optimizer_kwargs, method)
|
|
74
|
+
maxiter, optimizer_kwargs = determine_maxiter(optimizer_kwargs, method, len(x0))
|
|
75
75
|
optimizer_kwargs = determine_tolerance(optimizer_kwargs, method)
|
|
76
76
|
|
|
77
77
|
objective = ObjectiveWrapper(
|
|
@@ -36,7 +36,7 @@ def validate_provided_functions_minimize(
|
|
|
36
36
|
verbose=True,
|
|
37
37
|
) -> None:
|
|
38
38
|
has_grad, has_hess, has_hessp = map(lambda f: f is not None, [f_grad, f_hess, f_hessp])
|
|
39
|
-
uses_grad, uses_hess, uses_hessp, _ = MINIMIZE_MODE_KWARGS[method].values()
|
|
39
|
+
uses_grad, uses_hess, uses_hessp, *_ = MINIMIZE_MODE_KWARGS[method].values()
|
|
40
40
|
|
|
41
41
|
if has_fused_f_and_grad and has_grad:
|
|
42
42
|
_log.warning(
|
|
@@ -119,12 +119,19 @@ def check_f_is_fused(f, x0, args):
|
|
|
119
119
|
|
|
120
120
|
|
|
121
121
|
def determine_maxiter(
|
|
122
|
-
optimizer_kwargs: dict, method: minimize_method | root_method
|
|
122
|
+
optimizer_kwargs: dict, method: minimize_method | root_method, n_vars
|
|
123
123
|
) -> tuple[int, dict]:
|
|
124
124
|
MAXITER_KWARGS = ["maxiter", "maxfun", "maxfev"]
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
method_info = get_option_kwargs(method)
|
|
126
|
+
maxiter_kwargs = [x for x in method_info["valid_options"] if x in MAXITER_KWARGS]
|
|
127
|
+
maxiter_possibilities = [
|
|
128
|
+
optimizer_kwargs.pop("maxiter", None),
|
|
129
|
+
*(optimizer_kwargs["options"].get(kwarg) for kwarg in maxiter_kwargs),
|
|
130
|
+
]
|
|
131
|
+
if any(maxiter_possibilities):
|
|
132
|
+
maxiter = max([x for x in maxiter_possibilities if x is not None])
|
|
133
|
+
else:
|
|
134
|
+
maxiter = method_info["f_maxiter_default"](n_vars)
|
|
128
135
|
|
|
129
136
|
for kwarg in maxiter_kwargs:
|
|
130
137
|
if kwarg not in optimizer_kwargs["options"]:
|
|
@@ -123,12 +123,17 @@ class ObjectiveWrapper:
|
|
|
123
123
|
value_dict["hess_norm"] = hess_norm
|
|
124
124
|
|
|
125
125
|
if self.n_eval == 0:
|
|
126
|
-
self.task = self.progress.add_task(
|
|
126
|
+
self.task = self.progress.add_task(
|
|
127
|
+
"Optimizing", total=self.maxeval, refresh=True, **value_dict
|
|
128
|
+
)
|
|
127
129
|
|
|
128
130
|
if not completed:
|
|
129
131
|
self.progress.update(self.task, advance=self.update_every, **value_dict)
|
|
130
132
|
else:
|
|
131
|
-
self.progress.update(
|
|
133
|
+
self.progress.update(
|
|
134
|
+
self.task, total=self.n_eval, completed=self.n_eval, refresh=True, **value_dict
|
|
135
|
+
)
|
|
136
|
+
self.progress.stop()
|
|
132
137
|
|
|
133
138
|
def initialize_progress_bar(self):
|
|
134
139
|
text_column = TextColumn("{task.description}", table_column=Column(ratio=1))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: better-optimize
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.4
|
|
4
4
|
Summary: A drop-in replacement for scipy optimize functions with quality of life improvements
|
|
5
5
|
License: MIT License
|
|
6
6
|
Project-URL: Homepage, https://github.com/jessegrabowski/better_optimize
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{better_optimize-0.0.3 → better_optimize-0.0.4}/better_optimize.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|