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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: better_optimize
3
- Version: 0.0.3
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-19T21:06:06+0800",
11
+ "date": "2024-08-21T05:49:44+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "6fa51b7ab8759ba1dbd944c0839b97719358c2a2",
15
- "version": "0.0.3"
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
- maxiter = optimizer_kwargs.pop("maxiter", 5000)
126
- optimizer_kwargs["options"].update({"maxiter": maxiter})
127
- maxiter_kwargs = [x for x in get_option_kwargs(method)["valid_options"] if x in MAXITER_KWARGS]
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("Optimizing", **value_dict)
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(self.task, total=self.n_eval, completed=self.n_eval, **value_dict)
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
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