diff --git a/xdeps/__init__.py b/xdeps/__init__.py index 231600a..bf04235 100644 --- a/xdeps/__init__.py +++ b/xdeps/__init__.py @@ -6,7 +6,7 @@ from .tasks import Manager from . import madxutils from .table import Table -from .optimize import (Optimize, Vary, Target, TargetList, VaryList, Action) +from .optimize import (Optimize, Vary, Target, TargetList, VaryList, Action, MeritFunctionForMatch) from .functions import FunctionPieceWiseLinear from ._version import __version__ @@ -22,6 +22,7 @@ "TargetList", "VaryList", "Action", + "MeritFunctionForMatch", "FunctionPieceWiseLinear", "__version__", ] diff --git a/xdeps/optimize/__init__.py b/xdeps/optimize/__init__.py index eebd6ca..5729da7 100644 --- a/xdeps/optimize/__init__.py +++ b/xdeps/optimize/__init__.py @@ -1,4 +1,4 @@ -from .optimize import (Optimize, Vary, Target, TargetList, VaryList, Action) +from .optimize import (Optimize, Vary, Target, TargetList, VaryList, Action, MeritFunctionForMatch) -__all__ = ['Optimize', 'Vary', 'Target', 'TargetList', 'VaryList', 'Action'] \ No newline at end of file +__all__ = ['Optimize', 'Vary', 'Target', 'TargetList', 'VaryList', 'Action', 'MeritFunctionForMatch'] \ No newline at end of file diff --git a/xdeps/optimize/jacobian.py b/xdeps/optimize/jacobian.py index f9e6636..95e851c 100644 --- a/xdeps/optimize/jacobian.py +++ b/xdeps/optimize/jacobian.py @@ -61,7 +61,7 @@ def step(self, n_steps=1, rcond = None, sing_val_cutoff = None, broyden = False) _print("Function tolerance met") break # Equation search - if broyden and hasattr(self, "_last_jac"): + if broyden and hasattr(self, "_last_jac") and self._last_jac is not None: dx = self.x - self._last_jac_x dy = y - self._last_y # Broyden update diff --git a/xdeps/optimize/optimize.py b/xdeps/optimize/optimize.py index e8504d6..2342a20 100644 --- a/xdeps/optimize/optimize.py +++ b/xdeps/optimize/optimize.py @@ -409,6 +409,7 @@ def get_jacobian(self, x, f0=None): x[ii] -= steps[ii] self._last_jac = jac + self._set_x(x) return jac def _clip_to_max_steps(self, x_step): @@ -1018,12 +1019,12 @@ def step( this_broyden = False if broyden: - if broyden == True: + if isinstance(broyden, bool): this_broyden = True else: assert isinstance(broyden, int) this_broyden = True - if i_step % broyden == 0: + if i_step % (broyden + 1) == 0: this_broyden = False self.solver.step( @@ -1291,7 +1292,6 @@ def target_mismatch(self, ret=False, max_col_width=40, maxwidth=1000): print("Target mismatch: ") out.show(max_col_width=max_col_width, maxwidth=maxwidth) - def get_knob_values(self, iteration=None): """ Get the knob values at a given iteration. @@ -1692,6 +1692,10 @@ def check_limits(self, value): def _err(self): return self.solver.func + @_err.setter + def _err(self, value): + self.solver.func = value + @property def actions(self): return self._err.actions