IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 6, 2006, 10:32:36 AM (20 years ago)
Author:
gusciora
Message:

....

File:
1 edited

Legend:

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

    r6524 r6525  
    1010 *  @author EAM, IfA
    1111 *
    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 $
    1414 *
    1515 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    239239    psF64 ymodel;
    240240    psVector *deriv = psVectorAlloc(params->n, PS_TYPE_F32);
     241    deriv->n = deriv->nalloc;
    241242
    242243    // zero alpha and beta for summing below
     
    301302NOTES: EAM: this is my re-implementation of MinLM
    302303 
    303 XXX: EAM : constraints added 2006.02.15
     304XXX: Must implement code to handle the constrain->min, ->max, ->delta members.
    304305 
    305306XXX: Put the ASSERTS in.
     
    328329    PS_ASSERT_VECTOR_TYPE(params, PS_TYPE_F32, false);
    329330    psVector *paramMask = NULL;
    330     psVector *paramDelta = NULL;
    331     psVector *paramMin = NULL;
    332     psVector *paramMax = NULL;
    333331    if (constrain != NULL) {
    334         // XXX EAM : fill out the asserts
    335         paramDelta = constrain->paramDelta;
    336         paramMin = constrain->paramMin;
    337         paramMax = constrain->paramMax;
    338332        paramMask = constrain->paramMask;
    339333        if (paramMask != NULL) {
    340334            PS_ASSERT_VECTOR_TYPE(paramMask, PS_TYPE_U8, false);
    341335            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");
    342345        }
    343346    }
     
    368371    psVector *Beta   = psVectorAlloc(params->n, PS_TYPE_F64);
    369372    psVector *Params = psVectorAlloc(params->n, PS_TYPE_F32);
     373    beta->n = beta->nalloc;
     374    Beta->n = Beta->nalloc;
     375    Params->n = Params->nalloc;
    370376    psVector *dy     = NULL;
    371377    psF64 Chisq = 0.0;
    372378    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    }
    373401
    374402    // why is this needed here??? the initial guess on params is provided by the user
     
    381409    } else {
    382410        dy = psVectorAlloc(y->n, PS_TYPE_F32);
     411        dy->n = dy->nalloc;
    383412        psVectorInit(dy, 1.0);
    384413    }
     
    410439        // set a new guess for Alpha, Beta, Params
    411440        p_psMinLM_GuessABP(Alpha, Beta, Params, alpha, beta, params, paramMask,
    412                            paramDelta, paramMin, paramMax, lambda);
     441                           beta_lim, param_min, param_max, lambda);
    413442
    414443        // measure linear model prediction
     
    467496    if (covar != NULL) {
    468497        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);
    470499    }
    471500
     
    478507    if (yWt == NULL) {
    479508        psFree(dy);
     509    }
     510    if (mustFree00 == true) {
     511        psFree(beta_lim);
     512        psFree(param_min);
     513        psFree(param_max);
    480514    }
    481515    if (min->iter == min->maxIter) {
Note: See TracChangeset for help on using the changeset viewer.