Skip to content

liblaf.peach.testing

Small objectives for tests and examples.

Classes:

  • RosenProblem

    Rosenbrock objective exposed through Peach optimizer hooks.

RosenProblem

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

    Evaluate p.T @ H(x) @ p.

  • update

    Mutate state to the next parameter vector.

fun

fun(x: Vector) -> Scalar

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)