Changeset 7105 for trunk/psLib/test/math/tst_psPolyFit1D.c
- Timestamp:
- May 10, 2006, 3:19:57 AM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/test/math/tst_psPolyFit1D.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/test/math/tst_psPolyFit1D.c
r6484 r7105 13 13 #include "pslib.h" 14 14 #include "psTest.h" 15 #define NUM_DATA 3515 #define NUM_DATA 100 16 16 #define POLY_ORDER 5 17 17 #define A 2.0 … … 52 52 } 53 53 54 psS32genericTest(54 bool genericTest( 55 55 psU32 flags, 56 56 psS32 polyOrder, … … 59 59 { 60 60 psS32 currentId = psMemGetId(); 61 psS32testStatus = true;61 bool testStatus = true; 62 62 psS32 memLeaks = 0; 63 63 psPolynomial1D *myPoly = NULL; … … 94 94 if (flags & TS00_X_NULL) { 95 95 printf(" using a NULL x vector\n"); 96 } 96 numData = 30; 97 } 98 99 psVector *xTruth = psVectorAlloc(numData, PS_TYPE_F64); 100 psVector *fTruth = psVectorAlloc(numData, PS_TYPE_F64); 101 xTruth->n = numData; 102 fTruth->n = numData; 103 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 1); // Using a known seed 104 for (int i = 0; i < numData; i++) { 105 xTruth->data.F64[i] = (flags & TS00_X_NULL) ? i : 2.0*psRandomUniform(rng) - 1.0; 106 fTruth->data.F64[i] = setData(xTruth->data.F64[i]); 107 } 108 if (flags & TS00_X_NULL && flags & TS00_POLY_CHEB) { 109 // Renormalise the indices 110 p_psNormalizeVectorRange(xTruth, -1.0, 1.0); 111 } 112 psFree(rng); 113 #if VERBOSE 114 115 for (int i = 0; i < numData; i++) { 116 printf("Original %d: %f\t%f\n", i, xTruth->data.F64[i], fTruth->data.F64[i]); 117 } 118 #endif 97 119 98 120 if (flags & TS00_X_F32) { 99 121 printf(" using a psF32 x vector\n"); 100 x = psVectorAlloc(numData, PS_TYPE_F32); 101 x->n = numData; 102 for (psS32 i=0;i<numData;i++) { 103 x->data.F32[i] = (psF32) i; 104 } 122 x = psVectorCopy(NULL, xTruth, PS_TYPE_F32); 123 124 #if 0 105 125 106 126 if (flags & TS00_POLY_CHEB) { 107 127 p_psNormalizeVectorRange(x, -1.0, 1.0); 108 128 } 129 #endif 130 109 131 } 110 132 111 133 if (flags & TS00_X_S32) { 112 134 printf(" using a psS32 x vector\n"); 113 x = psVectorAlloc(numData, PS_TYPE_S32); 114 x->n = numData; 115 for (psS32 i=0;i<numData;i++) { 116 x->data.S32[i] = (psS32) i; 117 } 135 x = psVectorCopy(NULL, xTruth, PS_TYPE_S32); 136 137 #if 0 118 138 119 139 if (flags & TS00_POLY_CHEB) { 120 140 p_psNormalizeVectorRange(x, -1, 1); 121 141 } 142 #endif 143 122 144 } 123 145 124 146 if (flags & TS00_X_F64) { 125 147 printf(" using a psF64 x vector\n"); 126 x = psVectorAlloc(numData, PS_TYPE_F64); 127 x->n = numData; 128 for (psS32 i=0;i<numData;i++) { 129 x->data.F64[i] = (psF64) i; 130 } 148 x = psVectorCopy(NULL, xTruth, PS_TYPE_F64); 149 150 #if 0 131 151 132 152 if (flags & TS00_POLY_CHEB) { 133 153 p_psNormalizeVectorRange(x, -1.0, 1.0); 134 154 } 155 #endif 156 135 157 } 136 158 … … 141 163 if (flags & TS00_F_F32) { 142 164 printf(" using a psF32 f vector\n"); 143 f = psVectorAlloc(numData, PS_TYPE_F32); 144 f->n = numData; 145 for (psS32 i=0;i<numData;i++) { 146 f->data.F32[i] = setData((psF32) i); 147 } 165 f = psVectorCopy(NULL, fTruth, PS_TYPE_F32); 148 166 // Set a few outliers in the data. 149 167 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 152 170 f->data.F32[3*numData/4]*= 2.0; 153 171 } 154 155 if (VERBOSE) {156 for (psS32 i=0;i<numData;i++) {157 printf("Original data %d: (%.1f %.1f)\n", i, (psF32) i, f->data.F32[i]);158 }159 }160 172 } 161 173 162 174 if (flags & TS00_F_S32) { 163 175 printf(" using a psS32 f vector\n"); 164 f = psVectorAlloc(numData, PS_TYPE_S32); 165 f->n = numData; 166 for (psS32 i=0;i<numData;i++) { 167 f->data.S32[i] = (psS32) setData((psF32) i); 168 } 176 f = psVectorCopy(NULL, fTruth, PS_TYPE_S32); 169 177 // Set a few outliers in the data. 170 178 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 174 182 } 175 183 176 if (VERBOSE) {177 for (psS32 i=0;i<numData;i++) {178 printf("Original data %d: (%.1f %d)\n", i, (psF32) i, f->data.S32[i]);179 }180 }181 184 } 182 185 183 186 if (flags & TS00_F_F64) { 184 187 printf(" using a psF64 f vector\n"); 185 f = psVectorAlloc(numData, PS_TYPE_F64); 186 f->n = numData; 187 for (psS32 i=0;i<numData;i++) { 188 f->data.F64[i] = (psF64) setData((psF32) i); 189 } 188 f = psVectorCopy(NULL, fTruth, PS_TYPE_F64); 190 189 // Set a few outliers in the data. 191 190 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 193 192 f->data.F64[numData/2]*= 2.0; 194 193 f->data.F64[3*numData/4]*= 2.0; 195 }196 197 if (VERBOSE) {198 for (psS32 i=0;i<numData;i++) {199 printf("Original data %d: (%.1f %.1f)\n", i, (psF32) i, f->data.F64[i]);200 }201 194 } 202 195 } … … 279 272 } 280 273 281 for (psS32 i=0 ;i<numData; i++) { 274 psVector *result = psPolynomial1DEvalVector(myPoly, xTruth); 275 for (psS32 i=0; i<numData; i++) { 282 276 // Skip the outliers. 283 277 if ((i == numData/4) || (i == numData/2) || (i == 3*numData/4)) { 284 278 continue; 285 279 } 286 psF32 expectData; 287 psF32 xData; 288 if (flags & TS00_F_F32) { 289 expectData = f->data.F32[i]; 290 } else if (flags & TS00_F_F64) { 291 expectData = (psF32) f->data.F64[i]; 292 } else if (flags & TS00_F_S32) { 293 expectData = (psF32) f->data.S32[i]; 294 } 295 296 if (flags & TS00_X_F32) { 297 xData = x->data.F32[i]; 298 } else if (flags & TS00_X_F64) { 299 xData = (psF32) x->data.F64[i]; 300 } else if (flags & TS00_X_S32) { 301 xData = (psF32) x->data.S32[i]; 302 } else if (flags & TS00_X_NULL) { 303 if (flags & TS00_POLY_ORD) { 304 xData = (psF32) i; 305 } else if (flags & TS00_POLY_CHEB) { 306 xData = ((2.0 / ((psF32) (numData - 1))) * ((psF32) i)) - 1.0; 307 } 308 } 309 310 psF32 actualData = psPolynomial1DEval(myPoly, xData); 311 280 psF32 expectData = fTruth->data.F64[i]; 281 psF32 actualData = result->data.F64[i]; 312 282 if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) { 313 printf("TEST ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",314 i, x Data, actualData, expectData);283 printf("TEST ERROR: Fitted data %d: %.1f --> %.1f vs %.1f\n", 284 i, xTruth->data.F64[i], actualData, expectData); 315 285 testStatus = false; 316 286 } else { 317 287 if (VERBOSE) { 318 printf("GOOD: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",319 i, x Data, actualData, expectData);288 printf("GOOD: Fitted data %d: %1.f --> %.1f vs %.1f\n", 289 i, xTruth->data.F64[i], actualData, expectData); 320 290 } 321 291 } 322 292 } 293 psFree(result); 323 294 } 324 295 … … 328 299 psFree(x); 329 300 psFree(f); 301 psFree(xTruth); 302 psFree(fTruth); 330 303 psFree(fErr); 331 304 psFree(stats); … … 353 326 F64 tests: Chebyshev polys, clip fit 354 327 *****************************************************************************/ 355 psS32main()328 int main() 356 329 { 357 330 psBool testStatus = true;
Note:
See TracChangeset
for help on using the changeset viewer.
