IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 10, 2006, 3:19:57 AM (20 years ago)
Author:
Paul Price
Message:

Fixing tests: standardised inputs, distributed inputs around [-1,1] so as to avoid numerical effects. tst_psPolyFit1D required special treatment for chebyshev polynomial fitting when x==NULL (indices used as the ordinate)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/test/math/tst_psPolyFit4D.c

    r6527 r7105  
    1111#include "pslib.h"
    1212#include "psTest.h"
    13 #define NUM_DATA 35
     13#define NUM_DATA 30
    1414#define POLY_ORDER_X 2
    15 #define POLY_ORDER_Y 3
     15#define POLY_ORDER_Y 2
    1616#define POLY_ORDER_Z 2
    1717#define POLY_ORDER_T 2
     
    3333#define ERROR_TOLERANCE 0.10
    3434#define YERR 10.0
    35 #define VERBOSE 0
     35#define VERBOSE 1
    3636#define NUM_ITERATIONS 5
    3737#define CLIP_SIGMA 4.0
     
    8282}
    8383
    84 psS32 genericTest(
     84bool genericTest(
    8585    psU32 flags,
    8686    psS32 polyOrderX,
     
    9292{
    9393    psS32 currentId = psMemGetId();
    94     psS32 testStatus = true;
     94    bool testStatus = true;
    9595    psS32 memLeaks = 0;
    9696    psPolynomial4D *myPoly = NULL;
     
    108108    printPositiveTestHeader(stdout, "psMinimize functions", "4D Polynomial Fitting Functions");
    109109
     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
    110131    if (expectedRC == false) {
    111132        printf("This test should generate an error message, and return NULL.\n");
     
    129150    if (flags & TS00_X_F32) {
    130151        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);
    136153    }
    137154
    138155    if (flags & TS00_X_S32) {
    139156        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);
    145158    }
    146159
    147160    if (flags & TS00_X_F64) {
    148161        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);
    154163    }
    155164
     
    161170    if (flags & TS00_Y_F32) {
    162171        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);
    168173    }
    169174
    170175    if (flags & TS00_Y_S32) {
    171176        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);
    177178    }
    178179
    179180    if (flags & TS00_Y_F64) {
    180181        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);
    186183    }
    187184
     
    192189    if (flags & TS00_Z_F32) {
    193190        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);
    199192    }
    200193
    201194    if (flags & TS00_Z_S32) {
    202195        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);
    208197    }
    209198
    210199    if (flags & TS00_Z_F64) {
    211200        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);
    217202    }
    218203
     
    223208    if (flags & TS00_T_F32) {
    224209        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);
    230211    }
    231212
    232213    if (flags & TS00_T_S32) {
    233214        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);
    239216    }
    240217
    241218    if (flags & TS00_T_F64) {
    242219        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);
    248221    }
    249222
     
    255228    if (flags & TS00_F_F32) {
    256229        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);
    262231        // Set a few outliers in the data.
    263232        if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
     
    266235            f->data.F32[3*numData/4]*= 2.0;
    267236        }
    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         }
    274237    }
    275238
    276239    if (flags & TS00_F_S32) {
    277240        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);
    283242        // Set a few outliers in the data.
    284243        if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
     
    287246            f->data.S32[3*numData/4]*= 2.0;
    288247        }
    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         }
    295248    }
    296249
    297250    if (flags & TS00_F_F64) {
    298251        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);
    304253        // Set a few outliers in the data.
    305254        if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
     
    307256            f->data.F64[numData/2]*= 2.0;
    308257            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             }
    315258        }
    316259    }
     
    399342        }
    400343
    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++) {
    402346            // Skip the outliers.
    403347            if ((i == numData/4) || (i == numData/2) || (i == 3*numData/4)) {
    404348                continue;
    405349            }
    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];
    460352
    461353            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);
    464356                testStatus = false;
    465357            } else {
    466358                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);
    469361                }
    470362            }
    471363        }
     364        psFree(result);
    472365    }
    473366
     
    480373    psFree(t);
    481374    psFree(f);
     375    psFree(xTruth);
     376    psFree(yTruth);
     377    psFree(zTruth);
     378    psFree(tTruth);
     379    psFree(fTruth);
    482380    psFree(fErr);
    483381    psFree(stats);
     
    505403    F64 tests: Chebyshev polys, clip fit
    506404 *****************************************************************************/
    507 psS32 main()
     405int main()
    508406{
    509407    psBool testStatus = true;
     
    611509    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);
    612510
     511    printf("Status: %x\n", testStatus);
     512
    613513    printFooter(stdout, "psMinimize functions: 4D Polynomial Fitting Functions", "", testStatus);
    614514}
Note: See TracChangeset for help on using the changeset viewer.