Changeset 2228
- Timestamp:
- Oct 28, 2004, 12:47:00 PM (22 years ago)
- Location:
- trunk/psLib/src
- Files:
-
- 10 edited
-
dataManip/psConstants.h (modified) (2 diffs)
-
dataManip/psMinimize.c (modified) (29 diffs)
-
dataManip/psMinimize.h (modified) (3 diffs)
-
dataManip/psStats.c (modified) (12 diffs)
-
math/psConstants.h (modified) (2 diffs)
-
math/psMinimize.c (modified) (29 diffs)
-
math/psMinimize.h (modified) (3 diffs)
-
math/psStats.c (modified) (12 diffs)
-
sys/psTrace.h (modified) (2 diffs)
-
sysUtils/psTrace.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/dataManip/psConstants.h
r2224 r2228 6 6 * @author GLG, MHPCC 7 7 * 8 * @version $Revision: 1. 29$ $Name: not supported by cvs2svn $9 * @date $Date: 2004-10-28 00:22:53$8 * @version $Revision: 1.30 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2004-10-28 22:46:57 $ 10 10 * 11 11 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 208 208 p_psMemSetPersistent(NAME->data.V, true); \ 209 209 210 #define PS_VECTOR_DECLARE_ALLOC_STATIC(NAME, SIZE, TYPE) \ 211 static psVector *NAME = NULL; \ 212 if (NAME == NULL) { \ 213 NAME = psVectorAlloc(SIZE, TYPE); \ 214 p_psMemSetPersistent(NAME, true); \ 215 } \ 210 216 211 217 -
trunk/psLib/src/dataManip/psMinimize.c
r2221 r2228 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.7 2$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-10-2 7 23:31:43$11 * @version $Revision: 1.73 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-10-28 22:46:57 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 408 408 } 409 409 410 411 /****************************************************************************** 412 XXX: We assume unnormalized gaussians. 413 XXX: Currently, yErr is ignored. 414 *****************************************************************************/ 415 psVector *psMinimizeLMChi2Gauss1D(psImage *deriv, 416 const psVector *params, 417 const psArray *coords) 418 { 419 psTrace(".psLib.dataManip.psMinimize", 4, 420 "---- psMinimizeLMChi2Gauss1D() begin ----\n"); 421 422 PS_PTR_CHECK_NULL(coords, NULL); 423 PS_PTR_CHECK_NULL(params, NULL); 424 float x; 425 int i; 426 float mean = params->data.F32[0]; 427 float stdev = params->data.F32[1]; 428 psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32); 429 430 psTrace(".psLib.dataManip.psMinimize", 6, 431 "(mean, stdev) is (%f, %f)\n", mean, stdev); 432 433 if (deriv == NULL) { 434 deriv = psImageAlloc(params->n, coords->n, PS_TYPE_F32); 435 } 436 437 for (i=0;i<coords->n;i++) { 438 x = ((psVector *) (coords->data[i]))->data.F32[0]; 439 out->data.F32[i] = psGaussian(x, mean, stdev, false); 440 // psTrace(".psLib.dataManip.psMinimize", 6, 441 // "out->data.F32[%d]: (x, m, s) is (%f, %f, %f) is %f\n", i, x, mean, stdev, out->data.F32[i]); 442 } 443 444 for (i=0;i<coords->n;i++) { 445 x = ((psVector *) (coords->data[i]))->data.F32[0]; 446 float tmp = (x - mean) * psGaussian(x, mean, stdev, false); 447 deriv->data.F32[i][0] = tmp / (stdev * stdev); 448 449 tmp = (x - mean) * (x - mean) * 450 psGaussian(x, mean, stdev, 0); 451 deriv->data.F32[i][1] = tmp / (stdev * stdev * stdev); 452 } 453 454 psTrace(".psLib.dataManip.psMinimize", 4, 455 "---- psMinimizeLMChi2Gauss1D() end ----\n"); 456 return(out); 457 } 458 459 410 460 /****************************************************************************** 411 461 psMinimizeLMChi2(): This routine will take an procedure which calculates … … 429 479 XXX: This must work for both F32 and F64. F32 is currently implemented. 430 480 Note: since the LUD routines are only implemented in F64, then we 431 will have to convert all F32 input vectors to F64 regardless. So,481 > will have to convert all F32 input vectors to F64 regardless. So, 432 482 the F64 port might be. 433 483 *****************************************************************************/ … … 457 507 } 458 508 459 psTrace(".psLib.dataManip.psMinimize LMChi2", 4,509 psTrace(".psLib.dataManip.psMinimize", 4, 460 510 "---- psMinimizeLMChi2() begin ----\n"); 461 511 psS32 numData = y->n; … … 490 540 float newChi2 = 0.0; 491 541 float lamda = 0.00005; 492 493 psTrace(".psLib.dataManip.psMinimizeLMChi2", 6, 542 lamda = 0.05; 543 544 psTrace(".psLib.dataManip.psMinimize", 6, 494 545 "min->maxIter is %d\n", min->maxIter); 495 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,546 psTrace(".psLib.dataManip.psMinimize", 6, 496 547 "min->tol is %f\n", min->tol); 497 548 … … 504 555 505 556 while ((min->lastDelta > min->tol) && (min->iter < min->maxIter)) { 506 psTrace(".psLib.dataManip.psMinimize LMChi2", 4,557 psTrace(".psLib.dataManip.psMinimize", 4, 507 558 "------------------------------------------------------\n"); 508 psTrace(".psLib.dataManip.psMinimize LMChi2", 4,559 psTrace(".psLib.dataManip.psMinimize", 4, 509 560 "Iteration %d. Delta is %f\n", min->iter, min->lastDelta); 510 561 … … 515 566 currValueVec = func(deriv, params, x); 516 567 for (n=0;n<numData;n++) { 517 currChi2+= (currValueVec->data.F32[n] * currValueVec->data.F32[n]); 568 currChi2+= (currValueVec->data.F32[n] - y->data.F32[n]) * 569 (currValueVec->data.F32[n] - y->data.F32[n]); 570 psTrace(".psLib.dataManip.psMinimize", 6, 571 "data[%d], chi2 calculation+= (%f * %f)\n", n, 572 currValueVec->data.F32[n], y->data.F32[n]); 518 573 } 519 574 520 575 for (p=0;p<numParams;p++) { 521 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,576 psTrace(".psLib.dataManip.psMinimize", 6, 522 577 "params->data.F32[%d] is %f.\n", p, params->data.F32[p]); 523 578 } 524 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,579 psTrace(".psLib.dataManip.psMinimize", 6, 525 580 "Current chi-squared is (%f)\n", currChi2); 526 581 … … 548 603 // XXX: multiple by -1 here? 549 604 (beta->data.F64[p])*= -1.0; 550 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,605 psTrace(".psLib.dataManip.psMinimize", 6, 551 606 "beta->data.F64[%d] is %f.\n", p, beta->data.F64[p]); 552 607 } … … 580 635 } 581 636 for (j=0;j<numParams;j++) { 582 psTrace(".psLib.dataManip.psMinimize LMChi2", 6, "Matrix A[][]:\n");637 psTrace(".psLib.dataManip.psMinimize", 6, "Matrix A[][]:\n"); 583 638 for (k=0;k<numParams;k++) { 584 psTrace(".psLib.dataManip.psMinimize LMChi2", 6, "%f ", A->data.F64[j][k]);585 } 586 psTrace(".psLib.dataManip.psMinimize LMChi2", 6, "Matrix A[][]:\n");639 psTrace(".psLib.dataManip.psMinimize", 6, "%f ", A->data.F64[j][k]); 640 } 641 psTrace(".psLib.dataManip.psMinimize", 6, "Matrix A[][]:\n"); 587 642 } 588 643 … … 597 652 // 598 653 for (i=0;i<numParams;i++) { 599 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,654 psTrace(".psLib.dataManip.psMinimize", 6, 600 655 "paramDeltasF64->data.F64[%d] is %f.\n", i, paramDeltasF64->data.F64[i]); 601 656 if ((paramMask != NULL) && (paramMask->data.U8[i] != 0)) { … … 607 662 } 608 663 609 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,664 psTrace(".psLib.dataManip.psMinimize", 6, 610 665 "Calling func() with new parameters:\n"); 611 666 for (i=0;i<numParams;i++) { 612 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,667 psTrace(".psLib.dataManip.psMinimize", 6, 613 668 "newParams->data.F32[%d] is %f.\n", i, newParams->data.F32[i]); 614 669 } … … 621 676 newValueVec = func(deriv, newParams, x); 622 677 for (n=0;n<numData;n++) { 623 newChi2+= (newValueVec->data.F32[n] * newValueVec->data.F32[n]); 678 newChi2+= (newValueVec->data.F32[n] - y->data.F32[n]) * 679 (newValueVec->data.F32[n] - y->data.F32[n]); 680 624 681 } 625 682 psFree(newValueVec); 626 683 627 psTrace(".psLib.dataManip.psMinimize LMChi2", 4,684 psTrace(".psLib.dataManip.psMinimize", 4, 628 685 "old/new chi-squareds are (%f, %f)\n", currChi2, newChi2); 629 686 … … 640 697 } 641 698 lamda*= 0.1; 699 psTrace(".psLib.dataManip.psMinimize", 4, "*** Reducing lamda by factor of 10\n"); 642 700 } else { 643 701 lamda*= 10.0; 644 } 645 psTrace(".psLib.dataManip.psMinimizeLMChi2", 4, 702 psTrace(".psLib.dataManip.psMinimize", 4, "*** Increasing lamda by factor of 10\n"); 703 } 704 psTrace(".psLib.dataManip.psMinimize", 4, 646 705 "lamda is %f\n", lamda); 647 706 min->iter++; … … 662 721 } 663 722 664 psTrace(".psLib.dataManip.psMinimize LMChi2", 4,723 psTrace(".psLib.dataManip.psMinimize", 4, 665 724 "---- psMinimizeLMChi2() end (false) ----\n"); 666 725 return(false); … … 942 1001 } 943 1002 1003 #define PS_VECTOR_ADD_MULTIPLE(BASE, BASEMASK, LINE, OUT, MUL) \ 1004 for (int i=0;i<BASE->n;i++) { \ 1005 if (BASEMASK->data.U8[i] == 0) { \ 1006 OUT->data.F32[i] = BASE->data.F32[i] + (MUL * LINE->data.F32[i]); \ 1007 } else { \ 1008 OUT->data.F32[i] = BASE->data.F32[i]; \ 1009 } \ 1010 } \ 1011 1012 944 1013 /****************************************************************************** 945 1014 p_psDetermineBracket(): This routine takes as input an arbitrary function, … … 947 1016 function produces as output a bracket [a, b, c] such that 948 1017 949 f(param + b * line) is less than f(param + a * line) and 950 f(param + c * line). 951 952 Algorithm: XXX completely ad hoc: start with the user-supplied starting 1018 f(param + b * line) is less than f(param + a * line) and 1019 f(param + c * line). 1020 1021 Algorithm: 1022 XXX completely ad hoc: 1023 start with the user-supplied starting 953 1024 parameter and call that b. Calculate a/c as a fractional amount 954 1025 smaller/larger than b. Repeat this process until a local minimum is found. 955 1026 956 XXX: new algorithm: start at x=0, expand in one direction until the function 1027 XXX: 1028 new algorithm: 1029 start at x=0, expand in one direction until the function 957 1030 decreases. Then you have two points in the bracket. Keep going until it 958 1031 increases, or x is too large. If thst does not work, expand in the other 959 1032 direction. 960 1033 961 XXX: This is F32 only 962 *****************************************************************************/ 1034 XXX: 1035 This is F32 only. 1036 1037 XXX: 1038 output bracket vector should be an input as well. 1039 *****************************************************************************/ 963 1040 psVector *p_psDetermineBracket(psVector *params, 964 1041 psVector *line, … … 966 1043 const psArray *coords, 967 1044 psMinimizePowellFunc func) 1045 { 1046 float a = 0.0; 1047 float b = 0.0; 1048 float c = 0.0; 1049 float fa = 0.0; 1050 float fb = 0.0; 1051 float fc = 0.0; 1052 psS32 iter = 100; 1053 float aDir = 0.0; 1054 float cDir = 0.0; 1055 float new_aDir = 0.0; 1056 float new_cDir = 0.0; 1057 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 1058 float stepSize = PS_DETERMINE_BRACKET_STEP_SIZE; 1059 psVector *tmp = NULL; 1060 psS32 i = 0; 1061 psS32 null = 0; 1062 1063 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1064 "---- p_psDetermineBracket() begin ----\n"); 1065 1066 for (i=0;i<params->n;i++) { 1067 if (paramMask->data.U8[i] == 0) { 1068 if (line->data.F32[i] >= FLT_EPSILON) { 1069 null = 1; 1070 } 1071 } 1072 } 1073 1074 if (null == 0) { 1075 psTrace(".psLib.dataManip.p_psDetermineBracket", 2, 1076 "p_psDetermineBracket() called with zero line vector.\n"); 1077 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1078 "---- p_psDetermineBracket() end (NULL) ----\n"); 1079 psFree(bracket); 1080 return(NULL); 1081 } 1082 1083 tmp = psVectorAlloc(params->n, PS_TYPE_F32); 1084 1085 b = 0; 1086 a = -stepSize; 1087 c = stepSize; 1088 1089 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a); 1090 fa = func(tmp, coords); 1091 1092 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, b); 1093 fb = func(tmp, coords); 1094 1095 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c); 1096 fc = func(tmp, coords); 1097 1098 if (fa < fb) { 1099 aDir = -1; 1100 } else { 1101 aDir = 1; 1102 } 1103 1104 if (fc < fb) { 1105 cDir = -1; 1106 } else { 1107 cDir = 1; 1108 } 1109 1110 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1111 "(a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", a, b, c, fa, fb, fc); 1112 1113 while (iter > 0) { 1114 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1115 "psDetermineBracket(): iteration %d\n", iter); 1116 if ((fb < fa) && (fb < fc)) { 1117 bracket->data.F32[0] = a; 1118 bracket->data.F32[1] = b; 1119 bracket->data.F32[2] = c; 1120 psFree(tmp); 1121 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1122 "---- p_psDetermineBracket() end ----\n"); 1123 return(bracket); 1124 } 1125 stepSize*= (1.0 + stepSize); 1126 a =- stepSize; 1127 c =+ stepSize; 1128 1129 for (i=0;i<params->n;i++) { 1130 if (paramMask->data.U8[i] == 0) { 1131 tmp->data.F32[i] = params->data.F32[i] + (a * line->data.F32[i]); 1132 } else { 1133 tmp->data.F32[i] = params->data.F32[i]; 1134 } 1135 } 1136 fa = func(tmp, coords); 1137 1138 for (i=0;i<params->n;i++) { 1139 if (paramMask->data.U8[i] == 0) { 1140 tmp->data.F32[i] = params->data.F32[i] + (c * line->data.F32[i]); 1141 } else { 1142 tmp->data.F32[i] = params->data.F32[i]; 1143 } 1144 } 1145 fc = func(tmp, coords); 1146 1147 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1148 "Iter(%d): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc); 1149 1150 if (fa < fb) { 1151 new_aDir = -1; 1152 } else { 1153 new_aDir = 1; 1154 } 1155 1156 if (fc < fb) { 1157 new_cDir = -1; 1158 } else { 1159 new_cDir = 1; 1160 } 1161 if ((new_aDir == 1) && (aDir == -1)) { 1162 bracket->data.F32[0] = a; 1163 bracket->data.F32[1] = b; 1164 bracket->data.F32[2] = c; 1165 psFree(tmp); 1166 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1167 "---- p_psDetermineBracket() end ----\n"); 1168 return(bracket); 1169 } 1170 1171 if ((new_cDir == 1) && (cDir == -1)) { 1172 bracket->data.F32[0] = a; 1173 bracket->data.F32[1] = b; 1174 bracket->data.F32[2] = c; 1175 psFree(tmp); 1176 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1177 "---- p_psDetermineBracket() end ----\n"); 1178 return(bracket); 1179 } 1180 aDir = new_aDir; 1181 cDir = new_cDir; 1182 iter--; 1183 } 1184 psFree(tmp); 1185 psFree(bracket); 1186 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1187 "---- p_psDetermineBracket() end (NULL) ----\n"); 1188 return(NULL); 1189 } 1190 1191 psVector *p_psDetermineBracket2(psVector *params, 1192 psVector *line, 1193 const psVector *paramMask, 1194 const psArray *coords, 1195 psMinimizePowellFunc func) 968 1196 { 969 1197 float a = 0.0; … … 1365 1593 float fqp = 0.0; 1366 1594 float diff = 0.0; 1595 int iterationNumber = 0; 1367 1596 1368 1597 psTrace(".psLib.dataManip.psMinimizePowell", 4, … … 1407 1636 } 1408 1637 1409 min->iter = 0; 1410 while (min->iter < min->maxIter) { 1411 min->iter++; 1638 while (iterationNumber < min->maxIter) { 1639 iterationNumber++; 1412 1640 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1413 "psMinimizePowell() iteration %d\n", min->iter);1641 "psMinimizePowell() iteration %d\n", iterationNumber); 1414 1642 1415 1643 // 3: For each dimension in params, move Q only in the vector v[i] to … … 1418 1646 baseFuncVal = func(Q, coords); 1419 1647 currFuncVal = baseFuncVal; 1648 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1649 "Current function value is %f\n", currFuncVal); 1650 1420 1651 diff = 0.0; 1421 1652 biggestDiff = 0; … … 1423 1654 for (i=0;i<numDims;i++) { 1424 1655 if (myParamMask->data.U8[i] == 0) { 1425 dummyMin.maxIter = 100;1656 dummyMin.maxIter = 20; 1426 1657 dummyMin.tol = 0.01; 1427 1658 mul = p_psLineMin(&dummyMin, Q, v[i], myParamMask, coords, func); … … 1433 1664 } 1434 1665 } 1435 1666 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1667 "New function value is %f\n", currFuncVal); 1436 1668 // 4: Set the vector u = Q - P 1437 1669 for (i=0;i<numDims;i++) { … … 1450 1682 1451 1683 // 5: Move Q only in the direction u, and minimize the function. 1452 psTrace(".psLib.dataManip.psMinimizePowell", 6, "HERE 01\n");1453 1684 for (i=0;i<numDims;i++) { 1454 1685 psTrace(".psLib.dataManip.psMinimizePowell", 6, … … 1470 1701 psFree(myParamMask); 1471 1702 } 1703 min->iter = iterationNumber; 1472 1704 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1473 1705 "---- psMinimizePowell() end (true) ----\n"); … … 1513 1745 psFree(pQP); 1514 1746 psFree(Q); 1747 if (paramMask == NULL) { 1748 psFree(myParamMask); 1749 } 1750 min->iter = iterationNumber; 1515 1751 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1516 1752 "---- psMinimizePowell() end (true) ----\n"); 1517 if (paramMask == NULL) {1518 psFree(myParamMask);1519 }1520 1753 return(true); 1521 1754 } … … 1532 1765 psFree(pQP); 1533 1766 psFree(Q); 1767 min->iter = iterationNumber; 1534 1768 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1535 1769 "---- psMinimizePowell() end (false) ----\n"); … … 1549 1783 const psArray *coords) 1550 1784 { 1785 psTrace(".psLib.dataManip.myPowellChi2Func", 4, 1786 "---- myPowellChi2Func() begin ----\n"); 1787 PS_VECTOR_CHECK_NULL(params, NAN); 1788 PS_VECTOR_CHECK_EMPTY(params, NAN); 1789 PS_VECTOR_CHECK_NULL(myValue, NAN); 1790 PS_VECTOR_CHECK_EMPTY(myValue, NAN); 1791 PS_PTR_CHECK_NULL(coords, NAN); 1792 1551 1793 float chi2 = 0.0; 1552 1794 float d; … … 1555 1797 1556 1798 tmp = Chi2PowellFunc(params, coords); 1557 for (i=0;i<coords->n;i++) { 1558 d = (tmp->data.F32[i] - myValue->data.F32[i]) / myError->data.F32[i]; 1559 chi2+= d * d; 1799 if (myError == NULL) { 1800 for (i=0;i<coords->n;i++) { 1801 d = (tmp->data.F32[i] - myValue->data.F32[i]); 1802 chi2+= d * d; 1803 } 1804 } else { 1805 for (i=0;i<coords->n;i++) { 1806 d = (tmp->data.F32[i] - myValue->data.F32[i]) / myError->data.F32[i]; 1807 chi2+= d * d; 1808 } 1560 1809 } 1561 1810 psFree(tmp); 1811 psTrace(".psLib.dataManip.myPowellChi2Func", 4, 1812 "---- myPowellChi2Func() end (%f) ----\n", chi2); 1562 1813 return(chi2); 1563 1814 } … … 1584 1835 myValue = (psVector *) value; 1585 1836 myError = (psVector *) error; 1837 1586 1838 Chi2PowellFunc = func; 1587 1839 -
trunk/psLib/src/dataManip/psMinimize.h
r2221 r2228 8 8 * @author GLG, MHPCC 9 9 * 10 * @version $Revision: 1.3 4$ $Name: not supported by cvs2svn $11 * @date $Date: 2004-10-2 7 23:31:43$10 * @version $Revision: 1.35 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2004-10-28 22:46:57 $ 12 12 * 13 13 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 81 81 const psArray *x); 82 82 83 /*84 psVector *psMinimizeLMChi2Gauss1D(psImage *deriv,85 const psVector *params,86 const psArray *coords)87 {88 psVector *x = (psVector *) coords->data[0];89 psVector *y = (psVector *) coords->data[1];90 psVector *yErr = NULL;91 int i;92 int j;93 float normalization = params->data.F32[0];94 float center = params->data.F32[1];95 float stdev = params->data.F32[2];96 psVector *out = psVectorAlloc(x->n, PS_TYPE_F32);97 98 99 if (deriv == NULL) {100 deriv = psImageAlloc(params->n, x->n, PS_TYPE_F32);101 }102 103 if (coords->n == 2) {104 yErr = (psVector *) coords->data[2];105 }106 107 for (i=0;i<x->n;i++) {108 out->data.F32[i] = psGaussian(x->data.F32[i], center, stdev, 1);109 }110 111 for (i=0;i<x->n;i++) {112 for (j=0;j<params->n;j++) {113 deriv->data.F32[i][j] = the derivative of the gaussian w.r.t. the j-th parameter at the coord x[i]114 }115 }116 return(out);117 }118 */119 120 83 psBool psMinimizeLMChi2(psMinimization *min, 121 84 psImage *covar, … … 137 100 psMinimizePowellFunc func); 138 101 102 psVector *psMinimizeLMChi2Gauss1D(psImage *deriv, 103 const psVector *params, 104 const psArray *coords); 105 139 106 typedef 140 107 psVector *(*psMinimizeChi2PowellFunc)(const psVector *params, -
trunk/psLib/src/dataManip/psStats.c
r2227 r2228 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1. 79$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-10-28 00:46:04$13 n*11 * @version $Revision: 1.80 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-10-28 22:46:57 $ 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii 15 15 */ … … 123 123 default: 124 124 return false; 125 }126 }127 128 /*****************************************************************************129 p_psVectorPrint(myVector, maskVector, maskVal, stats): a private internal130 function that simply prints a vector to STDOUT. Used primarily for131 debugging.132 *****************************************************************************/133 134 void p_psVectorPrint(psVector* myVector, psVector* maskVector, psU32 maskVal, psStats* stats)135 {136 psS32 i = 0; // Loop index variable.137 138 for (i = 0; i < myVector->n; i++) {139 if (maskVector != NULL)140 printf("Element %d is %f (mask is %d)\n", i, myVector->data.F32[i], maskVector->data.U8[i]);141 else142 printf("Element %d is %f\n", i, myVector->data.F32[i]);143 125 } 144 126 } … … 428 410 // Allocate temporary vectors for the data. 429 411 unsortedVector = psVectorAlloc(nValues, PS_TYPE_F32); 430 unsortedVector->n = unsortedVector->nalloc;431 432 412 sortedVector = psVectorAlloc(nValues, PS_TYPE_F32); 433 sortedVector->n = sortedVector->nalloc;434 413 435 414 // Determine if we must only use data points within a min/max range. … … 579 558 // Allocate temporary vectors for the data. 580 559 unsortedVector = psVectorAlloc(nValues, PS_TYPE_F32); 581 unsortedVector->n = unsortedVector->nalloc;582 560 sortedVector = psVectorAlloc(nValues, PS_TYPE_F32); 583 sortedVector->n = sortedVector->nalloc;584 561 585 562 // Determine if we must only use data points within a min/max range. … … 817 794 p_psNormalizeVectorF32(myData): this is a private function which normalizes the 818 795 elements of a vector to a range between 0.0 and 1.0. 796 797 XXX: how about an arbitrary p_psNormalizeVectorF32(myData, min, max)? 819 798 *****************************************************************************/ 820 799 void p_psNormalizeVectorF32(psVector* myData) … … 847 826 elements of a vector to a range between -1.0 and 1.0. 848 827 XXX: 0-1 or -1:1? 828 829 XXX: how about an arbitrary p_psNormalizeVectorF64(myData, min, max)? 849 830 *****************************************************************************/ 850 831 void p_psNormalizeVectorF64(psVector* myData) … … 876 857 } 877 858 859 // XXX: how about an arbitrary p_psNormalizeVector(myData, min, max)? 878 860 void p_psNormalizeVector(psVector* myData) 879 861 { … … 885 867 psError(__func__, "Unalowable data type.\n"); 886 868 } 887 }888 889 /*****************************************************************************890 p_psGaussian(myData, myParams): an internal function, used by robust stats,891 intended to compute the Gaussian with a specified sigma/mean, at the892 specified data point.893 *****************************************************************************/894 float p_psGaussian(const psVector* restrict myData,895 const psVector* restrict myParams)896 {897 float x = myData->data.F32[0];898 float mean = myParams->data.F32[0];899 float stdev = myParams->data.F32[1];900 float tmp = exp(-((x - mean) * (x - mean)) / (2.0 * stdev * stdev));901 902 tmp /= ((float)sqrt(2.0 * M_PI * (stdev * stdev)));903 904 // printf("p_psGaussian((%.2f), %.2f, %.2f) is %.2f\n", x, mean, stdev, tmp);905 return (tmp);906 }907 908 /*****************************************************************************909 p_psGaussianDeriv(myData, myParams, whichParam): an internal function, which910 calculates the specified partial derivative of the above Gaussian function.911 *****************************************************************************/912 float p_psGaussianDeriv(const psVector* restrict myData,913 const psVector* restrict myParams, psS32 whichParam)914 {915 float x = myData->data.F32[0];916 float mean = myParams->data.F32[0];917 float stdev = myParams->data.F32[1];918 float tmp = 0.0;919 920 if (whichParam == 0) {921 // Return the derivative w.r.t. the mean.922 tmp = (x - mean) * p_psGaussian(myData, myParams);923 tmp /= (stdev * stdev);924 } else if (whichParam == 1) {925 // Return the derivative w.r.t. the stdev.926 tmp = (x - mean) * (x - mean) * p_psGaussian(myData, myParams);927 tmp /= (stdev * stdev * stdev);928 }929 printf("p_psGaussianDeriv((%.2f), %.2f, %.2f, (%d)) is %.2f\n", x, mean, stdev, whichParam, tmp);930 931 return (tmp);932 }933 934 /*****************************************************************************935 p_psQuadratic(myData, myParams): an internal function, used by robust stats,936 intended to compute a quadratic, with the specified parameters, at the937 specified data point.938 *****************************************************************************/939 float p_psQuadratic(const psVector* restrict myParams, const psVector* restrict myCoords)940 {941 float x = myCoords->data.F32[0];942 float A = myParams->data.F32[0];943 float B = myParams->data.F32[1];944 float C = myParams->data.F32[2];945 float tmp = 0.0;946 947 tmp = (A * x * x) + (B * x) + C;948 return (tmp);949 }950 951 /*****************************************************************************952 p_psQuadraticDeriv(myData, myParams, whichParam): an internal function, which953 calculates the specified partial derivative of the above quadratic function.954 *****************************************************************************/955 float p_psQuadraticDeriv(const psVector* restrict myParams,956 const psVector* restrict myCoords, psS32 whichParamDeriv)957 {958 float x = myCoords->data.F32[0];959 float tmp = 0.0;960 961 if (whichParamDeriv == 0) {962 tmp = x * x;963 } else if (whichParamDeriv == 1) {964 tmp = x;965 } else if (whichParamDeriv == 2) {966 tmp = 1.0;967 }968 969 return (tmp);970 869 } 971 870 … … 1022 921 and i+1 is used for x[i]). It then determines for what value x does that 1023 922 quadratic f(x) = yVal (the input parameter). 1024 1025 // XXX: Use static variables.1026 923 *****************************************************************************/ 1027 924 float fitQuadraticSearchForYThenReturnX(psVector *xVec, … … 1030 927 float yVal) 1031 928 { 1032 // static psVector* x = NULL; 1033 // static psVector* y = NULL; 1034 // static psVector* yErr = NULL; 1035 psVector* x = psVectorAlloc(3, PS_TYPE_F64); 1036 psVector* y = psVectorAlloc(3, PS_TYPE_F64); 1037 psVector* yErr = psVectorAlloc(3, PS_TYPE_F64); 1038 1039 /* 1040 if (x == NULL) { 1041 x = psVectorAlloc(3, PS_TYPE_F64); 1042 p_psMemSetPersistent(x, true); 1043 } 1044 if (y == NULL) { 1045 y = psVectorAlloc(3, PS_TYPE_F64); 1046 p_psMemSetPersistent(y, true); 1047 } 1048 if (yErr == NULL) { 1049 yErr = psVectorAlloc(3, PS_TYPE_F64); 1050 p_psMemSetPersistent(yErr, true); 1051 } 1052 */ 1053 psPolynomial1D* myPoly = psPolynomial1DAlloc(2, PS_POLYNOMIAL_ORD); 929 PS_VECTOR_DECLARE_ALLOC_STATIC(x, 3, PS_TYPE_F64); 930 PS_VECTOR_DECLARE_ALLOC_STATIC(y, 3, PS_TYPE_F64); 931 PS_VECTOR_DECLARE_ALLOC_STATIC(yErr, 3, PS_TYPE_F64); 932 static psPolynomial1D* myPoly = NULL; 933 934 if (myPoly == NULL) { 935 myPoly = psPolynomial1DAlloc(2, PS_POLYNOMIAL_ORD); 936 p_psMemSetPersistent(myPoly, true); 937 } 1054 938 float tmpFloat; 1055 939 … … 1090 974 } 1091 975 1092 psFree(x);1093 psFree(y);1094 psFree(yErr);1095 psFree(myPoly);1096 976 return(tmpFloat); 1097 977 } … … 1475 1355 1476 1356 /****************************************************************************** 1477 psHistogramAllocGen ric(bounds): allocate a non-uniform histogram structure1357 psHistogramAllocGeneric(bounds): allocate a non-uniform histogram structure 1478 1358 with the specifed bounds. 1479 1359 -
trunk/psLib/src/math/psConstants.h
r2224 r2228 6 6 * @author GLG, MHPCC 7 7 * 8 * @version $Revision: 1. 29$ $Name: not supported by cvs2svn $9 * @date $Date: 2004-10-28 00:22:53$8 * @version $Revision: 1.30 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2004-10-28 22:46:57 $ 10 10 * 11 11 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 208 208 p_psMemSetPersistent(NAME->data.V, true); \ 209 209 210 #define PS_VECTOR_DECLARE_ALLOC_STATIC(NAME, SIZE, TYPE) \ 211 static psVector *NAME = NULL; \ 212 if (NAME == NULL) { \ 213 NAME = psVectorAlloc(SIZE, TYPE); \ 214 p_psMemSetPersistent(NAME, true); \ 215 } \ 210 216 211 217 -
trunk/psLib/src/math/psMinimize.c
r2221 r2228 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.7 2$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-10-2 7 23:31:43$11 * @version $Revision: 1.73 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-10-28 22:46:57 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 408 408 } 409 409 410 411 /****************************************************************************** 412 XXX: We assume unnormalized gaussians. 413 XXX: Currently, yErr is ignored. 414 *****************************************************************************/ 415 psVector *psMinimizeLMChi2Gauss1D(psImage *deriv, 416 const psVector *params, 417 const psArray *coords) 418 { 419 psTrace(".psLib.dataManip.psMinimize", 4, 420 "---- psMinimizeLMChi2Gauss1D() begin ----\n"); 421 422 PS_PTR_CHECK_NULL(coords, NULL); 423 PS_PTR_CHECK_NULL(params, NULL); 424 float x; 425 int i; 426 float mean = params->data.F32[0]; 427 float stdev = params->data.F32[1]; 428 psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32); 429 430 psTrace(".psLib.dataManip.psMinimize", 6, 431 "(mean, stdev) is (%f, %f)\n", mean, stdev); 432 433 if (deriv == NULL) { 434 deriv = psImageAlloc(params->n, coords->n, PS_TYPE_F32); 435 } 436 437 for (i=0;i<coords->n;i++) { 438 x = ((psVector *) (coords->data[i]))->data.F32[0]; 439 out->data.F32[i] = psGaussian(x, mean, stdev, false); 440 // psTrace(".psLib.dataManip.psMinimize", 6, 441 // "out->data.F32[%d]: (x, m, s) is (%f, %f, %f) is %f\n", i, x, mean, stdev, out->data.F32[i]); 442 } 443 444 for (i=0;i<coords->n;i++) { 445 x = ((psVector *) (coords->data[i]))->data.F32[0]; 446 float tmp = (x - mean) * psGaussian(x, mean, stdev, false); 447 deriv->data.F32[i][0] = tmp / (stdev * stdev); 448 449 tmp = (x - mean) * (x - mean) * 450 psGaussian(x, mean, stdev, 0); 451 deriv->data.F32[i][1] = tmp / (stdev * stdev * stdev); 452 } 453 454 psTrace(".psLib.dataManip.psMinimize", 4, 455 "---- psMinimizeLMChi2Gauss1D() end ----\n"); 456 return(out); 457 } 458 459 410 460 /****************************************************************************** 411 461 psMinimizeLMChi2(): This routine will take an procedure which calculates … … 429 479 XXX: This must work for both F32 and F64. F32 is currently implemented. 430 480 Note: since the LUD routines are only implemented in F64, then we 431 will have to convert all F32 input vectors to F64 regardless. So,481 > will have to convert all F32 input vectors to F64 regardless. So, 432 482 the F64 port might be. 433 483 *****************************************************************************/ … … 457 507 } 458 508 459 psTrace(".psLib.dataManip.psMinimize LMChi2", 4,509 psTrace(".psLib.dataManip.psMinimize", 4, 460 510 "---- psMinimizeLMChi2() begin ----\n"); 461 511 psS32 numData = y->n; … … 490 540 float newChi2 = 0.0; 491 541 float lamda = 0.00005; 492 493 psTrace(".psLib.dataManip.psMinimizeLMChi2", 6, 542 lamda = 0.05; 543 544 psTrace(".psLib.dataManip.psMinimize", 6, 494 545 "min->maxIter is %d\n", min->maxIter); 495 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,546 psTrace(".psLib.dataManip.psMinimize", 6, 496 547 "min->tol is %f\n", min->tol); 497 548 … … 504 555 505 556 while ((min->lastDelta > min->tol) && (min->iter < min->maxIter)) { 506 psTrace(".psLib.dataManip.psMinimize LMChi2", 4,557 psTrace(".psLib.dataManip.psMinimize", 4, 507 558 "------------------------------------------------------\n"); 508 psTrace(".psLib.dataManip.psMinimize LMChi2", 4,559 psTrace(".psLib.dataManip.psMinimize", 4, 509 560 "Iteration %d. Delta is %f\n", min->iter, min->lastDelta); 510 561 … … 515 566 currValueVec = func(deriv, params, x); 516 567 for (n=0;n<numData;n++) { 517 currChi2+= (currValueVec->data.F32[n] * currValueVec->data.F32[n]); 568 currChi2+= (currValueVec->data.F32[n] - y->data.F32[n]) * 569 (currValueVec->data.F32[n] - y->data.F32[n]); 570 psTrace(".psLib.dataManip.psMinimize", 6, 571 "data[%d], chi2 calculation+= (%f * %f)\n", n, 572 currValueVec->data.F32[n], y->data.F32[n]); 518 573 } 519 574 520 575 for (p=0;p<numParams;p++) { 521 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,576 psTrace(".psLib.dataManip.psMinimize", 6, 522 577 "params->data.F32[%d] is %f.\n", p, params->data.F32[p]); 523 578 } 524 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,579 psTrace(".psLib.dataManip.psMinimize", 6, 525 580 "Current chi-squared is (%f)\n", currChi2); 526 581 … … 548 603 // XXX: multiple by -1 here? 549 604 (beta->data.F64[p])*= -1.0; 550 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,605 psTrace(".psLib.dataManip.psMinimize", 6, 551 606 "beta->data.F64[%d] is %f.\n", p, beta->data.F64[p]); 552 607 } … … 580 635 } 581 636 for (j=0;j<numParams;j++) { 582 psTrace(".psLib.dataManip.psMinimize LMChi2", 6, "Matrix A[][]:\n");637 psTrace(".psLib.dataManip.psMinimize", 6, "Matrix A[][]:\n"); 583 638 for (k=0;k<numParams;k++) { 584 psTrace(".psLib.dataManip.psMinimize LMChi2", 6, "%f ", A->data.F64[j][k]);585 } 586 psTrace(".psLib.dataManip.psMinimize LMChi2", 6, "Matrix A[][]:\n");639 psTrace(".psLib.dataManip.psMinimize", 6, "%f ", A->data.F64[j][k]); 640 } 641 psTrace(".psLib.dataManip.psMinimize", 6, "Matrix A[][]:\n"); 587 642 } 588 643 … … 597 652 // 598 653 for (i=0;i<numParams;i++) { 599 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,654 psTrace(".psLib.dataManip.psMinimize", 6, 600 655 "paramDeltasF64->data.F64[%d] is %f.\n", i, paramDeltasF64->data.F64[i]); 601 656 if ((paramMask != NULL) && (paramMask->data.U8[i] != 0)) { … … 607 662 } 608 663 609 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,664 psTrace(".psLib.dataManip.psMinimize", 6, 610 665 "Calling func() with new parameters:\n"); 611 666 for (i=0;i<numParams;i++) { 612 psTrace(".psLib.dataManip.psMinimize LMChi2", 6,667 psTrace(".psLib.dataManip.psMinimize", 6, 613 668 "newParams->data.F32[%d] is %f.\n", i, newParams->data.F32[i]); 614 669 } … … 621 676 newValueVec = func(deriv, newParams, x); 622 677 for (n=0;n<numData;n++) { 623 newChi2+= (newValueVec->data.F32[n] * newValueVec->data.F32[n]); 678 newChi2+= (newValueVec->data.F32[n] - y->data.F32[n]) * 679 (newValueVec->data.F32[n] - y->data.F32[n]); 680 624 681 } 625 682 psFree(newValueVec); 626 683 627 psTrace(".psLib.dataManip.psMinimize LMChi2", 4,684 psTrace(".psLib.dataManip.psMinimize", 4, 628 685 "old/new chi-squareds are (%f, %f)\n", currChi2, newChi2); 629 686 … … 640 697 } 641 698 lamda*= 0.1; 699 psTrace(".psLib.dataManip.psMinimize", 4, "*** Reducing lamda by factor of 10\n"); 642 700 } else { 643 701 lamda*= 10.0; 644 } 645 psTrace(".psLib.dataManip.psMinimizeLMChi2", 4, 702 psTrace(".psLib.dataManip.psMinimize", 4, "*** Increasing lamda by factor of 10\n"); 703 } 704 psTrace(".psLib.dataManip.psMinimize", 4, 646 705 "lamda is %f\n", lamda); 647 706 min->iter++; … … 662 721 } 663 722 664 psTrace(".psLib.dataManip.psMinimize LMChi2", 4,723 psTrace(".psLib.dataManip.psMinimize", 4, 665 724 "---- psMinimizeLMChi2() end (false) ----\n"); 666 725 return(false); … … 942 1001 } 943 1002 1003 #define PS_VECTOR_ADD_MULTIPLE(BASE, BASEMASK, LINE, OUT, MUL) \ 1004 for (int i=0;i<BASE->n;i++) { \ 1005 if (BASEMASK->data.U8[i] == 0) { \ 1006 OUT->data.F32[i] = BASE->data.F32[i] + (MUL * LINE->data.F32[i]); \ 1007 } else { \ 1008 OUT->data.F32[i] = BASE->data.F32[i]; \ 1009 } \ 1010 } \ 1011 1012 944 1013 /****************************************************************************** 945 1014 p_psDetermineBracket(): This routine takes as input an arbitrary function, … … 947 1016 function produces as output a bracket [a, b, c] such that 948 1017 949 f(param + b * line) is less than f(param + a * line) and 950 f(param + c * line). 951 952 Algorithm: XXX completely ad hoc: start with the user-supplied starting 1018 f(param + b * line) is less than f(param + a * line) and 1019 f(param + c * line). 1020 1021 Algorithm: 1022 XXX completely ad hoc: 1023 start with the user-supplied starting 953 1024 parameter and call that b. Calculate a/c as a fractional amount 954 1025 smaller/larger than b. Repeat this process until a local minimum is found. 955 1026 956 XXX: new algorithm: start at x=0, expand in one direction until the function 1027 XXX: 1028 new algorithm: 1029 start at x=0, expand in one direction until the function 957 1030 decreases. Then you have two points in the bracket. Keep going until it 958 1031 increases, or x is too large. If thst does not work, expand in the other 959 1032 direction. 960 1033 961 XXX: This is F32 only 962 *****************************************************************************/ 1034 XXX: 1035 This is F32 only. 1036 1037 XXX: 1038 output bracket vector should be an input as well. 1039 *****************************************************************************/ 963 1040 psVector *p_psDetermineBracket(psVector *params, 964 1041 psVector *line, … … 966 1043 const psArray *coords, 967 1044 psMinimizePowellFunc func) 1045 { 1046 float a = 0.0; 1047 float b = 0.0; 1048 float c = 0.0; 1049 float fa = 0.0; 1050 float fb = 0.0; 1051 float fc = 0.0; 1052 psS32 iter = 100; 1053 float aDir = 0.0; 1054 float cDir = 0.0; 1055 float new_aDir = 0.0; 1056 float new_cDir = 0.0; 1057 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 1058 float stepSize = PS_DETERMINE_BRACKET_STEP_SIZE; 1059 psVector *tmp = NULL; 1060 psS32 i = 0; 1061 psS32 null = 0; 1062 1063 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1064 "---- p_psDetermineBracket() begin ----\n"); 1065 1066 for (i=0;i<params->n;i++) { 1067 if (paramMask->data.U8[i] == 0) { 1068 if (line->data.F32[i] >= FLT_EPSILON) { 1069 null = 1; 1070 } 1071 } 1072 } 1073 1074 if (null == 0) { 1075 psTrace(".psLib.dataManip.p_psDetermineBracket", 2, 1076 "p_psDetermineBracket() called with zero line vector.\n"); 1077 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1078 "---- p_psDetermineBracket() end (NULL) ----\n"); 1079 psFree(bracket); 1080 return(NULL); 1081 } 1082 1083 tmp = psVectorAlloc(params->n, PS_TYPE_F32); 1084 1085 b = 0; 1086 a = -stepSize; 1087 c = stepSize; 1088 1089 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a); 1090 fa = func(tmp, coords); 1091 1092 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, b); 1093 fb = func(tmp, coords); 1094 1095 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c); 1096 fc = func(tmp, coords); 1097 1098 if (fa < fb) { 1099 aDir = -1; 1100 } else { 1101 aDir = 1; 1102 } 1103 1104 if (fc < fb) { 1105 cDir = -1; 1106 } else { 1107 cDir = 1; 1108 } 1109 1110 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1111 "(a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", a, b, c, fa, fb, fc); 1112 1113 while (iter > 0) { 1114 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1115 "psDetermineBracket(): iteration %d\n", iter); 1116 if ((fb < fa) && (fb < fc)) { 1117 bracket->data.F32[0] = a; 1118 bracket->data.F32[1] = b; 1119 bracket->data.F32[2] = c; 1120 psFree(tmp); 1121 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1122 "---- p_psDetermineBracket() end ----\n"); 1123 return(bracket); 1124 } 1125 stepSize*= (1.0 + stepSize); 1126 a =- stepSize; 1127 c =+ stepSize; 1128 1129 for (i=0;i<params->n;i++) { 1130 if (paramMask->data.U8[i] == 0) { 1131 tmp->data.F32[i] = params->data.F32[i] + (a * line->data.F32[i]); 1132 } else { 1133 tmp->data.F32[i] = params->data.F32[i]; 1134 } 1135 } 1136 fa = func(tmp, coords); 1137 1138 for (i=0;i<params->n;i++) { 1139 if (paramMask->data.U8[i] == 0) { 1140 tmp->data.F32[i] = params->data.F32[i] + (c * line->data.F32[i]); 1141 } else { 1142 tmp->data.F32[i] = params->data.F32[i]; 1143 } 1144 } 1145 fc = func(tmp, coords); 1146 1147 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1148 "Iter(%d): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc); 1149 1150 if (fa < fb) { 1151 new_aDir = -1; 1152 } else { 1153 new_aDir = 1; 1154 } 1155 1156 if (fc < fb) { 1157 new_cDir = -1; 1158 } else { 1159 new_cDir = 1; 1160 } 1161 if ((new_aDir == 1) && (aDir == -1)) { 1162 bracket->data.F32[0] = a; 1163 bracket->data.F32[1] = b; 1164 bracket->data.F32[2] = c; 1165 psFree(tmp); 1166 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1167 "---- p_psDetermineBracket() end ----\n"); 1168 return(bracket); 1169 } 1170 1171 if ((new_cDir == 1) && (cDir == -1)) { 1172 bracket->data.F32[0] = a; 1173 bracket->data.F32[1] = b; 1174 bracket->data.F32[2] = c; 1175 psFree(tmp); 1176 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1177 "---- p_psDetermineBracket() end ----\n"); 1178 return(bracket); 1179 } 1180 aDir = new_aDir; 1181 cDir = new_cDir; 1182 iter--; 1183 } 1184 psFree(tmp); 1185 psFree(bracket); 1186 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1187 "---- p_psDetermineBracket() end (NULL) ----\n"); 1188 return(NULL); 1189 } 1190 1191 psVector *p_psDetermineBracket2(psVector *params, 1192 psVector *line, 1193 const psVector *paramMask, 1194 const psArray *coords, 1195 psMinimizePowellFunc func) 968 1196 { 969 1197 float a = 0.0; … … 1365 1593 float fqp = 0.0; 1366 1594 float diff = 0.0; 1595 int iterationNumber = 0; 1367 1596 1368 1597 psTrace(".psLib.dataManip.psMinimizePowell", 4, … … 1407 1636 } 1408 1637 1409 min->iter = 0; 1410 while (min->iter < min->maxIter) { 1411 min->iter++; 1638 while (iterationNumber < min->maxIter) { 1639 iterationNumber++; 1412 1640 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1413 "psMinimizePowell() iteration %d\n", min->iter);1641 "psMinimizePowell() iteration %d\n", iterationNumber); 1414 1642 1415 1643 // 3: For each dimension in params, move Q only in the vector v[i] to … … 1418 1646 baseFuncVal = func(Q, coords); 1419 1647 currFuncVal = baseFuncVal; 1648 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1649 "Current function value is %f\n", currFuncVal); 1650 1420 1651 diff = 0.0; 1421 1652 biggestDiff = 0; … … 1423 1654 for (i=0;i<numDims;i++) { 1424 1655 if (myParamMask->data.U8[i] == 0) { 1425 dummyMin.maxIter = 100;1656 dummyMin.maxIter = 20; 1426 1657 dummyMin.tol = 0.01; 1427 1658 mul = p_psLineMin(&dummyMin, Q, v[i], myParamMask, coords, func); … … 1433 1664 } 1434 1665 } 1435 1666 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1667 "New function value is %f\n", currFuncVal); 1436 1668 // 4: Set the vector u = Q - P 1437 1669 for (i=0;i<numDims;i++) { … … 1450 1682 1451 1683 // 5: Move Q only in the direction u, and minimize the function. 1452 psTrace(".psLib.dataManip.psMinimizePowell", 6, "HERE 01\n");1453 1684 for (i=0;i<numDims;i++) { 1454 1685 psTrace(".psLib.dataManip.psMinimizePowell", 6, … … 1470 1701 psFree(myParamMask); 1471 1702 } 1703 min->iter = iterationNumber; 1472 1704 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1473 1705 "---- psMinimizePowell() end (true) ----\n"); … … 1513 1745 psFree(pQP); 1514 1746 psFree(Q); 1747 if (paramMask == NULL) { 1748 psFree(myParamMask); 1749 } 1750 min->iter = iterationNumber; 1515 1751 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1516 1752 "---- psMinimizePowell() end (true) ----\n"); 1517 if (paramMask == NULL) {1518 psFree(myParamMask);1519 }1520 1753 return(true); 1521 1754 } … … 1532 1765 psFree(pQP); 1533 1766 psFree(Q); 1767 min->iter = iterationNumber; 1534 1768 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1535 1769 "---- psMinimizePowell() end (false) ----\n"); … … 1549 1783 const psArray *coords) 1550 1784 { 1785 psTrace(".psLib.dataManip.myPowellChi2Func", 4, 1786 "---- myPowellChi2Func() begin ----\n"); 1787 PS_VECTOR_CHECK_NULL(params, NAN); 1788 PS_VECTOR_CHECK_EMPTY(params, NAN); 1789 PS_VECTOR_CHECK_NULL(myValue, NAN); 1790 PS_VECTOR_CHECK_EMPTY(myValue, NAN); 1791 PS_PTR_CHECK_NULL(coords, NAN); 1792 1551 1793 float chi2 = 0.0; 1552 1794 float d; … … 1555 1797 1556 1798 tmp = Chi2PowellFunc(params, coords); 1557 for (i=0;i<coords->n;i++) { 1558 d = (tmp->data.F32[i] - myValue->data.F32[i]) / myError->data.F32[i]; 1559 chi2+= d * d; 1799 if (myError == NULL) { 1800 for (i=0;i<coords->n;i++) { 1801 d = (tmp->data.F32[i] - myValue->data.F32[i]); 1802 chi2+= d * d; 1803 } 1804 } else { 1805 for (i=0;i<coords->n;i++) { 1806 d = (tmp->data.F32[i] - myValue->data.F32[i]) / myError->data.F32[i]; 1807 chi2+= d * d; 1808 } 1560 1809 } 1561 1810 psFree(tmp); 1811 psTrace(".psLib.dataManip.myPowellChi2Func", 4, 1812 "---- myPowellChi2Func() end (%f) ----\n", chi2); 1562 1813 return(chi2); 1563 1814 } … … 1584 1835 myValue = (psVector *) value; 1585 1836 myError = (psVector *) error; 1837 1586 1838 Chi2PowellFunc = func; 1587 1839 -
trunk/psLib/src/math/psMinimize.h
r2221 r2228 8 8 * @author GLG, MHPCC 9 9 * 10 * @version $Revision: 1.3 4$ $Name: not supported by cvs2svn $11 * @date $Date: 2004-10-2 7 23:31:43$10 * @version $Revision: 1.35 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2004-10-28 22:46:57 $ 12 12 * 13 13 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 81 81 const psArray *x); 82 82 83 /*84 psVector *psMinimizeLMChi2Gauss1D(psImage *deriv,85 const psVector *params,86 const psArray *coords)87 {88 psVector *x = (psVector *) coords->data[0];89 psVector *y = (psVector *) coords->data[1];90 psVector *yErr = NULL;91 int i;92 int j;93 float normalization = params->data.F32[0];94 float center = params->data.F32[1];95 float stdev = params->data.F32[2];96 psVector *out = psVectorAlloc(x->n, PS_TYPE_F32);97 98 99 if (deriv == NULL) {100 deriv = psImageAlloc(params->n, x->n, PS_TYPE_F32);101 }102 103 if (coords->n == 2) {104 yErr = (psVector *) coords->data[2];105 }106 107 for (i=0;i<x->n;i++) {108 out->data.F32[i] = psGaussian(x->data.F32[i], center, stdev, 1);109 }110 111 for (i=0;i<x->n;i++) {112 for (j=0;j<params->n;j++) {113 deriv->data.F32[i][j] = the derivative of the gaussian w.r.t. the j-th parameter at the coord x[i]114 }115 }116 return(out);117 }118 */119 120 83 psBool psMinimizeLMChi2(psMinimization *min, 121 84 psImage *covar, … … 137 100 psMinimizePowellFunc func); 138 101 102 psVector *psMinimizeLMChi2Gauss1D(psImage *deriv, 103 const psVector *params, 104 const psArray *coords); 105 139 106 typedef 140 107 psVector *(*psMinimizeChi2PowellFunc)(const psVector *params, -
trunk/psLib/src/math/psStats.c
r2227 r2228 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1. 79$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-10-28 00:46:04$13 n*11 * @version $Revision: 1.80 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-10-28 22:46:57 $ 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii 15 15 */ … … 123 123 default: 124 124 return false; 125 }126 }127 128 /*****************************************************************************129 p_psVectorPrint(myVector, maskVector, maskVal, stats): a private internal130 function that simply prints a vector to STDOUT. Used primarily for131 debugging.132 *****************************************************************************/133 134 void p_psVectorPrint(psVector* myVector, psVector* maskVector, psU32 maskVal, psStats* stats)135 {136 psS32 i = 0; // Loop index variable.137 138 for (i = 0; i < myVector->n; i++) {139 if (maskVector != NULL)140 printf("Element %d is %f (mask is %d)\n", i, myVector->data.F32[i], maskVector->data.U8[i]);141 else142 printf("Element %d is %f\n", i, myVector->data.F32[i]);143 125 } 144 126 } … … 428 410 // Allocate temporary vectors for the data. 429 411 unsortedVector = psVectorAlloc(nValues, PS_TYPE_F32); 430 unsortedVector->n = unsortedVector->nalloc;431 432 412 sortedVector = psVectorAlloc(nValues, PS_TYPE_F32); 433 sortedVector->n = sortedVector->nalloc;434 413 435 414 // Determine if we must only use data points within a min/max range. … … 579 558 // Allocate temporary vectors for the data. 580 559 unsortedVector = psVectorAlloc(nValues, PS_TYPE_F32); 581 unsortedVector->n = unsortedVector->nalloc;582 560 sortedVector = psVectorAlloc(nValues, PS_TYPE_F32); 583 sortedVector->n = sortedVector->nalloc;584 561 585 562 // Determine if we must only use data points within a min/max range. … … 817 794 p_psNormalizeVectorF32(myData): this is a private function which normalizes the 818 795 elements of a vector to a range between 0.0 and 1.0. 796 797 XXX: how about an arbitrary p_psNormalizeVectorF32(myData, min, max)? 819 798 *****************************************************************************/ 820 799 void p_psNormalizeVectorF32(psVector* myData) … … 847 826 elements of a vector to a range between -1.0 and 1.0. 848 827 XXX: 0-1 or -1:1? 828 829 XXX: how about an arbitrary p_psNormalizeVectorF64(myData, min, max)? 849 830 *****************************************************************************/ 850 831 void p_psNormalizeVectorF64(psVector* myData) … … 876 857 } 877 858 859 // XXX: how about an arbitrary p_psNormalizeVector(myData, min, max)? 878 860 void p_psNormalizeVector(psVector* myData) 879 861 { … … 885 867 psError(__func__, "Unalowable data type.\n"); 886 868 } 887 }888 889 /*****************************************************************************890 p_psGaussian(myData, myParams): an internal function, used by robust stats,891 intended to compute the Gaussian with a specified sigma/mean, at the892 specified data point.893 *****************************************************************************/894 float p_psGaussian(const psVector* restrict myData,895 const psVector* restrict myParams)896 {897 float x = myData->data.F32[0];898 float mean = myParams->data.F32[0];899 float stdev = myParams->data.F32[1];900 float tmp = exp(-((x - mean) * (x - mean)) / (2.0 * stdev * stdev));901 902 tmp /= ((float)sqrt(2.0 * M_PI * (stdev * stdev)));903 904 // printf("p_psGaussian((%.2f), %.2f, %.2f) is %.2f\n", x, mean, stdev, tmp);905 return (tmp);906 }907 908 /*****************************************************************************909 p_psGaussianDeriv(myData, myParams, whichParam): an internal function, which910 calculates the specified partial derivative of the above Gaussian function.911 *****************************************************************************/912 float p_psGaussianDeriv(const psVector* restrict myData,913 const psVector* restrict myParams, psS32 whichParam)914 {915 float x = myData->data.F32[0];916 float mean = myParams->data.F32[0];917 float stdev = myParams->data.F32[1];918 float tmp = 0.0;919 920 if (whichParam == 0) {921 // Return the derivative w.r.t. the mean.922 tmp = (x - mean) * p_psGaussian(myData, myParams);923 tmp /= (stdev * stdev);924 } else if (whichParam == 1) {925 // Return the derivative w.r.t. the stdev.926 tmp = (x - mean) * (x - mean) * p_psGaussian(myData, myParams);927 tmp /= (stdev * stdev * stdev);928 }929 printf("p_psGaussianDeriv((%.2f), %.2f, %.2f, (%d)) is %.2f\n", x, mean, stdev, whichParam, tmp);930 931 return (tmp);932 }933 934 /*****************************************************************************935 p_psQuadratic(myData, myParams): an internal function, used by robust stats,936 intended to compute a quadratic, with the specified parameters, at the937 specified data point.938 *****************************************************************************/939 float p_psQuadratic(const psVector* restrict myParams, const psVector* restrict myCoords)940 {941 float x = myCoords->data.F32[0];942 float A = myParams->data.F32[0];943 float B = myParams->data.F32[1];944 float C = myParams->data.F32[2];945 float tmp = 0.0;946 947 tmp = (A * x * x) + (B * x) + C;948 return (tmp);949 }950 951 /*****************************************************************************952 p_psQuadraticDeriv(myData, myParams, whichParam): an internal function, which953 calculates the specified partial derivative of the above quadratic function.954 *****************************************************************************/955 float p_psQuadraticDeriv(const psVector* restrict myParams,956 const psVector* restrict myCoords, psS32 whichParamDeriv)957 {958 float x = myCoords->data.F32[0];959 float tmp = 0.0;960 961 if (whichParamDeriv == 0) {962 tmp = x * x;963 } else if (whichParamDeriv == 1) {964 tmp = x;965 } else if (whichParamDeriv == 2) {966 tmp = 1.0;967 }968 969 return (tmp);970 869 } 971 870 … … 1022 921 and i+1 is used for x[i]). It then determines for what value x does that 1023 922 quadratic f(x) = yVal (the input parameter). 1024 1025 // XXX: Use static variables.1026 923 *****************************************************************************/ 1027 924 float fitQuadraticSearchForYThenReturnX(psVector *xVec, … … 1030 927 float yVal) 1031 928 { 1032 // static psVector* x = NULL; 1033 // static psVector* y = NULL; 1034 // static psVector* yErr = NULL; 1035 psVector* x = psVectorAlloc(3, PS_TYPE_F64); 1036 psVector* y = psVectorAlloc(3, PS_TYPE_F64); 1037 psVector* yErr = psVectorAlloc(3, PS_TYPE_F64); 1038 1039 /* 1040 if (x == NULL) { 1041 x = psVectorAlloc(3, PS_TYPE_F64); 1042 p_psMemSetPersistent(x, true); 1043 } 1044 if (y == NULL) { 1045 y = psVectorAlloc(3, PS_TYPE_F64); 1046 p_psMemSetPersistent(y, true); 1047 } 1048 if (yErr == NULL) { 1049 yErr = psVectorAlloc(3, PS_TYPE_F64); 1050 p_psMemSetPersistent(yErr, true); 1051 } 1052 */ 1053 psPolynomial1D* myPoly = psPolynomial1DAlloc(2, PS_POLYNOMIAL_ORD); 929 PS_VECTOR_DECLARE_ALLOC_STATIC(x, 3, PS_TYPE_F64); 930 PS_VECTOR_DECLARE_ALLOC_STATIC(y, 3, PS_TYPE_F64); 931 PS_VECTOR_DECLARE_ALLOC_STATIC(yErr, 3, PS_TYPE_F64); 932 static psPolynomial1D* myPoly = NULL; 933 934 if (myPoly == NULL) { 935 myPoly = psPolynomial1DAlloc(2, PS_POLYNOMIAL_ORD); 936 p_psMemSetPersistent(myPoly, true); 937 } 1054 938 float tmpFloat; 1055 939 … … 1090 974 } 1091 975 1092 psFree(x);1093 psFree(y);1094 psFree(yErr);1095 psFree(myPoly);1096 976 return(tmpFloat); 1097 977 } … … 1475 1355 1476 1356 /****************************************************************************** 1477 psHistogramAllocGen ric(bounds): allocate a non-uniform histogram structure1357 psHistogramAllocGeneric(bounds): allocate a non-uniform histogram structure 1478 1358 with the specifed bounds. 1479 1359 -
trunk/psLib/src/sys/psTrace.h
r2221 r2228 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.2 6$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-10-2 7 23:31:44$11 * @version $Revision: 1.27 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-10-28 22:47:00 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 18 18 19 19 #define PS_UNKNOWN_TRACE_LEVEL -9999 // we don't know this name's level 20 #define PS_DEFAULT_TRACE_LEVEL 020 #define PS_DEFAULT_TRACE_LEVEL -1 21 21 22 22 /** \addtogroup LogTrace -
trunk/psLib/src/sysUtils/psTrace.h
r2221 r2228 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.2 6$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-10-2 7 23:31:44$11 * @version $Revision: 1.27 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-10-28 22:47:00 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 18 18 19 19 #define PS_UNKNOWN_TRACE_LEVEL -9999 // we don't know this name's level 20 #define PS_DEFAULT_TRACE_LEVEL 020 #define PS_DEFAULT_TRACE_LEVEL -1 21 21 22 22 /** \addtogroup LogTrace
Note:
See TracChangeset
for help on using the changeset viewer.
