IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 29, 2009, 6:15:31 PM (17 years ago)
Author:
beaumont
Message:

merged with head

Location:
branches/cnb_branches/cnb_branch_20090301
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/cnb_branches/cnb_branch_20090301

  • branches/cnb_branches/cnb_branch_20090301/psLib/src/math/psMinimizeLMM.c

    r21183 r23594  
    9595    // check for non-finite entries in result
    9696    for (int i = 0; i < Beta->n; i++) {
    97         if (!isfinite(Beta->data.F32[i])) {
    98             // psError(PS_ERR_BAD_PARAMETER_VALUE, 3, "Fit value diverges: vector[%d] is %.2f\n", i, Beta->data.F32[i]);
    99             return false;
    100         }
     97        if (!isfinite(Beta->data.F32[i])) {
     98            // psError(PS_ERR_BAD_PARAMETER_VALUE, 3, "Fit value diverges: vector[%d] is %.2f\n", i, Beta->data.F32[i]);
     99            return false;
     100        }
    101101    }
    102102
     
    104104    // (we must do this before truncating Beta below)
    105105    if (dLinear) {
    106         *dLinear = psMinLM_dLinear(Beta, beta, lambda);
    107     }
    108 
    109     // full-length Beta for checkLimits functions 
     106        *dLinear = psMinLM_dLinear(Beta, beta, lambda);
     107    }
     108
     109    // full-length Beta for checkLimits functions
    110110    psVector *tmpBeta = psVectorAlloc(params->n, PS_TYPE_F32);
    111111    psVectorInit (tmpBeta, 0.0);
     
    113113    // set tmpBeta values which are not masked
    114114    for (int j = 0, n = 0; j < params->n; j++) {
    115         if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[j])) continue;
    116         tmpBeta->data.F32[j] = Beta->data.F32[n];
    117         n++;
     115        if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[j])) continue;
     116        tmpBeta->data.F32[j] = Beta->data.F32[n];
     117        n++;
    118118    }
    119119
     
    127127        if (checkLimits) {
    128128            checkLimits (PS_MINIMIZE_BETA_LIMIT, j, Params->data.F32, tmpBeta->data.F32);
    129         }
     129        }
    130130
    131131        Params->data.F32[j] = params->data.F32[j] - tmpBeta->data.F32[j];
     
    135135            checkLimits (PS_MINIMIZE_PARAM_MIN,  j, Params->data.F32, tmpBeta->data.F32);
    136136            checkLimits (PS_MINIMIZE_PARAM_MAX,  j, Params->data.F32, tmpBeta->data.F32);
    137         }
     137        }
    138138    }
    139139
    140140    // apply tmpBeta after limits have been checked
    141141    for (int j = 0, n = 0; j < params->n; j++) {
    142         if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[j])) continue;
    143         Beta->data.F32[n] = tmpBeta->data.F32[j];
    144         n++;
     142        if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[j])) continue;
     143        Beta->data.F32[n] = tmpBeta->data.F32[j];
     144        n++;
    145145    }
    146146
     
    169169    // if none are available, return false
    170170    if (!psMinLM_AllocAB (&Alpha, &Beta, params, paramMask)) {
    171         return false;
     171        return false;
    172172    }
    173173
     
    241241    // beta only counts unmasked parameters
    242242    for (int i = 0; i < beta->n; i++) {
    243         dh = lambda*B[i] + b[i];
    244         sh = 0.5*B[i]*dh;
    245         Sh += sh;
     243        dh = lambda*B[i] + b[i];
     244        sh = 0.5*B[i]*dh;
     245        Sh += sh;
    246246        dLinear += lambda*PS_SQR(B[i]) + B[i]*b[i];
    247247    }
     
    295295        assert (!isnan(chisq));
    296296
    297         // we track alpha,beta and params,deriv separately
     297        // we track alpha,beta and params,deriv separately
    298298        for (int j = 0, J = 0; j < params->n; j++) {
    299299            if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[j])) continue;
     
    304304                if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[k])) continue;
    305305                alpha->data.F32[J][K] += weight * deriv->data.F32[k];
    306                 K++;
     306                K++;
    307307            }
    308308            beta->data.F32[J] += weight * delta;
    309             J++;
     309            J++;
    310310        }
    311311    }
     
    328328between that function at the specified coords and the specified value at those
    329329coords.
    330  
     330
    331331This requires F32 input data; all internal calls use F32.
    332332XXX Make an F64 version?
     
    386386    // Alpha & Beta only contain elements to represent the unmasked parameters
    387387    if (!psMinLM_AllocAB (&Alpha, &Beta, params, paramMask)) {
    388         psAbort ("programming error: no unmasked parameters to be fit\n");
    389     }
    390    
     388        psAbort ("programming error: no unmasked parameters to be fit\n");
     389    }
     390
    391391    psImage *alpha   = psImageAlloc(Alpha->numCols, Alpha->numRows, PS_TYPE_F32);
    392392    psVector *beta   = psVectorAlloc(Beta->n, PS_TYPE_F32);
     
    490490            psTrace ("psLib.math", 5, "failure to calculate covariance matrix\n");
    491491        }
    492         // set covar values which are not masked
    493         psImageInit (covar, 0.0);
    494         for (int j = 0, J = 0; j < params->n; j++) {
    495             if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[j])) {
    496                 covar->data.F32[j][j] = 1.0;
    497                 continue;
    498             }
    499             for (int k = 0, K = 0; k < params->n; k++) {
    500                 if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[k])) continue;
    501                 covar->data.F32[j][k] = Alpha->data.F32[J][K];
    502                 K++;
    503             }
    504             J++;
    505         }
     492        // set covar values which are not masked
     493        psImageInit (covar, 0.0);
     494        for (int j = 0, J = 0; j < params->n; j++) {
     495            if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[j])) {
     496                covar->data.F32[j][j] = 1.0;
     497                continue;
     498            }
     499            for (int k = 0, K = 0; k < params->n; k++) {
     500                if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[k])) continue;
     501                covar->data.F32[j][k] = Alpha->data.F32[J][K];
     502                K++;
     503            }
     504            J++;
     505        }
    506506    }
    507507
     
    533533    // count unmasked parameters
    534534    if (paramMask) {
    535         nParams = 0;
    536         for (int i = 0; i < paramMask->n; i++) {
    537             if (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[i]) continue;
    538             nParams ++;
    539         }
    540     }
    541 
    542     if (nParams == 0) { 
    543         return false;
     535        nParams = 0;
     536        for (int i = 0; i < paramMask->n; i++) {
     537            if (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[i]) continue;
     538            nParams ++;
     539        }
     540    }
     541
     542    if (nParams == 0) {
     543        return false;
    544544    }
    545545
     
    585585}
    586586
    587 psMinConstraint* psMinConstraintAlloc()
     587psMinConstraint* psMinConstraintAlloc(void)
    588588{
    589589    psMinConstraint *tmp = psAlloc(sizeof(psMinConstraint));
Note: See TracChangeset for help on using the changeset viewer.