Changeset 7105
- Timestamp:
- May 10, 2006, 3:19:57 AM (20 years ago)
- Location:
- trunk/psLib/test/math
- Files:
-
- 4 edited
-
tst_psPolyFit1D.c (modified) (11 diffs)
-
tst_psPolyFit2D.c (modified) (10 diffs)
-
tst_psPolyFit3D.c (modified) (15 diffs)
-
tst_psPolyFit4D.c (modified) (17 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; -
trunk/psLib/test/math/tst_psPolyFit2D.c
r6484 r7105 11 11 #include "pslib.h" 12 12 #include "psTest.h" 13 #define NUM_DATA 3513 #define NUM_DATA 100 14 14 #define POLY_ORDER_X 2 15 15 #define POLY_ORDER_Y 3 … … 93 93 } 94 94 95 96 psVector *xTruth = psVectorAlloc(numData, PS_TYPE_F64); 97 psVector *yTruth = psVectorAlloc(numData, PS_TYPE_F64); 98 psVector *fTruth = psVectorAlloc(numData, PS_TYPE_F64); 99 xTruth->n = numData; 100 yTruth->n = numData; 101 fTruth->n = numData; 102 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 1); // Using an RNG with a known seed 103 for (int i = 0; i < numData; i++) { 104 xTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0; 105 yTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0; 106 fTruth->data.F64[i] = setData(xTruth->data.F64[i], yTruth->data.F64[i]); 107 } 108 psFree(rng); 109 95 110 if (flags & TS00_X_NULL) { 96 111 printf(" using a NULL x vector\n"); … … 99 114 if (flags & TS00_X_F32) { 100 115 printf(" using a psF32 x vector\n"); 101 x = psVectorAlloc(numData, PS_TYPE_F32); 102 x->n = numData; 103 for (psS32 i=0;i<numData;i++) { 104 x->data.F32[i] = (psF32) i; 105 } 116 x = psVectorCopy(NULL, xTruth, PS_TYPE_F32); 106 117 } 107 118 108 119 if (flags & TS00_X_S32) { 109 120 printf(" using a psS32 x vector\n"); 110 x = psVectorAlloc(numData, PS_TYPE_S32); 111 x->n = numData; 112 for (psS32 i=0;i<numData;i++) { 113 x->data.S32[i] = (psS32) i; 114 } 121 x = psVectorCopy(NULL, xTruth, PS_TYPE_S32); 115 122 } 116 123 117 124 if (flags & TS00_X_F64) { 118 125 printf(" using a psF64 x vector\n"); 119 x = psVectorAlloc(numData, PS_TYPE_F64); 120 x->n = numData; 121 for (psS32 i=0;i<numData;i++) { 122 x->data.F64[i] = (psF64) i; 123 } 124 } 125 126 x = psVectorCopy(NULL, xTruth, PS_TYPE_F64); 127 } 126 128 127 129 if (flags & TS00_Y_NULL) { … … 131 133 if (flags & TS00_Y_F32) { 132 134 printf(" using a psF32 y vector\n"); 133 y = psVectorAlloc(numData, PS_TYPE_F32); 134 y->n = numData; 135 for (psS32 i=0;i<numData;i++) { 136 y->data.F32[i] = (psF32) i; 137 } 135 y = psVectorCopy(NULL, yTruth, PS_TYPE_F32); 138 136 } 139 137 140 138 if (flags & TS00_Y_S32) { 141 139 printf(" using a psS32 y vector\n"); 142 y = psVectorAlloc(numData, PS_TYPE_S32); 143 y->n = numData; 144 for (psS32 i=0;i<numData;i++) { 145 y->data.S32[i] = (psS32) i; 146 } 140 y = psVectorCopy(NULL, yTruth, PS_TYPE_S32); 147 141 } 148 142 149 143 if (flags & TS00_Y_F64) { 150 144 printf(" using a psF64 y vector\n"); 151 y = psVectorAlloc(numData, PS_TYPE_F64); 152 y->n = numData; 153 for (psS32 i=0;i<numData;i++) { 154 y->data.F64[i] = (psF64) i; 155 } 145 y = psVectorCopy(NULL, yTruth, PS_TYPE_F64); 156 146 } 157 147 … … 162 152 if (flags & TS00_F_F32) { 163 153 printf(" using a psF32 f vector\n"); 164 f = psVectorAlloc(numData, PS_TYPE_F32); 165 f->n = numData; 166 for (psS32 i=0;i<numData;i++) { 167 f->data.F32[i] = setData((psF32) i, (psF32) i); 168 } 154 f = psVectorCopy(NULL, fTruth, PS_TYPE_F32); 169 155 // Set a few outliers in the data. 170 156 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 183 169 if (flags & TS00_F_S32) { 184 170 printf(" using a psS32 f vector\n"); 185 f = psVectorAlloc(numData, PS_TYPE_S32); 186 f->n = numData; 187 for (psS32 i=0;i<numData;i++) { 188 f->data.S32[i] = (psS32) setData((psF32) i, (psF32) i); 189 } 171 f = psVectorCopy(NULL, fTruth, PS_TYPE_S32); 190 172 // Set a few outliers in the data. 191 173 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 204 186 if (flags & TS00_F_F64) { 205 187 printf(" using a psF64 f vector\n"); 206 f = psVectorAlloc(numData, PS_TYPE_F64); 207 f->n = numData; 208 for (psS32 i=0;i<numData;i++) { 209 f->data.F64[i] = (psF64) setData((psF32) i, (psF32) i); 210 } 188 f = psVectorCopy(NULL, fTruth, PS_TYPE_F64); 211 189 // Set a few outliers in the data. 212 190 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 301 279 } 302 280 281 psVector *result = psPolynomial2DEvalVector(myPoly, xTruth, yTruth); 303 282 for (psS32 i=0 ;i<numData; i++) { 304 283 // Skip the outliers. … … 306 285 continue; 307 286 } 308 psF32 expectData; 309 psF32 xData; 310 psF32 yData; 311 if (flags & TS00_F_F32) { 312 expectData = f->data.F32[i]; 313 } else if (flags & TS00_F_F64) { 314 expectData = (psF32) f->data.F64[i]; 315 } else if (flags & TS00_F_S32) { 316 expectData = (psF32) f->data.S32[i]; 317 } 318 319 if (flags & TS00_X_F32) { 320 xData = x->data.F32[i]; 321 } else if (flags & TS00_X_F64) { 322 xData = (psF32) x->data.F64[i]; 323 } else if (flags & TS00_X_S32) { 324 xData = (psF32) x->data.S32[i]; 325 } else if (flags & TS00_X_NULL) { 326 xData = (psF32) i; 327 } 328 329 if (flags & TS00_Y_F32) { 330 yData = y->data.F32[i]; 331 } else if (flags & TS00_Y_F64) { 332 yData = (psF32) y->data.F64[i]; 333 } else if (flags & TS00_Y_S32) { 334 yData = (psF32) y->data.S32[i]; 335 } else if (flags & TS00_Y_NULL) { 336 yData = (psF32) i; 337 } 338 339 psF32 actualData = psPolynomial2DEval(myPoly, xData, yData); 287 psF64 actualData = result->data.F64[i]; 288 psF64 expectData = fTruth->data.F64[i]; 340 289 341 290 if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) { 342 printf("TEST ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",343 i, xData,actualData, expectData);291 printf("TEST ERROR: Fitted data %d: (%.1f), expected was (%.1f)\n", 292 i, actualData, expectData); 344 293 testStatus = false; 345 294 } else { 346 295 if (VERBOSE) { 347 printf("GOOD: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",348 i, xData,actualData, expectData);296 printf("GOOD: Fitted data %d: (%.1f), expected was (%.1f)\n", 297 i, actualData, expectData); 349 298 } 350 299 } 351 300 } 301 psFree(result); 352 302 } 353 303 … … 355 305 psFree(myPoly); 356 306 psFree(mask); 307 psFree(xTruth); 308 psFree(yTruth); 309 psFree(fTruth); 357 310 psFree(x); 358 311 psFree(y); -
trunk/psLib/test/math/tst_psPolyFit3D.c
r6484 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 15 #define POLY_ORDER_Y 3 … … 27 27 #define ERROR_TOLERANCE 0.10 28 28 #define YERR 10.0 29 #define VERBOSE 029 #define VERBOSE 1 30 30 #define NUM_ITERATIONS 5 31 31 #define CLIP_SIGMA 4.0 … … 95 95 printPositiveTestHeader(stdout, "psMinimize functions", "3D Polynomial Fitting Functions"); 96 96 97 psVector *xTruth = psVectorAlloc(numData, PS_TYPE_F64); 98 psVector *yTruth = psVectorAlloc(numData, PS_TYPE_F64); 99 psVector *zTruth = psVectorAlloc(numData, PS_TYPE_F64); 100 psVector *fTruth = psVectorAlloc(numData, PS_TYPE_F64); 101 xTruth->n = numData; 102 yTruth->n = numData; 103 zTruth->n = numData; 104 fTruth->n = numData; 105 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 1); // Using known seed 106 for (int i = 0; i < numData; i++) { 107 xTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0; 108 yTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0; 109 zTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0; 110 fTruth->data.F64[i] = setData(xTruth->data.F64[i], yTruth->data.F64[i], zTruth->data.F64[i]); 111 } 112 psFree(rng); 113 97 114 if (expectedRC == false) { 98 115 printf("This test should generate an error message, and return NULL.\n"); … … 116 133 if (flags & TS00_X_F32) { 117 134 printf(" using a psF32 x vector\n"); 118 x = psVectorAlloc(numData, PS_TYPE_F32); 119 x->n = numData; 120 for (psS32 i=0;i<numData;i++) { 121 x->data.F32[i] = (psF32) i; 122 } 135 x = psVectorCopy(NULL, xTruth, PS_TYPE_F32); 123 136 } 124 137 125 138 if (flags & TS00_X_S32) { 126 139 printf(" using a psS32 x vector\n"); 127 x = psVectorAlloc(numData, PS_TYPE_S32); 128 x->n = numData; 129 for (psS32 i=0;i<numData;i++) { 130 x->data.S32[i] = (psS32) i; 131 } 140 x = psVectorCopy(NULL, xTruth, PS_TYPE_S32); 132 141 } 133 142 134 143 if (flags & TS00_X_F64) { 135 144 printf(" using a psF64 x vector\n"); 136 x = psVectorAlloc(numData, PS_TYPE_F64); 137 x->n = numData; 138 for (psS32 i=0;i<numData;i++) { 139 x->data.F64[i] = (psF64) i; 140 } 145 x = psVectorCopy(NULL, xTruth, PS_TYPE_F64); 141 146 } 142 147 … … 148 153 if (flags & TS00_Y_F32) { 149 154 printf(" using a psF32 y vector\n"); 150 y = psVectorAlloc(numData, PS_TYPE_F32); 151 y->n = numData; 152 for (psS32 i=0;i<numData;i++) { 153 y->data.F32[i] = (psF32) i; 154 } 155 y = psVectorCopy(NULL, yTruth, PS_TYPE_F32); 155 156 } 156 157 157 158 if (flags & TS00_Y_S32) { 158 159 printf(" using a psS32 y vector\n"); 159 y = psVectorAlloc(numData, PS_TYPE_S32); 160 y->n = numData; 161 for (psS32 i=0;i<numData;i++) { 162 y->data.S32[i] = (psS32) i; 163 } 160 y = psVectorCopy(NULL, yTruth, PS_TYPE_S32); 164 161 } 165 162 166 163 if (flags & TS00_Y_F64) { 167 164 printf(" using a psF64 y vector\n"); 168 y = psVectorAlloc(numData, PS_TYPE_F64); 169 y->n = numData; 170 for (psS32 i=0;i<numData;i++) { 171 y->data.F64[i] = (psF64) i; 172 } 165 y = psVectorCopy(NULL, yTruth, PS_TYPE_F64); 173 166 } 174 167 … … 179 172 if (flags & TS00_Z_F32) { 180 173 printf(" using a psF32 z vector\n"); 181 z = psVectorAlloc(numData, PS_TYPE_F32); 182 z->n = numData; 183 for (psS32 i=0;i<numData;i++) { 184 z->data.F32[i] = (psF32) i; 185 } 174 z = psVectorCopy(NULL, zTruth, PS_TYPE_F32); 186 175 } 187 176 188 177 if (flags & TS00_Z_S32) { 189 178 printf(" using a psS32 z vector\n"); 190 z = psVectorAlloc(numData, PS_TYPE_S32); 191 z->n = numData; 192 for (psS32 i=0;i<numData;i++) { 193 z->data.S32[i] = (psS32) i; 194 } 179 z = psVectorCopy(NULL, zTruth, PS_TYPE_S32); 195 180 } 196 181 197 182 if (flags & TS00_Z_F64) { 198 183 printf(" using a psF64 z vector\n"); 199 z = psVectorAlloc(numData, PS_TYPE_F64); 200 z->n = numData; 201 for (psS32 i=0;i<numData;i++) { 202 z->data.F64[i] = (psF64) i; 203 } 184 z = psVectorCopy(NULL, zTruth, PS_TYPE_F64); 204 185 } 205 186 … … 211 192 if (flags & TS00_F_F32) { 212 193 printf(" using a psF32 f vector\n"); 213 f = psVectorAlloc(numData, PS_TYPE_F32); 214 f->n = numData; 215 for (psS32 i=0;i<numData;i++) { 216 f->data.F32[i] = setData((psF32) i, (psF32) i, (psF32) i); 217 } 194 f = psVectorCopy(NULL, fTruth, PS_TYPE_F32); 218 195 // Set a few outliers in the data. 219 196 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 225 202 if (VERBOSE) { 226 203 for (psS32 i=0;i<numData;i++) { 227 printf("Original data %d: (%.1f %.1f)\n", i, (psF32)i, f->data.F32[i]);204 printf("Original data %d: (%.1f)\n", i, f->data.F32[i]); 228 205 } 229 206 } … … 232 209 if (flags & TS00_F_S32) { 233 210 printf(" using a psS32 f vector\n"); 234 f = psVectorAlloc(numData, PS_TYPE_S32); 235 f->n = numData; 236 for (psS32 i=0;i<numData;i++) { 237 f->data.S32[i] = (psS32) setData((psF32) i, (psF32) i, (psF32) i); 238 } 211 f = psVectorCopy(NULL, fTruth, PS_TYPE_S32); 239 212 // Set a few outliers in the data. 240 213 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 246 219 if (VERBOSE) { 247 220 for (psS32 i=0;i<numData;i++) { 248 printf("Original data %d: (% .1f %d)\n", i, (psF32)i, f->data.S32[i]);221 printf("Original data %d: (%d)\n", i, f->data.S32[i]); 249 222 } 250 223 } … … 253 226 if (flags & TS00_F_F64) { 254 227 printf(" using a psF64 f vector\n"); 255 f = psVectorAlloc(numData, PS_TYPE_F64); 256 f->n = numData; 257 for (psS32 i=0;i<numData;i++) { 258 f->data.F64[i] = (psF64) setData((psF32) i, (psF32) i, (psF32) i); 259 } 228 f = psVectorCopy(NULL, fTruth, PS_TYPE_F64); 260 229 // Set a few outliers in the data. 261 230 if (OUTLIERS && (flags & TS00_CLIP_FIT)) { … … 267 236 if (VERBOSE) { 268 237 for (psS32 i=0;i<numData;i++) { 269 printf("Original data %d: (%.1f %.1f)\n", i, (psF32)i, f->data.F64[i]);238 printf("Original data %d: (%.1f)\n", i, f->data.F64[i]); 270 239 } 271 240 } … … 353 322 } 354 323 324 psVector *result = psPolynomial3DEvalVector(myPoly, xTruth, yTruth, zTruth); 355 325 for (psS32 i=0 ;i<numData; i++) { 356 326 // Skip the outliers. … … 358 328 continue; 359 329 } 360 psF32 expectData; 361 psF32 xData; 362 psF32 yData; 363 psF32 zData; 364 if (flags & TS00_F_F32) { 365 expectData = f->data.F32[i]; 366 } else if (flags & TS00_F_F64) { 367 expectData = (psF32) f->data.F64[i]; 368 } else if (flags & TS00_F_S32) { 369 expectData = (psF32) f->data.S32[i]; 370 } 371 372 if (flags & TS00_X_F32) { 373 xData = x->data.F32[i]; 374 } else if (flags & TS00_X_F64) { 375 xData = (psF32) x->data.F64[i]; 376 } else if (flags & TS00_X_S32) { 377 xData = (psF32) x->data.S32[i]; 378 } else if (flags & TS00_X_NULL) { 379 xData = (psF32) i; 380 } 381 382 if (flags & TS00_Y_F32) { 383 yData = y->data.F32[i]; 384 } else if (flags & TS00_Y_F64) { 385 yData = (psF32) y->data.F64[i]; 386 } else if (flags & TS00_Y_S32) { 387 yData = (psF32) y->data.S32[i]; 388 } else if (flags & TS00_Y_NULL) { 389 yData = (psF32) i; 390 } 391 392 if (flags & TS00_Z_F32) { 393 zData = z->data.F32[i]; 394 } else if (flags & TS00_Z_F64) { 395 zData = (psF32) z->data.F64[i]; 396 } else if (flags & TS00_Z_S32) { 397 zData = (psF32) z->data.S32[i]; 398 } else if (flags & TS00_Z_NULL) { 399 zData = (psF32) i; 400 } 401 402 psF32 actualData = psPolynomial3DEval(myPoly, xData, yData, zData); 330 psF32 expectData = fTruth->data.F64[i]; 331 psF32 actualData = result->data.F64[i]; 403 332 404 333 if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) { 405 printf("TEST ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",406 i, xData,actualData, expectData);334 printf("TEST ERROR: Fitted data %d: (%.1f), expected was (%.1f)\n", 335 i, actualData, expectData); 407 336 testStatus = false; 408 337 } else { 409 338 if (VERBOSE) { 410 printf("GOOD: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",411 i, xData,actualData, expectData);339 printf("GOOD: Fitted data %d: (%.1f), expected was (%.1f)\n", 340 i, actualData, expectData); 412 341 } 413 342 } 414 343 } 344 psFree(result); 415 345 } 416 346 … … 422 352 psFree(z); 423 353 psFree(f); 354 psFree(xTruth); 355 psFree(yTruth); 356 psFree(zTruth); 357 psFree(fTruth); 424 358 psFree(fErr); 425 359 psFree(stats); -
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.
