Skip to content

liblaf.peach.optim.base

Base protocols and result containers for optimizers.

Classes:

  • BaseProblem

    Marker protocol for optimizer problems.

  • Optimizer

    Base class for iterative optimizers.

  • Problem

    Protocol implemented by differentiable optimization problems.

  • Result

    Result code returned by optimizers.

  • Solution

    Optimizer output bundle.

  • State

    Protocol for optimizer states that expose current parameters.

  • Stats

    Protocol for optimizer-specific summary statistics.

BaseProblem

Bases: Protocol


              flowchart TD
              liblaf.peach.optim.base.BaseProblem[BaseProblem]

              

              click liblaf.peach.optim.base.BaseProblem href "" "liblaf.peach.optim.base.BaseProblem"
            

Marker protocol for optimizer problems.

Optimizer

Base class for iterative optimizers.

Subclasses keep optimizer-specific data in a mutable state object. A step implementation mutates the model state and optimizer state in place, so callbacks and postprocess observe the same final objects.

Methods:

  • init

    Create optimizer state from a model state and parameter vector.

  • minimize

    Run optimization until the configured termination rule stops.

  • postprocess

    Build the final solution object.

  • step

    Advance the optimizer by one step.

  • terminate

    Return whether optimization should stop and why.

init

init[X](
    problem: BaseProblem[X],
    model_state: X,
    params: Vector,
) -> S

Create optimizer state from a model state and parameter vector.

Source code in src/liblaf/peach/optim/base/_optimizer.py
def init[X](self, problem: BaseProblem[X], model_state: X, params: Vector) -> S:
    """Create optimizer state from a model state and parameter vector."""
    raise NotImplementedError

minimize

minimize[X](
    problem: BaseProblem[X],
    model_state: X,
    params: Vector,
) -> Solution[S, T]

Run optimization until the configured termination rule stops.

After every step, Problem.callback is called when the concrete problem implements it. The callback receives the current model state and the same mutable optimizer state that will be stored on the returned Solution.

Parameters:

  • problem (BaseProblem[X]) –

    Optimization problem that supplies objective hooks.

  • model_state (X) –

    Initial model state used by objective hooks.

  • params (Vector) –

    Initial optimizer parameter vector.

Returns:

  • Solution[S, T]

    The final solution.

Source code in src/liblaf/peach/optim/base/_optimizer.py
def minimize[X](
    self, problem: BaseProblem[X], model_state: X, params: Vector
) -> Solution[S, T]:
    """Run optimization until the configured termination rule stops.

    After every step, [`Problem.callback`][liblaf.peach.optim.base.Problem.callback]
    is called when the concrete problem implements it. The callback receives
    the current model state and the same mutable optimizer state that will be
    stored on the returned [`Solution`][liblaf.peach.optim.base.Solution].

    Args:
        problem: Optimization problem that supplies objective hooks.
        model_state: Initial model state used by objective hooks.
        params: Initial optimizer parameter vector.

    Returns:
        The final solution.
    """
    problem: Problem[X] = cast("Problem[X]", problem)
    opt_state: S = self.init(problem, model_state, params)
    while True:
        self.step(problem, model_state, opt_state)
        if is_implemented(problem, Problem.callback):
            problem.callback(model_state, opt_state)
        ok, result = self.terminate(problem, model_state, opt_state)
        if ok:
            break
    solution: Solution[S, T] = self.postprocess(
        problem, model_state, opt_state, result
    )
    return solution

postprocess

postprocess[X](
    problem: BaseProblem[X],
    model_state: X,
    opt_state: S,
    result: Result,
) -> Solution[S, T]

Build the final solution object.

Source code in src/liblaf/peach/optim/base/_optimizer.py
def postprocess[X](
    self, problem: BaseProblem[X], model_state: X, opt_state: S, result: Result
) -> Solution[S, T]:
    """Build the final solution object."""
    del problem, model_state
    stats: T = cast("T", {})
    return Optimizer.Solution(result=result, state=opt_state, stats=stats)

step

step[X](
    problem: BaseProblem[X], model_state: X, opt_state: S
) -> None

Advance the optimizer by one step.

Implementations should mutate model_state and opt_state with any accepted parameter, gradient, or diagnostic updates.

Source code in src/liblaf/peach/optim/base/_optimizer.py
def step[X](self, problem: BaseProblem[X], model_state: X, opt_state: S) -> None:
    """Advance the optimizer by one step.

    Implementations should mutate `model_state` and `opt_state` with any
    accepted parameter, gradient, or diagnostic updates.
    """
    raise NotImplementedError

terminate

terminate[X](
    problem: BaseProblem[X], model_state: X, opt_state: S
) -> tuple[bool, Result]

Return whether optimization should stop and why.

Source code in src/liblaf/peach/optim/base/_optimizer.py
def terminate[X](
    self, problem: BaseProblem[X], model_state: X, opt_state: S
) -> tuple[bool, Result]:
    """Return whether optimization should stop and why."""
    raise NotImplementedError

Problem

Bases: Protocol


              flowchart TD
              liblaf.peach.optim.base.Problem[Problem]

              

              click liblaf.peach.optim.base.Problem href "" "liblaf.peach.optim.base.Problem"
            

Protocol implemented by differentiable optimization problems.

Optimizers evaluate objective derivatives on a model state. Drivers that produce fresh parameter vectors use update to mutate the model state before asking for objective values or derivatives.

