Changeset 2788 for trunk/psLib/src/dataManip/psMinimize.c
- Timestamp:
- Dec 21, 2004, 7:09:32 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/dataManip/psMinimize.c (modified) (36 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/dataManip/psMinimize.c
r2741 r2788 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.9 5$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-12- 17 00:18:31$11 * @version $Revision: 1.96 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-12-22 05:09:32 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii 15 15 * 16 16 * XXX: must follow coding name standards on local functions. 17 *18 * XXX: Section 4.5.1.1 (predefined functions for Gauss minimization via19 * LMM) is not addressed here. We are waiting for subsequent SDRs20 * which will redefine the LMM functions.21 17 * 22 18 */ … … 64 60 XXX: Use a static vector. 65 61 *****************************************************************************/ 66 void psBuildSums1D( doublex,62 void psBuildSums1D(psF64 x, 67 63 psS32 polyOrder, 68 64 psVector* sums) 69 65 { 70 66 psS32 i = 0; 71 doublexSum = 0.0;67 psF64 xSum = 0.0; 72 68 73 69 if (sums == NULL) { … … 100 96 XXX: do an F64 version? 101 97 *****************************************************************************/ 102 float*CalculateSecondDerivs(const psVector* restrict x, ///< Ordinates (or NULL to just use the indices)98 psF32 *CalculateSecondDerivs(const psVector* restrict x, ///< Ordinates (or NULL to just use the indices) 103 99 const psVector* restrict y) ///< Coordinates 104 100 { … … 108 104 psS32 i; 109 105 psS32 k; 110 floatsig;111 floatp;106 psF32 sig; 107 psF32 p; 112 108 psS32 n = y->n; 113 float *u = (float *) psAlloc(n * sizeof(float));114 float *derivs2 = (float *) psAlloc(n * sizeof(float));115 float *X = (float*) & (x->data.F32[0]);116 float *Y = (float*) & (y->data.F32[0]);117 floatqn;109 psF32 *u = (psF32 *) psAlloc(n * sizeof(psF32)); 110 psF32 *derivs2 = (psF32 *) psAlloc(n * sizeof(psF32)); 111 psF32 *X = (psF32 *) & (x->data.F32[0]); 112 psF32 *Y = (psF32 *) & (y->data.F32[0]); 113 psF32 qn; 118 114 119 115 // XXX: The second derivatives at the endpoints, undefined in the SDR, … … 168 164 *****************************************************************************/ 169 165 /* 170 floatp_psNRSpline1DEval(psSpline1D *spline,166 psF32 p_psNRSpline1DEval(psSpline1D *spline, 171 167 const psVector* restrict x, 172 168 const psVector* restrict y, 173 floatX)169 psF32 X) 174 170 { 175 171 PS_PTR_CHECK_NULL(spline, NAN); … … 185 181 psS32 klo; 186 182 psS32 khi; 187 floatH;188 floatA;189 floatB;190 floatC;191 floatD;192 floatY;183 psF32 H; 184 psF32 A; 185 psF32 B; 186 psF32 C; 187 psF32 D; 188 psF32 Y; 193 189 194 190 n = spline->n; … … 258 254 "---- psVectorFitSpline1D() begin ----\n"); 259 255 psS32 numSplines = (y->n)-1; 260 floattmp;261 floatH;256 psF32 tmp; 257 psF32 H; 262 258 psS32 i; 263 floatslope;259 psF32 slope; 264 260 psVector *x32 = NULL; 265 261 psVector *y32 = NULL; … … 421 417 psTrace(".psLib.dataManip.psMinimize", 4, 422 418 "---- psMinimizeLMChi2Gauss1D() begin ----\n"); 423 floatx;424 inti;425 floatmean = params->data.F32[0];426 floatstdev = params->data.F32[1];419 psF32 x; 420 psS32 i; 421 psF32 mean = params->data.F32[0]; 422 psF32 stdev = params->data.F32[1]; 427 423 psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32); 428 424 … … 443 439 for (i=0;i<coords->n;i++) { 444 440 x = ((psVector *) (coords->data[i]))->data.F32[0]; 445 floattmp = (x - mean) * psGaussian(x, mean, stdev, false);441 psF32 tmp = (x - mean) * psGaussian(x, mean, stdev, false); 446 442 deriv->data.F32[i][0] = tmp / (stdev * stdev); 447 443 tmp = (x - mean) * (x - mean) * … … 491 487 PS_PTR_CHECK_NULL(params, NULL); 492 488 493 doublenormalization = params->data.F32[0];494 doublex0 = params->data.F32[1];495 doubley0 = params->data.F32[2];496 doublesigmaX = params->data.F32[3];497 doublesigmaY = params->data.F32[4];498 doubletheta = params->data.F32[5];489 psF64 normalization = params->data.F32[0]; 490 psF64 x0 = params->data.F32[1]; 491 psF64 y0 = params->data.F32[2]; 492 psF64 sigmaX = params->data.F32[3]; 493 psF64 sigmaY = params->data.F32[4]; 494 psF64 theta = params->data.F32[5]; 499 495 psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32); 500 496 … … 502 498 deriv = psImageAlloc(params->n, coords->n, PS_TYPE_F32); 503 499 } else { 504 // XXX: Check size of derivative500 PS_IMAGE_CHECK_SIZE(deriv, 6, coords->n, NULL); 505 501 } 506 502 … … 508 504 "---- psMinimizeLMChi2Gauss2D() begin ----\n"); 509 505 510 for ( inti=0;i<coords->n;i++) {511 doublex = ((psVector *) coords->data[i])->data.F32[0];512 doubley = ((psVector *) coords->data[i])->data.F32[0];513 514 doubleu = - (x-x0)*cos(theta) + (y-y0)*sin(theta);515 doublev = (x-x0)*cos(theta) + (y-y0)*sin(theta);516 517 doubleflux = normalization * exp(-( u*u/(2.0 * sigmaX * sigmaX) +518 v*v/(2.0 * sigmaY * sigmaY)))/519 (2.0 * M_PI * sigmaX * sigmaY);506 for (psS32 i=0;i<coords->n;i++) { 507 psF64 x = ((psVector *) coords->data[i])->data.F32[0]; 508 psF64 y = ((psVector *) coords->data[i])->data.F32[0]; 509 510 psF64 u = - (x-x0)*cos(theta) + (y-y0)*sin(theta); 511 psF64 v = (x-x0)*cos(theta) + (y-y0)*sin(theta); 512 513 psF64 flux = normalization * exp(-( u*u/(2.0 * sigmaX * sigmaX) + 514 v*v/(2.0 * sigmaY * sigmaY)))/ 515 (2.0 * M_PI * sigmaX * sigmaY); 520 516 out->data.F32[i] = flux; 521 517 … … 584 580 PS_VECTOR_CHECK_SIZE_EQUAL(y, yErr, NULL); 585 581 } 586 587 // XXX: Generate code that modifies covar matrix if not-NULL.588 582 if (covar != NULL) { 589 583 PS_IMAGE_CHECK_SIZE(covar, params->n, params->n, NULL); … … 610 604 psImage *A = psImageAlloc(numParams, numParams, PS_TYPE_F64); 611 605 psImage *aOut = psImageAlloc(numParams, numParams, PS_TYPE_F64); 612 613 // psVector **deriv = (psVector **) psAlloc(numData * sizeof(psVector *));614 // for (i=0;i<numData;i++) {615 // deriv[i] = psVectorAlloc(numParams, PS_TYPE_F32);616 // }617 606 psImage *deriv = psImageAlloc(numParams, numData, PS_TYPE_F32); 618 619 psVector *currValueVec; 620 psVector *newValueVec; 621 622 float currChi2 = 0.0; 623 float newChi2 = 0.0; 624 float lamda = 0.00005; 607 psVector *currValueVec = NULL; 608 psVector *newValueVec = NULL; 609 psF32 currChi2 = 0.0; 610 psF32 newChi2 = 0.0; 611 psF32 lamda = 0.00005; 625 612 lamda = 0.05; 626 613 … … 711 698 if (j == k) { 712 699 A->data.F64[j][k] = 713 ( double) ((1.0 + lamda) * alpha->data.F32[j][k]);700 (psF64) ((1.0 + lamda) * alpha->data.F32[j][k]); 714 701 } else { 715 A->data.F64[j][k] = ( double) alpha->data.F32[j][k];702 A->data.F64[j][k] = (psF64) alpha->data.F32[j][k]; 716 703 } 717 704 } … … 741 728 } else { 742 729 newParams->data.F32[i] = params->data.F32[i] - 743 ( float) paramDeltasF64->data.F64[i];730 (psF32) paramDeltasF64->data.F64[i]; 744 731 } 745 732 } … … 777 764 // We already masked params. 778 765 for (i=0;i<numParams;i++) { 779 params->data.F32[i] = ( float) newParams->data.F32[i];766 params->data.F32[i] = (psF32) newParams->data.F32[i]; 780 767 } 781 768 lamda*= 0.1; … … 826 813 psS32 k; 827 814 psS32 n = x->n; 828 doublefac;829 doublesum;815 psF64 fac; 816 psF64 sum; 830 817 PS_VECTOR_GEN_STATIC_RECYCLED(f, n, PS_TYPE_F64); 831 818 psScalar *fScalar; … … 836 823 // variable declarations. I retain them here to maintain coherence 837 824 // with the NR code. 838 doublemin = -1.0;839 doublemax = 1.0;840 doublebma = 0.5 * (max-min); // 1841 doublebpa = 0.5 * (max+min); // 0825 psF64 min = -1.0; 826 psF64 max = 1.0; 827 psF64 bma = 0.5 * (max-min); // 1 828 psF64 bpa = 0.5 * (max+min); // 0 842 829 843 830 // In this loop, we first calculate the values of X for which the … … 851 838 for (psS32 i=0;i<n;i++) { 852 839 // NR 5.8.4 853 double Y = cos(M_PI * (0.5 + ((float) i)) / ((float) n));854 doubleX = (Y + bma + bpa) - 1.0;840 psF64 Y = cos(M_PI * (0.5 + ((psF32) i)) / ((psF32) n)); 841 psF64 X = (Y + bma + bpa) - 1.0; 855 842 tmpScalar.data.F64 = X; 856 843 … … 873 860 // coefficients of the Chebyshev polynomial: NR 5.8.7. 874 861 875 fac = 2.0/(( float) n);862 fac = 2.0/((psF32) n); 876 863 // XXX: is this loop bound correct? 877 864 for (j=0;j<myPoly->n;j++) { … … 879 866 for (k=0;k<n;k++) { 880 867 sum+= f->data.F64[k] * 881 cos(M_PI * (( float) j) * (0.5 + ((float) k)) / ((float) n));868 cos(M_PI * ((psF32) j) * (0.5 + ((psF32) k)) / ((psF32) n)); 882 869 } 883 870 … … 1075 1062 *****************************************************************************/ 1076 1063 psMinimization *psMinimizationAlloc(psS32 maxIter, 1077 floattol)1064 psF32 tol) 1078 1065 { 1079 1066 PS_INT_CHECK_NON_NEGATIVE(maxIter, NULL); … … 1092 1079 // LINE to it. We assume BASEMASK is non-null. 1093 1080 #define PS_VECTOR_ADD_MULTIPLE(BASE, BASEMASK, LINE, OUT, MUL) \ 1094 for ( inti=0;i<BASE->n;i++) { \1081 for (psS32 i=0;i<BASE->n;i++) { \ 1095 1082 if (BASEMASK->data.U8[i] == 0) { \ 1096 1083 OUT->data.F32[i] = BASE->data.F32[i] + (MUL * LINE->data.F32[i]); \ … … 1102 1089 #define PS_VECTOR_F32_CHECK_ZERO_VECTOR(IN, BOOL_VAR) \ 1103 1090 BOOL_VAR = true; \ 1104 for ( inti=0;i<IN->n;i++) { \1091 for (psS32 i=0;i<IN->n;i++) { \ 1105 1092 if (fabs(IN->data.F32[i]) >= FLT_EPSILON) { \ 1106 1093 BOOL_VAR = false; \ … … 1111 1098 #define PS_VECTOR_WITH_MASK_F32_CHECK_ZERO_VECTOR(IN, INMASK, BOOL_VAR) \ 1112 1099 BOOL_VAR = true; \ 1113 for ( inti=0;i<IN->n;i++) { \1100 for (psS32 i=0;i<IN->n;i++) { \ 1114 1101 if ((INMASK->data.U8[i] == 0) && (fabs(IN->data.F32[i]) >= FLT_EPSILON)) { \ 1115 1102 BOOL_VAR = false; \ … … 1152 1139 psMinimizePowellFunc func) 1153 1140 { 1154 floata = 0.0;1155 floatb = 0.0;1156 floatc = 0.0;1157 floatfa = 0.0;1158 floatfb = 0.0;1159 floatfc = 0.0;1141 psF32 a = 0.0; 1142 psF32 b = 0.0; 1143 psF32 c = 0.0; 1144 psF32 fa = 0.0; 1145 psF32 fb = 0.0; 1146 psF32 fc = 0.0; 1160 1147 psS32 iter = 100; 1161 floataDir = 0.0;1162 floatcDir = 0.0;1163 floatnew_aDir = 0.0;1164 floatnew_cDir = 0.0;1148 psF32 aDir = 0.0; 1149 psF32 cDir = 0.0; 1150 psF32 new_aDir = 0.0; 1151 psF32 new_cDir = 0.0; 1165 1152 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 1166 floatstepSize = PS_DETERMINE_BRACKET_STEP_SIZE;1153 psF32 stepSize = PS_DETERMINE_BRACKET_STEP_SIZE; 1167 1154 psVector *tmp = NULL; 1168 1155 psBool boolLineIsNull = true; … … 1301 1288 psMinimizePowellFunc func) 1302 1289 { 1303 floata = 0.0;1304 floatb = 0.0;1305 floatc = 0.0;1306 floatfa = 0.0;1307 floatfb = 0.0;1308 floatfc = 0.0;1290 psF32 a = 0.0; 1291 psF32 b = 0.0; 1292 psF32 c = 0.0; 1293 psF32 fa = 0.0; 1294 psF32 fb = 0.0; 1295 psF32 fc = 0.0; 1309 1296 psS32 iter = 0; 1310 1297 PS_VECTOR_GEN_STATIC_RECYCLED(tmp, params->n, PS_TYPE_F32); 1311 1298 psBool boolLineIsNull = true; 1312 floatprevMin = 0.0;1313 intcountMin = 0;1299 psF32 prevMin = 0.0; 1300 psS32 countMin = 0; 1314 1301 1315 1302 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, … … 1403 1390 *****************************************************************************/ 1404 1391 #define PS_LINEMIN_MAX_ITERATIONS 30 1405 floatp_psLineMin(psMinimization *min,1392 psF32 p_psLineMin(psMinimization *min, 1406 1393 psVector *params, 1407 1394 psVector *line, … … 1423 1410 PS_PTR_CHECK_NULL(func, NAN); 1424 1411 psVector *bracket; 1425 floata = 0.0;1426 floatb = 0.0;1427 floatc = 0.0;1428 floatn = 0.0;1429 floatfa = 0.0;1430 floatfb = 0.0;1431 floatfc = 0.0;1432 floatfn = 0.0;1433 floatmul = 0.0;1412 psF32 a = 0.0; 1413 psF32 b = 0.0; 1414 psF32 c = 0.0; 1415 psF32 n = 0.0; 1416 psF32 fa = 0.0; 1417 psF32 fb = 0.0; 1418 psF32 fc = 0.0; 1419 psF32 fn = 0.0; 1420 psF32 mul = 0.0; 1434 1421 PS_VECTOR_GEN_STATIC_RECYCLED(tmpa, params->n, PS_TYPE_F32); 1435 1422 PS_VECTOR_GEN_STATIC_RECYCLED(tmpb, params->n, PS_TYPE_F32); … … 1544 1531 This routine must minimize a possibly multi-dimensional function. The 1545 1532 function to be minimized "func" is: 1546 floatfunc(psVector *params, psArray *coords)1533 psF32 func(psVector *params, psArray *coords) 1547 1534 The "params" are the parameters of the function which are varied. The data 1548 1535 points at which the function is varied are in the argument "coords" which is … … 1578 1565 psVector *myParamMask = NULL; 1579 1566 psMinimization dummyMin; 1580 floatmul = 0.0;1581 floatbaseFuncVal = 0.0;1582 floatcurrFuncVal = 0.0;1567 psF32 mul = 0.0; 1568 psF32 baseFuncVal = 0.0; 1569 psF32 currFuncVal = 0.0; 1583 1570 psS32 biggestIter = 0; 1584 floatbiggestDiff = 0.0;1585 intiterationNumber = 0;1571 psF32 biggestDiff = 0.0; 1572 psS32 iterationNumber = 0; 1586 1573 1587 1574 psTrace(".psLib.dataManip.psMinimizePowell", 4, … … 1711 1698 } 1712 1699 } 1713 floatfqp = func(pQP, coords);1714 floatterm1 = (baseFuncVal - currFuncVal) - biggestDiff;1700 psF32 fqp = func(pQP, coords); 1701 psF32 term1 = (baseFuncVal - currFuncVal) - biggestDiff; 1715 1702 term1*= term1; 1716 1703 term1*= 2.0 * (baseFuncVal - (2.0 * currFuncVal) + fqp); 1717 floatterm2 = baseFuncVal - fqp;1704 psF32 term2 = baseFuncVal - fqp; 1718 1705 term2*= term2 * biggestDiff; 1719 1706 if (term1 < term2) { … … 1760 1747 PS_PTR_CHECK_NULL(params, NULL); 1761 1748 1762 floatx;1763 inti;1764 floatmean = params->data.F32[0];1765 floatstdev = params->data.F32[1];1749 psF32 x; 1750 psS32 i; 1751 psF32 mean = params->data.F32[0]; 1752 psF32 stdev = params->data.F32[1]; 1766 1753 psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32); 1767 1754 … … 1783 1770 XXX: This is F32 only 1784 1771 *****************************************************************************/ 1785 floatmyPowellChi2Func(const psVector *params,1772 psF32 myPowellChi2Func(const psVector *params, 1786 1773 const psArray *coords) 1787 1774 { … … 1794 1781 PS_PTR_CHECK_NULL(coords, NAN); 1795 1782 1796 floatchi2 = 0.0;1797 floatd;1783 psF32 chi2 = 0.0; 1784 psF32 d; 1798 1785 psS32 i; 1799 1786 psVector *tmp;
Note:
See TracChangeset
for help on using the changeset viewer.
