1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.hipparchus.optim.nonlinear.vector.constrained;
18
19 import org.hipparchus.linear.MatrixUtils;
20 import org.hipparchus.linear.RealVector;
21 import org.hipparchus.optim.InitialGuess;
22 import org.hipparchus.optim.OptimizationData;
23 import org.hipparchus.optim.nonlinear.scalar.ObjectiveFunction;
24
25 import static org.junit.jupiter.api.Assertions.assertEquals;
26 import static org.junit.jupiter.api.Assertions.assertTrue;
27
28 public abstract class AbstractConstrainedOptimizerTest {
29
30
31
32
33 protected abstract ConstraintOptimizer buildOptimizer();
34
35
36
37
38
39
40
41
42
43
44
45
46 protected void doTestProblem(final double[] expectedSolution,
47 final double solutionTolerance,
48 final double[] expectedMultipliers,
49 final double multipliersTolerance,
50 final double expectedValue,
51 final double valueTolerance,
52 final ObjectiveFunction objectiveFunction,
53 final double[] initialGuess,
54 final Constraint... constraints) {
55
56
57 final ConstraintOptimizer optimizer = buildOptimizer();
58 final OptimizationData[] data = new OptimizationData[constraints.length + (initialGuess == null ? 1 : 2)];
59 data[0] = objectiveFunction;
60 System.arraycopy(constraints, 0, data, 1, constraints.length);
61 if (initialGuess != null) {
62 data[data.length - 1] = new InitialGuess(initialGuess);
63 }
64 final LagrangeSolution solution = optimizer.optimize(data);
65
66
67 assertEquals(0.0,
68 MatrixUtils.createRealVector(expectedSolution).subtract(solution.getX()).getL1Norm(),
69 solutionTolerance);
70 assertEquals(0.0,
71 MatrixUtils.createRealVector(expectedMultipliers).subtract(solution.getLambda()).getL1Norm(),
72 multipliersTolerance);
73 assertEquals(expectedValue, solution.getValue(), valueTolerance);
74
75
76 for (int i = 0; i < expectedSolution.length; ++i) {
77
78 final RealVector plusShift = MatrixUtils.createRealVector(expectedSolution);
79 plusShift.addToEntry(i, 2 * solutionTolerance);
80 boolean plusIsFeasible = true;
81 for (final Constraint constraint : constraints) {
82 plusIsFeasible &= constraint.overshoot(constraint.value(plusShift)) <= 0;
83 }
84 if (plusIsFeasible) {
85
86
87 assertTrue(objectiveFunction.getObjectiveFunction().value(plusShift.toArray()) > expectedValue);
88 }
89
90 final RealVector minusShift = MatrixUtils.createRealVector(expectedSolution);
91 minusShift.addToEntry(i, -2 * solutionTolerance);
92 boolean minusIsFeasible = true;
93 for (final Constraint constraint : constraints) {
94 minusIsFeasible &= constraint.overshoot(constraint.value(minusShift)) <= 0;
95 }
96 if (minusIsFeasible) {
97
98
99 assertTrue(objectiveFunction.getObjectiveFunction().value(minusShift.toArray()) > expectedValue);
100 }
101
102 }
103
104 }
105
106 }