Class NonlinearConstraint

java.lang.Object
de.labathome.trustconstr.NonlinearConstraint
All Implemented Interfaces:
Constraint, Jacobian

public class NonlinearConstraint extends Object implements Constraint, Jacobian
Nonlinear constraint of the form
     lb <= fun(x) <= ub
 
Counterpart to scipy.optimize.NonlinearConstraint (scipy/optimize/_constraints.py:22).

fun is the constraint function R^n -> R^m, jac its Jacobian (R^n -> R^{m x n}). The optional hess callable is the constraint-Hessian-of-Lagrangian: hess(x, v) -> sum_i v[i] * H_{c_i}(x). When supplied, the orchestrator uses it to build the full Lagrangian Hessian H_objective(x) + hess(x, v); without it, the orchestrator falls back to the objective Hessian alone, which can hurt convergence on problems where constraint curvature matters at the optimum (e.g. Maratos).

Eq/ineq classification follows the same rule as LinearConstraint, including the two-sided interval split. Inequality rows are emitted in scipy's 4-block order (less, greater, interval-upper, interval-lower).

  • Constructor Details

    • NonlinearConstraint

      public NonlinearConstraint(Function<Matrix,Matrix> fun, Function<Matrix,Matrix> jac, BiFunction<Matrix,Matrix,Matrix> hess, double[] lb, double[] ub, boolean[] keepFeasible)
      Build a nonlinear constraint with explicit constraint Hessian.
      Parameters:
      fun - constraint function R^n -> R^m
      jac - analytic Jacobian R^n -> R^{m x n}
      hess - constraint Hessian-of-Lagrangian (x, v) -> Sum v[i] H_{c_i}(x); may be null
      lb - per-row lower bounds, length m
      ub - per-row upper bounds, length m
      keepFeasible - per-row strict-feasibility flag, length m; null = all-false
    • NonlinearConstraint

      public NonlinearConstraint(Function<Matrix,Matrix> fun, Function<Matrix,Matrix> jac, double[] lb, double[] ub, boolean[] keepFeasible)
      Parameters:
      fun - constraint function
      jac - analytic Jacobian
      lb - lower bounds
      ub - upper bounds
      keepFeasible - per-row strict-feasibility flag
    • NonlinearConstraint

      public NonlinearConstraint(Function<Matrix,Matrix> fun, Function<Matrix,Matrix> jac, double[] lb, double[] ub)
      Convenience overload with neither constraint Hessian nor keepFeasible flags.
      Parameters:
      fun - constraint function
      jac - analytic Jacobian
      lb - lower bounds
      ub - upper bounds
    • NonlinearConstraint

      public NonlinearConstraint(Function<Matrix,Matrix> fun, double[] lb, double[] ub, boolean[] keepFeasible)
      Parameters:
      fun - constraint function
      lb - lower bounds
      ub - upper bounds
      keepFeasible - per-row strict-feasibility flag
    • NonlinearConstraint

      public NonlinearConstraint(Function<Matrix,Matrix> fun, double[] lb, double[] ub)
      Parameters:
      fun - constraint function
      lb - lower bounds
      ub - upper bounds
  • Method Details

    • lb

      public double[] lb()
      Returns:
      defensive copy of the lower bounds
    • ub

      public double[] ub()
      Returns:
      defensive copy of the upper bounds
    • keepFeasible

      public boolean[] keepFeasible()
      Returns:
      defensive copy of the per-row keep-feasible flags
    • userFun

      public Function<Matrix,Matrix> userFun()
      Returns:
      the user-supplied constraint function R^n -> R^m
    • userJac

      public Function<Matrix,Matrix> userJac()
      Returns:
      the user-supplied analytic Jacobian R^n -> R^{m x n}
    • userHess

      public BiFunction<Matrix,Matrix,Matrix> userHess()
      Returns:
      the user-supplied constraint Hessian-of-Lagrangian (x, v) -> Sum v[i] H_{c_i}(x), or null if none
    • bounds

      public Bounds bounds()
      Returns:
      the bounds repackaged as a Bounds record
    • nEq

      public int nEq()
      Returns:
      number of canonical equality rows
    • nIneq

      public int nIneq()
      Returns:
      number of canonical inequality rows
    • enforceFeasibilityIneq

      public boolean[] enforceFeasibilityIneq()
      Per-canonical-inequality-row enforceFeasibility flags derived from the user-supplied keep_feasible. Each canonical ineq row inherits the kf flag of the original row it came from. Length matches nIneq().
      Returns:
      per-canonical-row strict-feasibility flags
    • validateKeepFeasibleAtStart

      public void validateKeepFeasibleAtStart(Matrix x0)
      Throws IllegalArgumentException if any row marked keepFeasible[i] == true is violated at the supplied starting point. Mirrors scipy's strict-feasibility precondition for keep_feasible=True rows.
      Parameters:
      x0 - starting iterate (n x 1)
    • lagrangianContribution

      public Matrix lagrangianContribution(Matrix x, double[] vEq, double[] vIneq)
      Constraint Hessian-of-Lagrangian Sum_i v[i] * H_{c_i}(x), combining equality and inequality multipliers into a single Hessian contribution.
      Parameters:
      x - iterate (n x 1)
      vEq - equality multipliers, length nEq()
      vIneq - inequality multipliers, length nIneq()
      Returns:
      summed n x n constraint Hessian, or null if no analytic Hessian was supplied at construction
    • constrEq

      public Matrix constrEq(Matrix x)
      Specified by:
      constrEq in interface Constraint
      Parameters:
      x - current iterate (n &times; 1)
      Returns:
      equality-constraint residual (nEq &times; 1)
    • constrIneq

      public Matrix constrIneq(Matrix x)
      Specified by:
      constrIneq in interface Constraint
      Parameters:
      x - current iterate (n &times; 1)
      Returns:
      inequality-constraint residual (nIneq &times; 1); feasible iff every entry is &le; 0
    • jacEq

      public Matrix jacEq(Matrix x)
      Specified by:
      jacEq in interface Jacobian
      Parameters:
      x - current iterate (n &times; 1)
      Returns:
      Jacobian of constr_eq at x (nEq &times; n)
    • jacIneq

      public Matrix jacIneq(Matrix x)
      Specified by:
      jacIneq in interface Jacobian
      Parameters:
      x - current iterate (n &times; 1)
      Returns:
      Jacobian of constr_ineq at x (nIneq &times; n)