Changeset 7764 for trunk/psLib/src/math/psMinimizePowell.c
- Timestamp:
- Jun 29, 2006, 3:56:22 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psMinimizePowell.c (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psMinimizePowell.c
r6484 r7764 11 11 * NOTE: XXX: The SDR is silent about data types. F32 is implemented here. 12 12 * 13 * @version $Revision: 1. 7$ $Name: not supported by cvs2svn $14 * @date $Date: 2006-0 2-24 23:43:15$13 * @version $Revision: 1.8 $ $Name: not supported by cvs2svn $ 14 * @date $Date: 2006-06-30 01:56:22 $ 15 15 * 16 16 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 64 64 /*****************************************************************************/ 65 65 /* 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 */76 66 /*****************************************************************************/ 77 67 … … 239 229 psTrace(__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); \ 240 230 psTrace(__func__, 4, "---- p_psDetermineBracket() end ----\n"); \ 231 psFree(tmp); \ 241 232 return(bracket); \ 242 233 … … 256 247 psF32 fc = 0.0; 257 248 psS32 iter = 0; 258 PS_VECTOR_GEN_STATIC_RECYCLED(tmp,params->n, PS_TYPE_F32);249 psVector *tmp = psVectorAlloc(params->n, PS_TYPE_F32); 259 250 psBool boolLineIsNull = true; 260 251 psF32 prevMin = 0.0; … … 268 259 psTrace(__func__, 2, "p_psDetermineBracket() called with zero line vector.\n"); 269 260 psTrace(__func__, 4, "---- p_psDetermineBracket() end (NULL) ----\n"); 261 psFree(tmp); 270 262 return(NULL); 271 263 } … … 374 366 psF32 fn = 0.0; 375 367 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);380 368 psS32 i = 0; 381 369 psS32 boolLineIsNull = true; … … 405 393 } 406 394 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 407 401 while (numIterations < PS_LINEMIN_MAX_ITERATIONS) { 408 402 numIterations++; … … 462 456 psFree(bracket); 463 457 psTrace(__func__, 4, "---- LineMin() end.a (%f) (%f) ----\n", mul, min->value); 458 psFree(tmpa); 459 psFree(tmpb); 460 psFree(tmpc); 461 psFree(tmpn); 464 462 return(mul); 465 463 } … … 472 470 473 471 psFree(bracket); 472 psFree(tmpa); 473 psFree(tmpb); 474 psFree(tmpc); 475 psFree(tmpn); 474 476 return(mul); 475 477 } … … 503 505 PS_ASSERT_PTR_NON_NULL(func, NULL); 504 506 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);508 507 psS32 i = 0; 509 508 psS32 j = 0; … … 533 532 } 534 533 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); 535 539 536 540 // 1: Set v[i] to be the unit vectors for each dimension in params … … 578 582 "Could not perform line minimization. Returning FALSE.\n"); 579 583 psFree(v); 584 psFree(pQP); 585 psFree(u); 586 psFree(Q); 580 587 return(false); 581 588 } … … 620 627 "Could not perform line minimization. Returning FALSE.\n"); 621 628 psFree(v); 629 psFree(pQP); 630 psFree(u); 631 psFree(Q); 622 632 return(false); 623 633 } … … 626 636 if (dummyMin.value > currFuncVal) { 627 637 psFree(v); 638 psFree(pQP); 639 psFree(u); 640 psFree(Q); 628 641 min->iter = iterationNumber; 629 642 min->value = currFuncVal; … … 664 677 if (fabs(baseFuncVal - currFuncVal) <= min->tol) { 665 678 psFree(v); 679 psFree(pQP); 680 psFree(u); 681 psFree(Q); 666 682 // XXX: Ensure that currFuncVal is the correct value to use here. 667 683 min->value = currFuncVal; … … 674 690 675 691 psFree(v); 692 psFree(pQP); 693 psFree(u); 694 psFree(Q); 676 695 min->iter = iterationNumber; 677 696 psTrace(__func__, 4, "---- psMinimizePowell() end (0) (false) ----\n"); … … 695 714 PS_ASSERT_VECTOR_NON_NULL(params, NAN); 696 715 PS_ASSERT_VECTOR_NON_EMPTY(params, NAN); 697 PS_ASSERT_VECTOR_NON_NULL(PowellValue, NAN);698 PS_ASSERT_VECTOR_NON_EMPTY(PowellValue, NAN);699 716 PS_ASSERT_PTR_NON_NULL(coords, NAN); 700 717 … … 704 721 psVector *tmp; 705 722 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) { 708 740 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]); 710 742 chi2+= d * d; 711 743 } 712 744 } else { 713 745 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]; 715 747 chi2+= d * d; 716 748 } … … 741 773 psMinimizeChi2PowellFunc model) 742 774 { 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; 749 791 } 750 792
Note:
See TracChangeset
for help on using the changeset viewer.
