IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Sep 9, 2004, 4:55:59 PM (22 years ago)
Author:
gusciora
Message:

...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/math/psMinimize.c

    r1734 r1775  
    99 *  @author George Gusciora, MHPCC
    1010 *
    11  *  @version $Revision: 1.35 $ $Name: not supported by cvs2svn $
    12  *  @date $Date: 2004-09-08 23:32:03 $
     11 *  @version $Revision: 1.36 $ $Name: not supported by cvs2svn $
     12 *  @date $Date: 2004-09-10 02:52:02 $
    1313 *
    1414 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    846846/******************************************************************************
    847847GUS
    848  
    849 XXX: bug report for the psMatrix covar argument.
    850848 *****************************************************************************/
    851849bool psMinimizeLM(psMinimization *min,
     
    856854                  psMinimizeLMFunc func)
    857855{
    858     /*
    859         psVector *beta = psVectorAlloc(params->n, PS_TYPE_F32);
    860         psImage *alpha = psImageAlloc(params->n, params->n, PS_TYPE_F32);
    861         psVector *deriv;
    862         int i;
    863         int k;
    864         float tmp;
    865      
    866         tmp = func(deriv, params, coords);
    867         for (k=0;k<params->n;k++) {
    868             beta->data.F32[k] = 0.0;
     856    psVector *beta = psVectorAlloc(params->n, PS_TYPE_F32);
     857    psVector *perm = psVectorAlloc(params->n, PS_TYPE_F32);
     858    psVector *newParams = psVectorAlloc(params->n, PS_TYPE_F32);
     859    psImage *alpha = psImageAlloc(params->n, params->n, PS_TYPE_F32);
     860    psImage *A = psImageAlloc(params->n, params->n, PS_TYPE_F32);
     861    psImage *aOut = psImageAlloc(params->n, params->n, PS_TYPE_F32);
     862    psVector *deriv = psVectorAlloc(params->n, PS_TYPE_F32);
     863    psVector *newDeriv = psVectorAlloc(params->n, PS_TYPE_F32);
     864    int i;
     865    int j;
     866    int k;
     867    float newValue;
     868    float oldValue;
     869    float lamda = 1.0;
     870
     871    min->lastDelta = -HUGE;
     872    min->iter = 0;
     873    min->value = func(deriv, params, coords);
     874
     875    while ((min->lastDelta > min->tol) &&
     876            (min->iter < min->maxIter)) {
     877
     878        for (i=0;i<params->n;i++) {
     879            beta->data.F32[i] = deriv->data.F32[i];
     880        }
     881
     882        for (j=0;j<params->n;j++) {
     883            for (k=0;k<params->n;k++) {
     884                alpha->data.F32[j][k] = deriv->data.F32[j] * deriv->data.F32[j];
     885            }
     886        }
     887        for (j=0;j<params->n;j++) {
     888            for (k=0;k<params->n;k++) {
     889                if (j != k) {
     890                    A->data.F32[j][k] = alpha->data.F32[j][k];
     891                } else {
     892                    A->data.F32[j][k] = (1.0 + lamda) * alpha->data.F32[j][k];
     893                }
     894            }
     895        }
     896        aOut = psMatrixLUD(aOut, perm, A);
     897        newParams = psMatrixLUSolve(newParams, aOut, beta, perm);
     898
     899        oldValue = min->value;
     900        newValue = func(newDeriv, newParams, coords);
     901        if (oldValue > newValue) {
     902            min->lastDelta = oldValue - newValue;
     903            min->value = newValue;
     904
    869905            for (i=0;i<params->n;i++) {
    870                 beta->data.F32[k]+= deriv
    871             }
    872     */
     906                params->data.F32[i] = newParams->data.F32[i];
     907                deriv->data.F32[i] = newDeriv->data.F32[i];
     908            }
     909            min->value = func(deriv, params, coords);
     910
     911            lamda*= 0.1;
     912        } else {
     913            lamda*= 10.0;
     914        }
     915        min->iter++;
     916    }
     917    psFree(beta);
     918    psFree(perm);
     919    psFree(newParams);
     920    psFree(alpha);
     921    psFree(A);
     922    psFree(aOut);
     923    psFree(deriv);
     924    psFree(newDeriv);
     925
     926    if ((min->iter < min->maxIter) ||
     927            (min->lastDelta <= min->tol)) {
     928        return(true);
     929    }
     930
    873931    return(false);
    874932}
Note: See TracChangeset for help on using the changeset viewer.