Changeset 6322 for trunk/psLib/src/math/psMinimizeLMM.c
- Timestamp:
- Feb 3, 2006, 12:05:22 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psMinimizeLMM.c (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psMinimizeLMM.c
r6226 r6322 10 10 * @author EAM, IfA 11 11 * 12 * @version $Revision: 1. 3$ $Name: not supported by cvs2svn $13 * @date $Date: 2006-0 1-27 20:08:58$12 * @version $Revision: 1.4 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2006-02-03 22:05:22 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 48 48 49 49 // XXX EAM : can we use static copies of LUv, LUm, A? 50 // XXX: Add trace messages, check return codes.51 50 psBool p_psMinLM_GuessABP( 52 51 psImage *Alpha, … … 75 74 A = psImageCopy(NULL, alpha, PS_TYPE_F64); 76 75 for (int j = 0; j < params->n; j++) { 77 if ((paramMask != NULL) && (paramMask->data.U8[j])) 76 if ((paramMask != NULL) && (paramMask->data.U8[j])) { 78 77 continue; 78 } 79 79 A->data.F64[j][j] = alpha->data.F64[j][j] * (1.0 + lambda); 80 80 } … … 83 83 // these operations do not modify the input values (creates LUm, LUv) 84 84 LUm = psMatrixLUD(NULL, &LUv, A); 85 if (LUm == NULL) { 86 psError(PS_ERR_UNKNOWN, false, "psMatrixLUD() returned NULL\n"); 87 } 85 88 Beta = psMatrixLUSolve(Beta, LUm, beta, LUv); 89 if (Beta == NULL) { 90 psError(PS_ERR_UNKNOWN, false, "psMatrixLUSolve() returned NULL\n"); 91 } 86 92 Alpha = psMatrixInvert(Alpha, A, &det); 87 93 psFree(LUm); 94 psFree(LUv); 95 psFree(A); 96 97 if (Alpha == NULL) { 98 psError(PS_ERR_UNKNOWN, false, "psMatrixInvert() returned NULL\n"); 99 return(false); 100 } 88 101 # else 89 102 // gauss-jordan version … … 94 107 Alpha = psImageCopy(Alpha, alpha, PS_TYPE_F64); 95 108 for (int j = 0; j < params->n; j++) { 96 if ((paramMask != NULL) && (paramMask->data.U8[j])) 109 if ((paramMask != NULL) && (paramMask->data.U8[j])) { 97 110 continue; 111 } 98 112 Alpha->data.F64[j][j] = alpha->data.F64[j][j] * (1.0 + lambda); 99 113 } 100 114 101 // XXX: Check error codes! 102 psGaussJordan(Alpha, Beta); 103 psFree(A); 104 psFree(LUm); 105 psFree(LUv); 115 if (false == psGaussJordan(Alpha, Beta)) { 116 psError(PS_ERR_UNKNOWN, false, "psMatrixInvert() returned NULL\n"); 117 return(false); 118 } 106 119 # endif 107 120 108 121 // apply Beta to get new Params values 109 122 for (int j = 0; j < params->n; j++) { 110 if ((paramMask != NULL) && (paramMask->data.U8[j])) 123 if ((paramMask != NULL) && (paramMask->data.U8[j])) { 111 124 continue; 125 } 112 126 // Params->data.F32[j] = params->data.F32[j] - Beta->data.F64[j]; 113 127 // compare Beta to beta limits … … 126 140 } 127 141 } 128 # if (USE_LU_DECOMP)129 psFree(A);130 psFree(LUm);131 psFree(LUv);132 # endif133 142 134 143 return(true); … … 136 145 137 146 138 // XXX: Add trace messages, check return codes.139 147 bool psMinimizeGaussNewtonDelta( 140 148 psVector *delta, … … 146 154 psMinimizeLMChi2Func func) 147 155 { 156 psTrace(__func__, 3, "---- %s() begin ----\n", __func__); 148 157 // allocate internal arrays (current vs Guess) 149 158 psImage *alpha = psImageAlloc (params->n, params->n, PS_TYPE_F64); … … 152 161 psVector *Params = psVectorAlloc(params->n, PS_TYPE_F64); 153 162 psVector *dy = NULL; 163 psBool rc = true; 154 164 155 165 // the user provides the error or NULL. we need to convert … … 162 172 } 163 173 164 p_psMinLM_SetABX(alpha, beta, params, paramMask, x, y, dy, func); 165 p_psMinLM_GuessABP(Alpha, delta, Params, alpha, beta, params, paramMask, NULL, NULL, NULL, 0.0); 174 psF64 rcF64 = p_psMinLM_SetABX(alpha, beta, params, paramMask, x, y, dy, func); 175 if (isnan(rcF64)) { 176 psError(PS_ERR_UNKNOWN, false, "p_psMinLM_SetABX() retruned a NAN.\n"); 177 rc = false; 178 } 179 psTrace(__func__, 5, "p_psMinLM_SetABX() was succesful\n", __func__); 180 181 psBool rcBool = p_psMinLM_GuessABP(Alpha, delta, Params, alpha, beta, params, paramMask, NULL, NULL, NULL, 0.0); 182 if (rcBool == false) { 183 psError(PS_ERR_UNKNOWN, false, "p_psMinLM_GuessABP() retruned FALSE.\n"); 184 rc = false; 185 } 186 psTrace(__func__, 5, "p_psMinLM_GuessABP() was succesful\n", __func__); 166 187 167 188 psFree(alpha); … … 172 193 psFree(dy); 173 194 } 174 return (true); 195 psTrace(__func__, 3, "---- %s() end ----\n", __func__); 196 return(rc); 175 197 } 176 198 … … 235 257 236 258 for (psS32 j = 0; j < params->n; j++) { 237 if ((paramMask != NULL) && (paramMask->data.U8[j])) 259 if ((paramMask != NULL) && (paramMask->data.U8[j])) { 238 260 continue; 261 } 239 262 weight = deriv->data.F32[j] * dy->data.F32[i]; 240 263 for (psS32 k = 0; k <= j; k++) { 241 if ((paramMask != NULL) && (paramMask->data.U8[k])) 264 if ((paramMask != NULL) && (paramMask->data.U8[k])) { 242 265 continue; 266 } 243 267 alpha->data.F64[j][k] += weight * deriv->data.F32[k]; 244 268 } … … 394 418 } 395 419 if (psTraceGetLevel (__func__) >= 6) { 396 //XXX: p_psVectorPrintRow(psTraceGetDestination(), Params, "params guess"); 420 psTrace(__func__, 6, "The current Param vector: \n"); 421 for (psS32 i = 0 ; i < Params->n ; i++) { 422 psTrace(__func__, 6, "Params[%d] is %f\n", Params->data.F32[i]); 423 } 397 424 } 398 425 … … 416 443 } 417 444 if (psTraceGetLevel(__func__) >= 6) { 418 //XXX: p_psVectorPrintRow(psTraceGetDestination(), Params, "params guess"); 445 if (psTraceGetLevel (__func__) >= 6) { 446 psTrace(__func__, 6, "The current Param vector: \n"); 447 for (psS32 i = 0 ; i < Params->n ; i++) { 448 psTrace(__func__, 6, "Params[%d] is %f\n", Params->data.F32[i]); 449 } 450 } 419 451 } 420 452 … … 628 660 bool psMemCheckConstrain(psPtr tmp) 629 661 { 630 return( psMemGetDeallocator(tmp) == (psFreeFunc)constrainFree);631 } 662 return(psMemGetDeallocator(tmp) == (psFreeFunc) constrainFree); 663 }
Note:
See TracChangeset
for help on using the changeset viewer.
