IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 26702


Ignore:
Timestamp:
Jan 27, 2010, 10:06:50 PM (16 years ago)
Author:
eugene
Message:

update DUAL to allow for SEPARATE solutions of norm and kernels

Location:
branches/eam_branches/20091201/psModules/src/imcombine
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionEquation.c

    r26667 r26702  
    156156            if (mode & PM_SUBTRACTION_EQUATION_KERNELS) {
    157157                vector->data.F64[iIndex] = sumIC * poly[iTerm];
    158                 // XXX TEST for Hermitians: do not calculate A - norm*B - \sum(k x B),
    159                 // instead, calculate A - \sum(k x B), with full hermitians
    160                 if (0 && !(mode & PM_SUBTRACTION_EQUATION_NORM)) {
     158                if (!(mode & PM_SUBTRACTION_EQUATION_NORM)) {
    161159                    // subtract norm * sumRC * poly[iTerm]
    162160                    psAssert (kernels->solution1, "programming error: define solution first!");
     
    232230                                      const pmSubtractionKernels *kernels, // Kernels
    233231                                      const psImage *polyValues, // Spatial polynomial values
    234                                       int footprint // (Half-)Size of stamp
     232                                      int footprint, // (Half-)Size of stamp
     233                                      const pmSubtractionEquationCalculationMode mode
    235234                                      )
    236235{
     
    272271    }
    273272
     273
     274    // initialize the matrix and vector for NOP on all coeffs.  we only fill in the coeffs we
     275    // choose to calculate
     276    psImageInit(matrix, 0.0);
     277    psVectorInit(vector, 1.0);
     278    for (int i = 0; i < matrix->numCols; i++) {
     279        matrix->data.F64[i][i] = 1.0;
     280    }
    274281
    275282    for (int i = 0; i < numKernels; i++) {
     
    306313            }
    307314
    308             // Spatial variation
    309             for (int iTerm = 0, iIndex = i; iTerm < numPoly; iTerm++, iIndex += numKernels) {
    310                 for (int jTerm = 0, jIndex = j; jTerm < numPoly; jTerm++, jIndex += numKernels) {
    311                     double aa = sumAA * poly2[iTerm][jTerm];
    312                     double bb = sumBB * poly2[iTerm][jTerm];
    313                     double ab = sumAB * poly2[iTerm][jTerm];
    314 
    315                     matrix->data.F64[iIndex][jIndex] = aa;
    316                     matrix->data.F64[jIndex][iIndex] = aa;
    317 
    318                     matrix->data.F64[iIndex + numParams][jIndex + numParams] = bb;
    319                     matrix->data.F64[jIndex + numParams][iIndex + numParams] = bb;
    320 
    321                     matrix->data.F64[iIndex][jIndex + numParams] = ab;
    322                     matrix->data.F64[jIndex + numParams][iIndex] = ab;
    323                 }
    324             }
     315            // Spatial variation of kernel coeffs
     316            if (mode & PM_SUBTRACTION_EQUATION_KERNELS) {
     317                for (int iTerm = 0, iIndex = i; iTerm < numPoly; iTerm++, iIndex += numKernels) {
     318                    for (int jTerm = 0, jIndex = j; jTerm < numPoly; jTerm++, jIndex += numKernels) {
     319                        double aa = sumAA * poly2[iTerm][jTerm];
     320                        double bb = sumBB * poly2[iTerm][jTerm];
     321                        double ab = sumAB * poly2[iTerm][jTerm];
     322
     323                        matrix->data.F64[iIndex][jIndex] = aa;
     324                        matrix->data.F64[jIndex][iIndex] = aa;
     325
     326                        matrix->data.F64[iIndex + numParams][jIndex + numParams] = bb;
     327                        matrix->data.F64[jIndex + numParams][iIndex + numParams] = bb;
     328
     329                        matrix->data.F64[iIndex][jIndex + numParams] = ab;
     330                        matrix->data.F64[jIndex + numParams][iIndex] = ab;
     331                    }
     332                }
     333            }
    325334        }
    326335        for (int j = 0; j < i; j++) {
     
    340349            }
    341350
    342             // Spatial variation
    343             for (int iTerm = 0, iIndex = i; iTerm < numPoly; iTerm++, iIndex += numKernels) {
    344                 for (int jTerm = 0, jIndex = j; jTerm < numPoly; jTerm++, jIndex += numKernels) {
    345                     double ab = sumAB * poly2[iTerm][jTerm];
    346                     matrix->data.F64[iIndex][jIndex + numParams] = ab;
    347                     matrix->data.F64[jIndex + numParams][iIndex] = ab;
    348                 }
    349             }
     351            // Spatial variation of kernel coeffs
     352            if (mode & PM_SUBTRACTION_EQUATION_KERNELS) {
     353                for (int iTerm = 0, iIndex = i; iTerm < numPoly; iTerm++, iIndex += numKernels) {
     354                    for (int jTerm = 0, jIndex = j; jTerm < numPoly; jTerm++, jIndex += numKernels) {
     355                        double ab = sumAB * poly2[iTerm][jTerm];
     356                        matrix->data.F64[iIndex][jIndex + numParams] = ab;
     357                        matrix->data.F64[jIndex + numParams][iIndex] = ab;
     358                    }
     359                }
     360            }
    350361        }
    351362
     
    403414            double bi2 = sumBI2 * poly[iTerm];
    404415            double ai1 = sumAI1 * poly[iTerm];
    405             double a = sumA * poly[iTerm];
     416            double a   = sumA * poly[iTerm];
    406417            double bi1 = sumBI1 * poly[iTerm];
    407             double b = sumB * poly[iTerm];
    408 
    409             matrix->data.F64[iIndex][normIndex] = ai1;
    410             matrix->data.F64[normIndex][iIndex] = ai1;
    411             matrix->data.F64[iIndex][bgIndex] = a;
    412             matrix->data.F64[bgIndex][iIndex] = a;
    413             matrix->data.F64[iIndex + numParams][normIndex] = bi1;
    414             matrix->data.F64[normIndex][iIndex + numParams] = bi1;
    415             matrix->data.F64[iIndex + numParams][bgIndex] = b;
    416             matrix->data.F64[bgIndex][iIndex + numParams] = b;
    417             vector->data.F64[iIndex] = ai2;
    418             vector->data.F64[iIndex + numParams] = bi2;
     418            double b   = sumB * poly[iTerm];
     419
     420            if ((mode & PM_SUBTRACTION_EQUATION_NORM) && (mode & PM_SUBTRACTION_EQUATION_KERNELS)) {
     421                matrix->data.F64[iIndex][normIndex] = ai1;
     422                matrix->data.F64[normIndex][iIndex] = ai1;
     423                matrix->data.F64[iIndex + numParams][normIndex] = bi1;
     424                matrix->data.F64[normIndex][iIndex + numParams] = bi1;
     425            }
     426            if ((mode & PM_SUBTRACTION_EQUATION_BG) && (mode & PM_SUBTRACTION_EQUATION_KERNELS)) {
     427                matrix->data.F64[iIndex][bgIndex] = a;
     428                matrix->data.F64[bgIndex][iIndex] = a;
     429                matrix->data.F64[iIndex + numParams][bgIndex] = b;
     430                matrix->data.F64[bgIndex][iIndex + numParams] = b;
     431            }
     432            if (mode & PM_SUBTRACTION_EQUATION_KERNELS) {
     433                vector->data.F64[iIndex] = ai2;
     434                vector->data.F64[iIndex + numParams] = bi2;
     435                if (!(mode & PM_SUBTRACTION_EQUATION_NORM)) {
     436                    // subtract norm * sumRC * poly[iTerm]
     437                    psAssert (kernels->solution1, "programming error: define solution first!");
     438                    int normIndex = PM_SUBTRACTION_INDEX_NORM(kernels); // Index for normalisation
     439                    double norm = fabs(kernels->solution1->data.F64[normIndex]);  // Normalisation
     440                    vector->data.F64[iIndex] -= norm * ai1;
     441                    vector->data.F64[iIndex + numParams] -= norm * bi1;
     442                }
     443            }
    419444        }
    420445    }
     
    457482        }
    458483    }
    459     matrix->data.F64[bgIndex][normIndex] = sumI1;
    460     matrix->data.F64[normIndex][bgIndex] = sumI1;
    461     matrix->data.F64[normIndex][normIndex] = sumI1I1;
    462     matrix->data.F64[bgIndex][bgIndex] = sum1;
    463     vector->data.F64[bgIndex] = sumI2;
    464     vector->data.F64[normIndex] = sumI1I2;
    465 
     484    if (mode & PM_SUBTRACTION_EQUATION_NORM) {
     485        matrix->data.F64[normIndex][normIndex] = sumI1I1;
     486        vector->data.F64[normIndex] = sumI1I2;
     487    }
     488    if (mode & PM_SUBTRACTION_EQUATION_BG) {
     489        matrix->data.F64[bgIndex][bgIndex] = sum1;
     490        vector->data.F64[bgIndex] = sumI2;
     491    }
     492    if ((mode & PM_SUBTRACTION_EQUATION_NORM) && (mode & PM_SUBTRACTION_EQUATION_BG)) {
     493        matrix->data.F64[bgIndex][normIndex] = sumI1;
     494        matrix->data.F64[normIndex][bgIndex] = sumI1;
     495    }
    466496    return true;
    467497}
     
    680710        status = calculateDualMatrixVector(stamp->matrix, stamp->vector,stamp->image1, stamp->image2,
    681711                                           weight, window, stamp->convolutions1, stamp->convolutions2,
    682                                            kernels, polyValues, footprint);
     712                                           kernels, polyValues, footprint, mode);
    683713        break;
    684714      default:
     
    12981328        if (!kernels->solution1) {
    12991329            kernels->solution1 = psVectorAlloc(numSolution1, PS_TYPE_F64);
     1330            psVectorInit (kernels->solution1, 0.0);
    13001331        }
    13011332        if (!kernels->solution2) {
    13021333            kernels->solution2 = psVectorAlloc(numSolution2, PS_TYPE_F64);
    1303         }
     1334            psVectorInit (kernels->solution2, 0.0);
     1335        }
     1336
     1337        // only update the solutions that we chose to calculate:
     1338        if (mode & PM_SUBTRACTION_EQUATION_NORM) {
     1339            int normIndex = PM_SUBTRACTION_INDEX_NORM(kernels); // Index for normalisation
     1340            kernels->solution1->data.F64[normIndex] = solution->data.F64[normIndex];
     1341        }
     1342        if (mode & PM_SUBTRACTION_EQUATION_BG) {
     1343            int bgIndex = PM_SUBTRACTION_INDEX_BG(kernels); // Index in matrix for background
     1344            kernels->solution1->data.F64[bgIndex] = solution->data.F64[bgIndex];
     1345        }
     1346        if (mode & PM_SUBTRACTION_EQUATION_KERNELS) {
     1347            int numKernels = kernels->num;
     1348            for (int i = 0; i < numKernels * numSpatial; i++) {
     1349                // XXX fprintf (stderr, "keep\n");
     1350                kernels->solution1->data.F64[i] = solution->data.F64[i];
     1351                kernels->solution2->data.F64[i] = solution->data.F64[i + numSolution1];
     1352            }
     1353        }
     1354
    13041355
    13051356        memcpy(kernels->solution1->data.F64, solution->data.F64,
  • branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionMatch.c

    r26687 r26702  
    2828static bool useFFT = true;              // Do convolutions using FFT
    2929
    30 # define SEPARATE 0
     30# define SEPARATE 1
    3131# if (SEPARATE)
    3232# define SUBMODE PM_SUBTRACTION_EQUATION_NORM
    3333# else
    3434# define SUBMODE PM_SUBTRACTION_EQUATION_ALL
    35 // # define SUBMODE PM_SUBTRACTION_EQUATION_KERNELS
    3635# endif
    3736
Note: See TracChangeset for help on using the changeset viewer.