liblaf.peach.optim.pncg
¶
Preconditioned nonlinear conjugate-gradient optimizer.
Classes:
-
ConvergenceCriteria–Gradient-norm stopping criteria for
Pncg. -
ConvergenceState–Gradient-norm convergence state.
-
DirectionUpdate–Dai-Kou nonlinear conjugate-gradient direction update.
-
HessianDamping–Adaptive Levenberg-style diagonal Hessian damping.
-
LineSearch–Armijo backtracking with Newton, norm, and problem-specific step bounds.
-
Pncg–Preconditioned nonlinear conjugate-gradient optimizer.
-
PncgState–State tracked by
Pncg. -
PncgStats–Stats placeholder for
Pncg.
ConvergenceCriteria
¶
Gradient-norm stopping criteria for Pncg.
Parameters:
-
max_steps(int, default:1000) – -
atol_primary(float, default:0.0) – -
rtol_primary(float, default:1e-06) – -
atol_secondary(float, default:<dynamic>) – -
rtol_secondary(float, default:<dynamic>) – -
patience(int, default:20) –
Methods:
-
init–Create an empty convergence state shaped like
params. -
primary_success–Check the primary absolute-relative gradient tolerance.
-
secondary_success–Check the looser secondary gradient tolerance.
-
terminate–Return the convergence decision and result code.
-
update–Record the current gradient and gradient norms.
Attributes:
-
atol_primary(float) – -
atol_secondary(float) – -
max_steps(int) – -
patience(int) – -
rtol_primary(float) – -
rtol_secondary(float) –
atol_secondary
class-attribute
instance-attribute
¶
atol_secondary: float = field(
default=Factory(
_default_atol_secondary, takes_self=True
)
)
rtol_secondary
class-attribute
instance-attribute
¶
rtol_secondary: float = field(
default=Factory(
_default_rtol_secondary, takes_self=True
)
)
init
¶
init() -> ConvergenceState
primary_success
¶
primary_success(
state: ConvergenceState,
) -> Bool[Tensor, ""]
Check the primary absolute-relative gradient tolerance.
secondary_success
¶
secondary_success(
state: ConvergenceState,
) -> Bool[Tensor, ""]
Check the looser secondary gradient tolerance.
terminate
¶
terminate(state: ConvergenceState) -> tuple[bool, Result]
Return the convergence decision and result code.
Source code in src/liblaf/peach/optim/pncg/_terminate.py
update
¶
update(
state: ConvergenceState,
g: Vector,
*,
line_search_ok: bool,
) -> ConvergenceState
Record the current gradient and gradient norms.
Source code in src/liblaf/peach/optim/pncg/_terminate.py
ConvergenceState
¶
Gradient-norm convergence state.
Parameters:
-
grad_norm(Scalar, default:None) – -
grad_norm_first(Scalar, default:None) – -
stagnation_count(int, default:0) – -
step(int, default:0) –
Attributes:
-
grad_norm(Scalar) – -
grad_norm_first(Scalar) – -
stagnation_count(int) – -
step(int) –
DirectionUpdate
¶
Dai-Kou nonlinear conjugate-gradient direction update.
Methods:
-
__call__–Compute a descent direction, restarting when requested.
__call__
¶
__call__(
g: Vector,
g_prev: Vector,
P: Vector,
p_prev: Vector,
*,
restart: bool = False,
) -> Vector
Compute a descent direction, restarting when requested.
Source code in src/liblaf/peach/optim/pncg/_direction.py
HessianDamping
¶
Adaptive Levenberg-style diagonal Hessian damping.
Parameters:
-
initial(float, default:0.0) – -
factor_max(float, default:<dynamic>) – -
factor_min(float, default:<dynamic>) –
Methods:
-
hess_diag–Return
abs(H_diag) + factor * mean(abs(H_diag)). -
hess_quad–Add the damping contribution to a Hessian quadratic form.
-
init–Create damping state with the initial factor.
-
update–Adapt the damping factor from line-search behavior.
Attributes:
-
factor_max(float) – -
factor_min(float) – -
initial(float) –
factor_max
class-attribute
instance-attribute
¶
factor_max: float = field(
default=Factory(_default_factor_max, takes_self=True)
)
factor_min
class-attribute
instance-attribute
¶
factor_min: float = field(
default=Factory(_default_factor_min, takes_self=True)
)
hess_diag
¶
Return abs(H_diag) + factor * mean(abs(H_diag)).
Source code in src/liblaf/peach/optim/pncg/_hess_damping.py
hess_quad
¶
Add the damping contribution to a Hessian quadratic form.
init
¶
update
¶
update(
state: HessianDampingState,
*,
actual_decrease: Scalar,
line_search_step: int,
predicted_decrease: Scalar,
) -> None
Adapt the damping factor from line-search behavior.
Source code in src/liblaf/peach/optim/pncg/_hess_damping.py
LineSearch
¶
Armijo backtracking with Newton, norm, and problem-specific step bounds.
Parameters:
-
armijo(float, default:0.0001) – -
max_step_norm(float, default:inf) – -
max_steps(int, default:10) –
Methods:
-
__call__–Run line search along direction
pfromparams. -
armijo_condition–Evaluate the Armijo sufficient-decrease condition.
-
init–Create an empty line-search state.
-
line_search_newton–Return the Newton step length or
1.0when curvature is unsuitable. -
line_search_upper–Return the largest step satisfying the infinity-norm bound.
Attributes:
__call__
¶
__call__[X](
state: LineSearchState,
problem: Problem[X],
model_state: X,
m: Scalar,
p: Vector,
params: Vector,
pHp: Scalar,
) -> None
Run line search along direction p from params.
The initial step length is the smaller of the Newton proposal and the
configured infinity-norm bound. If the problem implements
Problem.max_step_size,
that hook receives the proposed displacement alpha * p and returns a
safe fraction of it. Every accepted or rejected trial is materialized
through Problem.update.
Source code in src/liblaf/peach/optim/pncg/_line_search.py
armijo_condition
¶
Evaluate the Armijo sufficient-decrease condition.
init
¶
line_search_newton
staticmethod
¶
Return the Newton step length or 1.0 when curvature is unsuitable.
Source code in src/liblaf/peach/optim/pncg/_line_search.py
line_search_upper
staticmethod
¶
line_search_upper(
p: Vector, max_step_norm: float
) -> Scalar
Return the largest step satisfying the infinity-norm bound.
Source code in src/liblaf/peach/optim/pncg/_line_search.py
Pncg
¶
Bases: Optimizer[PncgState, PncgStats]
flowchart TD
liblaf.peach.optim.pncg.Pncg[Pncg]
liblaf.peach.optim.base._optimizer.Optimizer[Optimizer]
liblaf.peach.optim.base._optimizer.Optimizer --> liblaf.peach.optim.pncg.Pncg
click liblaf.peach.optim.pncg.Pncg href "" "liblaf.peach.optim.pncg.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.Pncg.Result[Result]
click liblaf.peach.optim.pncg.Pncg.Result href "" "liblaf.peach.optim.pncg.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
PncgState
¶
Bases: State
flowchart TD
liblaf.peach.optim.pncg.PncgState[PncgState]
liblaf.peach.optim.base._protocols.State[State]
liblaf.peach.optim.base._protocols.State --> liblaf.peach.optim.pncg.PncgState
click liblaf.peach.optim.pncg.PncgState href "" "liblaf.peach.optim.pncg.PncgState"
click liblaf.peach.optim.base._protocols.State href "" "liblaf.peach.optim.base._protocols.State"
State tracked by Pncg.
Parameters:
-
fun(Scalar) – -
params(Vector) –Current optimizer parameters.
-
convergence_state(ConvergenceState) – -
hess_damping_state(HessianDampingState) – -
line_search_state(LineSearchState) – -
direction(Vector, default:None) – -
grad(Vector, default:None) – -
hess_diag(Vector, default:None) – -
hess_quad(Vector, default:None) – -
slope(Vector, default:None) –
Attributes:
-
convergence_state(ConvergenceState) – -
direction(Vector) – -
fun(Scalar) – -
grad(Vector) – -
hess_damping_state(HessianDampingState) – -
hess_diag(Vector) – -
hess_quad(Vector) – -
line_search_state(LineSearchState) – -
params(Vector) –Current optimizer parameters.
-
slope(Vector) – -
step(int) –
PncgStats
¶
Bases: Stats
flowchart TD
liblaf.peach.optim.pncg.PncgStats[PncgStats]
liblaf.peach.optim.base._protocols.Stats[Stats]
liblaf.peach.optim.base._protocols.Stats --> liblaf.peach.optim.pncg.PncgStats
click liblaf.peach.optim.pncg.PncgStats href "" "liblaf.peach.optim.pncg.PncgStats"
click liblaf.peach.optim.base._protocols.Stats href "" "liblaf.peach.optim.base._protocols.Stats"
Stats placeholder for Pncg.