Methods:

  • callback

    Run an optional side-effect after an optimizer step.

  • fun

    Evaluate the scalar objective value.

  • grad

    Evaluate the objective gradient.

  • hess_diag

    Evaluate or approximate the Hessian diagonal.

  • hess_prod

    Evaluate the Hessian-vector product along p.

  • hess_quad

    Evaluate the quadratic form p.T @ H @ p.

  • max_step_size

    Return a safe fraction of proposed trial displacement p.

  • update

    Mutate model state for a line-search trial at x.

  • value_and_grad

    Evaluate the objective and gradient together.

callback

callback(model_state: X, opt_state: State) -> None

Run an optional side-effect after an optimizer step.

Source code in src/liblaf/peach/optim/base/_protocols.py
@not_implemented
def callback(self, model_state: X, opt_state: State, /) -> None:
    """Run an optional side-effect after an optimizer step."""

fun

fun(state: X) -> Scalar

Evaluate the scalar objective value.

Source code in src/liblaf/peach/optim/base/_protocols.py
@not_implemented
def fun(self, state: X, /) -> Scalar:
    """Evaluate the scalar objective value."""

grad

grad(state: X) -> Vector

Evaluate the objective gradient.

Source code in src/liblaf/peach/optim/base/_protocols.py
@not_implemented
def grad(self, state: X, /) -> Vector:
    """Evaluate the objective gradient."""

hess_diag

hess_diag(state: X) -> Vector

Evaluate or approximate the Hessian diagonal.

Source code in src/liblaf/peach/optim/base/_protocols.py
@not_implemented
def hess_diag(self, state: X, /) -> Vector:
    """Evaluate or approximate the Hessian diagonal."""

hess_prod

hess_prod(state: X, p: Vector) -> Vector

Evaluate the Hessian-vector product along p.

Source code in src/liblaf/peach/optim/base/_protocols.py
@not_implemented
def hess_prod(self, state: X, p: Vector, /) -> Vector:
    """Evaluate the Hessian-vector product along `p`."""

hess_quad

hess_quad(state: X, p: Vector) -> Scalar

Evaluate the quadratic form p.T @ H @ p.

Source code in src/liblaf/peach/optim/base/_protocols.py
@not_implemented
def hess_quad(self, state: X, p: Vector, /) -> Scalar:
    """Evaluate the quadratic form `p.T @ H @ p`."""

max_step_size

max_step_size(state: X, p: Vector) -> Scalar

Return a safe fraction of proposed trial displacement p.

Source code in src/liblaf/peach/optim/base/_protocols.py
@not_implemented
def max_step_size(self, state: X, p: Vector, /) -> Scalar:
    """Return a safe fraction of proposed trial displacement `p`."""

update

update(state: X, x: Vector) -> None

Mutate model state for a line-search trial at x.

Source code in src/liblaf/peach/optim/base/_protocols.py
@not_implemented
def update(self, state: X, x: Vector, /) -> None:
    """Mutate model state for a line-search trial at `x`."""

value_and_grad

value_and_grad(state: X) -> tuple[Scalar, Vector]

Evaluate the objective and gradient together.

Source code in src/liblaf/peach/optim/base/_protocols.py
@not_implemented
def value_and_grad(self, state: X, /) -> tuple[Scalar, Vector]:
    """Evaluate the objective and gradient together."""

Result

Bases: StrEnum


              flowchart TD
              liblaf.peach.optim.base.Result[Result]

              

              click liblaf.peach.optim.base.Result href "" "liblaf.peach.optim.base.Result"
            

Result code returned by optimizers.

Attributes:

INTERRUPT class-attribute instance-attribute

INTERRUPT = auto()

MAX_STEPS_REACHED class-attribute instance-attribute

MAX_STEPS_REACHED = auto()

NAN class-attribute instance-attribute

NAN = auto()

PRIMARY_SUCCESS class-attribute instance-attribute

PRIMARY_SUCCESS = auto()

SECONDARY_SUCCESS class-attribute instance-attribute

SECONDARY_SUCCESS = auto()

STAGNATION class-attribute instance-attribute

STAGNATION = auto()

SUCCESS class-attribute instance-attribute

SUCCESS = auto()

UNKNOWN_ERROR class-attribute instance-attribute

UNKNOWN_ERROR = auto()

success property

success: bool

Whether the result represents an accepted optimization outcome.

Solution

Optimizer output bundle.

Parameters:

  • result (Result) –
  • state (S) –
  • stats (T) –

Attributes:

params property

params: Vector

Final optimizer parameters.

result instance-attribute

result: Result

state instance-attribute

state: S

stats instance-attribute

stats: T

success property

success: bool

Whether result is successful.

State

Bases: Protocol


              flowchart TD
              liblaf.peach.optim.base.State[State]

              

              click liblaf.peach.optim.base.State href "" "liblaf.peach.optim.base.State"
            

Protocol for optimizer states that expose current parameters.

Attributes:

  • params (Vector) –

    Current optimizer parameters.

params property

params: Vector

Current optimizer parameters.

Stats

Bases: Protocol


              flowchart TD
              liblaf.peach.optim.base.Stats[Stats]

              

              click liblaf.peach.optim.base.Stats href "" "liblaf.peach.optim.base.Stats"
            

Protocol for optimizer-specific summary statistics.