Changeset 6525 for trunk/psLib/src/math/psMinimizeLMM.c
- Timestamp:
- Mar 6, 2006, 10:32:36 AM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psMinimizeLMM.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psMinimizeLMM.c
r6524 r6525 10 10 * @author EAM, IfA 11 11 * 12 * @version $Revision: 1. 9$ $Name: not supported by cvs2svn $13 * @date $Date: 2006-03-06 20:32: 19$12 * @version $Revision: 1.10 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2006-03-06 20:32:36 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 239 239 psF64 ymodel; 240 240 psVector *deriv = psVectorAlloc(params->n, PS_TYPE_F32); 241 deriv->n = deriv->nalloc; 241 242 242 243 // zero alpha and beta for summing below … … 301 302 NOTES: EAM: this is my re-implementation of MinLM 302 303 303 XXX: EAM : constraints added 2006.02.15304 XXX: Must implement code to handle the constrain->min, ->max, ->delta members. 304 305 305 306 XXX: Put the ASSERTS in. … … 328 329 PS_ASSERT_VECTOR_TYPE(params, PS_TYPE_F32, false); 329 330 psVector *paramMask = NULL; 330 psVector *paramDelta = NULL;331 psVector *paramMin = NULL;332 psVector *paramMax = NULL;333 331 if (constrain != NULL) { 334 // XXX EAM : fill out the asserts335 paramDelta = constrain->paramDelta;336 paramMin = constrain->paramMin;337 paramMax = constrain->paramMax;338 332 paramMask = constrain->paramMask; 339 333 if (paramMask != NULL) { 340 334 PS_ASSERT_VECTOR_TYPE(paramMask, PS_TYPE_U8, false); 341 335 PS_ASSERT_VECTORS_SIZE_EQUAL(params, paramMask, false); 336 } 337 if (constrain->paramMin != NULL) { 338 psLogMsg(__func__, PS_LOG_WARN, "WARNING: the constrain->paramMin vector is currently ignored.\n"); 339 } 340 if (constrain->paramMax != NULL) { 341 psLogMsg(__func__, PS_LOG_WARN, "WARNING: the constrain->paramMax vector is currently ignored.\n"); 342 } 343 if (constrain->paramDelta != NULL) { 344 psLogMsg(__func__, PS_LOG_WARN, "WARNING: the constrain->paramDelta vector is currently ignored.\n"); 342 345 } 343 346 } … … 368 371 psVector *Beta = psVectorAlloc(params->n, PS_TYPE_F64); 369 372 psVector *Params = psVectorAlloc(params->n, PS_TYPE_F32); 373 beta->n = beta->nalloc; 374 Beta->n = Beta->nalloc; 375 Params->n = Params->nalloc; 370 376 psVector *dy = NULL; 371 377 psF64 Chisq = 0.0; 372 378 psF64 lambda = 0.001; 379 // XXX: Code this properly. Don't use mustFree00. 380 psBool mustFree00 = false; 381 psVector *beta_lim = NULL; 382 psVector *param_min = NULL; 383 psVector *param_max = NULL; 384 385 // if we are provided a covar image, we expect to find these three vectors in first three rows 386 if (covar != NULL) { 387 mustFree00 = true; 388 beta_lim = psVectorAlloc(params->n, PS_TYPE_F32); 389 param_min = psVectorAlloc(params->n, PS_TYPE_F32); 390 param_max = psVectorAlloc(params->n, PS_TYPE_F32); 391 beta_lim->n = beta_lim->nalloc; 392 param_min->n = param_min->nalloc; 393 param_max->n = param_max->nalloc; 394 for (int i = 0; i < params->n; i++) { 395 beta_lim->data.F32[i] = covar->data.F64[0][i]; 396 param_min->data.F32[i] = covar->data.F64[1][i]; 397 param_max->data.F32[i] = covar->data.F64[2][i]; 398 } 399 psImageRecycle(covar, params->n, params->n, PS_TYPE_F64); 400 } 373 401 374 402 // why is this needed here??? the initial guess on params is provided by the user … … 381 409 } else { 382 410 dy = psVectorAlloc(y->n, PS_TYPE_F32); 411 dy->n = dy->nalloc; 383 412 psVectorInit(dy, 1.0); 384 413 } … … 410 439 // set a new guess for Alpha, Beta, Params 411 440 p_psMinLM_GuessABP(Alpha, Beta, Params, alpha, beta, params, paramMask, 412 paramDelta, paramMin, paramMax, lambda);441 beta_lim, param_min, param_max, lambda); 413 442 414 443 // measure linear model prediction … … 467 496 if (covar != NULL) { 468 497 p_psMinLM_GuessABP(covar, Beta, Params, alpha, beta, params, paramMask, 469 paramDelta, paramMin, paramMax, 0.0);498 beta_lim, param_min, param_max, 0.0); 470 499 } 471 500 … … 478 507 if (yWt == NULL) { 479 508 psFree(dy); 509 } 510 if (mustFree00 == true) { 511 psFree(beta_lim); 512 psFree(param_min); 513 psFree(param_max); 480 514 } 481 515 if (min->iter == min->maxIter) {
Note:
See TracChangeset
for help on using the changeset viewer.
