1 #include "FittingStatistics.h" 3 #include "MainWindow.h" 6 #include <QtTest/QtTest> 7 #include "Test/TestFitting.h" 13 const int NOMINAL_ORDER = 6;
14 const int NOMINAL_SIGNIFICANT_DIGITS = 7;
21 void TestFitting::cleanupTestCase ()
26 bool TestFitting::generalFunctionTest (
int order,
29 int orderReduced = qMin (order, numPoints - 1);
31 const double EPSILON = 0.0001;
33 double mse, rms, rSquared;
34 FittingCurveCoefficients coefficientsGot (MAX_POLYNOMIAL_ORDER + 1);
37 bool isOverfitting = (order >= numPoints - 1);
40 FittingPointsConvenient points;
41 for (
int iPoint = 0; iPoint < numPoints; iPoint++) {
44 if (orderReduced > 0) {
46 for (
int ord = 0; ord < orderReduced; ord++) {
51 points.append (QPointF (x, y));
60 NOMINAL_SIGNIFICANT_DIGITS);
65 FittingCurveCoefficients coefficientsExpected (orderReduced + 1);
69 coefficientsExpected [0] = 0;
72 coefficientsExpected [0] = 1;
73 coefficientsExpected [1] = 1;
76 coefficientsExpected [0] = 2;
77 coefficientsExpected [1] = 3;
78 coefficientsExpected [2] = 1;
81 coefficientsExpected [0] = 6;
82 coefficientsExpected [1] = 11;
83 coefficientsExpected [2] = 6;
84 coefficientsExpected [3] = 1;
87 coefficientsExpected [0] = 24;
88 coefficientsExpected [1] = 50;
89 coefficientsExpected [2] = 35;
90 coefficientsExpected [3] = 10;
91 coefficientsExpected [4] = 1;
95 for (
int coef = 0; coef < order + 1; coef++) {
96 double coefGot = coefficientsGot [coef];
98 double coefExpected = 0;
99 if (coef <= orderReduced) {
100 coefExpected = coefficientsExpected [coef];
103 success = (success && ((qAbs (coefGot - coefExpected) < EPSILON)));
108 success = (success && ((qAbs (mse) < EPSILON)));
114 bool TestFitting::generalNonFunctionTest ()
const 116 const double EPSILON = 0.0001;
118 double mse, rms, rSquared;
119 FittingCurveCoefficients coefficientsGot (MAX_POLYNOMIAL_ORDER);
122 FittingPointsConvenient points;
123 const double Y1 = 1, Y2 = 2;
124 points.append (QPointF (1, Y1));
125 points.append (QPointF (1, Y2));
133 NOMINAL_SIGNIFICANT_DIGITS);
138 FittingCurveCoefficients coefficientsExpected (2);
139 coefficientsExpected [0] = (Y1 + Y2) / 2.0;
140 coefficientsExpected [1] = 0;
142 for (
int coef = 0; coef < 2; coef++) {
143 double coefGot = coefficientsGot [coef];
145 double coefExpected = coefficientsExpected [coef];
147 success = (success && ((qAbs (coefGot - coefExpected) < EPSILON)));
153 void TestFitting::initTestCase ()
155 const QString NO_ERROR_REPORT_LOG_FILE;
156 const QString NO_REGRESSION_OPEN_FILE;
157 const bool NO_GNUPLOT_LOG_FILES =
false;
158 const bool NO_REGRESSION_IMPORT =
false;
159 const bool NO_RESET =
false;
160 const bool NO_EXPORT_ONLY =
false;
161 const bool NO_EXTRACT_IMAGE_ONLY =
false;
162 const QString NO_EXTRACT_IMAGE_EXTENSION;
163 const bool DEBUG_FLAG =
false;
164 const QStringList NO_LOAD_STARTUP_FILES;
165 const QStringList NO_COMMAND_LINE;
167 initializeLogging (
"engauge_test",
172 NO_REGRESSION_OPEN_FILE,
173 NO_REGRESSION_IMPORT,
174 NO_GNUPLOT_LOG_FILES,
177 NO_EXTRACT_IMAGE_ONLY,
178 NO_EXTRACT_IMAGE_EXTENSION,
179 NO_LOAD_STARTUP_FILES,
184 int TestFitting::orderReducedVersusOrderAndSignificantDigits (
int order,
185 int significantDigits)
const 187 FittingPointsConvenient points;
188 FittingCurveCoefficients coefficients (MAX_POLYNOMIAL_ORDER + 1);
192 for (
double x = 1; x <= 10; x += 1) {
193 double y = 100.0 / x;
194 points.append (QPointF (x, y));
197 fittingStatistics.calculateCurveFit (order,
205 for (orderReduced = MAX_POLYNOMIAL_ORDER; orderReduced > 0; orderReduced--) {
206 if (coefficients [orderReduced] != 0) {
214 void TestFitting::testFunctionExactFit01 ()
216 QVERIFY (generalFunctionTest (0, 1));
219 void TestFitting::testFunctionExactFit12 ()
221 QVERIFY (generalFunctionTest (1, 2));
224 void TestFitting::testFunctionExactFit23 ()
226 QVERIFY (generalFunctionTest (2, 3));
229 void TestFitting::testFunctionExactFit34 ()
231 QVERIFY (generalFunctionTest (3, 4));
234 void TestFitting::testFunctionOverfit11 ()
236 QVERIFY (generalFunctionTest (1, 1));
239 void TestFitting::testFunctionOverfit22 ()
241 QVERIFY (generalFunctionTest (2, 2));
244 void TestFitting::testFunctionOverfit33 ()
246 QVERIFY (generalFunctionTest (3, 3));
249 void TestFitting::testFunctionOverfit44 ()
251 QVERIFY (generalFunctionTest (4, 4));
254 void TestFitting::testFunctionUnderfit02 ()
256 QVERIFY (generalFunctionTest (0, 2));
259 void TestFitting::testFunctionUnderfit13 ()
261 QVERIFY (generalFunctionTest (1, 3));
264 void TestFitting::testFunctionUnderfit24 ()
266 QVERIFY (generalFunctionTest (2, 4));
269 void TestFitting::testFunctionUnderfit35 ()
271 QVERIFY (generalFunctionTest (3, 5));
274 void TestFitting::testNonFunction ()
276 QVERIFY (generalNonFunctionTest ());
279 void TestFitting::testOrderReduced3 ()
281 QVERIFY (orderReducedVersusOrderAndSignificantDigits (3, NOMINAL_SIGNIFICANT_DIGITS) == 3);
284 void TestFitting::testOrderReduced4 ()
286 QVERIFY (orderReducedVersusOrderAndSignificantDigits (4, NOMINAL_SIGNIFICANT_DIGITS) == 4);
289 void TestFitting::testOrderReduced5 ()
291 QVERIFY (orderReducedVersusOrderAndSignificantDigits (5, NOMINAL_SIGNIFICANT_DIGITS) == 5);
294 void TestFitting::testOrderReduced6 ()
296 QVERIFY (orderReducedVersusOrderAndSignificantDigits (6, NOMINAL_SIGNIFICANT_DIGITS) == 6);
299 void TestFitting::testSignificantDigits3 ()
301 QVERIFY (orderReducedVersusOrderAndSignificantDigits (NOMINAL_ORDER, 3) == NOMINAL_ORDER);
304 void TestFitting::testSignificantDigits4 ()
306 QVERIFY (orderReducedVersusOrderAndSignificantDigits (NOMINAL_ORDER, 4) == NOMINAL_ORDER);
309 void TestFitting::testSignificantDigits5 ()
311 QVERIFY (orderReducedVersusOrderAndSignificantDigits (NOMINAL_ORDER, 5) == NOMINAL_ORDER);
314 void TestFitting::testSignificantDigits6 ()
316 QVERIFY (orderReducedVersusOrderAndSignificantDigits (NOMINAL_ORDER, 6) == NOMINAL_ORDER);
Unit test of Fitting classes.
void calculateCurveFitAndStatistics(unsigned int order, const FittingPointsConvenient &pointsConvenient, FittingCurveCoefficients &coefficients, double &mse, double &rms, double &rSquared, int significantDigits)
Compute the curve fit and the statistics for that curve fit.
TestFitting(QObject *parent=0)
Single constructor.
This class does the math to compute statistics for FittingWindow.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...