archimedes.optimize.LMResult¶

class archimedes.optimize.LMResult¶

Result of Levenberg-Marquardt optimization.

This class provides detailed information about the optimization process and results, following SciPy conventions while adding specialized fields for system identification applications.

Variables:
  • x (ndarray or Tree) – Solution parameters with the same structure as the initial guess. For system identification, this preserves the nested parameter organization (e.g., {"mass": 1.0, "damping": {"c1": 0.1}}).

  • success (bool) – Whether optimization terminated successfully. True for status codes 1-4 (converged), False for status code 5 (max iterations reached).

  • status (LMStatus) – Detailed termination status code indicating the specific convergence criterion that was satisfied or reason for termination.

  • message (str) – Human-readable description of the termination reason corresponding to the status code.

  • fun (float) – Final objective function value. For least-squares problems, this is 0.5 times the sum of squared residuals.

  • jac (ndarray) – Final gradient vector of shape (n,). For constrained problems, this is the full gradient (not projected).

  • hess (ndarray) – Final Hessian matrix or approximation of shape (n, n). This can be used for uncertainty quantification and further analysis.

  • nfev (int) – Number of objective function evaluations performed during optimization. Each evaluation computes the objective value, gradient, and Hessian.

  • njev (int) – Number of Jacobian evaluations. For this implementation, this equals nfev since gradient and Hessian are computed simultaneously.

  • nit (int) – Number of algorithm iterations. Each iteration may involve multiple function evaluations due to the trust region approach.

  • history (List[Dict[str, Any]]) –

    Detailed iteration history containing convergence diagnostics:

    • iter : Iteration number

    • cost : Objective function value

    • grad_norm : Gradient norm (or projected gradient for constrained)

    • lambda : Levenberg-Marquardt damping parameter

    • x : Parameter values at this iteration

    • step_norm : Step size (when step is accepted)

    • actred : Actual reduction in objective

    • prered : Predicted reduction from quadratic model

    • ratio : Ratio of actual to predicted reduction

See also

lm_solve

Function that returns this result type

LMStatus

Detailed description of status codes

Methods

clear()

copy()

fromkeys(iterable[, value])

Create a new dictionary with keys from iterable and values set to value.

get(key[, default])

Return the value for key if key is in the dictionary, else default.

items()

keys()

pop(k[,d])

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

setdefault(key[, default])

Insert key with a value of default if key is not in the dictionary.

update([E, ]**F)

If E is present and has a .keys() method, then does: for k in E: D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

__init__(*args, **kwargs)¶
clear() → None.  Remove all items from D.¶
copy() → a shallow copy of D¶
classmethod fromkeys(iterable, value=None, /)¶

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)¶

Return the value for key if key is in the dictionary, else default.

items() → a set-like object providing a view on D's items¶
keys() → a set-like object providing a view on D's keys¶
pop(k[, d]) → v, remove specified key and return the corresponding value.¶

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()¶

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)¶

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) → None.  Update D from dict/iterable E and F.¶

If E is present and has a .keys() method, then does: for k in E: D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values() → an object providing a view on D's values¶