liblaf.peach.optim
¶
Optimization protocols and solver implementations.
Modules:
-
base–Base protocols and result containers for optimizers.
-
pncg–Preconditioned nonlinear conjugate-gradient optimizer.
-
scipy–SciPy optimizer adapter.
Classes:
-
BaseProblem–Marker protocol for optimizer problems.
-
Optimizer–Base class for iterative optimizers.
-
Pncg–Preconditioned nonlinear conjugate-gradient optimizer.
-
Problem–Protocol implemented by differentiable optimization problems.
-
Result–Result code returned by optimizers.
-
ScipyOptimizer–Adapter around
scipy.optimize.minimize. -
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.BaseProblem[BaseProblem]
click liblaf.peach.optim.BaseProblem href "" "liblaf.peach.optim.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.
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
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
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
terminate
¶
terminate[X](
problem: BaseProblem[X], model_state: X, opt_state: S
) -> tuple[bool, Result]
Return whether optimization should stop and why.
Pncg
¶
Bases: Optimizer[PncgState, PncgStats]
flowchart TD
liblaf.peach.optim.Pncg[Pncg]
liblaf.peach.optim.base._optimizer.Optimizer[Optimizer]
liblaf.peach.optim.base._optimizer.Optimizer --> liblaf.peach.optim.Pncg
click liblaf.peach.optim.Pncg href "" "liblaf.peach.optim.Pncg"
click liblaf.peach.optim.base._optimizer.Optimizer href "" "liblaf.peach.optim.base._optimizer.Optimizer"
Preconditioned nonlinear conjugate-gradient optimizer.
Pncg builds a diagonal preconditioner from a damped Hessian diagonal,
computes a Dai-Kou conjugate-gradient direction, and accepts steps with
Armijo backtracking. Accepted line-search trials mutate the model state in
place, so each call to step expects
model_state to already match opt_state.params.
Examples:
Minimize a one-dimensional quadratic objective.
>>> import torch
>>> class QuadraticProblem:
... def __init__(self, target):
... self.target = target
...
... def update(self, state, params, /):
... state.copy_(params)
...
... def fun(self, state, /):
... residual = state - self.target
... return 0.5 * torch.dot(residual, residual)
...
... def grad(self, state, /):
... return state - self.target
...
... def hess_diag(self, state, /):
... return torch.ones_like(state)
...
... def hess_quad(self, state, direction, /):
... return torch.dot(direction, direction)
>>> problem = QuadraticProblem(target=torch.tensor([3.0]))
>>> params = torch.tensor([0.0])
>>> model_state = params.clone()
>>> solution = Pncg().minimize(problem, model_state, params)
>>> bool(solution.success)
True
>>> torch.testing.assert_close(solution.params, torch.tensor([3.0]))
>>> torch.testing.assert_close(model_state, solution.params)
Parameters:
-
criteria(ConvergenceCriteria, default:<dynamic>) –Gradient-norm stopping criteria for
Pncg. -
direction(DirectionUpdate, default:DirectionUpdate()) –Dai-Kou nonlinear conjugate-gradient direction update.
-
hess_damping(HessianDamping, default:<dynamic>) –Adaptive Levenberg-style diagonal Hessian damping.
-
line_search(LineSearch, default:<dynamic>) –Armijo backtracking with Newton, norm, and problem-specific step bounds.
Type Aliases:
-
Solution–Optimizer output bundle.
Classes:
-
Result–Result code returned by optimizers.
Methods:
-
init–Initialize
Pncgstate. -
minimize–Run optimization until the configured termination rule stops.
-
postprocess–Build a
Pncgsolution object. -
step–Run one
Pncgstep. -
terminate–Delegate stopping to the configured convergence criteria.
Attributes:
-
criteria(ConvergenceCriteria) – -
direction(DirectionUpdate) – -
hess_damping(HessianDamping) – -
line_search(LineSearch) –
criteria
class-attribute
instance-attribute
¶
criteria: ConvergenceCriteria = field(
factory=ConvergenceCriteria
)
direction
class-attribute
instance-attribute
¶
direction: DirectionUpdate = field(factory=DirectionUpdate)
hess_damping
class-attribute
instance-attribute
¶
hess_damping: HessianDamping = field(factory=HessianDamping)
line_search
class-attribute
instance-attribute
¶
line_search: LineSearch = field(factory=LineSearch)
Solution
¶
Result
¶
Bases: StrEnum
flowchart TD
liblaf.peach.optim.Pncg.Result[Result]
click liblaf.peach.optim.Pncg.Result href "" "liblaf.peach.optim.Pncg.Result"
Result code returned by optimizers.
Attributes:
-
INTERRUPT– -
MAX_STEPS_REACHED– -
NAN– -
PRIMARY_SUCCESS– -
SECONDARY_SUCCESS– -
STAGNATION– -
SUCCESS– -
UNKNOWN_ERROR– -
success(bool) –Whether the result represents an accepted optimization outcome.
init
¶
init[X](
problem: BaseProblem[X],
model_state: X,
params: Vector,
) -> PncgState
Initialize Pncg state.
The stored parameter vector is cloned from params; subsequent steps
mutate the clone instead of the caller-owned input tensor.
Source code in src/liblaf/peach/optim/pncg/_pncg.py
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
postprocess
¶
postprocess[X](
problem: BaseProblem[X],
model_state: X,
opt_state: PncgState,
result: Result,
) -> Solution
Build a Pncg solution object.
Source code in src/liblaf/peach/optim/pncg/_pncg.py
step
¶
step[X](
problem: BaseProblem[X],
model_state: X,
opt_state: PncgState,
) -> None
Run one Pncg step.
The method evaluates derivatives at model_state, writes the accepted
direction, slope, Hessian diagnostics, line-search diagnostics, and
parameter update into opt_state, then mutates model_state to the
accepted trial.
Source code in src/liblaf/peach/optim/pncg/_pncg.py
Problem
¶
Bases: Protocol
flowchart TD
liblaf.peach.optim.Problem[Problem]
click liblaf.peach.optim.Problem href "" "liblaf.peach.optim.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.
Result
¶
Bases: StrEnum
flowchart TD
liblaf.peach.optim.Result[Result]
click liblaf.peach.optim.Result href "" "liblaf.peach.optim.Result"
Result code returned by optimizers.
Attributes:
-
INTERRUPT– -
MAX_STEPS_REACHED– -
NAN– -
PRIMARY_SUCCESS– -
SECONDARY_SUCCESS– -
STAGNATION– -
SUCCESS– -
UNKNOWN_ERROR– -
success(bool) –Whether the result represents an accepted optimization outcome.
ScipyOptimizer
¶
Bases: Optimizer[ScipyState, ScipyStats]
flowchart TD
liblaf.peach.optim.ScipyOptimizer[ScipyOptimizer]
liblaf.peach.optim.base._optimizer.Optimizer[Optimizer]
liblaf.peach.optim.base._optimizer.Optimizer --> liblaf.peach.optim.ScipyOptimizer
click liblaf.peach.optim.ScipyOptimizer href "" "liblaf.peach.optim.ScipyOptimizer"
click liblaf.peach.optim.base._optimizer.Optimizer href "" "liblaf.peach.optim.base._optimizer.Optimizer"
Adapter around scipy.optimize.minimize.
Parameters:
-
method(str | None, default:None) – -
options(Mapping[str, Any] | None, default:None) – -
tol(float | None, default:None) –
Type Aliases:
-
Solution–Optimizer output bundle.
Classes:
-
Result–Result code returned by optimizers.
Methods:
-
init–Initialize SciPy state from the starting parameters.
-
minimize–Run
scipy.optimize.minimizeagainst a Peach problem. -
postprocess–Build the SciPy optimizer solution object.
-
step–Advance the optimizer by one step.
-
terminate–Return whether optimization should stop and why.
Attributes:
Solution
¶
Solution = Solution[ScipyState, ScipyStats]
Result
¶
Bases: StrEnum
flowchart TD
liblaf.peach.optim.ScipyOptimizer.Result[Result]
click liblaf.peach.optim.ScipyOptimizer.Result href "" "liblaf.peach.optim.ScipyOptimizer.Result"
Result code returned by optimizers.
Attributes:
-
INTERRUPT– -
MAX_STEPS_REACHED– -
NAN– -
PRIMARY_SUCCESS– -
SECONDARY_SUCCESS– -
STAGNATION– -
SUCCESS– -
UNKNOWN_ERROR– -
success(bool) –Whether the result represents an accepted optimization outcome.
init
¶
init[X](
problem: BaseProblem[X],
model_state: X,
params: Vector,
) -> ScipyState
Initialize SciPy state from the starting parameters.
Source code in src/liblaf/peach/optim/scipy/_scipy.py
minimize
¶
minimize[X](
problem: BaseProblem[X],
model_state: X,
params: Vector,
) -> Solution
Run scipy.optimize.minimize against a Peach problem.
Source code in src/liblaf/peach/optim/scipy/_scipy.py
postprocess
¶
postprocess[X](
problem: BaseProblem[X],
model_state: X,
opt_state: ScipyState,
result: Result,
) -> Solution
Build the SciPy optimizer solution object.
Source code in src/liblaf/peach/optim/scipy/_scipy.py
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
terminate
¶
terminate[X](
problem: BaseProblem[X], model_state: X, opt_state: S
) -> tuple[bool, Result]
Return whether optimization should stop and why.