herculesabqp 0.1.2

A convex box-constrained quadratic programming solver with warm starts and active-set polishing.
Documentation
import numpy as np

import herculesabqp


class DiagonalOperator:
    def __init__(self, diag):
        self.diag = np.asarray(diag, dtype=np.float64)
        self.n = int(self.diag.size)

    def matvec(self, x):
        x = np.asarray(x, dtype=np.float64)
        return self.diag * x

    def diagonal(self):
        return self.diag


def main() -> None:
    op = DiagonalOperator([4.0, 9.0, 2.0])
    c = np.array([-2.0, 3.0, -0.5], dtype=np.float64)
    lb = np.zeros(3, dtype=np.float64)
    ub = np.ones(3, dtype=np.float64)

    result = herculesabqp.solve_box_qp_implicit(
        op,
        c,
        lb,
        ub,
        assume_symmetric=True,
        scaling="hessian_diag",
    )

    print(f"objective = {result['objective']:.8f}")
    print(f"x = {result['x']}")
    print(
        f"scaling applied = {result['scaling_applied']} ({result['scaling_name']})"
    )


if __name__ == "__main__":
    main()