LeastSquaresBuilder.java
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.
*/
/*
* This is not the original file distributed by the Apache Software Foundation
* It has been modified by the Hipparchus project
*/
package org.hipparchus.optim.nonlinear.vector.leastsquares;
import org.hipparchus.analysis.MultivariateMatrixFunction;
import org.hipparchus.analysis.MultivariateVectorFunction;
import org.hipparchus.linear.ArrayRealVector;
import org.hipparchus.linear.RealMatrix;
import org.hipparchus.linear.RealVector;
import org.hipparchus.optim.ConvergenceChecker;
import org.hipparchus.optim.PointVectorValuePair;
import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresProblem.Evaluation;
/**
* A mutable builder for {@link LeastSquaresProblem}s.
*
* @see LeastSquaresFactory
*/
public class LeastSquaresBuilder {
/** max evaluations */
private int maxEvaluations;
/** max iterations */
private int maxIterations;
/** convergence checker */
private ConvergenceChecker<Evaluation> checker;
/** model function */
private MultivariateJacobianFunction model;
/** observed values */
private RealVector target;
/** initial guess */
private RealVector start;
/** weight matrix */
private RealMatrix weight;
/**
* Lazy evaluation.
*
*/
private boolean lazyEvaluation;
/** Validator.
*
*/
private ParameterValidator paramValidator;
/** Empty constructor.
* <p>
* This constructor is not strictly necessary, but it prevents spurious
* javadoc warnings with JDK 18 and later.
* </p>
* @since 3.0
*/
public LeastSquaresBuilder() { // NOPMD - unnecessary constructor added intentionally to make javadoc happy
// nothing to do
}
/**
* Construct a {@link LeastSquaresProblem} from the data in this builder.
*
* @return a new {@link LeastSquaresProblem}.
*/
public LeastSquaresProblem build() {
return LeastSquaresFactory.create(model,
target,
start,
weight,
checker,
maxEvaluations,
maxIterations,
lazyEvaluation,
paramValidator);
}
/**
* Configure the max evaluations.
*
* @param newMaxEvaluations the maximum number of evaluations permitted.
* @return this
*/
public LeastSquaresBuilder maxEvaluations(final int newMaxEvaluations) {
this.maxEvaluations = newMaxEvaluations;
return this;
}
/**
* Configure the max iterations.
*
* @param newMaxIterations the maximum number of iterations permitted.
* @return this
*/
public LeastSquaresBuilder maxIterations(final int newMaxIterations) {
this.maxIterations = newMaxIterations;
return this;
}
/**
* Configure the convergence checker.
*
* @param newChecker the convergence checker.
* @return this
*/
public LeastSquaresBuilder checker(final ConvergenceChecker<Evaluation> newChecker) {
this.checker = newChecker;
return this;
}
/**
* Configure the convergence checker.
* <p>
* This function is an overloaded version of {@link #checker(ConvergenceChecker)}.
* </p>
*
* @param newChecker the convergence checker.
* @return this
*/
public LeastSquaresBuilder checkerPair(final ConvergenceChecker<PointVectorValuePair> newChecker) {
return this.checker(LeastSquaresFactory.evaluationChecker(newChecker));
}
/**
* Configure the model function.
*
* @param value the model function value
* @param jacobian the Jacobian of {@code value}
* @return this
*/
public LeastSquaresBuilder model(final MultivariateVectorFunction value,
final MultivariateMatrixFunction jacobian) {
return model(LeastSquaresFactory.model(value, jacobian));
}
/**
* Configure the model function.
*
* @param newModel the model function value and Jacobian
* @return this
*/
public LeastSquaresBuilder model(final MultivariateJacobianFunction newModel) {
this.model = newModel;
return this;
}
/**
* Configure the observed data.
*
* @param newTarget the observed data.
* @return this
*/
public LeastSquaresBuilder target(final RealVector newTarget) {
this.target = newTarget;
return this;
}
/**
* Configure the observed data.
*
* @param newTarget the observed data.
* @return this
*/
public LeastSquaresBuilder target(final double[] newTarget) {
return target(new ArrayRealVector(newTarget, false));
}
/**
* Configure the initial guess.
*
* @param newStart the initial guess.
* @return this
*/
public LeastSquaresBuilder start(final RealVector newStart) {
this.start = newStart;
return this;
}
/**
* Configure the initial guess.
*
* @param newStart the initial guess.
* @return this
*/
public LeastSquaresBuilder start(final double[] newStart) {
return start(new ArrayRealVector(newStart, false));
}
/**
* Configure the weight matrix.
*
* @param newWeight the weight matrix
* @return this
*/
public LeastSquaresBuilder weight(final RealMatrix newWeight) {
this.weight = newWeight;
return this;
}
/**
* Configure whether evaluation will be lazy or not.
*
* @param newValue Whether to perform lazy evaluation.
* @return this object.
*
*/
public LeastSquaresBuilder lazyEvaluation(final boolean newValue) {
lazyEvaluation = newValue;
return this;
}
/**
* Configure the validator of the model parameters.
*
* @param newValidator Parameter validator.
* @return this object.
*
*/
public LeastSquaresBuilder parameterValidator(final ParameterValidator newValidator) {
paramValidator = newValidator;
return this;
}
}