Rosenbrock objective exposed through Peach optimizer hooks.
The implementation delegates value and derivative calculations to SciPy and
converts inputs and outputs to torch tensors.
Examples:
>>> import torch
>>> from liblaf.peach.testing import RosenProblem
>>> problem = RosenProblem()
>>> x = torch.tensor([1.0, 1.0, 1.0])
>>> torch.allclose(problem.fun(x), torch.tensor(0.0))
True
>>> torch.allclose(problem.grad(x), torch.zeros(3))
True
Methods:
-
fun
–
Evaluate the Rosenbrock objective.
-
grad
–
Evaluate the Rosenbrock gradient.
-
hess_diag
–
Evaluate the diagonal of the Rosenbrock Hessian.
-
hess_prod
–
Evaluate a Rosenbrock Hessian-vector product.
-
hess_quad
–
-
update
–
Mutate state to the next parameter vector.
fun
Evaluate the Rosenbrock objective.
Source code in src/liblaf/peach/testing/_rosen.py
| def fun(self, x: Vector, /) -> Scalar:
"""Evaluate the Rosenbrock objective."""
x: Vector = torch.as_tensor(x)
return torch.as_tensor(scipy.optimize.rosen(x))
|
grad
grad(x: Vector) -> Vector
Evaluate the Rosenbrock gradient.
Source code in src/liblaf/peach/testing/_rosen.py
| def grad(self, x: Vector, /) -> Vector:
"""Evaluate the Rosenbrock gradient."""
x: Vector = torch.as_tensor(x)
return torch.as_tensor(scipy.optimize.rosen_der(x))
|
hess_diag
hess_diag(x: Vector) -> Vector
Evaluate the diagonal of the Rosenbrock Hessian.
Source code in src/liblaf/peach/testing/_rosen.py
| def hess_diag(self, x: Vector, /) -> Vector:
"""Evaluate the diagonal of the Rosenbrock Hessian."""
x: Vector = torch.as_tensor(x)
return torch.tensor(np.diagonal(scipy.optimize.rosen_hess(x)))
|
hess_prod
hess_prod(x: Vector, p: Vector) -> Vector
Evaluate a Rosenbrock Hessian-vector product.
Source code in src/liblaf/peach/testing/_rosen.py
| def hess_prod(self, x: Vector, p: Vector, /) -> Vector:
"""Evaluate a Rosenbrock Hessian-vector product."""
x: Vector = torch.as_tensor(x)
p: Vector = torch.as_tensor(p)
return torch.as_tensor(scipy.optimize.rosen_hess_prod(x, p))
|
hess_quad
hess_quad(x: Vector, p: Vector) -> Scalar
Evaluate p.T @ H(x) @ p.
Source code in src/liblaf/peach/testing/_rosen.py
| def hess_quad(self, x: Vector, p: Vector, /) -> Scalar:
"""Evaluate `p.T @ H(x) @ p`."""
x: Vector = torch.as_tensor(x)
p: Vector = torch.as_tensor(p)
return torch.dot(p, self.hess_prod(x, p))
|
update
update(state: Vector, params: Vector) -> None
Mutate state to the next parameter vector.
Source code in src/liblaf/peach/testing/_rosen.py
| def update(self, state: Vector, params: Vector, /) -> None:
"""Mutate `state` to the next parameter vector."""
state.copy_(params)
|