Changeset 1991
- Timestamp:
- Oct 6, 2004, 1:29:16 PM (22 years ago)
- Location:
- trunk/psLib
- Files:
-
- 5 edited
-
src/dataManip/psMinimize.c (modified) (14 diffs)
-
src/math/psMinimize.c (modified) (14 diffs)
-
test/dataManip/tst_psFunc05.c (modified) (1 diff)
-
test/dataManip/tst_psMinimize04.c (modified) (1 diff)
-
test/dataManip/tst_psMinimize05.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/dataManip/psMinimize.c
r1982 r1991 9 9 * @author GLF, MHPCC 10 10 * 11 * @version $Revision: 1.5 5$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-10-06 2 1:30:53$11 * @version $Revision: 1.56 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-10-06 23:29:16 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 1297 1297 1298 1298 XXX: Define constants for default dummy number of iterations and tolerance. 1299 1300 XXX: Must define behavior on various NULL inputs. 1299 1301 *****************************************************************************/ 1300 1302 bool psMinimizePowell(psMinimization *min, … … 1304 1306 psMinimizePowellFunc func) 1305 1307 { 1308 PS_CHECK_NULL_VECTOR_RETURN_NULL(params); 1309 PS_CHECK_EMPTY_VECTOR_RETURN_NULL(params); 1310 PS_CHECK_NULL_PTR_RETURN_NULL(min); 1311 PS_CHECK_NULL_PTR_RETURN_NULL(coords); 1312 PS_CHECK_NULL_PTR_RETURN_NULL(func); 1313 1306 1314 int numDims = params->n; 1307 1315 int i = 0; … … 1311 1319 psVector *Q = NULL; 1312 1320 psVector *u = NULL; 1321 psVector *myParamMask = NULL; // XXX: Use a recylced vector here. 1313 1322 psMinimization dummyMin; 1314 1323 float mul = 0.0; … … 1333 1342 Q = psVectorAlloc(numDims, PS_TYPE_F32); 1334 1343 1344 if (paramMask == NULL) { 1345 myParamMask = psVectorAlloc(params->n, PS_TYPE_U8); 1346 for (i=0;i<myParamMask->n;i++) { 1347 myParamMask->data.U8[i] = 0; 1348 } 1349 } else { 1350 myParamMask = (psVector *) paramMask; 1351 } 1352 PS_CHECK_VECTOR_SIZE_EQUAL_RETURN_NULL(params, myParamMask); 1353 1335 1354 // 1: Set v[i] to be the unit vectors for each dimension in params 1336 1355 v = (psVector **) psAlloc(params->n * sizeof(psVector **)); … … 1348 1367 // 2: Set Q to be the initial params (P in the ADD) 1349 1368 for (i=0;i<numDims;i++) { 1350 if ( paramMask->data.U8[i] == 0) {1369 if (myParamMask->data.U8[i] == 0) { 1351 1370 Q->data.F32[i] = params->data.F32[i]; 1352 1371 } … … 1368 1387 biggestIter = 0; 1369 1388 for (i=0;i<numDims;i++) { 1370 if ( paramMask->data.U8[i] == 0) {1389 if (myParamMask->data.U8[i] == 0) { 1371 1390 dummyMin.maxIter = 100; 1372 1391 dummyMin.tol = 0.01; 1373 mul = p_psLineMin(&dummyMin, Q, v[i], paramMask, coords, func);1392 mul = p_psLineMin(&dummyMin, Q, v[i], myParamMask, coords, func); 1374 1393 if (fabs(dummyMin.value - currFuncVal) > biggestDiff) { 1375 1394 biggestDiff = fabs(dummyMin.value - currFuncVal); … … 1382 1401 // 4: Set the vector u = Q - P 1383 1402 for (i=0;i<numDims;i++) { 1384 if ( paramMask->data.U8[i] == 0) {1403 if (myParamMask->data.U8[i] == 0) { 1385 1404 u->data.F32[i] = Q->data.F32[i] - params->data.F32[i]; 1386 1405 … … 1402 1421 } 1403 1422 1404 mul = p_psLineMin(min, params, u, paramMask, coords, func);1423 mul = p_psLineMin(min, params, u, myParamMask, coords, func); 1405 1424 1406 1425 // 6: … … 1413 1432 psFree(pQP); 1414 1433 psFree(Q); 1434 if (paramMask == NULL) { 1435 psFree(myParamMask); 1436 } 1415 1437 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1416 1438 "---- psMinimizePowell() end (true) ----\n"); … … 1419 1441 1420 1442 for (i=0;i<numDims;i++) { 1421 if ( paramMask->data.U8[i] == 0) {1443 if (myParamMask->data.U8[i] == 0) { 1422 1444 pQP->data.F32[i] = (2 * Q->data.F32[i]) - params->data.F32[i]; 1423 1445 } else { … … 1434 1456 if (term1 < term2) { 1435 1457 for (i=0;i<numDims;i++) { 1436 if ( paramMask->data.U8[i] == 0) {1458 if (myParamMask->data.U8[i] == 0) { 1437 1459 v[biggestIter]->data.F32[i] = u->data.F32[i]; 1438 1460 } … … 1442 1464 // 7: Set P to Q 1443 1465 for (i=0;i<numDims;i++) { 1444 if ( paramMask->data.U8[i] == 0) {1466 if (myParamMask->data.U8[i] == 0) { 1445 1467 params->data.F32[i] = Q->data.F32[i]; 1446 1468 } … … 1458 1480 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1459 1481 "---- psMinimizePowell() end (true) ----\n"); 1482 if (paramMask == NULL) { 1483 psFree(myParamMask); 1484 } 1460 1485 return(true); 1461 1486 } 1462 1487 } 1463 1488 1489 if (paramMask == NULL) { 1490 psFree(myParamMask); 1491 } 1464 1492 for (i=0;i<numDims;i++) { 1465 1493 psFree(v[i]); -
trunk/psLib/src/math/psMinimize.c
r1982 r1991 9 9 * @author GLF, MHPCC 10 10 * 11 * @version $Revision: 1.5 5$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-10-06 2 1:30:53$11 * @version $Revision: 1.56 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-10-06 23:29:16 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 1297 1297 1298 1298 XXX: Define constants for default dummy number of iterations and tolerance. 1299 1300 XXX: Must define behavior on various NULL inputs. 1299 1301 *****************************************************************************/ 1300 1302 bool psMinimizePowell(psMinimization *min, … … 1304 1306 psMinimizePowellFunc func) 1305 1307 { 1308 PS_CHECK_NULL_VECTOR_RETURN_NULL(params); 1309 PS_CHECK_EMPTY_VECTOR_RETURN_NULL(params); 1310 PS_CHECK_NULL_PTR_RETURN_NULL(min); 1311 PS_CHECK_NULL_PTR_RETURN_NULL(coords); 1312 PS_CHECK_NULL_PTR_RETURN_NULL(func); 1313 1306 1314 int numDims = params->n; 1307 1315 int i = 0; … … 1311 1319 psVector *Q = NULL; 1312 1320 psVector *u = NULL; 1321 psVector *myParamMask = NULL; // XXX: Use a recylced vector here. 1313 1322 psMinimization dummyMin; 1314 1323 float mul = 0.0; … … 1333 1342 Q = psVectorAlloc(numDims, PS_TYPE_F32); 1334 1343 1344 if (paramMask == NULL) { 1345 myParamMask = psVectorAlloc(params->n, PS_TYPE_U8); 1346 for (i=0;i<myParamMask->n;i++) { 1347 myParamMask->data.U8[i] = 0; 1348 } 1349 } else { 1350 myParamMask = (psVector *) paramMask; 1351 } 1352 PS_CHECK_VECTOR_SIZE_EQUAL_RETURN_NULL(params, myParamMask); 1353 1335 1354 // 1: Set v[i] to be the unit vectors for each dimension in params 1336 1355 v = (psVector **) psAlloc(params->n * sizeof(psVector **)); … … 1348 1367 // 2: Set Q to be the initial params (P in the ADD) 1349 1368 for (i=0;i<numDims;i++) { 1350 if ( paramMask->data.U8[i] == 0) {1369 if (myParamMask->data.U8[i] == 0) { 1351 1370 Q->data.F32[i] = params->data.F32[i]; 1352 1371 } … … 1368 1387 biggestIter = 0; 1369 1388 for (i=0;i<numDims;i++) { 1370 if ( paramMask->data.U8[i] == 0) {1389 if (myParamMask->data.U8[i] == 0) { 1371 1390 dummyMin.maxIter = 100; 1372 1391 dummyMin.tol = 0.01; 1373 mul = p_psLineMin(&dummyMin, Q, v[i], paramMask, coords, func);1392 mul = p_psLineMin(&dummyMin, Q, v[i], myParamMask, coords, func); 1374 1393 if (fabs(dummyMin.value - currFuncVal) > biggestDiff) { 1375 1394 biggestDiff = fabs(dummyMin.value - currFuncVal); … … 1382 1401 // 4: Set the vector u = Q - P 1383 1402 for (i=0;i<numDims;i++) { 1384 if ( paramMask->data.U8[i] == 0) {1403 if (myParamMask->data.U8[i] == 0) { 1385 1404 u->data.F32[i] = Q->data.F32[i] - params->data.F32[i]; 1386 1405 … … 1402 1421 } 1403 1422 1404 mul = p_psLineMin(min, params, u, paramMask, coords, func);1423 mul = p_psLineMin(min, params, u, myParamMask, coords, func); 1405 1424 1406 1425 // 6: … … 1413 1432 psFree(pQP); 1414 1433 psFree(Q); 1434 if (paramMask == NULL) { 1435 psFree(myParamMask); 1436 } 1415 1437 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1416 1438 "---- psMinimizePowell() end (true) ----\n"); … … 1419 1441 1420 1442 for (i=0;i<numDims;i++) { 1421 if ( paramMask->data.U8[i] == 0) {1443 if (myParamMask->data.U8[i] == 0) { 1422 1444 pQP->data.F32[i] = (2 * Q->data.F32[i]) - params->data.F32[i]; 1423 1445 } else { … … 1434 1456 if (term1 < term2) { 1435 1457 for (i=0;i<numDims;i++) { 1436 if ( paramMask->data.U8[i] == 0) {1458 if (myParamMask->data.U8[i] == 0) { 1437 1459 v[biggestIter]->data.F32[i] = u->data.F32[i]; 1438 1460 } … … 1442 1464 // 7: Set P to Q 1443 1465 for (i=0;i<numDims;i++) { 1444 if ( paramMask->data.U8[i] == 0) {1466 if (myParamMask->data.U8[i] == 0) { 1445 1467 params->data.F32[i] = Q->data.F32[i]; 1446 1468 } … … 1458 1480 psTrace(".psLib.dataManip.psMinimizePowell", 4, 1459 1481 "---- psMinimizePowell() end (true) ----\n"); 1482 if (paramMask == NULL) { 1483 psFree(myParamMask); 1484 } 1460 1485 return(true); 1461 1486 } 1462 1487 } 1463 1488 1489 if (paramMask == NULL) { 1490 psFree(myParamMask); 1491 } 1464 1492 for (i=0;i<numDims;i++) { 1465 1493 psFree(v[i]); -
trunk/psLib/test/dataManip/tst_psFunc05.c
r1946 r1991 6 6 psSpline1DEvalVector() on new data values and ensures that the results 7 7 are correct. 8 9 XXX: Only F32 types are tested here. F64 types are tested elsewhere. 8 10 *****************************************************************************/ 9 11 #include <stdio.h> -
trunk/psLib/test/dataManip/tst_psMinimize04.c
r1976 r1991 27 27 #define C 3.0 28 28 #define ERROR_TOLERANCE 0.10 29 #define YERR 1 0.029 #define YERR 1.0 30 30 double setData(double x) 31 31 { -
trunk/psLib/test/dataManip/tst_psMinimize05.c
r1810 r1991 1 1 /***************************************************************************** 2 2 This routine must ensure that psMinimizePowell() works correctly. 3 4 We test with a NULL and non-NULL paramMask. 5 6 XXX: Must verify the stderr for the NULL parameter tests. 3 7 *****************************************************************************/ 4 8 #include <stdio.h> … … 9 13 #define MIN_VALUE 20.0 10 14 #define NUM_PARAMS 10 15 #define ERROR_TOLERANCE 0.10 11 16 float expectedParm[NUM_PARAMS]; 12 17 int testStatus = true; … … 57 62 58 63 59 int main()64 int t00() 60 65 { 61 66 int currentId = psMemGetId(); … … 86 91 } 87 92 88 psMinimizePowell(min, myParams, myParamMask, myCoords, (psMinimizePowellFunc) myFunc); 93 printPositiveTestHeader(stdout, 94 "psMinimize functions", 95 "psMinimizePowell()"); 96 97 psMinimizePowell(min, 98 myParams, 99 myParamMask, 100 myCoords, 101 (psMinimizePowellFunc) myFunc); 102 89 103 printf("\nThe minimum is %f (expected: %f)\n", min->value, MIN_VALUE); 104 90 105 for (i=0;i<NUM_PARAMS;i++) { 91 106 printf("Parameter %d at the minimum is %f (expected: %f)\n", i, 92 107 myParams->data.F32[i], expectedParm[i]); 93 } 108 109 if (fabs(myParams->data.F32[i] - expectedParm[i]) > fabs(ERROR_TOLERANCE * expectedParm[i])) { 110 printf("ERROR: Parameter %d: (%.1f), expected was (%.1f)\n", 111 i, myParams->data.F32[i], expectedParm[i]); 112 testStatus = false; 113 } else { 114 printf("Parameter %d: (%.1f), expected was (%.1f)\n", 115 i, myParams->data.F32[i], expectedParm[i]); 116 } 117 } 118 94 119 95 120 psFree(myCoords); … … 103 128 psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks); 104 129 } 130 printFooter(stdout, 131 "psMinimize functions", 132 "psMinimizePowell()", 133 testStatus); 134 135 105 136 return (!testStatus); 106 137 } 138 139 int t01() 140 { 141 int currentId = psMemGetId(); 142 int memLeaks = 0; 143 int i = 0; 144 psArray *myCoords; 145 psVector *myParams; 146 psMinimization *min; 147 148 psTraceSetLevel(".psLib", 0); 149 /************************************************************************** 150 *************************************************************************/ 151 myParams = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32); 152 min = psMinimizationAlloc(100, 0.01); 153 154 myCoords = psArrayAlloc(N); 155 for (i=0;i<N;i++) { 156 myCoords->data[i] = (psPTR *) psVectorAlloc(2, PS_TYPE_F32); 157 ((psVector *) (myCoords->data[i]))->data.F32[0] = (float) (i+10); 158 ((psVector *) (myCoords->data[i]))->data.F32[1] = (float) (i+3); 159 } 160 for (i=0;i<NUM_PARAMS;i++) { 161 expectedParm[i] = 2.32 + (float) (2 * i); 162 myParams->data.F32[i] = 0.0; 163 } 164 165 printPositiveTestHeader(stdout, 166 "psMinimize functions", 167 "psMinimizePowell()"); 168 169 psMinimizePowell(min, 170 myParams, 171 NULL, 172 myCoords, 173 (psMinimizePowellFunc) myFunc); 174 175 printf("\nThe minimum is %f (expected: %f)\n", min->value, MIN_VALUE); 176 177 for (i=0;i<NUM_PARAMS;i++) { 178 printf("Parameter %d at the minimum is %f (expected: %f)\n", i, 179 myParams->data.F32[i], expectedParm[i]); 180 181 if (fabs(myParams->data.F32[i] - expectedParm[i]) > fabs(ERROR_TOLERANCE * expectedParm[i])) { 182 printf("ERROR: Parameter %d: (%.1f), expected was (%.1f)\n", 183 i, myParams->data.F32[i], expectedParm[i]); 184 testStatus = false; 185 } else { 186 printf("Parameter %d: (%.1f), expected was (%.1f)\n", 187 i, myParams->data.F32[i], expectedParm[i]); 188 } 189 } 190 191 192 psFree(myCoords); 193 psFree(myParams); 194 psFree(min); 195 196 psMemCheckCorruption(1); 197 memLeaks = psMemCheckLeaks(currentId,NULL,stderr); 198 if (0 != memLeaks) { 199 psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks); 200 } 201 printFooter(stdout, 202 "psMinimize functions", 203 "psMinimizePowell()", 204 testStatus); 205 206 207 return (!testStatus); 208 } 209 210 int t02() 211 { 212 int currentId = psMemGetId(); 213 int memLeaks = 0; 214 int i = 0; 215 psArray *myCoords; 216 psVector *myParams; 217 psVector *myParamMask; 218 psMinimization *min; 219 220 psTraceSetLevel(".psLib", 0); 221 /************************************************************************** 222 *************************************************************************/ 223 myParams = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32); 224 myParamMask = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32); 225 min = psMinimizationAlloc(100, 0.01); 226 227 myCoords = psArrayAlloc(N); 228 for (i=0;i<N;i++) { 229 myCoords->data[i] = (psPTR *) psVectorAlloc(2, PS_TYPE_F32); 230 ((psVector *) (myCoords->data[i]))->data.F32[0] = (float) (i+10); 231 ((psVector *) (myCoords->data[i]))->data.F32[1] = (float) (i+3); 232 } 233 for (i=0;i<NUM_PARAMS;i++) { 234 expectedParm[i] = 2.32 + (float) (2 * i); 235 myParams->data.F32[i] = 0.0; 236 myParamMask->data.U8[i] = 0; 237 } 238 239 printPositiveTestHeader(stdout, 240 "psMinimize functions", 241 "psMinimizePowell(): various NULL inputs"); 242 243 psMinimizePowell(NULL, myParams, myParamMask, myCoords, (psMinimizePowellFunc) myFunc); 244 psMinimizePowell(min, NULL, myParamMask, myCoords,(psMinimizePowellFunc) myFunc); 245 psMinimizePowell(min, myParams, myParamMask, NULL, (psMinimizePowellFunc) myFunc); 246 psMinimizePowell(min, myParams, myParamMask, myCoords, NULL); 247 248 psFree(myCoords); 249 psFree(myParams); 250 psFree(myParamMask); 251 psFree(min); 252 253 psMemCheckCorruption(1); 254 memLeaks = psMemCheckLeaks(currentId,NULL,stderr); 255 if (0 != memLeaks) { 256 psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks); 257 } 258 printFooter(stdout, 259 "psMinimize functions", 260 "psMinimizePowell(): various NULL inputs", 261 testStatus); 262 263 264 return (!testStatus); 265 } 266 267 int main() 268 { 269 t00(); 270 t01(); 271 t02(); 272 }
Note:
See TracChangeset
for help on using the changeset viewer.
