Changeset 7105 for trunk/psLib/test/math/tst_psPolyFit4D.c
- Timestamp:
- May 10, 2006, 3:19:57 AM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/test/math/tst_psPolyFit4D.c (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/test/math/tst_psPolyFit4D.c
r6527 r7105 11 11 #include "pslib.h" 12 12 #include "psTest.h" 13 #define NUM_DATA 3 513 #define NUM_DATA 30 14 14 #define POLY_ORDER_X 2 15 #define POLY_ORDER_Y 315 #define POLY_ORDER_Y 2 16 16 #define POLY_ORDER_Z 2 17 17 #define POLY_ORDER_T 2 … … 33 33 #define ERROR_TOLERANCE 0.10 34 34 #define YERR 10.0 35 #define VERBOSE 035 #define VERBOSE 1 36 36 #define NUM_ITERATIONS 5 37 37 #define CLIP_SIGMA 4.0 … … 82 82 } 83 83 84 psS32genericTest(84 bool genericTest( 85 85 psU32 flags, 86 86 psS32 polyOrderX, … … 92 92 { 93 93 psS32 currentId = psMemGetId(); 94 psS32testStatus = true;94 bool testStatus = true; 95 95 psS32 memLeaks = 0; 96 96 psPolynomial4D *myPoly = NULL; … … 108 108 printPositiveTestHeader(stdout, "psMinimize functions", "4D Polynomial Fitting Functions"); 109 109 110 psVector *xTruth = psVectorAlloc(numData, PS_TYPE_F64); 111 psVector *yTruth = psVectorAlloc(numData, PS_TYPE_F64); 112 psVector *zTruth = psVectorAlloc(numData, PS_TYPE_F64); 113 psVector *tTruth = psVectorAlloc(numData, PS_TYPE_F64); 114 psVector *fTruth = psVectorAlloc(numData, PS_TYPE_F64); 115 xTruth->n = numData; 116 yTruth->n = numData; 117 zTruth->n = numData; 118 tTruth->n = numData; 119 fTruth->n = numData; 120 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 1); // Using known seed 121 for (int i = 0; i < numData; i++) { 122 xTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0; 123 yTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0; 124 zTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0; 125 tTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0; 126 fTruth->data.F64[i] = setData(xTruth->data.F64[i], yTruth->data.F64[i], 127 zTruth->data.F64[i], tTruth->data.F64[i]); 128 } 129 psFree(rng); 130 110 131 if (expectedRC == false) { 111 132 printf("This test should generate an error message, and return NULL.\n"); … … 129 150 if (flags & TS00_X_F32) { 130 151 printf(" using a psF32 x vector\n"); 131 x = psVectorAlloc(numData, PS_TYPE_F32); 132 x->n = numData; 133 for (psS32 i=0;i<numData;i++) { 134 x->data.F32[i] = (psF32) i; 135 } 152 x = psVectorCopy(NULL, xTruth, PS_TYPE_F32); 136 153 } 137 154 138 155 if (flags & TS00_X_S32) { 139 156 printf(" using a psS32 x vector\n"); 140 x = psVectorAlloc(numData, PS_TYPE_S32); 141 x->n = numData; 142 for (psS32 i=0;i<numData;i++) { 143 x->data.S32[i] = (psS32) i; 144 } 157 x = psVectorCopy(NULL, xTruth, PS_TYPE_S32); 145 158 } 146 159 147 160 if (flags & TS00_X_F64) { 148 161 printf(" using a psF64 x vector\n"); 149 x = psVectorAlloc(numData, PS_TYPE_F64); 150 x->n = numData; 151 for (psS32 i=0;i<numData;i++) { 152 x->data.F64[i] = (psF64) i; 153 } 162 x = psVectorCopy(NULL, xTruth, PS_TYPE_F64); 154 163 } 155 164 … … 161 170 if (flags & TS00_Y_F32) { 162 171 printf(" using a psF32 y vector\n"); 163 y = psVectorAlloc(numData, PS_TYPE_F32); 164 y->n = numData; 165 for (psS32 i=0;i<numData;i++) { 166 y->data.F32[i] = (psF32) i; 167 } 172 y = psVectorCopy(NULL, yTruth, PS_TYPE_F32); 168 173 } 169 174 170 175 if (flags & TS00_Y_S32) { 171 176 printf(" using a psS32 y vector\n"); 172 y = psVectorAlloc(numData, PS_TYPE_S32); 173 y->n = numData; 174 for (psS32 i=0;i<numData;i++) { 175 y->data.S32[i] = (psS32) i; 176 } 177 y = psVectorCopy(NULL, yTruth, PS_TYPE_S32); 177 178 } 178 179 179 180 if (flags & TS00_Y_F64) { 180 181 printf(" using a psF64 y vector\n"); 181 y = psVectorAlloc(numData, PS_TYPE_F64); 182 y->n = numData; 183 for (psS32 i=0;i<numData;i++) { 184 y->data.F64[i] = (psF64) i; 185 } 182 y = psVectorCopy(NULL, yTruth, PS_TYPE_F64); 186 183 } 187 184 … … 192 189 if (flags & TS00_Z_F32) { 193 190 printf(" using a psF32 z vector\n"); 194 z = psVectorAlloc(numData, PS_TYPE_F32); 195 z->n = numData; 196 for (psS32 i=0;i<numData;i++) { 197 z->data.F32[i] = (psF32) i; 198 } 191 z = psVectorCopy(NULL, zTruth, PS_TYPE_F32); 199 192 } 200 193 201 194 if (flags & TS00_Z_S32) { 202 195 printf(" using a psS32 z vector\n"); 203 z = psVectorAlloc(numData, PS_TYPE_S32); 204 z->n = numData; 205 for (psS32 i=0;i<numData;i++) { 206 z->data.S32[i] = (psS32) i; 207 } 196 z = psVectorCopy(NULL, zTruth, PS_TYPE_S32); 208 197 } 209 198 210 199 if (flags & TS00_Z_F64) { 211 200 printf(" using a psF64 z vector\n"); 212 z = psVectorAlloc(numData, PS_TYPE_F64); 213 z->n = numData; 214 for (psS32 i=0;i<numData;i++) { 215 z->data.F64[i] = (psF64) i; 216 } 201 z = psVectorCopy(NULL, zTruth, PS_TYPE_F64); 217 202 } 218 203 … … 223 208 if (flags & TS00_T_F32) { 224 209 printf(" using a psF32 t vector\n"); 225 t = psVectorAlloc(numData, PS_TYPE_F32); 226 t->n = numData; 227 for (psS32 i=0;i<numData;i++) { 228 t->data.F32[i] = (psF32) i; 229 } 210 t = psVectorCopy(NULL, tTruth, PS_TYPE_F32); 230 211 } 231 212 232 213 if (flags & TS00_T_S32) { 233 214 printf(" using a psS32 t vector\n"); 234 t = psVectorAlloc(numData, PS_TYPE_S32); 235 t->n = numData; 236 for (psS32 i=0;i<numData;i++) { 237 t->data.S32[i] = (psS32) i; 238 } 215 t = psVectorCopy(NULL, tTruth, PS_TYPE_S32); 239 216 } 240 217 241 218 if (flags & TS00_T_F64) { 242 219 printf(" using a psF64 t vector\n"); 243 t = psVectorAlloc(numData, PS_TYPE_F64); 244 t->n = numData; 245 for (psS32 i=0;i<numData;i++) { 246 t->data.F64[i] = (psF64) i; 247 } 220 t = psVectorCopy(NULL, tTruth, PS_TYPE_F64); 248 221 } 249 222 … … 255 228 if (flags & TS00_F_F32) { 256 229 printf(" using a psF32 f vector\n"); 257 f = psVectorAlloc(numData, PS_TYPE_F32); 258 f->n = numData; 259 for (psS32 i=0;i<numData;i++) { 260 f->data.F32[i] = setData((psF32) i, (psF32) i, (psF32) i, (psF32) i); 261 } 230 f = psVectorCopy(NULL, fTruth, PS_TYPE_F32); 262 231 // Set a few outliers in the data. 263 232 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 266 235 f->data.F32[3*numData/4]*= 2.0; 267 236 } 268 269 if (VERBOSE) {270 for (psS32 i=0;i<numData;i++) {271 printf("Original data %d: (%.1f %.1f)\n", i, (psF32) i, f->data.F32[i]);272 }273 }274 237 } 275 238 276 239 if (flags & TS00_F_S32) { 277 240 printf(" using a psS32 f vector\n"); 278 f = psVectorAlloc(numData, PS_TYPE_S32); 279 f->n = numData; 280 for (psS32 i=0;i<numData;i++) { 281 f->data.S32[i] = (psS32) setData((psF32) i, (psF32) i, (psF32) i, (psF32) i); 282 } 241 f = psVectorCopy(NULL, fTruth, PS_TYPE_S32); 283 242 // Set a few outliers in the data. 284 243 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 287 246 f->data.S32[3*numData/4]*= 2.0; 288 247 } 289 290 if (VERBOSE) {291 for (psS32 i=0;i<numData;i++) {292 printf("Original data %d: (%.1f %d)\n", i, (psF32) i, f->data.S32[i]);293 }294 }295 248 } 296 249 297 250 if (flags & TS00_F_F64) { 298 251 printf(" using a psF64 f vector\n"); 299 f = psVectorAlloc(numData, PS_TYPE_F64); 300 f->n = numData; 301 for (psS32 i=0;i<numData;i++) { 302 f->data.F64[i] = (psF64) setData((psF32) i, (psF32) i, (psF32) i, (psF32) i); 303 } 252 f = psVectorCopy(NULL, fTruth, PS_TYPE_F64); 304 253 // Set a few outliers in the data. 305 254 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 307 256 f->data.F64[numData/2]*= 2.0; 308 257 f->data.F64[3*numData/4]*= 2.0; 309 }310 311 if (VERBOSE) {312 for (psS32 i=0;i<numData;i++) {313 printf("Original data %d: (%.1f %.1f)\n", i, (psF32) i, f->data.F64[i]);314 }315 258 } 316 259 } … … 399 342 } 400 343 401 for (psS32 i=0 ;i<numData; i++) { 344 psVector *result = psPolynomial4DEvalVector(myPoly, xTruth, yTruth, zTruth, tTruth); 345 for (int i=0;i<numData; i++) { 402 346 // Skip the outliers. 403 347 if ((i == numData/4) || (i == numData/2) || (i == 3*numData/4)) { 404 348 continue; 405 349 } 406 psF32 expectData; 407 psF32 xData; 408 psF32 yData; 409 psF32 zData; 410 psF32 tData; 411 if (flags & TS00_F_F32) { 412 expectData = f->data.F32[i]; 413 } else if (flags & TS00_F_F64) { 414 expectData = (psF32) f->data.F64[i]; 415 } else if (flags & TS00_F_S32) { 416 expectData = (psF32) f->data.S32[i]; 417 } 418 419 if (flags & TS00_X_F32) { 420 xData = x->data.F32[i]; 421 } else if (flags & TS00_X_F64) { 422 xData = (psF32) x->data.F64[i]; 423 } else if (flags & TS00_X_S32) { 424 xData = (psF32) x->data.S32[i]; 425 } else if (flags & TS00_X_NULL) { 426 xData = (psF32) i; 427 } 428 429 if (flags & TS00_Y_F32) { 430 yData = y->data.F32[i]; 431 } else if (flags & TS00_Y_F64) { 432 yData = (psF32) y->data.F64[i]; 433 } else if (flags & TS00_Y_S32) { 434 yData = (psF32) y->data.S32[i]; 435 } else if (flags & TS00_Y_NULL) { 436 yData = (psF32) i; 437 } 438 439 if (flags & TS00_Z_F32) { 440 zData = z->data.F32[i]; 441 } else if (flags & TS00_Z_F64) { 442 zData = (psF32) z->data.F64[i]; 443 } else if (flags & TS00_Z_S32) { 444 zData = (psF32) z->data.S32[i]; 445 } else if (flags & TS00_Z_NULL) { 446 zData = (psF32) i; 447 } 448 449 if (flags & TS00_T_F32) { 450 tData = t->data.F32[i]; 451 } else if (flags & TS00_T_F64) { 452 tData = (psF32) t->data.F64[i]; 453 } else if (flags & TS00_T_S32) { 454 tData = (psF32) t->data.S32[i]; 455 } else if (flags & TS00_T_NULL) { 456 tData = (psF32) i; 457 } 458 459 psF32 actualData = psPolynomial4DEval(myPoly, xData, yData, zData, tData); 350 psF32 expectData = fTruth->data.F64[i]; 351 psF32 actualData = result->data.F64[i]; 460 352 461 353 if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) { 462 printf("TEST ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",463 i, xData,actualData, expectData);354 printf("TEST ERROR: Fitted data %d: (%.1f), expected was (%.1f)\n", 355 i, actualData, expectData); 464 356 testStatus = false; 465 357 } else { 466 358 if (VERBOSE) { 467 printf("GOOD: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",468 i, xData,actualData, expectData);359 printf("GOOD: Fitted data %d: (%.1f), expected was (%.1f)\n", 360 i, actualData, expectData); 469 361 } 470 362 } 471 363 } 364 psFree(result); 472 365 } 473 366 … … 480 373 psFree(t); 481 374 psFree(f); 375 psFree(xTruth); 376 psFree(yTruth); 377 psFree(zTruth); 378 psFree(tTruth); 379 psFree(fTruth); 482 380 psFree(fErr); 483 381 psFree(stats); … … 505 403 F64 tests: Chebyshev polys, clip fit 506 404 *****************************************************************************/ 507 psS32main()405 int main() 508 406 { 509 407 psBool testStatus = true; … … 611 509 testStatus &= genericTest(TS00_MASK_S32 | TS00_FERR_F64 | TS00_X_F64 | TS00_Y_F64 | TS00_Z_F64 | TS00_T_F64 | TS00_F_F64 | TS00_POLY_ORD | TS00_CLIP_FIT, POLY_ORDER_X, POLY_ORDER_Y, POLY_ORDER_Z, POLY_ORDER_T, NUM_DATA, false); 612 510 511 printf("Status: %x\n", testStatus); 512 613 513 printFooter(stdout, "psMinimize functions: 4D Polynomial Fitting Functions", "", testStatus); 614 514 }
Note:
See TracChangeset
for help on using the changeset viewer.
