IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 29, 2006, 3:56:22 PM (20 years ago)
Author:
Paul Price
Message:

Removing static variables. See bug 768.

File:
1 edited

Legend:

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

    r6484 r7764  
    1111 *  NOTE: XXX: The SDR is silent about data types.  F32 is implemented here.
    1212 *
    13  *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
    14  *  @date $Date: 2006-02-24 23:43:15 $
     13 *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
     14 *  @date $Date: 2006-06-30 01:56:22 $
    1515 *
    1616 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    6464/*****************************************************************************/
    6565/* TYPE DEFINITIONS                                                          */
    66 /*****************************************************************************/
    67 
    68 /*****************************************************************************/
    69 /* GLOBAL VARIABLES                                                          */
    70 /*****************************************************************************/
    71 static psMinimizeChi2PowellFunc Chi2PowellFunc = NULL;
    72 static psVector *PowellValue;
    73 static psVector *PowellError;
    74 /*****************************************************************************/
    75 /* FILE STATIC VARIABLES                                                     */
    7666/*****************************************************************************/
    7767
     
    239229psTrace(__func__, 4, "Final bracket (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", a, b, c, fa, fb, fc); \
    240230psTrace(__func__, 4, "---- p_psDetermineBracket() end ----\n"); \
     231psFree(tmp); \
    241232return(bracket); \
    242233
     
    256247    psF32 fc = 0.0;
    257248    psS32 iter = 0;
    258     PS_VECTOR_GEN_STATIC_RECYCLED(tmp, params->n, PS_TYPE_F32);
     249    psVector *tmp = psVectorAlloc(params->n, PS_TYPE_F32);
    259250    psBool boolLineIsNull = true;
    260251    psF32 prevMin = 0.0;
     
    268259        psTrace(__func__, 2, "p_psDetermineBracket() called with zero line vector.\n");
    269260        psTrace(__func__, 4, "---- p_psDetermineBracket() end (NULL) ----\n");
     261        psFree(tmp);
    270262        return(NULL);
    271263    }
     
    374366    psF32 fn = 0.0;
    375367    psF32 mul = 0.0;
    376     PS_VECTOR_GEN_STATIC_RECYCLED(tmpa, params->n, PS_TYPE_F32);
    377     PS_VECTOR_GEN_STATIC_RECYCLED(tmpb, params->n, PS_TYPE_F32);
    378     PS_VECTOR_GEN_STATIC_RECYCLED(tmpc, params->n, PS_TYPE_F32);
    379     PS_VECTOR_GEN_STATIC_RECYCLED(tmpn, params->n, PS_TYPE_F32);
    380368    psS32 i = 0;
    381369    psS32 boolLineIsNull = true;
     
    405393    }
    406394    numIterations = 0;
     395
     396    psVector *tmpa = psVectorAlloc(params->n, PS_TYPE_F32);
     397    psVector *tmpb = psVectorAlloc(params->n, PS_TYPE_F32);
     398    psVector *tmpc = psVectorAlloc(params->n, PS_TYPE_F32);
     399    psVector *tmpn = psVectorAlloc(params->n, PS_TYPE_F32);
     400
    407401    while (numIterations < PS_LINEMIN_MAX_ITERATIONS) {
    408402        numIterations++;
     
    462456            psFree(bracket);
    463457            psTrace(__func__, 4, "---- LineMin() end.a (%f) (%f) ----\n", mul, min->value);
     458            psFree(tmpa);
     459            psFree(tmpb);
     460            psFree(tmpc);
     461            psFree(tmpn);
    464462            return(mul);
    465463        }
     
    472470
    473471    psFree(bracket);
     472    psFree(tmpa);
     473    psFree(tmpb);
     474    psFree(tmpc);
     475    psFree(tmpn);
    474476    return(mul);
    475477}
     
    503505    PS_ASSERT_PTR_NON_NULL(func, NULL);
    504506    psS32 numDims = params->n;
    505     PS_VECTOR_GEN_STATIC_RECYCLED(pQP, numDims, PS_TYPE_F32);
    506     PS_VECTOR_GEN_STATIC_RECYCLED(u, numDims, PS_TYPE_F32);
    507     PS_VECTOR_GEN_STATIC_RECYCLED(Q, numDims, PS_TYPE_F32);
    508507    psS32 i = 0;
    509508    psS32 j = 0;
     
    533532    }
    534533    PS_ASSERT_VECTORS_SIZE_EQUAL(params, myParamMask, NULL);
     534
     535
     536    psVector *pQP = psVectorAlloc(numDims, PS_TYPE_F32);
     537    psVector *u   = psVectorAlloc(numDims, PS_TYPE_F32);
     538    psVector *Q   = psVectorAlloc(numDims, PS_TYPE_F32);
    535539
    536540    // 1: Set v[i] to be the unit vectors for each dimension in params
     
    578582                            "Could not perform line minimization.  Returning FALSE.\n");
    579583                    psFree(v);
     584                    psFree(pQP);
     585                    psFree(u);
     586                    psFree(Q);
    580587                    return(false);
    581588                }
     
    620627                    "Could not perform line minimization.  Returning FALSE.\n");
    621628            psFree(v);
     629            psFree(pQP);
     630            psFree(u);
     631            psFree(Q);
    622632            return(false);
    623633        }
     
    626636        if (dummyMin.value > currFuncVal) {
    627637            psFree(v);
     638            psFree(pQP);
     639            psFree(u);
     640            psFree(Q);
    628641            min->iter = iterationNumber;
    629642            min->value = currFuncVal;
     
    664677        if (fabs(baseFuncVal - currFuncVal) <= min->tol) {
    665678            psFree(v);
     679            psFree(pQP);
     680            psFree(u);
     681            psFree(Q);
    666682            // XXX: Ensure that currFuncVal is the correct value to use here.
    667683            min->value = currFuncVal;
     
    674690
    675691    psFree(v);
     692    psFree(pQP);
     693    psFree(u);
     694    psFree(Q);
    676695    min->iter = iterationNumber;
    677696    psTrace(__func__, 4, "---- psMinimizePowell() end (0) (false) ----\n");
     
    695714    PS_ASSERT_VECTOR_NON_NULL(params, NAN);
    696715    PS_ASSERT_VECTOR_NON_EMPTY(params, NAN);
    697     PS_ASSERT_VECTOR_NON_NULL(PowellValue, NAN);
    698     PS_ASSERT_VECTOR_NON_EMPTY(PowellValue, NAN);
    699716    PS_ASSERT_PTR_NON_NULL(coords, NAN);
    700717
     
    704721    psVector *tmp;
    705722
    706     tmp = Chi2PowellFunc(params, coords);
    707     if (PowellError == NULL) {
     723    psVector *values = coords->data[coords->n];
     724    psVector *errors = coords->data[coords->n + 1];
     725    psMinimizeChi2PowellFunc *func = coords->data[coords->n + 2];
     726
     727    PS_ASSERT_VECTOR_NON_NULL(values, NAN);
     728    PS_ASSERT_VECTOR_NON_EMPTY(values, NAN);
     729    PS_ASSERT_VECTOR_TYPE(values, PS_TYPE_F32, NAN);
     730    if (errors) {
     731        PS_ASSERT_VECTOR_NON_NULL(errors, NAN);
     732        PS_ASSERT_VECTOR_NON_EMPTY(errors, NAN);
     733        PS_ASSERT_VECTOR_TYPE(errors, PS_TYPE_F32, NAN);
     734        PS_ASSERT_VECTORS_SIZE_EQUAL(values, errors, NAN);
     735    }
     736
     737    tmp = (*func)(params, coords);
     738
     739    if (errors == NULL) {
    708740        for (i=0;i<coords->n;i++) {
    709             d = (tmp->data.F32[i] - PowellValue->data.F32[i]);
     741            d = (tmp->data.F32[i] - values->data.F32[i]);
    710742            chi2+= d * d;
    711743        }
    712744    } else {
    713745        for (i=0;i<coords->n;i++) {
    714             d = (tmp->data.F32[i] - PowellValue->data.F32[i]) / PowellError->data.F32[i];
     746            d = (tmp->data.F32[i] - values->data.F32[i]) / errors->data.F32[i];
    715747            chi2+= d * d;
    716748        }
     
    741773    psMinimizeChi2PowellFunc model)
    742774{
    743     PowellValue = (psVector *) value;
    744     PowellError = (psVector *) error;
    745 
    746     Chi2PowellFunc = model;
    747 
    748     return(psMinimizePowell(min, params, constrain->paramMask, coords, myPowellChi2Func));
     775    // Generate extended version of coords array, so we can pass in extra data to the chi^2 function
     776    psArray *newCoords = psArrayAlloc(coords->n + 3);
     777    for (long i = 0; i < coords->n; i++) {
     778        newCoords->data[i] = psMemIncrRefCounter(coords->data[i]);
     779    }
     780    newCoords->n = coords->n;           // We deceive everyone else as to the length
     781    // Casting away const: I'm not going to hurt you, just want to increment your reference counter is all
     782    newCoords->data[coords->n] = psMemIncrRefCounter((psVector*)value);
     783    newCoords->data[coords->n + 1] = psMemIncrRefCounter((psVector*)error);
     784    newCoords->data[coords->n + 2] = &model;
     785
     786    bool success = psMinimizePowell(min, params, constrain->paramMask, newCoords, myPowellChi2Func);
     787
     788    newCoords->data[coords->n - 1] = NULL; // We can't free the array with a function pointer on it
     789    psFree(newCoords);
     790    return success;
    749791}
    750792
Note: See TracChangeset for help on using the changeset viewer.