Changeset 1719
- Timestamp:
- Sep 7, 2004, 8:03:26 PM (22 years ago)
- Location:
- trunk/psLib/src
- Files:
-
- 10 edited
-
dataManip/psFunctions.c (modified) (7 diffs)
-
dataManip/psMinimize.c (modified) (16 diffs)
-
dataManip/psMinimize.h (modified) (2 diffs)
-
image/psImageStats.c (modified) (6 diffs)
-
imageops/psImageStats.c (modified) (6 diffs)
-
math/psMinimize.c (modified) (16 diffs)
-
math/psMinimize.h (modified) (2 diffs)
-
math/psPolynomial.c (modified) (7 diffs)
-
math/psSpline.c (modified) (7 diffs)
-
sys/psTrace.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/dataManip/psFunctions.c
r1718 r1719 7 7 * polynomials. It also contains a Gaussian functions. 8 8 * 9 * @version $Revision: 1.2 4$ $Name: not supported by cvs2svn $10 * @date $Date: 2004-09-08 06:0 0:49$9 * @version $Revision: 1.25 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2004-09-08 06:01:21 $ 11 11 * 12 12 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii 13 13 */ 14 15 14 /*****************************************************************************/ 16 17 15 /* INCLUDE FILES */ 18 19 16 /*****************************************************************************/ 20 17 #include <stdlib.h> … … 37 34 38 35 /*****************************************************************************/ 39 40 36 /* DEFINE STATEMENTS */ 41 42 37 /*****************************************************************************/ 43 38 … … 83 78 84 79 /*****************************************************************************/ 85 86 80 /* TYPE DEFINITIONS */ 87 88 81 /*****************************************************************************/ 89 82 static void polynomial1DFree(psPolynomial1D* myPoly); … … 97 90 98 91 /*****************************************************************************/ 99 100 92 /* GLOBAL VARIABLES */ 101 102 93 /*****************************************************************************/ 103 94 … … 105 96 106 97 /*****************************************************************************/ 107 108 98 /* FILE STATIC VARIABLES */ 109 110 99 /*****************************************************************************/ 111 100 … … 113 102 114 103 /*****************************************************************************/ 115 116 104 /* FUNCTION IMPLEMENTATION - LOCAL */ 117 118 105 /*****************************************************************************/ 119 106 … … 121 108 122 109 /*****************************************************************************/ 123 124 110 /* FUNCTION IMPLEMENTATION - PUBLIC */ 125 126 111 /*****************************************************************************/ 127 112 -
trunk/psLib/src/dataManip/psMinimize.c
r1629 r1719 9 9 * @author George Gusciora, MHPCC 10 10 * 11 * @version $Revision: 1.3 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-0 8-26 20:10:25$11 * @version $Revision: 1.34 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-09-08 06:02:23 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 43 43 #include "psMinimize.h" 44 44 #include "psMatrix.h" 45 #include "psTrace.h" 45 46 46 47 /*****************************************************************************/ … … 569 570 gsl_vector *x; 570 571 572 psTrace(".psLib.dataManip.psMinimize", 4, 573 "---- psMinimize() begin ----\n"); 574 571 575 PS_CHECK_NULL_VECTOR(initialGuess); 572 576 PS_CHECK_EMPTY_VECTOR(initialGuess); … … 655 659 } 656 660 } 661 psTrace(".psLib.dataManip.psMinimize", 4, 662 "---- psMinimize() end ----\n"); 657 663 return (initialGuess); 658 664 } … … 691 697 float chiSqOld = 0.0; 692 698 699 psTrace(".psLib.dataManip.psMinimizeChi2", 4, 700 "---- psMinimizeChi2() begin ----\n"); 701 693 702 PS_CHECK_NULL_IMAGE(domain); 694 703 PS_CHECK_EMPTY_IMAGE(domain); … … 837 846 838 847 // Bye bye. 848 psTrace(".psLib.dataManip.psMinimizeChi2", 4, 849 "---- psMinimizeChi2() end ----\n"); 839 850 return (initialGuess); 840 851 } … … 863 874 psVector* xSums = NULL; 864 875 876 psTrace(".psLib.dataManip.psVectorFitPolynomial1D", 4, 877 "---- psVectorFitPolynomial1D() begin ----\n"); 865 878 // printf("psVectorFitPolynomial1D()\n"); 866 879 // for (i=0;i<x->n;i++) { … … 936 949 psFree(xSums); 937 950 951 psTrace(".psLib.dataManip.psVectorFitPolynomial1D", 4, 952 "---- psVectorFitPolynomial1D() begin ----\n"); 938 953 return (myPoly); 954 } 955 956 psMinimization *psMinimizationAlloc(int maxIter, 957 float tol) 958 { 959 psMinimization *min = psAlloc(sizeof(psMinimization)); 960 min->maxIter = maxIter; 961 min->tol = tol; 962 min->value = 0.0; 963 min->iter = 0; 964 min->lastDelta = 0.0; 965 966 return(min); 939 967 } 940 968 941 969 #define STEP_SIZE 0.10 942 970 /****************************************************************************** 943 This routine takes as input an arbitrary function of a single parameter.944 This function produces as output a bracket [a, b, c] such that f(b) is945 less than f(a) and f(b).971 This routine takes as input an arbitrary function, and the parameter to 972 vary. This function produces as output a bracket [a, b, c] such that 973 f(b) is less than f(a) and f(b). 946 974 947 975 Algorithm: XXX completely ad hoc: start with the user-supplied starting … … 950 978 found. 951 979 *****************************************************************************/ 952 psVector *p_psDetermineBracket(psVector *params, 953 const psArray *coords, 954 psMinimizePowellFunc func) 980 psVector *p_psDetermineBracketOld(psVector *params, 981 int dim, 982 const psArray *coords, 983 psMinimizePowellFunc func) 955 984 { 956 985 float a = 0.0; … … 966 995 float new_cDir = 0.0; 967 996 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 968 psVector *dummyParams = psVectorAlloc(1, PS_TYPE_F32); 969 997 float stepSize = params->data.F32[dim] * STEP_SIZE; 998 // float initialParam = params->data.F32[dim]; 999 1000 if (stepSize == 0.0) { 1001 stepSize = 1.0; 1002 } 970 1003 a = b = c = params->data.F32[0]; 971 a = a * (1.0 - STEP_SIZE);972 c = c * (1.0 + STEP_SIZE);973 974 dummyParams->data.F32[0] = a;975 fa = func( dummyParams, coords);976 dummyParams->data.F32[0] = b;977 fb = func( dummyParams, coords);978 dummyParams->data.F32[0] = c;979 fc = func( dummyParams, coords);1004 a-= stepSize; 1005 c+= stepSize; 1006 1007 params->data.F32[dim] = a; 1008 fa = func(params, coords); 1009 params->data.F32[dim] = b; 1010 fb = func(params, coords); 1011 params->data.F32[dim] = c; 1012 fc = func(params, coords); 980 1013 if (fa < fb) { 981 1014 aDir = -1; … … 997 1030 return(bracket); 998 1031 } 999 a = a * (1.0 - STEP_SIZE); 1000 c = c * (1.0 + STEP_SIZE); 1001 dummyParams->data.F32[0] = a; 1002 fa = func(dummyParams, coords); 1003 dummyParams->data.F32[0] = c; 1004 fc = func(dummyParams, coords); 1032 stepSize*= (1.0 + stepSize); 1033 a = a - stepSize; 1034 c = c + stepSize; 1035 1036 params->data.F32[dim] = a; 1037 fa = func(params, coords); 1038 params->data.F32[dim] = c; 1039 fc = func(params, coords); 1040 1041 //printf("HMMM(%d): (%f %f %f) (%f %f %f)\n", iter, a, b, c, fa, fb, fc); 1005 1042 1006 1043 if (fa < fb) { … … 1017 1054 if ((new_aDir == 1) && (aDir == -1)) { 1018 1055 bracket->data.F32[0] = a; 1019 bracket->data.F32[1] = b racket->data.F32[0] / (1.0 - STEP_SIZE);1020 bracket->data.F32[2] = bracket->data.F32[1] / (1.0 - STEP_SIZE);1056 bracket->data.F32[1] = b; 1057 bracket->data.F32[2] = c; 1021 1058 return(bracket); 1022 1059 } 1023 1060 1024 1061 if ((new_cDir == 1) && (cDir == -1)) { 1062 bracket->data.F32[0] = a; 1063 bracket->data.F32[1] = b; 1025 1064 bracket->data.F32[2] = c; 1026 bracket->data.F32[1] = bracket->data.F32[0] / (1.0 + STEP_SIZE);1027 bracket->data.F32[0] = bracket->data.F32[1] / (1.0 + STEP_SIZE);1028 1065 return(bracket); 1029 1066 } 1030 1067 aDir = new_aDir; 1031 1068 cDir = new_cDir; 1032 }1033 psFree(dummyParams);1069 iter--; 1070 } 1034 1071 psFree(bracket); 1035 1072 return(NULL); 1036 1073 } 1037 1074 1038 1039 1040 1075 /****************************************************************************** 1041 This routine must minimize a function of exactly one parameter. 1076 This routine takes as input an arbitrary function, and the parameter to 1077 vary, and the line along which it must vary. This function produces as 1078 output a bracket [a, b, c] such that 1079 f(param + b * line) is less than f(param + a * line) and 1080 f(param + c * line). 1081 1082 Algorithm: XXX completely ad hoc: start with the user-supplied starting 1083 parameter and call that b. Calculate a/c as a fractional amount 1084 smaller/larger than b. Repeat this process until a local minimum is 1085 found. 1086 *****************************************************************************/ 1087 psVector *p_psDetermineBracket(psVector *params, 1088 psVector *line, 1089 const psVector *paramMask, 1090 const psArray *coords, 1091 psMinimizePowellFunc func) 1092 { 1093 float a = 0.0; 1094 float b = 0.0; 1095 float c = 0.0; 1096 float fa = 0.0; 1097 float fb = 0.0; 1098 float fc = 0.0; 1099 int iter = 100; 1100 float aDir = 0.0; 1101 float cDir = 0.0; 1102 float new_aDir = 0.0; 1103 float new_cDir = 0.0; 1104 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 1105 float stepSize = STEP_SIZE; 1106 psVector *tmp = NULL; 1107 int i = 0; 1108 int null = 0; 1109 1110 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1111 "---- p_psDetermineBracket() begin ----\n"); 1112 1113 for (i=0;i<params->n;i++) { 1114 if (paramMask->data.U8[i] == 0) { 1115 if (line->data.F32[i] >= FLT_EPSILON) { 1116 null = 1; 1117 } 1118 } 1119 } 1120 if (null == 0) { 1121 psTrace(".psLib.dataManip.p_psDetermineBracket", 2, 1122 "p_psDetermineBracket() called with zero line vector.\n"); 1123 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1124 "---- p_psDetermineBracket() end (NULL) ----\n"); 1125 return(NULL); 1126 } 1127 1128 tmp = psVectorAlloc(params->n, PS_TYPE_F32); 1129 1130 b = 0; 1131 a = -stepSize; 1132 c = stepSize; 1133 1134 for (i=0;i<params->n;i++) { 1135 if (paramMask->data.U8[i] == 0) { 1136 tmp->data.F32[i] = params->data.F32[i] + (a * line->data.F32[i]); 1137 } else { 1138 tmp->data.F32[i] = params->data.F32[i]; 1139 } 1140 } 1141 fa = func(tmp, coords); 1142 1143 for (i=0;i<params->n;i++) { 1144 if (paramMask->data.U8[i] == 0) { 1145 tmp->data.F32[i] = params->data.F32[i] + (b * line->data.F32[i]); 1146 } else { 1147 tmp->data.F32[i] = params->data.F32[i]; 1148 } 1149 } 1150 fb = func(tmp, coords); 1151 1152 for (i=0;i<params->n;i++) { 1153 if (paramMask->data.U8[i] == 0) { 1154 tmp->data.F32[i] = params->data.F32[i] + (c * line->data.F32[i]); 1155 } else { 1156 tmp->data.F32[i] = params->data.F32[i]; 1157 } 1158 } 1159 fc = func(tmp, coords); 1160 1161 if (fa < fb) { 1162 aDir = -1; 1163 } else { 1164 aDir = 1; 1165 } 1166 1167 if (fc < fb) { 1168 cDir = -1; 1169 } else { 1170 cDir = 1; 1171 } 1172 1173 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1174 "HMMM(%d): (%f %f %f) (%f %f %f)\n", iter, a, b, c, fa, fb, fc); 1175 while (iter > 0) { 1176 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1177 "psDetermineBracket(): iteration %d\n", iter); 1178 if ((b < a) && (b < c)) { 1179 bracket->data.F32[0] = a; 1180 bracket->data.F32[1] = b; 1181 bracket->data.F32[2] = c; 1182 psFree(tmp); 1183 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1184 "---- p_psDetermineBracket() end ----\n"); 1185 return(bracket); 1186 } 1187 stepSize*= (1.0 + stepSize); 1188 a =- stepSize; 1189 c =+ stepSize; 1190 1191 for (i=0;i<params->n;i++) { 1192 if (paramMask->data.U8[i] == 0) { 1193 tmp->data.F32[i] = params->data.F32[i] + (a * line->data.F32[i]); 1194 } else { 1195 tmp->data.F32[i] = params->data.F32[i]; 1196 } 1197 } 1198 fa = func(tmp, coords); 1199 1200 for (i=0;i<params->n;i++) { 1201 if (paramMask->data.U8[i] == 0) { 1202 tmp->data.F32[i] = params->data.F32[i] + (c * line->data.F32[i]); 1203 } else { 1204 tmp->data.F32[i] = params->data.F32[i]; 1205 } 1206 } 1207 fc = func(tmp, coords); 1208 1209 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1210 "HMMM(%d): (%f %f %f) (%f %f %f)\n", iter, a, b, c, fa, fb, fc); 1211 1212 if (fa < fb) { 1213 new_aDir = -1; 1214 } else { 1215 new_aDir = 1; 1216 } 1217 1218 if (fc < fb) { 1219 new_cDir = -1; 1220 } else { 1221 new_cDir = 1; 1222 } 1223 if ((new_aDir == 1) && (aDir == -1)) { 1224 bracket->data.F32[0] = a; 1225 bracket->data.F32[1] = b; 1226 bracket->data.F32[2] = c; 1227 psFree(tmp); 1228 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1229 "---- p_psDetermineBracket() end ----\n"); 1230 return(bracket); 1231 } 1232 1233 if ((new_cDir == 1) && (cDir == -1)) { 1234 bracket->data.F32[0] = a; 1235 bracket->data.F32[1] = b; 1236 bracket->data.F32[2] = c; 1237 psFree(tmp); 1238 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1239 "---- p_psDetermineBracket() end ----\n"); 1240 return(bracket); 1241 } 1242 aDir = new_aDir; 1243 cDir = new_cDir; 1244 iter--; 1245 } 1246 psFree(tmp); 1247 psFree(bracket); 1248 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1249 "---- p_psDetermineBracket() end (NULL) ----\n"); 1250 return(NULL); 1251 } 1252 1253 bool p_psDummyFunc(int dimNum, 1254 psVector *params, 1255 const psArray *coords, 1256 psMinimizePowellFunc func) 1257 { 1258 return(true); 1259 } 1260 1261 1262 /****************************************************************************** 1263 This routine must minimize a possibly multi-dimensional function 1264 (several parameters) along a single dimension. 1042 1265 *****************************************************************************/ 1043 1266 bool psMinimize1DFunc(psMinimization *min, 1044 1267 psVector *params, 1268 int dim, 1045 1269 const psArray *coords, 1046 1270 psMinimizePowellFunc func) 1047 1271 { 1048 1272 psVector *bracket; 1049 psVector *dummyParams = psVectorAlloc(1, PS_TYPE_F32);1050 1273 float a = 0.0; 1051 1274 float b = 0.0; 1052 1275 float c = 0.0; 1053 1276 float n = 0.0; 1277 float fa = 0.0; 1054 1278 float fb = 0.0; 1279 float fc = 0.0; 1055 1280 float fn = 0.0; 1056 1057 if (params->n != 1) { 1058 psAbort(__func__, "params is larger than a single dimension.");1059 }1060 bracket = p_psDetermineBracket(params, coords, func);1061 1281 // float initialParam = params->data.F32[dim]; 1282 1283 bracket = p_psDetermineBracketOld(params, dim, coords, func); 1284 if (bracket == NULL) { 1285 psAbort(__func__, "Could not bracket minimum."); 1286 } 1062 1287 1063 1288 min->iter = 0; 1064 while ( 1) {1289 while (min->iter < min->maxIter) { 1065 1290 min->iter++; 1066 1291 //printf("psMinimize1DFunc(): iteration %d\n", min->iter); 1067 1292 a = bracket->data.F32[0]; 1068 1293 b = bracket->data.F32[1]; 1069 1294 c = bracket->data.F32[2]; 1070 dummyParams->data.F32[0] = b; 1071 fb = func(dummyParams, coords); 1295 1296 params->data.F32[dim] = a; 1297 fa = func(params, coords); 1298 params->data.F32[dim] = b; 1299 fb = func(params, coords); 1300 params->data.F32[dim] = c; 1301 fc = func(params, coords); 1302 //printf("Iteration %d: f(%f %f %f) is (%f %f %f)\n", min->iter, a, b, c, fa, fb, fc); 1072 1303 1073 1304 // We determine which is the biggest segment in [a,b,c] then split … … 1075 1306 if ((b-a) > (c-b)) { 1076 1307 // This is the golden section formula 1077 dummyParams->data.F32[0] = n = a + (0.69 * (b-a));1078 fn = func( dummyParams, coords);1308 params->data.F32[dim] = n = a + (0.69 * (b-a)); 1309 fn = func(params, coords); 1079 1310 if (fn > fb) { 1080 1311 // a = n, b = b, c = c … … 1086 1317 } 1087 1318 } else { 1088 dummyParams->data.F32[0]= b + (0.69 * (c-b));1089 fn = func( dummyParams, coords);1319 params->data.F32[dim] = n = b + (0.69 * (c-b)); 1320 fn = func(params, coords); 1090 1321 if (fn > fb) { 1091 1322 // a = a, b = b, c = n … … 1097 1328 } 1098 1329 } 1099 } 1100 1101 psFree(dummyParams); 1102 } 1103 1330 1331 if ((fabs(a-b) < min->tol) && 1332 (fabs(b-c) < min->tol)) { 1333 // psFree(bracket); 1334 // XXX: is this line correct? 1335 params->data.F32[dim] = bracket->data.F32[1]; 1336 min->value = func(params, coords); 1337 return(true); 1338 } 1339 } 1340 1341 // psFree(bracket); 1342 return(false); 1343 } 1344 1345 /****************************************************************************** 1346 This routine must minimize a possibly multi-dimensional function 1347 along a vector defined by line. 1348 *****************************************************************************/ 1349 float psLineMin(psMinimization *min, 1350 psVector *params, 1351 psVector *line, 1352 const psVector *paramMask, 1353 const psArray *coords, 1354 psMinimizePowellFunc func) 1355 { 1356 psVector *bracket; 1357 float a = 0.0; 1358 float b = 0.0; 1359 float c = 0.0; 1360 float n = 0.0; 1361 float fa = 0.0; 1362 float fb = 0.0; 1363 float fc = 0.0; 1364 float fn = 0.0; 1365 float mul = 0.0; 1366 psVector *tmpa = NULL; 1367 psVector *tmpb = NULL; 1368 psVector *tmpc = NULL; 1369 psVector *tmpn = NULL; 1370 int i = 0; 1371 int null = 0; 1372 1373 psTrace(".psLib.dataManip.psLineMin", 4, 1374 "---- psLineMin() begin ----\n"); 1375 1376 for (i=0;i<params->n;i++) { 1377 if (paramMask->data.U8[i] == 0) { 1378 if (line->data.F32[i] >= FLT_EPSILON) { 1379 null = 1; 1380 psTrace(".psLib.dataManip.psLineMin", 4, 1381 "line->data.F32[%d] is %f\n", i, line->data.F32[i]); 1382 } 1383 } 1384 } 1385 if (null == 0) { 1386 psTrace(".psLib.dataManip.psLineMin", 2, 1387 "psLineMin() called with zero line vector.\n"); 1388 return(0.0); 1389 } 1390 1391 tmpa = psVectorAlloc(params->n, PS_TYPE_F32); 1392 tmpb = psVectorAlloc(params->n, PS_TYPE_F32); 1393 tmpc = psVectorAlloc(params->n, PS_TYPE_F32); 1394 tmpn = psVectorAlloc(params->n, PS_TYPE_F32); 1395 1396 1397 for (i=0;i<params->n;i++) { 1398 psTrace(".psLib.dataManip.psLineMin", 6, 1399 "params, paramMask, line [%d] is (%f %d %f)\n", i, 1400 params->data.F32[i], 1401 paramMask->data.U8[i], 1402 line->data.F32[i]); 1403 } 1404 1405 bracket = p_psDetermineBracket(params, line, paramMask, coords, func); 1406 if (bracket == NULL) { 1407 psAbort(__func__, "(1) Could not bracket minimum."); 1408 } 1409 1410 min->iter = 0; 1411 while (min->iter < min->maxIter) { 1412 min->iter++; 1413 psTrace(".psLib.dataManip.psLineMin", 6, 1414 "psLineMin(): iteration %d\n", min->iter); 1415 1416 a = bracket->data.F32[0]; 1417 b = bracket->data.F32[1]; 1418 c = bracket->data.F32[2]; 1419 1420 for (i=0;i<params->n;i++) { 1421 if (paramMask->data.U8[i] == 0) { 1422 tmpa->data.F32[i] = params->data.F32[i] + (a * line->data.F32[i]); 1423 tmpb->data.F32[i] = params->data.F32[i] + (b * line->data.F32[i]); 1424 tmpc->data.F32[i] = params->data.F32[i] + (c * line->data.F32[i]); 1425 } else { 1426 tmpa->data.F32[i] = params->data.F32[i]; 1427 tmpb->data.F32[i] = params->data.F32[i]; 1428 tmpc->data.F32[i] = params->data.F32[i]; 1429 } 1430 } 1431 fa = func(tmpa, coords); 1432 fb = func(tmpb, coords); 1433 fc = func(tmpc, coords); 1434 psTrace(".psLib.dataManip.psLineMin", 6, 1435 "Iteration %d: f(%f %f %f) is (%f %f %f)\n", min->iter, a, b, c, fa, fb, fc); 1436 1437 // We determine which is the biggest segment in [a,b,c] then split 1438 // that with the point n. 1439 if ((b-a) > (c-b)) { 1440 // This is the golden section formula 1441 n = a + (0.69 * (b-a)); 1442 for (i=0;i<params->n;i++) { 1443 tmpn->data.F32[i] = params->data.F32[i] + (n * line->data.F32[i]); 1444 } 1445 fn = func(tmpn, coords); 1446 1447 if (fn > fb) { 1448 // a = n, b = b, c = c 1449 bracket->data.F32[0] = n; 1450 } else { 1451 // a = a, b = n, c = b 1452 bracket->data.F32[1] = n; 1453 bracket->data.F32[2] = b; 1454 } 1455 } else { 1456 n = b + (0.69 * (c-b)); 1457 for (i=0;i<params->n;i++) { 1458 tmpn->data.F32[i] = params->data.F32[i] + (n * line->data.F32[i]); 1459 } 1460 fn = func(tmpn, coords); 1461 1462 if (fn > fb) { 1463 // a = a, b = b, c = n 1464 bracket->data.F32[2] = n; 1465 } else { 1466 // a = b, b = n, c = c 1467 bracket->data.F32[0] = b; 1468 bracket->data.F32[1] = n; 1469 } 1470 } 1471 psTrace(".psLib.dataManip.psLineMin", 6, 1472 "Iteration %d: new bracket is (%f %f %f)\n", min->iter, bracket->data.F32[0], bracket->data.F32[1], bracket->data.F32[2]); 1473 1474 mul = bracket->data.F32[1]; 1475 if ((fabs(a-b) < min->tol) && 1476 (fabs(b-c) < min->tol)) { 1477 for (i=0;i<params->n;i++) { 1478 if (paramMask->data.U8[i] == 0) { 1479 params->data.F32[i]+= mul * line->data.F32[i]; 1480 } 1481 } 1482 min->value = func(params, coords); 1483 psFree(bracket); 1484 psFree(tmpa); 1485 psFree(tmpb); 1486 psFree(tmpc); 1487 psFree(tmpn); 1488 psTrace(".psLib.dataManip.psLineMin", 4, 1489 "---- psLineMin() end (%f) ----\n", mul); 1490 return(mul); 1491 } 1492 } 1493 1494 psFree(bracket); 1495 psFree(tmpa); 1496 psFree(tmpb); 1497 psFree(tmpc); 1498 psFree(tmpn); 1499 1500 psTrace(".psLib.dataManip.psLineMin", 4, 1501 "---- psLineMin() end (0.0) ----\n"); 1502 return(0.0); 1503 } 1504 1505 1506 /****************************************************************************** 1507 This routine must minimize a possibly multi-dimensional function. 1508 *****************************************************************************/ 1104 1509 bool psMinimizePowell(psMinimization *min, 1105 1510 psVector *params, … … 1108 1513 psMinimizePowellFunc func) 1109 1514 { 1110 1111 1112 1113 1114 1115 1116 1117 1118 return(true); 1119 } 1515 int numDims = params->n; 1516 int i = 0; 1517 int j = 0; 1518 psVector **v = NULL; 1519 psVector *pQP = NULL; 1520 psVector *Q = NULL; 1521 psVector *u = NULL; 1522 psMinimization dummyMin; 1523 float mul = 0.0; 1524 float baseFuncVal = 0.0; 1525 float currFuncVal = 0.0; 1526 int biggestIter = 0; 1527 float biggestDiff = 0.0; 1528 float term1 = 0.0; 1529 float term2 = 0.0; 1530 float fqp = 0.0; 1531 float diff = 0.0; 1532 1533 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1534 "---- psMinimizePowell() begin ----\n"); 1535 1536 pQP = psVectorAlloc(numDims, PS_TYPE_F32); 1537 u = psVectorAlloc(numDims, PS_TYPE_F32); 1538 Q = psVectorAlloc(numDims, PS_TYPE_F32); 1539 1540 // 1: Set v[i] to be the unit vectors for each dimension in params 1541 v = (psVector **) psAlloc(params->n * sizeof(psVector **)); 1542 for (i=0;i<numDims;i++) { 1543 v[i] = psVectorAlloc(numDims, PS_TYPE_F32); 1544 for (j=0;j<numDims;j++) { 1545 if (i == j) { 1546 v[i]->data.F32[j] = 1.0; 1547 } else { 1548 v[i]->data.F32[j] = 0.0; 1549 } 1550 } 1551 } 1552 1553 // 2: Set Q to be the initial params (P in the ADD) 1554 for (i=0;i<numDims;i++) { 1555 if (paramMask->data.U8[i] == 0) { 1556 Q->data.F32[i] = params->data.F32[i]; 1557 } 1558 } 1559 1560 min->iter = 0; 1561 while (min->iter < min->maxIter) { 1562 min->iter++; 1563 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1564 "psMinimizePowell() iteration %d\n", min->iter); 1565 1566 // 3: For each dimension in params, move Q only in the vector v[i] to 1567 // minimize the function. 1568 1569 baseFuncVal = func(Q, coords); 1570 currFuncVal = baseFuncVal; 1571 diff = 0.0; 1572 biggestDiff = 0; 1573 biggestIter = 0; 1574 for (i=0;i<numDims;i++) { 1575 if (paramMask->data.U8[i] == 0) { 1576 mul = psLineMin(&dummyMin, Q, v[i], paramMask, coords, func); 1577 if (fabs(dummyMin.value - currFuncVal) > biggestDiff) { 1578 biggestDiff = fabs(dummyMin.value - currFuncVal); 1579 biggestIter = i; 1580 } 1581 currFuncVal = dummyMin.value; 1582 } 1583 } 1584 1585 // 4: Set the vector u = Q - P 1586 for (i=0;i<numDims;i++) { 1587 if (paramMask->data.U8[i] == 0) { 1588 u->data.F32[i] = Q->data.F32[i] - params->data.F32[i]; 1589 1590 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1591 "WOW (%f %f %f)\n", u->data.F32[i], Q->data.F32[i], params->data.F32[i]); 1592 1593 } else { 1594 u->data.F32[i] = 0.0; 1595 } 1596 } 1597 1598 // 5: Move Q only in the direction u, and minimize the function. 1599 psTrace(".psLib.dataManip.psMinimizePowell", 6, "HERE 01\n"); 1600 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1601 "u[0] is %f\n", u->data.F32[0]); 1602 1603 mul = psLineMin(min, params, u, paramMask, coords, func); 1604 1605 // 6: 1606 if (min->value > currFuncVal) { 1607 for (i=0;i<numDims;i++) { 1608 psFree(v[i]); 1609 } 1610 psFree(v); 1611 psFree(u); 1612 psFree(pQP); 1613 psFree(Q); 1614 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1615 "---- psMinimizePowell() end (true) ----\n"); 1616 return(true); 1617 } 1618 1619 for (i=0;i<numDims;i++) { 1620 if (paramMask->data.U8[i] == 0) { 1621 pQP->data.F32[i] = (2 * Q->data.F32[i]) - params->data.F32[i]; 1622 } else { 1623 pQP->data.F32[i] = params->data.F32[i]; 1624 } 1625 } 1626 fqp = func(pQP, coords); 1627 1628 term1 = (baseFuncVal - currFuncVal) - biggestDiff; 1629 term1*= term1; 1630 term1*= 2.0 * (baseFuncVal - (2.0 * currFuncVal) + fqp); 1631 term2 = baseFuncVal - fqp; 1632 term2*= term2 * biggestDiff; 1633 if (term1 < term2) { 1634 for (i=0;i<numDims;i++) { 1635 if (paramMask->data.U8[i] == 0) { 1636 v[biggestIter]->data.F32[i] = u->data.F32[i]; 1637 } 1638 } 1639 } 1640 1641 // 7: Set P to Q 1642 for (i=0;i<numDims;i++) { 1643 if (paramMask->data.U8[i] == 0) { 1644 params->data.F32[i] = Q->data.F32[i]; 1645 } 1646 } 1647 1648 // 8: Go to step 3 until the change is less than some tolerance. 1649 if (fabs(baseFuncVal - currFuncVal) <= min->tol) { 1650 for (i=0;i<numDims;i++) { 1651 psFree(v[i]); 1652 } 1653 psFree(v); 1654 psFree(u); 1655 psFree(pQP); 1656 psFree(Q); 1657 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1658 "---- psMinimizePowell() end (true) ----\n"); 1659 return(true); 1660 } 1661 } 1662 1663 for (i=0;i<numDims;i++) { 1664 psFree(v[i]); 1665 } 1666 psFree(v); 1667 psFree(u); 1668 psFree(pQP); 1669 psFree(Q); 1670 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1671 "---- psMinimizePowell() end (false) ----\n"); 1672 return(false); 1673 } -
trunk/psLib/src/dataManip/psMinimize.h
r1629 r1719 105 105 typedef struct 106 106 { 107 constint maxIter; ///< Convergence limit108 const float tol;///< Error Tolerance107 int maxIter; ///< Convergence limit 108 float tol; ///< Error Tolerance 109 109 float value; ///< Value of function at minimum 110 110 int iter; ///< Number of iterations required … … 138 138 bool psMinimize1DFunc(psMinimization *min, 139 139 psVector *params, 140 int dim, 140 141 const psArray *coords, 141 142 psMinimizePowellFunc func); 143 144 float psLineMin(psMinimization *min, 145 psVector *params, 146 psVector *line, 147 const psVector *paramMask, 148 const psArray *coords, 149 psMinimizePowellFunc func); 142 150 143 151 -
trunk/psLib/src/image/psImageStats.c
r1448 r1719 10 10 * @author George Gusciora, MHPCC 11 11 * 12 * @version $Revision: 1.3 3$ $Name: not supported by cvs2svn $13 * @date $Date: 2004-0 8-10 01:55:34$12 * @version $Revision: 1.34 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2004-09-08 06:02:47 $ 14 14 * 15 15 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 185 185 psPolynomial1D* *p_psCreateChebyshevPolys(int maxChebyPoly) 186 186 { 187 psPolynomial1D **chebPolys = NULL;187 psPolynomial1D **chebPolys = NULL; 188 188 int i = 0; 189 189 int j = 0; 190 190 191 chebPolys = (psPolynomial1D * *) psAlloc(maxChebyPoly * sizeof(psPolynomial1D*));191 chebPolys = (psPolynomial1D **) psAlloc(maxChebyPoly * sizeof(psPolynomial1D *)); 192 192 for (i = 0; i < maxChebyPoly; i++) { 193 chebPolys[i] = psPolynomial1DAlloc(i + 1 );193 chebPolys[i] = psPolynomial1DAlloc(i + 1, PS_POLYNOMIAL_ORD); 194 194 } 195 195 … … 333 333 int i = 0; 334 334 int j = 0; 335 float **sums = NULL;335 // float **sums = NULL; 336 336 psPolynomial1D* *chebPolys = NULL; 337 337 int maxChebyPoly = 0; … … 340 340 float polySum = 0.0; 341 341 342 // Create the sums[][] data structure. This 343 // will hold the LHS of 344 // equation 345 // 29 in the ADD: sums[k][l] = SUM { 346 // image(x,y) * Tk(x) * Tl(y) } 347 sums = (float **)psAlloc(coeffs->nX * sizeof(float *)); 348 for (i = 0; i < coeffs->nX; i++) { 349 sums[i] = (float *)psAlloc(coeffs->nY * sizeof(float)); 350 } 351 for (i = 0; i < coeffs->nX; i++) { 352 for (j = 0; j < coeffs->nY; j++) { 353 sums[i][j] = 0.0; 354 } 355 } 342 // Create the sums[][] data structure. This will hold the LHS of 343 // equation 29 in the ADD: 344 // sums[k][l] = SUM { image(x,y) * Tk(x) * Tl(y) } 345 // 346 // sums = (float **)psAlloc(coeffs->nX * sizeof(float *)); 347 // for (i = 0; i < coeffs->nX; i++) { 348 // sums[i] = (float *)psAlloc(coeffs->nY * sizeof(float)); 349 // } 350 // for (i = 0; i < coeffs->nX; i++) { 351 // for (j = 0; j < coeffs->nY; j++) { 352 // sums[i][j] = 0.0; 353 // } 354 // } 356 355 357 356 // We scale the pixel positions to values … … 375 374 for (j = 0; j < coeffs->nY; j++) { 376 375 polySum += 377 psPolynomial1DEval 378 (rScalingFactors[x], 379 chebPolys[i]) * 380 psPolynomial1DEval(cScalingFactors[y], chebPolys[j]) * coeffs->coeff[i][j]; 376 psPolynomial1DEval(rScalingFactors[x], chebPolys[i]) * 377 psPolynomial1DEval(cScalingFactors[y], chebPolys[j]) * 378 coeffs->coeff[i][j]; 381 379 382 380 } … … 394 392 395 393 // Free some data 396 for (i = 0; i < coeffs->nX; i++) {397 psFree(sums[i]);398 }399 psFree(sums);394 // for (i = 0; i < coeffs->nX; i++) { 395 // psFree(sums[i]); 396 // } 397 // psFree(sums); 400 398 psFree(cScalingFactors); 401 399 psFree(rScalingFactors); -
trunk/psLib/src/imageops/psImageStats.c
r1448 r1719 10 10 * @author George Gusciora, MHPCC 11 11 * 12 * @version $Revision: 1.3 3$ $Name: not supported by cvs2svn $13 * @date $Date: 2004-0 8-10 01:55:34$12 * @version $Revision: 1.34 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2004-09-08 06:02:47 $ 14 14 * 15 15 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 185 185 psPolynomial1D* *p_psCreateChebyshevPolys(int maxChebyPoly) 186 186 { 187 psPolynomial1D **chebPolys = NULL;187 psPolynomial1D **chebPolys = NULL; 188 188 int i = 0; 189 189 int j = 0; 190 190 191 chebPolys = (psPolynomial1D * *) psAlloc(maxChebyPoly * sizeof(psPolynomial1D*));191 chebPolys = (psPolynomial1D **) psAlloc(maxChebyPoly * sizeof(psPolynomial1D *)); 192 192 for (i = 0; i < maxChebyPoly; i++) { 193 chebPolys[i] = psPolynomial1DAlloc(i + 1 );193 chebPolys[i] = psPolynomial1DAlloc(i + 1, PS_POLYNOMIAL_ORD); 194 194 } 195 195 … … 333 333 int i = 0; 334 334 int j = 0; 335 float **sums = NULL;335 // float **sums = NULL; 336 336 psPolynomial1D* *chebPolys = NULL; 337 337 int maxChebyPoly = 0; … … 340 340 float polySum = 0.0; 341 341 342 // Create the sums[][] data structure. This 343 // will hold the LHS of 344 // equation 345 // 29 in the ADD: sums[k][l] = SUM { 346 // image(x,y) * Tk(x) * Tl(y) } 347 sums = (float **)psAlloc(coeffs->nX * sizeof(float *)); 348 for (i = 0; i < coeffs->nX; i++) { 349 sums[i] = (float *)psAlloc(coeffs->nY * sizeof(float)); 350 } 351 for (i = 0; i < coeffs->nX; i++) { 352 for (j = 0; j < coeffs->nY; j++) { 353 sums[i][j] = 0.0; 354 } 355 } 342 // Create the sums[][] data structure. This will hold the LHS of 343 // equation 29 in the ADD: 344 // sums[k][l] = SUM { image(x,y) * Tk(x) * Tl(y) } 345 // 346 // sums = (float **)psAlloc(coeffs->nX * sizeof(float *)); 347 // for (i = 0; i < coeffs->nX; i++) { 348 // sums[i] = (float *)psAlloc(coeffs->nY * sizeof(float)); 349 // } 350 // for (i = 0; i < coeffs->nX; i++) { 351 // for (j = 0; j < coeffs->nY; j++) { 352 // sums[i][j] = 0.0; 353 // } 354 // } 356 355 357 356 // We scale the pixel positions to values … … 375 374 for (j = 0; j < coeffs->nY; j++) { 376 375 polySum += 377 psPolynomial1DEval 378 (rScalingFactors[x], 379 chebPolys[i]) * 380 psPolynomial1DEval(cScalingFactors[y], chebPolys[j]) * coeffs->coeff[i][j]; 376 psPolynomial1DEval(rScalingFactors[x], chebPolys[i]) * 377 psPolynomial1DEval(cScalingFactors[y], chebPolys[j]) * 378 coeffs->coeff[i][j]; 381 379 382 380 } … … 394 392 395 393 // Free some data 396 for (i = 0; i < coeffs->nX; i++) {397 psFree(sums[i]);398 }399 psFree(sums);394 // for (i = 0; i < coeffs->nX; i++) { 395 // psFree(sums[i]); 396 // } 397 // psFree(sums); 400 398 psFree(cScalingFactors); 401 399 psFree(rScalingFactors); -
trunk/psLib/src/math/psMinimize.c
r1629 r1719 9 9 * @author George Gusciora, MHPCC 10 10 * 11 * @version $Revision: 1.3 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-0 8-26 20:10:25$11 * @version $Revision: 1.34 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-09-08 06:02:23 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 43 43 #include "psMinimize.h" 44 44 #include "psMatrix.h" 45 #include "psTrace.h" 45 46 46 47 /*****************************************************************************/ … … 569 570 gsl_vector *x; 570 571 572 psTrace(".psLib.dataManip.psMinimize", 4, 573 "---- psMinimize() begin ----\n"); 574 571 575 PS_CHECK_NULL_VECTOR(initialGuess); 572 576 PS_CHECK_EMPTY_VECTOR(initialGuess); … … 655 659 } 656 660 } 661 psTrace(".psLib.dataManip.psMinimize", 4, 662 "---- psMinimize() end ----\n"); 657 663 return (initialGuess); 658 664 } … … 691 697 float chiSqOld = 0.0; 692 698 699 psTrace(".psLib.dataManip.psMinimizeChi2", 4, 700 "---- psMinimizeChi2() begin ----\n"); 701 693 702 PS_CHECK_NULL_IMAGE(domain); 694 703 PS_CHECK_EMPTY_IMAGE(domain); … … 837 846 838 847 // Bye bye. 848 psTrace(".psLib.dataManip.psMinimizeChi2", 4, 849 "---- psMinimizeChi2() end ----\n"); 839 850 return (initialGuess); 840 851 } … … 863 874 psVector* xSums = NULL; 864 875 876 psTrace(".psLib.dataManip.psVectorFitPolynomial1D", 4, 877 "---- psVectorFitPolynomial1D() begin ----\n"); 865 878 // printf("psVectorFitPolynomial1D()\n"); 866 879 // for (i=0;i<x->n;i++) { … … 936 949 psFree(xSums); 937 950 951 psTrace(".psLib.dataManip.psVectorFitPolynomial1D", 4, 952 "---- psVectorFitPolynomial1D() begin ----\n"); 938 953 return (myPoly); 954 } 955 956 psMinimization *psMinimizationAlloc(int maxIter, 957 float tol) 958 { 959 psMinimization *min = psAlloc(sizeof(psMinimization)); 960 min->maxIter = maxIter; 961 min->tol = tol; 962 min->value = 0.0; 963 min->iter = 0; 964 min->lastDelta = 0.0; 965 966 return(min); 939 967 } 940 968 941 969 #define STEP_SIZE 0.10 942 970 /****************************************************************************** 943 This routine takes as input an arbitrary function of a single parameter.944 This function produces as output a bracket [a, b, c] such that f(b) is945 less than f(a) and f(b).971 This routine takes as input an arbitrary function, and the parameter to 972 vary. This function produces as output a bracket [a, b, c] such that 973 f(b) is less than f(a) and f(b). 946 974 947 975 Algorithm: XXX completely ad hoc: start with the user-supplied starting … … 950 978 found. 951 979 *****************************************************************************/ 952 psVector *p_psDetermineBracket(psVector *params, 953 const psArray *coords, 954 psMinimizePowellFunc func) 980 psVector *p_psDetermineBracketOld(psVector *params, 981 int dim, 982 const psArray *coords, 983 psMinimizePowellFunc func) 955 984 { 956 985 float a = 0.0; … … 966 995 float new_cDir = 0.0; 967 996 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 968 psVector *dummyParams = psVectorAlloc(1, PS_TYPE_F32); 969 997 float stepSize = params->data.F32[dim] * STEP_SIZE; 998 // float initialParam = params->data.F32[dim]; 999 1000 if (stepSize == 0.0) { 1001 stepSize = 1.0; 1002 } 970 1003 a = b = c = params->data.F32[0]; 971 a = a * (1.0 - STEP_SIZE);972 c = c * (1.0 + STEP_SIZE);973 974 dummyParams->data.F32[0] = a;975 fa = func( dummyParams, coords);976 dummyParams->data.F32[0] = b;977 fb = func( dummyParams, coords);978 dummyParams->data.F32[0] = c;979 fc = func( dummyParams, coords);1004 a-= stepSize; 1005 c+= stepSize; 1006 1007 params->data.F32[dim] = a; 1008 fa = func(params, coords); 1009 params->data.F32[dim] = b; 1010 fb = func(params, coords); 1011 params->data.F32[dim] = c; 1012 fc = func(params, coords); 980 1013 if (fa < fb) { 981 1014 aDir = -1; … … 997 1030 return(bracket); 998 1031 } 999 a = a * (1.0 - STEP_SIZE); 1000 c = c * (1.0 + STEP_SIZE); 1001 dummyParams->data.F32[0] = a; 1002 fa = func(dummyParams, coords); 1003 dummyParams->data.F32[0] = c; 1004 fc = func(dummyParams, coords); 1032 stepSize*= (1.0 + stepSize); 1033 a = a - stepSize; 1034 c = c + stepSize; 1035 1036 params->data.F32[dim] = a; 1037 fa = func(params, coords); 1038 params->data.F32[dim] = c; 1039 fc = func(params, coords); 1040 1041 //printf("HMMM(%d): (%f %f %f) (%f %f %f)\n", iter, a, b, c, fa, fb, fc); 1005 1042 1006 1043 if (fa < fb) { … … 1017 1054 if ((new_aDir == 1) && (aDir == -1)) { 1018 1055 bracket->data.F32[0] = a; 1019 bracket->data.F32[1] = b racket->data.F32[0] / (1.0 - STEP_SIZE);1020 bracket->data.F32[2] = bracket->data.F32[1] / (1.0 - STEP_SIZE);1056 bracket->data.F32[1] = b; 1057 bracket->data.F32[2] = c; 1021 1058 return(bracket); 1022 1059 } 1023 1060 1024 1061 if ((new_cDir == 1) && (cDir == -1)) { 1062 bracket->data.F32[0] = a; 1063 bracket->data.F32[1] = b; 1025 1064 bracket->data.F32[2] = c; 1026 bracket->data.F32[1] = bracket->data.F32[0] / (1.0 + STEP_SIZE);1027 bracket->data.F32[0] = bracket->data.F32[1] / (1.0 + STEP_SIZE);1028 1065 return(bracket); 1029 1066 } 1030 1067 aDir = new_aDir; 1031 1068 cDir = new_cDir; 1032 }1033 psFree(dummyParams);1069 iter--; 1070 } 1034 1071 psFree(bracket); 1035 1072 return(NULL); 1036 1073 } 1037 1074 1038 1039 1040 1075 /****************************************************************************** 1041 This routine must minimize a function of exactly one parameter. 1076 This routine takes as input an arbitrary function, and the parameter to 1077 vary, and the line along which it must vary. This function produces as 1078 output a bracket [a, b, c] such that 1079 f(param + b * line) is less than f(param + a * line) and 1080 f(param + c * line). 1081 1082 Algorithm: XXX completely ad hoc: start with the user-supplied starting 1083 parameter and call that b. Calculate a/c as a fractional amount 1084 smaller/larger than b. Repeat this process until a local minimum is 1085 found. 1086 *****************************************************************************/ 1087 psVector *p_psDetermineBracket(psVector *params, 1088 psVector *line, 1089 const psVector *paramMask, 1090 const psArray *coords, 1091 psMinimizePowellFunc func) 1092 { 1093 float a = 0.0; 1094 float b = 0.0; 1095 float c = 0.0; 1096 float fa = 0.0; 1097 float fb = 0.0; 1098 float fc = 0.0; 1099 int iter = 100; 1100 float aDir = 0.0; 1101 float cDir = 0.0; 1102 float new_aDir = 0.0; 1103 float new_cDir = 0.0; 1104 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 1105 float stepSize = STEP_SIZE; 1106 psVector *tmp = NULL; 1107 int i = 0; 1108 int null = 0; 1109 1110 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1111 "---- p_psDetermineBracket() begin ----\n"); 1112 1113 for (i=0;i<params->n;i++) { 1114 if (paramMask->data.U8[i] == 0) { 1115 if (line->data.F32[i] >= FLT_EPSILON) { 1116 null = 1; 1117 } 1118 } 1119 } 1120 if (null == 0) { 1121 psTrace(".psLib.dataManip.p_psDetermineBracket", 2, 1122 "p_psDetermineBracket() called with zero line vector.\n"); 1123 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1124 "---- p_psDetermineBracket() end (NULL) ----\n"); 1125 return(NULL); 1126 } 1127 1128 tmp = psVectorAlloc(params->n, PS_TYPE_F32); 1129 1130 b = 0; 1131 a = -stepSize; 1132 c = stepSize; 1133 1134 for (i=0;i<params->n;i++) { 1135 if (paramMask->data.U8[i] == 0) { 1136 tmp->data.F32[i] = params->data.F32[i] + (a * line->data.F32[i]); 1137 } else { 1138 tmp->data.F32[i] = params->data.F32[i]; 1139 } 1140 } 1141 fa = func(tmp, coords); 1142 1143 for (i=0;i<params->n;i++) { 1144 if (paramMask->data.U8[i] == 0) { 1145 tmp->data.F32[i] = params->data.F32[i] + (b * line->data.F32[i]); 1146 } else { 1147 tmp->data.F32[i] = params->data.F32[i]; 1148 } 1149 } 1150 fb = func(tmp, coords); 1151 1152 for (i=0;i<params->n;i++) { 1153 if (paramMask->data.U8[i] == 0) { 1154 tmp->data.F32[i] = params->data.F32[i] + (c * line->data.F32[i]); 1155 } else { 1156 tmp->data.F32[i] = params->data.F32[i]; 1157 } 1158 } 1159 fc = func(tmp, coords); 1160 1161 if (fa < fb) { 1162 aDir = -1; 1163 } else { 1164 aDir = 1; 1165 } 1166 1167 if (fc < fb) { 1168 cDir = -1; 1169 } else { 1170 cDir = 1; 1171 } 1172 1173 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1174 "HMMM(%d): (%f %f %f) (%f %f %f)\n", iter, a, b, c, fa, fb, fc); 1175 while (iter > 0) { 1176 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1177 "psDetermineBracket(): iteration %d\n", iter); 1178 if ((b < a) && (b < c)) { 1179 bracket->data.F32[0] = a; 1180 bracket->data.F32[1] = b; 1181 bracket->data.F32[2] = c; 1182 psFree(tmp); 1183 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1184 "---- p_psDetermineBracket() end ----\n"); 1185 return(bracket); 1186 } 1187 stepSize*= (1.0 + stepSize); 1188 a =- stepSize; 1189 c =+ stepSize; 1190 1191 for (i=0;i<params->n;i++) { 1192 if (paramMask->data.U8[i] == 0) { 1193 tmp->data.F32[i] = params->data.F32[i] + (a * line->data.F32[i]); 1194 } else { 1195 tmp->data.F32[i] = params->data.F32[i]; 1196 } 1197 } 1198 fa = func(tmp, coords); 1199 1200 for (i=0;i<params->n;i++) { 1201 if (paramMask->data.U8[i] == 0) { 1202 tmp->data.F32[i] = params->data.F32[i] + (c * line->data.F32[i]); 1203 } else { 1204 tmp->data.F32[i] = params->data.F32[i]; 1205 } 1206 } 1207 fc = func(tmp, coords); 1208 1209 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1210 "HMMM(%d): (%f %f %f) (%f %f %f)\n", iter, a, b, c, fa, fb, fc); 1211 1212 if (fa < fb) { 1213 new_aDir = -1; 1214 } else { 1215 new_aDir = 1; 1216 } 1217 1218 if (fc < fb) { 1219 new_cDir = -1; 1220 } else { 1221 new_cDir = 1; 1222 } 1223 if ((new_aDir == 1) && (aDir == -1)) { 1224 bracket->data.F32[0] = a; 1225 bracket->data.F32[1] = b; 1226 bracket->data.F32[2] = c; 1227 psFree(tmp); 1228 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1229 "---- p_psDetermineBracket() end ----\n"); 1230 return(bracket); 1231 } 1232 1233 if ((new_cDir == 1) && (cDir == -1)) { 1234 bracket->data.F32[0] = a; 1235 bracket->data.F32[1] = b; 1236 bracket->data.F32[2] = c; 1237 psFree(tmp); 1238 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1239 "---- p_psDetermineBracket() end ----\n"); 1240 return(bracket); 1241 } 1242 aDir = new_aDir; 1243 cDir = new_cDir; 1244 iter--; 1245 } 1246 psFree(tmp); 1247 psFree(bracket); 1248 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1249 "---- p_psDetermineBracket() end (NULL) ----\n"); 1250 return(NULL); 1251 } 1252 1253 bool p_psDummyFunc(int dimNum, 1254 psVector *params, 1255 const psArray *coords, 1256 psMinimizePowellFunc func) 1257 { 1258 return(true); 1259 } 1260 1261 1262 /****************************************************************************** 1263 This routine must minimize a possibly multi-dimensional function 1264 (several parameters) along a single dimension. 1042 1265 *****************************************************************************/ 1043 1266 bool psMinimize1DFunc(psMinimization *min, 1044 1267 psVector *params, 1268 int dim, 1045 1269 const psArray *coords, 1046 1270 psMinimizePowellFunc func) 1047 1271 { 1048 1272 psVector *bracket; 1049 psVector *dummyParams = psVectorAlloc(1, PS_TYPE_F32);1050 1273 float a = 0.0; 1051 1274 float b = 0.0; 1052 1275 float c = 0.0; 1053 1276 float n = 0.0; 1277 float fa = 0.0; 1054 1278 float fb = 0.0; 1279 float fc = 0.0; 1055 1280 float fn = 0.0; 1056 1057 if (params->n != 1) { 1058 psAbort(__func__, "params is larger than a single dimension.");1059 }1060 bracket = p_psDetermineBracket(params, coords, func);1061 1281 // float initialParam = params->data.F32[dim]; 1282 1283 bracket = p_psDetermineBracketOld(params, dim, coords, func); 1284 if (bracket == NULL) { 1285 psAbort(__func__, "Could not bracket minimum."); 1286 } 1062 1287 1063 1288 min->iter = 0; 1064 while ( 1) {1289 while (min->iter < min->maxIter) { 1065 1290 min->iter++; 1066 1291 //printf("psMinimize1DFunc(): iteration %d\n", min->iter); 1067 1292 a = bracket->data.F32[0]; 1068 1293 b = bracket->data.F32[1]; 1069 1294 c = bracket->data.F32[2]; 1070 dummyParams->data.F32[0] = b; 1071 fb = func(dummyParams, coords); 1295 1296 params->data.F32[dim] = a; 1297 fa = func(params, coords); 1298 params->data.F32[dim] = b; 1299 fb = func(params, coords); 1300 params->data.F32[dim] = c; 1301 fc = func(params, coords); 1302 //printf("Iteration %d: f(%f %f %f) is (%f %f %f)\n", min->iter, a, b, c, fa, fb, fc); 1072 1303 1073 1304 // We determine which is the biggest segment in [a,b,c] then split … … 1075 1306 if ((b-a) > (c-b)) { 1076 1307 // This is the golden section formula 1077 dummyParams->data.F32[0] = n = a + (0.69 * (b-a));1078 fn = func( dummyParams, coords);1308 params->data.F32[dim] = n = a + (0.69 * (b-a)); 1309 fn = func(params, coords); 1079 1310 if (fn > fb) { 1080 1311 // a = n, b = b, c = c … … 1086 1317 } 1087 1318 } else { 1088 dummyParams->data.F32[0]= b + (0.69 * (c-b));1089 fn = func( dummyParams, coords);1319 params->data.F32[dim] = n = b + (0.69 * (c-b)); 1320 fn = func(params, coords); 1090 1321 if (fn > fb) { 1091 1322 // a = a, b = b, c = n … … 1097 1328 } 1098 1329 } 1099 } 1100 1101 psFree(dummyParams); 1102 } 1103 1330 1331 if ((fabs(a-b) < min->tol) && 1332 (fabs(b-c) < min->tol)) { 1333 // psFree(bracket); 1334 // XXX: is this line correct? 1335 params->data.F32[dim] = bracket->data.F32[1]; 1336 min->value = func(params, coords); 1337 return(true); 1338 } 1339 } 1340 1341 // psFree(bracket); 1342 return(false); 1343 } 1344 1345 /****************************************************************************** 1346 This routine must minimize a possibly multi-dimensional function 1347 along a vector defined by line. 1348 *****************************************************************************/ 1349 float psLineMin(psMinimization *min, 1350 psVector *params, 1351 psVector *line, 1352 const psVector *paramMask, 1353 const psArray *coords, 1354 psMinimizePowellFunc func) 1355 { 1356 psVector *bracket; 1357 float a = 0.0; 1358 float b = 0.0; 1359 float c = 0.0; 1360 float n = 0.0; 1361 float fa = 0.0; 1362 float fb = 0.0; 1363 float fc = 0.0; 1364 float fn = 0.0; 1365 float mul = 0.0; 1366 psVector *tmpa = NULL; 1367 psVector *tmpb = NULL; 1368 psVector *tmpc = NULL; 1369 psVector *tmpn = NULL; 1370 int i = 0; 1371 int null = 0; 1372 1373 psTrace(".psLib.dataManip.psLineMin", 4, 1374 "---- psLineMin() begin ----\n"); 1375 1376 for (i=0;i<params->n;i++) { 1377 if (paramMask->data.U8[i] == 0) { 1378 if (line->data.F32[i] >= FLT_EPSILON) { 1379 null = 1; 1380 psTrace(".psLib.dataManip.psLineMin", 4, 1381 "line->data.F32[%d] is %f\n", i, line->data.F32[i]); 1382 } 1383 } 1384 } 1385 if (null == 0) { 1386 psTrace(".psLib.dataManip.psLineMin", 2, 1387 "psLineMin() called with zero line vector.\n"); 1388 return(0.0); 1389 } 1390 1391 tmpa = psVectorAlloc(params->n, PS_TYPE_F32); 1392 tmpb = psVectorAlloc(params->n, PS_TYPE_F32); 1393 tmpc = psVectorAlloc(params->n, PS_TYPE_F32); 1394 tmpn = psVectorAlloc(params->n, PS_TYPE_F32); 1395 1396 1397 for (i=0;i<params->n;i++) { 1398 psTrace(".psLib.dataManip.psLineMin", 6, 1399 "params, paramMask, line [%d] is (%f %d %f)\n", i, 1400 params->data.F32[i], 1401 paramMask->data.U8[i], 1402 line->data.F32[i]); 1403 } 1404 1405 bracket = p_psDetermineBracket(params, line, paramMask, coords, func); 1406 if (bracket == NULL) { 1407 psAbort(__func__, "(1) Could not bracket minimum."); 1408 } 1409 1410 min->iter = 0; 1411 while (min->iter < min->maxIter) { 1412 min->iter++; 1413 psTrace(".psLib.dataManip.psLineMin", 6, 1414 "psLineMin(): iteration %d\n", min->iter); 1415 1416 a = bracket->data.F32[0]; 1417 b = bracket->data.F32[1]; 1418 c = bracket->data.F32[2]; 1419 1420 for (i=0;i<params->n;i++) { 1421 if (paramMask->data.U8[i] == 0) { 1422 tmpa->data.F32[i] = params->data.F32[i] + (a * line->data.F32[i]); 1423 tmpb->data.F32[i] = params->data.F32[i] + (b * line->data.F32[i]); 1424 tmpc->data.F32[i] = params->data.F32[i] + (c * line->data.F32[i]); 1425 } else { 1426 tmpa->data.F32[i] = params->data.F32[i]; 1427 tmpb->data.F32[i] = params->data.F32[i]; 1428 tmpc->data.F32[i] = params->data.F32[i]; 1429 } 1430 } 1431 fa = func(tmpa, coords); 1432 fb = func(tmpb, coords); 1433 fc = func(tmpc, coords); 1434 psTrace(".psLib.dataManip.psLineMin", 6, 1435 "Iteration %d: f(%f %f %f) is (%f %f %f)\n", min->iter, a, b, c, fa, fb, fc); 1436 1437 // We determine which is the biggest segment in [a,b,c] then split 1438 // that with the point n. 1439 if ((b-a) > (c-b)) { 1440 // This is the golden section formula 1441 n = a + (0.69 * (b-a)); 1442 for (i=0;i<params->n;i++) { 1443 tmpn->data.F32[i] = params->data.F32[i] + (n * line->data.F32[i]); 1444 } 1445 fn = func(tmpn, coords); 1446 1447 if (fn > fb) { 1448 // a = n, b = b, c = c 1449 bracket->data.F32[0] = n; 1450 } else { 1451 // a = a, b = n, c = b 1452 bracket->data.F32[1] = n; 1453 bracket->data.F32[2] = b; 1454 } 1455 } else { 1456 n = b + (0.69 * (c-b)); 1457 for (i=0;i<params->n;i++) { 1458 tmpn->data.F32[i] = params->data.F32[i] + (n * line->data.F32[i]); 1459 } 1460 fn = func(tmpn, coords); 1461 1462 if (fn > fb) { 1463 // a = a, b = b, c = n 1464 bracket->data.F32[2] = n; 1465 } else { 1466 // a = b, b = n, c = c 1467 bracket->data.F32[0] = b; 1468 bracket->data.F32[1] = n; 1469 } 1470 } 1471 psTrace(".psLib.dataManip.psLineMin", 6, 1472 "Iteration %d: new bracket is (%f %f %f)\n", min->iter, bracket->data.F32[0], bracket->data.F32[1], bracket->data.F32[2]); 1473 1474 mul = bracket->data.F32[1]; 1475 if ((fabs(a-b) < min->tol) && 1476 (fabs(b-c) < min->tol)) { 1477 for (i=0;i<params->n;i++) { 1478 if (paramMask->data.U8[i] == 0) { 1479 params->data.F32[i]+= mul * line->data.F32[i]; 1480 } 1481 } 1482 min->value = func(params, coords); 1483 psFree(bracket); 1484 psFree(tmpa); 1485 psFree(tmpb); 1486 psFree(tmpc); 1487 psFree(tmpn); 1488 psTrace(".psLib.dataManip.psLineMin", 4, 1489 "---- psLineMin() end (%f) ----\n", mul); 1490 return(mul); 1491 } 1492 } 1493 1494 psFree(bracket); 1495 psFree(tmpa); 1496 psFree(tmpb); 1497 psFree(tmpc); 1498 psFree(tmpn); 1499 1500 psTrace(".psLib.dataManip.psLineMin", 4, 1501 "---- psLineMin() end (0.0) ----\n"); 1502 return(0.0); 1503 } 1504 1505 1506 /****************************************************************************** 1507 This routine must minimize a possibly multi-dimensional function. 1508 *****************************************************************************/ 1104 1509 bool psMinimizePowell(psMinimization *min, 1105 1510 psVector *params, … … 1108 1513 psMinimizePowellFunc func) 1109 1514 { 1110 1111 1112 1113 1114 1115 1116 1117 1118 return(true); 1119 } 1515 int numDims = params->n; 1516 int i = 0; 1517 int j = 0; 1518 psVector **v = NULL; 1519 psVector *pQP = NULL; 1520 psVector *Q = NULL; 1521 psVector *u = NULL; 1522 psMinimization dummyMin; 1523 float mul = 0.0; 1524 float baseFuncVal = 0.0; 1525 float currFuncVal = 0.0; 1526 int biggestIter = 0; 1527 float biggestDiff = 0.0; 1528 float term1 = 0.0; 1529 float term2 = 0.0; 1530 float fqp = 0.0; 1531 float diff = 0.0; 1532 1533 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1534 "---- psMinimizePowell() begin ----\n"); 1535 1536 pQP = psVectorAlloc(numDims, PS_TYPE_F32); 1537 u = psVectorAlloc(numDims, PS_TYPE_F32); 1538 Q = psVectorAlloc(numDims, PS_TYPE_F32); 1539 1540 // 1: Set v[i] to be the unit vectors for each dimension in params 1541 v = (psVector **) psAlloc(params->n * sizeof(psVector **)); 1542 for (i=0;i<numDims;i++) { 1543 v[i] = psVectorAlloc(numDims, PS_TYPE_F32); 1544 for (j=0;j<numDims;j++) { 1545 if (i == j) { 1546 v[i]->data.F32[j] = 1.0; 1547 } else { 1548 v[i]->data.F32[j] = 0.0; 1549 } 1550 } 1551 } 1552 1553 // 2: Set Q to be the initial params (P in the ADD) 1554 for (i=0;i<numDims;i++) { 1555 if (paramMask->data.U8[i] == 0) { 1556 Q->data.F32[i] = params->data.F32[i]; 1557 } 1558 } 1559 1560 min->iter = 0; 1561 while (min->iter < min->maxIter) { 1562 min->iter++; 1563 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1564 "psMinimizePowell() iteration %d\n", min->iter); 1565 1566 // 3: For each dimension in params, move Q only in the vector v[i] to 1567 // minimize the function. 1568 1569 baseFuncVal = func(Q, coords); 1570 currFuncVal = baseFuncVal; 1571 diff = 0.0; 1572 biggestDiff = 0; 1573 biggestIter = 0; 1574 for (i=0;i<numDims;i++) { 1575 if (paramMask->data.U8[i] == 0) { 1576 mul = psLineMin(&dummyMin, Q, v[i], paramMask, coords, func); 1577 if (fabs(dummyMin.value - currFuncVal) > biggestDiff) { 1578 biggestDiff = fabs(dummyMin.value - currFuncVal); 1579 biggestIter = i; 1580 } 1581 currFuncVal = dummyMin.value; 1582 } 1583 } 1584 1585 // 4: Set the vector u = Q - P 1586 for (i=0;i<numDims;i++) { 1587 if (paramMask->data.U8[i] == 0) { 1588 u->data.F32[i] = Q->data.F32[i] - params->data.F32[i]; 1589 1590 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1591 "WOW (%f %f %f)\n", u->data.F32[i], Q->data.F32[i], params->data.F32[i]); 1592 1593 } else { 1594 u->data.F32[i] = 0.0; 1595 } 1596 } 1597 1598 // 5: Move Q only in the direction u, and minimize the function. 1599 psTrace(".psLib.dataManip.psMinimizePowell", 6, "HERE 01\n"); 1600 psTrace(".psLib.dataManip.psMinimizePowell", 6, 1601 "u[0] is %f\n", u->data.F32[0]); 1602 1603 mul = psLineMin(min, params, u, paramMask, coords, func); 1604 1605 // 6: 1606 if (min->value > currFuncVal) { 1607 for (i=0;i<numDims;i++) { 1608 psFree(v[i]); 1609 } 1610 psFree(v); 1611 psFree(u); 1612 psFree(pQP); 1613 psFree(Q); 1614 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1615 "---- psMinimizePowell() end (true) ----\n"); 1616 return(true); 1617 } 1618 1619 for (i=0;i<numDims;i++) { 1620 if (paramMask->data.U8[i] == 0) { 1621 pQP->data.F32[i] = (2 * Q->data.F32[i]) - params->data.F32[i]; 1622 } else { 1623 pQP->data.F32[i] = params->data.F32[i]; 1624 } 1625 } 1626 fqp = func(pQP, coords); 1627 1628 term1 = (baseFuncVal - currFuncVal) - biggestDiff; 1629 term1*= term1; 1630 term1*= 2.0 * (baseFuncVal - (2.0 * currFuncVal) + fqp); 1631 term2 = baseFuncVal - fqp; 1632 term2*= term2 * biggestDiff; 1633 if (term1 < term2) { 1634 for (i=0;i<numDims;i++) { 1635 if (paramMask->data.U8[i] == 0) { 1636 v[biggestIter]->data.F32[i] = u->data.F32[i]; 1637 } 1638 } 1639 } 1640 1641 // 7: Set P to Q 1642 for (i=0;i<numDims;i++) { 1643 if (paramMask->data.U8[i] == 0) { 1644 params->data.F32[i] = Q->data.F32[i]; 1645 } 1646 } 1647 1648 // 8: Go to step 3 until the change is less than some tolerance. 1649 if (fabs(baseFuncVal - currFuncVal) <= min->tol) { 1650 for (i=0;i<numDims;i++) { 1651 psFree(v[i]); 1652 } 1653 psFree(v); 1654 psFree(u); 1655 psFree(pQP); 1656 psFree(Q); 1657 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1658 "---- psMinimizePowell() end (true) ----\n"); 1659 return(true); 1660 } 1661 } 1662 1663 for (i=0;i<numDims;i++) { 1664 psFree(v[i]); 1665 } 1666 psFree(v); 1667 psFree(u); 1668 psFree(pQP); 1669 psFree(Q); 1670 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1671 "---- psMinimizePowell() end (false) ----\n"); 1672 return(false); 1673 } -
trunk/psLib/src/math/psMinimize.h
r1629 r1719 105 105 typedef struct 106 106 { 107 constint maxIter; ///< Convergence limit108 const float tol;///< Error Tolerance107 int maxIter; ///< Convergence limit 108 float tol; ///< Error Tolerance 109 109 float value; ///< Value of function at minimum 110 110 int iter; ///< Number of iterations required … … 138 138 bool psMinimize1DFunc(psMinimization *min, 139 139 psVector *params, 140 int dim, 140 141 const psArray *coords, 141 142 psMinimizePowellFunc func); 143 144 float psLineMin(psMinimization *min, 145 psVector *params, 146 psVector *line, 147 const psVector *paramMask, 148 const psArray *coords, 149 psMinimizePowellFunc func); 142 150 143 151 -
trunk/psLib/src/math/psPolynomial.c
r1718 r1719 7 7 * polynomials. It also contains a Gaussian functions. 8 8 * 9 * @version $Revision: 1.2 4$ $Name: not supported by cvs2svn $10 * @date $Date: 2004-09-08 06:0 0:49$9 * @version $Revision: 1.25 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2004-09-08 06:01:21 $ 11 11 * 12 12 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii 13 13 */ 14 15 14 /*****************************************************************************/ 16 17 15 /* INCLUDE FILES */ 18 19 16 /*****************************************************************************/ 20 17 #include <stdlib.h> … … 37 34 38 35 /*****************************************************************************/ 39 40 36 /* DEFINE STATEMENTS */ 41 42 37 /*****************************************************************************/ 43 38 … … 83 78 84 79 /*****************************************************************************/ 85 86 80 /* TYPE DEFINITIONS */ 87 88 81 /*****************************************************************************/ 89 82 static void polynomial1DFree(psPolynomial1D* myPoly); … … 97 90 98 91 /*****************************************************************************/ 99 100 92 /* GLOBAL VARIABLES */ 101 102 93 /*****************************************************************************/ 103 94 … … 105 96 106 97 /*****************************************************************************/ 107 108 98 /* FILE STATIC VARIABLES */ 109 110 99 /*****************************************************************************/ 111 100 … … 113 102 114 103 /*****************************************************************************/ 115 116 104 /* FUNCTION IMPLEMENTATION - LOCAL */ 117 118 105 /*****************************************************************************/ 119 106 … … 121 108 122 109 /*****************************************************************************/ 123 124 110 /* FUNCTION IMPLEMENTATION - PUBLIC */ 125 126 111 /*****************************************************************************/ 127 112 -
trunk/psLib/src/math/psSpline.c
r1718 r1719 7 7 * polynomials. It also contains a Gaussian functions. 8 8 * 9 * @version $Revision: 1.2 4$ $Name: not supported by cvs2svn $10 * @date $Date: 2004-09-08 06:0 0:49$9 * @version $Revision: 1.25 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2004-09-08 06:01:21 $ 11 11 * 12 12 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii 13 13 */ 14 15 14 /*****************************************************************************/ 16 17 15 /* INCLUDE FILES */ 18 19 16 /*****************************************************************************/ 20 17 #include <stdlib.h> … … 37 34 38 35 /*****************************************************************************/ 39 40 36 /* DEFINE STATEMENTS */ 41 42 37 /*****************************************************************************/ 43 38 … … 83 78 84 79 /*****************************************************************************/ 85 86 80 /* TYPE DEFINITIONS */ 87 88 81 /*****************************************************************************/ 89 82 static void polynomial1DFree(psPolynomial1D* myPoly); … … 97 90 98 91 /*****************************************************************************/ 99 100 92 /* GLOBAL VARIABLES */ 101 102 93 /*****************************************************************************/ 103 94 … … 105 96 106 97 /*****************************************************************************/ 107 108 98 /* FILE STATIC VARIABLES */ 109 110 99 /*****************************************************************************/ 111 100 … … 113 102 114 103 /*****************************************************************************/ 115 116 104 /* FUNCTION IMPLEMENTATION - LOCAL */ 117 118 105 /*****************************************************************************/ 119 106 … … 121 108 122 109 /*****************************************************************************/ 123 124 110 /* FUNCTION IMPLEMENTATION - PUBLIC */ 125 126 111 /*****************************************************************************/ 127 112 -
trunk/psLib/src/sys/psTrace.h
r1713 r1719 10 10 * @author George Gusciora, MHPCC 11 11 * 12 * @version $Revision: 1.1 7$ $Name: not supported by cvs2svn $13 * @date $Date: 2004-09-08 0 0:09:06 $12 * @version $Revision: 1.18 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2004-09-08 06:03:26 $ 14 14 * 15 15 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 19 19 20 20 #define PS_UNKNOWN_TRACE_LEVEL -9999 // we don't know this name's level 21 #define PS_DEFAULT_TRACE_LEVEL 021 #define PS_DEFAULT_TRACE_LEVEL -1 22 22 23 23 /** \addtogroup LogTrace
Note:
See TracChangeset
for help on using the changeset viewer.
