Changeset 2235
- Timestamp:
- Oct 28, 2004, 4:00:25 PM (22 years ago)
- Location:
- trunk/psLib/src
- Files:
-
- 2 edited
-
dataManip/psMinimize.c (modified) (6 diffs)
-
math/psMinimize.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/dataManip/psMinimize.c
r2230 r2235 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.7 4$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-10-2 8 23:03:11$11 * @version $Revision: 1.75 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-10-29 02:00:25 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 1188 1188 } 1189 1189 1190 1191 #define PS_DETERMINE_BRACKET_MAX_ITERATIONS 100 1190 1192 psVector *p_psDetermineBracket2(psVector *params, 1191 1193 psVector *line, … … 1200 1202 float fb = 0.0; 1201 1203 float fc = 0.0; 1202 psS32 iter = 100; 1203 float aDir = 0.0; 1204 float cDir = 0.0; 1205 float new_aDir = 0.0; 1206 float new_cDir = 0.0; 1207 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 1208 float stepSize = PS_DETERMINE_BRACKET_STEP_SIZE; 1204 psS32 iter = 0; 1209 1205 psVector *tmp = NULL; 1210 1206 psBool boolLineIsNull = true; … … 1220 1216 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1221 1217 "---- p_psDetermineBracket() end (NULL) ----\n"); 1222 psFree(bracket);1223 1218 return(NULL); 1224 1219 } 1225 1220 1221 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 1226 1222 tmp = psVectorAlloc(params->n, PS_TYPE_F32); 1227 1223 1228 a = 0.0; 1229 b = stepSize; 1230 1231 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a); 1232 fa = func(tmp, coords); 1224 1225 determineINitialBracket(params, paramMask, line, coords, func, &a, &b, &fa, &fb); 1226 1227 a = -1.0; 1228 b = 0.0; 1229 c = 1.0; 1233 1230 1234 1231 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, b); 1235 1232 fb = func(tmp, coords); 1236 1233 1237 if (fa < fb) { 1238 aDir = -1; 1239 } else { 1240 aDir = 1; 1241 } 1242 1234 do { 1235 a*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE); 1236 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a); 1237 fa = func(tmp, coords); 1238 } while (fabs(fb - fa) < FLT_EPSILON); 1239 1240 do { 1241 c*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE); 1242 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c); 1243 fc = func(tmp, coords); 1244 } while (fabs(fc - fb) < FLT_EPSILON); 1245 1246 if ((fb < fa) && (fb < fc)) { 1247 bracket->data.F32[0] = a; 1248 bracket->data.F32[1] = b; 1249 bracket->data.F32[2] = c; 1250 psFree(tmp); 1251 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1252 "---- p_psDetermineBracket() end ----\n"); 1253 return(bracket); 1254 } 1255 1256 // The object of this code is to set the initial point a to 0.0, and 1257 // ensure that (fb < fa). 1243 1258 if (fc < fb) { 1244 cDir = -1; 1245 } else { 1246 cDir = 1; 1247 } 1248 1249 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1250 "(a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", a, b, c, fa, fb, fc); 1251 1252 while (iter > 0) { 1259 a = b; 1260 b = c; 1261 fa = fb; 1262 fb = fc; 1263 } else if (fa < fb) { 1264 float aSave = a; 1265 float faSave = fa; 1266 1267 a = b; 1268 fa = fb; 1269 1270 b = aSave; 1271 fb = faSave; 1272 } 1273 c = b; 1274 1275 // At this point we have (a, b) and we know that (fa > fb). Initially, c=b; 1276 // We keep stretching b out further from "a" until (fc > previous fc). If 1277 // that happens, then we have our bracket. 1278 iter = 0; 1279 while (iter < PS_DETERMINE_BRACKET_MAX_ITERATIONS) { 1253 1280 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1254 "psDetermineBracket(): iteration %d\n", iter); 1281 "psDetermineBracket(): iterationA %d\n", iter); 1282 c*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE); 1283 1284 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c); 1285 fc = func(tmp, coords); 1286 1287 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1288 "IterA(%d): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc); 1289 1255 1290 if ((fb < fa) && (fb < fc)) { 1256 1291 bracket->data.F32[0] = a; … … 1261 1296 "---- p_psDetermineBracket() end ----\n"); 1262 1297 return(bracket); 1263 }1264 stepSize*= (1.0 + stepSize);1265 a =- stepSize;1266 c =+ stepSize;1267 1268 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a);1269 fa = func(tmp, coords);1270 1271 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);1272 fc = func(tmp, coords);1273 1274 psTrace(".psLib.dataManip.p_psDetermineBracket", 6,1275 "Iter(%d): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc);1276 1277 if (fa < fb) {1278 new_aDir = -1;1279 1298 } else { 1280 new_aDir = 1; 1281 } 1282 1283 if (fc < fb) { 1284 new_cDir = -1; 1285 } else { 1286 new_cDir = 1; 1287 } 1288 if ((new_aDir == 1) && (aDir == -1)) { 1289 bracket->data.F32[0] = a; 1290 bracket->data.F32[1] = b; 1291 bracket->data.F32[2] = c; 1292 psFree(tmp); 1293 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1294 "---- p_psDetermineBracket() end ----\n"); 1295 return(bracket); 1296 } 1297 1298 if ((new_cDir == 1) && (cDir == -1)) { 1299 bracket->data.F32[0] = a; 1300 bracket->data.F32[1] = b; 1301 bracket->data.F32[2] = c; 1302 psFree(tmp); 1303 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1304 "---- p_psDetermineBracket() end ----\n"); 1305 return(bracket); 1306 } 1307 aDir = new_aDir; 1308 cDir = new_cDir; 1309 iter--; 1310 } 1299 b = c; 1300 fb = fc; 1301 } 1302 iter++; 1303 } 1304 1305 // Okay, let's try the other direction. 1306 1311 1307 psFree(tmp); 1312 1308 psFree(bracket); … … 1397 1393 } 1398 1394 1399 bracket = p_psDetermineBracket (params, line, paramMask, coords, func);1395 bracket = p_psDetermineBracket2(params, line, paramMask, coords, func); 1400 1396 if (bracket == NULL) { 1401 1397 psFree(tmpa); -
trunk/psLib/src/math/psMinimize.c
r2230 r2235 9 9 * @author GLG, MHPCC 10 10 * 11 * @version $Revision: 1.7 4$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-10-2 8 23:03:11$11 * @version $Revision: 1.75 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-10-29 02:00:25 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 1188 1188 } 1189 1189 1190 1191 #define PS_DETERMINE_BRACKET_MAX_ITERATIONS 100 1190 1192 psVector *p_psDetermineBracket2(psVector *params, 1191 1193 psVector *line, … … 1200 1202 float fb = 0.0; 1201 1203 float fc = 0.0; 1202 psS32 iter = 100; 1203 float aDir = 0.0; 1204 float cDir = 0.0; 1205 float new_aDir = 0.0; 1206 float new_cDir = 0.0; 1207 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 1208 float stepSize = PS_DETERMINE_BRACKET_STEP_SIZE; 1204 psS32 iter = 0; 1209 1205 psVector *tmp = NULL; 1210 1206 psBool boolLineIsNull = true; … … 1220 1216 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1221 1217 "---- p_psDetermineBracket() end (NULL) ----\n"); 1222 psFree(bracket);1223 1218 return(NULL); 1224 1219 } 1225 1220 1221 psVector *bracket = psVectorAlloc(3, PS_TYPE_F32); 1226 1222 tmp = psVectorAlloc(params->n, PS_TYPE_F32); 1227 1223 1228 a = 0.0; 1229 b = stepSize; 1230 1231 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a); 1232 fa = func(tmp, coords); 1224 1225 determineINitialBracket(params, paramMask, line, coords, func, &a, &b, &fa, &fb); 1226 1227 a = -1.0; 1228 b = 0.0; 1229 c = 1.0; 1233 1230 1234 1231 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, b); 1235 1232 fb = func(tmp, coords); 1236 1233 1237 if (fa < fb) { 1238 aDir = -1; 1239 } else { 1240 aDir = 1; 1241 } 1242 1234 do { 1235 a*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE); 1236 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a); 1237 fa = func(tmp, coords); 1238 } while (fabs(fb - fa) < FLT_EPSILON); 1239 1240 do { 1241 c*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE); 1242 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c); 1243 fc = func(tmp, coords); 1244 } while (fabs(fc - fb) < FLT_EPSILON); 1245 1246 if ((fb < fa) && (fb < fc)) { 1247 bracket->data.F32[0] = a; 1248 bracket->data.F32[1] = b; 1249 bracket->data.F32[2] = c; 1250 psFree(tmp); 1251 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1252 "---- p_psDetermineBracket() end ----\n"); 1253 return(bracket); 1254 } 1255 1256 // The object of this code is to set the initial point a to 0.0, and 1257 // ensure that (fb < fa). 1243 1258 if (fc < fb) { 1244 cDir = -1; 1245 } else { 1246 cDir = 1; 1247 } 1248 1249 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1250 "(a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", a, b, c, fa, fb, fc); 1251 1252 while (iter > 0) { 1259 a = b; 1260 b = c; 1261 fa = fb; 1262 fb = fc; 1263 } else if (fa < fb) { 1264 float aSave = a; 1265 float faSave = fa; 1266 1267 a = b; 1268 fa = fb; 1269 1270 b = aSave; 1271 fb = faSave; 1272 } 1273 c = b; 1274 1275 // At this point we have (a, b) and we know that (fa > fb). Initially, c=b; 1276 // We keep stretching b out further from "a" until (fc > previous fc). If 1277 // that happens, then we have our bracket. 1278 iter = 0; 1279 while (iter < PS_DETERMINE_BRACKET_MAX_ITERATIONS) { 1253 1280 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1254 "psDetermineBracket(): iteration %d\n", iter); 1281 "psDetermineBracket(): iterationA %d\n", iter); 1282 c*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE); 1283 1284 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c); 1285 fc = func(tmp, coords); 1286 1287 psTrace(".psLib.dataManip.p_psDetermineBracket", 6, 1288 "IterA(%d): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc); 1289 1255 1290 if ((fb < fa) && (fb < fc)) { 1256 1291 bracket->data.F32[0] = a; … … 1261 1296 "---- p_psDetermineBracket() end ----\n"); 1262 1297 return(bracket); 1263 }1264 stepSize*= (1.0 + stepSize);1265 a =- stepSize;1266 c =+ stepSize;1267 1268 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a);1269 fa = func(tmp, coords);1270 1271 PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);1272 fc = func(tmp, coords);1273 1274 psTrace(".psLib.dataManip.p_psDetermineBracket", 6,1275 "Iter(%d): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc);1276 1277 if (fa < fb) {1278 new_aDir = -1;1279 1298 } else { 1280 new_aDir = 1; 1281 } 1282 1283 if (fc < fb) { 1284 new_cDir = -1; 1285 } else { 1286 new_cDir = 1; 1287 } 1288 if ((new_aDir == 1) && (aDir == -1)) { 1289 bracket->data.F32[0] = a; 1290 bracket->data.F32[1] = b; 1291 bracket->data.F32[2] = c; 1292 psFree(tmp); 1293 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1294 "---- p_psDetermineBracket() end ----\n"); 1295 return(bracket); 1296 } 1297 1298 if ((new_cDir == 1) && (cDir == -1)) { 1299 bracket->data.F32[0] = a; 1300 bracket->data.F32[1] = b; 1301 bracket->data.F32[2] = c; 1302 psFree(tmp); 1303 psTrace(".psLib.dataManip.p_psDetermineBracket", 4, 1304 "---- p_psDetermineBracket() end ----\n"); 1305 return(bracket); 1306 } 1307 aDir = new_aDir; 1308 cDir = new_cDir; 1309 iter--; 1310 } 1299 b = c; 1300 fb = fc; 1301 } 1302 iter++; 1303 } 1304 1305 // Okay, let's try the other direction. 1306 1311 1307 psFree(tmp); 1312 1308 psFree(bracket); … … 1397 1393 } 1398 1394 1399 bracket = p_psDetermineBracket (params, line, paramMask, coords, func);1395 bracket = p_psDetermineBracket2(params, line, paramMask, coords, func); 1400 1396 if (bracket == NULL) { 1401 1397 psFree(tmpa);
Note:
See TracChangeset
for help on using the changeset viewer.
