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_psPolyFit1D.c

    r6484 r7105  
    1313#include "pslib.h"
    1414#include "psTest.h"
    15 #define NUM_DATA 35
     15#define NUM_DATA 100
    1616#define POLY_ORDER 5
    1717#define A 2.0
     
    5252}
    5353
    54 psS32 genericTest(
     54bool genericTest(
    5555    psU32 flags,
    5656    psS32 polyOrder,
     
    5959{
    6060    psS32 currentId = psMemGetId();
    61     psS32 testStatus = true;
     61    bool testStatus = true;
    6262    psS32 memLeaks = 0;
    6363    psPolynomial1D *myPoly = NULL;
     
    9494    if (flags & TS00_X_NULL) {
    9595        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
    97119
    98120    if (flags & TS00_X_F32) {
    99121        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
    105125
    106126        if (flags & TS00_POLY_CHEB) {
    107127            p_psNormalizeVectorRange(x, -1.0, 1.0);
    108128        }
     129        #endif
     130
    109131    }
    110132
    111133    if (flags & TS00_X_S32) {
    112134        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
    118138
    119139        if (flags & TS00_POLY_CHEB) {
    120140            p_psNormalizeVectorRange(x, -1, 1);
    121141        }
     142        #endif
     143
    122144    }
    123145
    124146    if (flags & TS00_X_F64) {
    125147        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
    131151
    132152        if (flags & TS00_POLY_CHEB) {
    133153            p_psNormalizeVectorRange(x, -1.0, 1.0);
    134154        }
     155        #endif
     156
    135157    }
    136158
     
    141163    if (flags & TS00_F_F32) {
    142164        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);
    148166        // Set a few outliers in the data.
    149167        if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
     
    152170            f->data.F32[3*numData/4]*= 2.0;
    153171        }
    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         }
    160172    }
    161173
    162174    if (flags & TS00_F_S32) {
    163175        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);
    169177        // Set a few outliers in the data.
    170178        if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
     
    174182        }
    175183
    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         }
    181184    }
    182185
    183186    if (flags & TS00_F_F64) {
    184187        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);
    190189        // Set a few outliers in the data.
    191190        if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
     
    193192            f->data.F64[numData/2]*= 2.0;
    194193            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             }
    201194        }
    202195    }
     
    279272        }
    280273
    281         for (psS32 i=0 ;i<numData; i++) {
     274        psVector *result = psPolynomial1DEvalVector(myPoly, xTruth);
     275        for (psS32 i=0; i<numData; i++) {
    282276            // Skip the outliers.
    283277            if ((i == numData/4) || (i == numData/2) || (i == 3*numData/4)) {
    284278                continue;
    285279            }
    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];
    312282            if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
    313                 printf("TEST ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
    314                        i, xData, actualData, expectData);
     283                printf("TEST ERROR: Fitted data %d: %.1f --> %.1f vs %.1f\n",
     284                       i, xTruth->data.F64[i], actualData, expectData);
    315285                testStatus = false;
    316286            } else {
    317287                if (VERBOSE) {
    318                     printf("GOOD: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
    319                            i, xData, actualData, expectData);
     288                    printf("GOOD: Fitted data %d: %1.f --> %.1f vs %.1f\n",
     289                           i, xTruth->data.F64[i], actualData, expectData);
    320290                }
    321291            }
    322292        }
     293        psFree(result);
    323294    }
    324295
     
    328299    psFree(x);
    329300    psFree(f);
     301    psFree(xTruth);
     302    psFree(fTruth);
    330303    psFree(fErr);
    331304    psFree(stats);
     
    353326    F64 tests: Chebyshev polys, clip fit
    354327 *****************************************************************************/
    355 psS32 main()
     328int main()
    356329{
    357330    psBool testStatus = true;
Note: See TracChangeset for help on using the changeset viewer.