- Timestamp:
- Mar 29, 2009, 6:15:31 PM (17 years ago)
- Location:
- branches/cnb_branches/cnb_branch_20090301
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
psLib/src/math/psMinimizeLMM.c (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/cnb_branches/cnb_branch_20090301
-
branches/cnb_branches/cnb_branch_20090301/psLib/src/math/psMinimizeLMM.c
r21183 r23594 95 95 // check for non-finite entries in result 96 96 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 } 101 101 } 102 102 … … 104 104 // (we must do this before truncating Beta below) 105 105 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 110 110 psVector *tmpBeta = psVectorAlloc(params->n, PS_TYPE_F32); 111 111 psVectorInit (tmpBeta, 0.0); … … 113 113 // set tmpBeta values which are not masked 114 114 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++; 118 118 } 119 119 … … 127 127 if (checkLimits) { 128 128 checkLimits (PS_MINIMIZE_BETA_LIMIT, j, Params->data.F32, tmpBeta->data.F32); 129 }129 } 130 130 131 131 Params->data.F32[j] = params->data.F32[j] - tmpBeta->data.F32[j]; … … 135 135 checkLimits (PS_MINIMIZE_PARAM_MIN, j, Params->data.F32, tmpBeta->data.F32); 136 136 checkLimits (PS_MINIMIZE_PARAM_MAX, j, Params->data.F32, tmpBeta->data.F32); 137 }137 } 138 138 } 139 139 140 140 // apply tmpBeta after limits have been checked 141 141 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++; 145 145 } 146 146 … … 169 169 // if none are available, return false 170 170 if (!psMinLM_AllocAB (&Alpha, &Beta, params, paramMask)) { 171 return false;171 return false; 172 172 } 173 173 … … 241 241 // beta only counts unmasked parameters 242 242 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; 246 246 dLinear += lambda*PS_SQR(B[i]) + B[i]*b[i]; 247 247 } … … 295 295 assert (!isnan(chisq)); 296 296 297 // we track alpha,beta and params,deriv separately297 // we track alpha,beta and params,deriv separately 298 298 for (int j = 0, J = 0; j < params->n; j++) { 299 299 if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[j])) continue; … … 304 304 if (paramMask && (paramMask->data.PS_TYPE_VECTOR_MASK_DATA[k])) continue; 305 305 alpha->data.F32[J][K] += weight * deriv->data.F32[k]; 306 K++;306 K++; 307 307 } 308 308 beta->data.F32[J] += weight * delta; 309 J++;309 J++; 310 310 } 311 311 } … … 328 328 between that function at the specified coords and the specified value at those 329 329 coords. 330 330 331 331 This requires F32 input data; all internal calls use F32. 332 332 XXX Make an F64 version? … … 386 386 // Alpha & Beta only contain elements to represent the unmasked parameters 387 387 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 391 391 psImage *alpha = psImageAlloc(Alpha->numCols, Alpha->numRows, PS_TYPE_F32); 392 392 psVector *beta = psVectorAlloc(Beta->n, PS_TYPE_F32); … … 490 490 psTrace ("psLib.math", 5, "failure to calculate covariance matrix\n"); 491 491 } 492 // set covar values which are not masked493 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 } 506 506 } 507 507 … … 533 533 // count unmasked parameters 534 534 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; 544 544 } 545 545 … … 585 585 } 586 586 587 psMinConstraint* psMinConstraintAlloc( )587 psMinConstraint* psMinConstraintAlloc(void) 588 588 { 589 589 psMinConstraint *tmp = psAlloc(sizeof(psMinConstraint));
Note:
See TracChangeset
for help on using the changeset viewer.
