SQPOption.java

/*
 * Licensed to the Hipparchus project under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The Hipparchus project licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.hipparchus.optim.nonlinear.vector.constrained;

import org.hipparchus.optim.OptimizationData;

/** Parameter for SQP Algorithm.
 * @since 3.1
 */
public class SQPOption implements OptimizationData {

    /** Default convergence criteria. */
    public static final int DEFAULT_CONV_CRITERIA = 1;

    /** Default tolerance for convergence and active constraint. */
    public static final double DEFAULT_EPSILON = 1.0e-9;//>0

    /** Default weight for augmented QP subproblem. */
    public static final double DEFAULT_RHO = 100.0;//rho>1

    /** Default max value admitted for additional variable in QP subproblem. */
    public static final  double DEFAULT_SIGMA_MAX = 0.90;//0<sigma<1

    /** Default max iteration admitted for QP subproblem. */
    public static final  int DEFAULT_QP_MAX_LOOP = 4;

    /** Default parameter for evaluation of Armijo condition for descend direction. */
    public static final  double DEFAULT_MU = 0.1;//[0,0.5]

    /** Default parameter for quadratic line search. */
    public static final  double DEFAULT_B = 0.1;//[0;1]

    /** Default flag for using BFGS update formula. */
    public static final  boolean DEFAULT_USE_FUNCTION_HESSIAN = false;

    /** Default max iteration before reset hessian. */
    public static final  int DEFAULT_MAX_LINE_SEARCH_ITERATION = 20;

    /** Convergence criteria*/
    private int convCriteria;

    /** Tolerance for convergence and active constraint evaluation. */
    private double eps;

    /** Weight for augmented QP subproblem. */
    private double rhoCons;

     /** Max value admitted for the solution of the additional variable in QP subproblem. */
    private double sigmaMax;

    /** Max iteration admitted for QP subproblem evaluation.
     * (over this threshold the descend direction will be approximated using the merit function).
     */
    private int qpMaxLoop;

    /** Parameter for evaluation of Armijo condition for descend direction.
     * (fhi(alfa)-fhi(0)<=mu * alfa * fhi'(0)) */
    private double mu;

    /** Parameter for quadratic line search. */
    private double b;

    /** Max Iteration for the line search. */
    private int maxLineSearchIteration;

    /** Enable or Disable using direct the function Hessian. */
    private boolean useFunHessian;

    /** Simple constructor.
     * <p>
     * This constructor uses all defaults values.
     * </p>
     */
    public SQPOption() {
        this.convCriteria           = DEFAULT_CONV_CRITERIA;
        this.eps                    = DEFAULT_EPSILON;
        this.rhoCons                = DEFAULT_RHO;
        this.sigmaMax               = DEFAULT_SIGMA_MAX;
        this.qpMaxLoop              = DEFAULT_QP_MAX_LOOP;
        this.mu                     = DEFAULT_MU;
        this.b                      = DEFAULT_B;
        this.maxLineSearchIteration = DEFAULT_MAX_LINE_SEARCH_ITERATION;
        this.useFunHessian          = DEFAULT_USE_FUNCTION_HESSIAN;
    }

    /** Set convergence criteria.
     * @param convCriteria convergence criteria
     */
    public void setConvCriteria(final int convCriteria) {
        this.convCriteria = convCriteria;
    }

    /** Get convergence criteria.
     * @return convergence criteria
     */
    public int getConvCriteria() {
        return convCriteria;
    }

    /** Set tolerance for convergence and active constraint evaluation.
     * @param eps tolerance for convergence and active constraint evaluation
     */
    public void setEps(final double eps) {
        this.eps = eps;
    }

    /** Get tolerance for convergence and active constraint evaluation.
     * @return tolerance for convergence and active constraint evaluation
     */
    public double getEps() {
        return eps;
    }

    /** Set weight for augmented QP subproblem.
     * @param rhoCons weight for augmented QP subproblem
     */
    public void setRhoCons(final double rhoCons) {
        this.rhoCons = rhoCons;
    }

    /** Get weight for augmented QP subproblem.
     * @return weight for augmented QP subproblem
     */
    public double getRhoCons() {
        return rhoCons;
    }

    /** Set max value admitted for the solution of the additional variable in QP subproblem.
     * @param sigmaMax max value admitted for the solution of the additional variable in QP subproblem
     */
    public void setSigmaMax(final double sigmaMax) {
        this.sigmaMax = sigmaMax;
    }

    /** Get max value admitted for the solution of the additional variable in QP subproblem.
     * @return max value admitted for the solution of the additional variable in QP subproblem
     */
    public double getSigmaMax() {
        return sigmaMax;
    }

    /** Set max iteration admitted for QP subproblem evaluation.
     * @param qpMaxLoop max iteration admitted for QP subproblem evaluation
     */
    public void setQpMaxLoop(final int qpMaxLoop) {
        this.qpMaxLoop = qpMaxLoop;
    }

    /** Get max iteration admitted for QP subproblem evaluation.
     * @return max iteration admitted for QP subproblem evaluation
     */
    public int getQpMaxLoop() {
        return qpMaxLoop;
    }

    /** Set parameter for evaluation of Armijo condition for descend direction.
     * @param mu parameter for evaluation of Armijo condition for descend direction
     */
    public void setMu(final double mu) {
        this.mu  = mu;
    }

    /** Get parameter for evaluation of Armijo condition for descend direction.
     * @return parameter for evaluation of Armijo condition for descend direction
     */
    public double getMu() {
        return mu;
    }

    /** Set parameter for quadratic line search.
     * @param b parameter for quadratic line search
     */
    public void setB(final double b) {
        this.b = b;
    }

    /** Get parameter for quadratic line search.
     * @return parameter for quadratic line search
     */
    public double getB() {
        return b;
    }

    /** Set max Iteration for the line search
     * @param maxLineSearchIteration max Iteration for the line search
     */
    public void setMaxLineSearchIteration(final int maxLineSearchIteration) {
        this.maxLineSearchIteration = maxLineSearchIteration;
    }

    /** Get max Iteration for the line search
     * @return max Iteration for the line search
     */
    public int getMaxLineSearchIteration() {
        return maxLineSearchIteration;
    }

    /** Enable or Disable using direct the function Hessian.
     * @param useFunHessian enable or Disable using direct the function Hessian
     */
    public void setUseFunHessian(final boolean useFunHessian) {
        this.useFunHessian = useFunHessian;
    }

    /** Check if using direct the function Hessian is enabled or disabled.
     * @return true if using direct the function Hessian is enabled
     */
    public boolean useFunHessian() {
        return useFunHessian;
    }

}