1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 /*
19 * This is not the original file distributed by the Apache Software Foundation
20 * It has been modified by the Hipparchus project
21 */
22
23 package org.hipparchus.optim.nonlinear.vector.leastsquares;
24
25 import java.io.IOException;
26
27 import org.hipparchus.exception.MathIllegalStateException;
28 import org.hipparchus.linear.QRDecomposer;
29 import org.hipparchus.optim.LocalizedOptimFormats;
30 import org.hipparchus.optim.SimpleVectorValueChecker;
31 import org.junit.Assert;
32 import org.junit.Test;
33
34 /**
35 * <p>Some of the unit tests are re-implementations of the MINPACK <a
36 * href="http://www.netlib.org/minpack/ex/file17">file17</a> and <a
37 * href="http://www.netlib.org/minpack/ex/file22">file22</a> test files.
38 * The redistribution policy for MINPACK is available <a
39 * href="http://www.netlib.org/minpack/disclaimer">here</a>/
40 *
41 */
42 public class GaussNewtonOptimizerWithQRNormalTest
43 extends AbstractLeastSquaresOptimizerAbstractTest {
44
45 @Override
46 public int getMaxIterations() {
47 return 1000;
48 }
49
50 @Override
51 public LeastSquaresOptimizer getOptimizer() {
52 return new GaussNewtonOptimizer(new QRDecomposer(1e-11), true);
53 }
54
55 @Override
56 @Test
57 public void testMoreEstimatedParametersUnsorted() {
58 /*
59 * Exception is expected with this optimizer
60 */
61 try {
62 super.testMoreEstimatedParametersUnsorted();
63 } catch (MathIllegalStateException mise) {
64 Assert.assertEquals(LocalizedOptimFormats.UNABLE_TO_SOLVE_SINGULAR_PROBLEM, mise.getSpecifier());
65 }
66 }
67
68 @Test
69 public void testMaxEvaluations() throws Exception {
70 try{
71 CircleVectorial circle = new CircleVectorial();
72 circle.addPoint( 30.0, 68.0);
73 circle.addPoint( 50.0, -6.0);
74 circle.addPoint(110.0, -20.0);
75 circle.addPoint( 35.0, 15.0);
76 circle.addPoint( 45.0, 97.0);
77
78 LeastSquaresProblem lsp = builder(circle)
79 .checkerPair(new SimpleVectorValueChecker(1e-30, 1e-30))
80 .maxIterations(Integer.MAX_VALUE)
81 .start(new double[]{98.680, 47.345})
82 .build();
83
84 optimizer.optimize(lsp);
85
86 fail(optimizer);
87 }catch (MathIllegalStateException e){
88 //expected
89 }
90 }
91
92 @Override
93 @Test
94 public void testCircleFittingBadInit() {
95 try {
96 /*
97 * This test does not converge with this optimizer.
98 */
99 super.testCircleFittingBadInit();
100 } catch (MathIllegalStateException mise) {
101 Assert.assertEquals(LocalizedOptimFormats.UNABLE_TO_SOLVE_SINGULAR_PROBLEM, mise.getSpecifier());
102 }
103 }
104
105 @Override
106 @Test
107 public void testHahn1() throws IOException {
108 try {
109 /*
110 * TODO This test leads to a singular problem with the Gauss-Newton
111 * optimizer. This should be inquired.
112 */
113 super.testHahn1();
114 Assert.fail("Expected Exception with: " + optimizer);
115 } catch (MathIllegalStateException mise) {
116 // pass. Both singular problem, and max iterations is acceptable.
117 }
118 }
119
120 @Override
121 @Test(expected = MathIllegalStateException.class)
122 public void testMoreEstimatedParametersSimple() {
123 // reduced numerical stability when forming the normal equations
124 super.testMoreEstimatedParametersSimple();
125 }
126
127 }