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

    r6484 r7105  
    1111#include "pslib.h"
    1212#include "psTest.h"
    13 #define NUM_DATA 35
     13#define NUM_DATA 100
    1414#define POLY_ORDER_X 2
    1515#define POLY_ORDER_Y 3
     
    9393    }
    9494
     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
    95110    if (flags & TS00_X_NULL) {
    96111        printf(" using a NULL x vector\n");
     
    99114    if (flags & TS00_X_F32) {
    100115        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);
    106117    }
    107118
    108119    if (flags & TS00_X_S32) {
    109120        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);
    115122    }
    116123
    117124    if (flags & TS00_X_F64) {
    118125        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    }
    126128
    127129    if (flags & TS00_Y_NULL) {
     
    131133    if (flags & TS00_Y_F32) {
    132134        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);
    138136    }
    139137
    140138    if (flags & TS00_Y_S32) {
    141139        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);
    147141    }
    148142
    149143    if (flags & TS00_Y_F64) {
    150144        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);
    156146    }
    157147
     
    162152    if (flags & TS00_F_F32) {
    163153        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);
    169155        // Set a few outliers in the data.
    170156        if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
     
    183169    if (flags & TS00_F_S32) {
    184170        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);
    190172        // Set a few outliers in the data.
    191173        if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
     
    204186    if (flags & TS00_F_F64) {
    205187        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);
    211189        // Set a few outliers in the data.
    212190        if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
     
    301279        }
    302280
     281        psVector *result = psPolynomial2DEvalVector(myPoly, xTruth, yTruth);
    303282        for (psS32 i=0 ;i<numData; i++) {
    304283            // Skip the outliers.
     
    306285                continue;
    307286            }
    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];
    340289
    341290            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);
    344293                testStatus = false;
    345294            } else {
    346295                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);
    349298                }
    350299            }
    351300        }
     301        psFree(result);
    352302    }
    353303
     
    355305    psFree(myPoly);
    356306    psFree(mask);
     307    psFree(xTruth);
     308    psFree(yTruth);
     309    psFree(fTruth);
    357310    psFree(x);
    358311    psFree(y);
Note: See TracChangeset for help on using the changeset viewer.