Normalizing per simulation scenario using the max(sum(fullPatternDisplacementNorm,d_e))

This commit is contained in:
iasonmanolas 2021-02-12 19:58:40 +02:00
parent 8e57909f3d
commit 135c9fd975
3 changed files with 45 additions and 56 deletions

View File

@ -72,15 +72,15 @@ int main(int argc, char *argv[]) {
FlatPattern fullPattern(filepathString); FlatPattern fullPattern(filepathString);
fullPattern.setLabel(filepath.stem().string()); fullPattern.setLabel(filepath.stem().string());
fullPattern.scale(0.03); fullPattern.scale(0.03);
for (int reducedPatternIndex = 0; //for (int reducedPatternIndex = 0;
reducedPatternIndex < reducedModels.size(); reducedPatternIndex++) { // reducedPatternIndex < reducedModels.size(); reducedPatternIndex++) {
FlatPattern *pFullPattern = new FlatPattern(); FlatPattern *pFullPattern = new FlatPattern();
pFullPattern->copy(fullPattern); pFullPattern->copy(fullPattern);
FlatPattern *pReducedPattern = new FlatPattern(); FlatPattern *pReducedPattern = new FlatPattern();
pReducedPattern->copy(*reducedModels[reducedPatternIndex]); //pReducedPattern->copy(*reducedModels[reducedPatternIndex]);
//pReducedPattern->copy(*reducedModels[0]); pReducedPattern->copy(*reducedModels[0]);
patternPairs.push_back(std::make_pair(pFullPattern, pReducedPattern)); patternPairs.push_back(std::make_pair(pFullPattern, pReducedPattern));
} //}
} }
// for (double rangeOffset = 0.15; rangeOffset <= 0.95; rangeOffset += 0.05) // for (double rangeOffset = 0.15; rangeOffset <= 0.95; rangeOffset += 0.05)
@ -92,7 +92,7 @@ int main(int argc, char *argv[]) {
// for (settings_optimization.numberOfFunctionCalls = 100; // for (settings_optimization.numberOfFunctionCalls = 100;
// settings_optimization.numberOfFunctionCalls < 5000; // settings_optimization.numberOfFunctionCalls < 5000;
// settings_optimization.numberOfFunctionCalls += 100) { // settings_optimization.numberOfFunctionCalls += 100) {
settings_optimization.numberOfFunctionCalls = 10; settings_optimization.numberOfFunctionCalls = 100;
const std::string optimizationSettingsString = const std::string optimizationSettingsString =
settings_optimization.toString(); settings_optimization.toString();
std::string optimiziationResultsDirectory = "../OptimizationResults"; std::string optimiziationResultsDirectory = "../OptimizationResults";
@ -116,7 +116,7 @@ int main(int argc, char *argv[]) {
patternPairs.size()); patternPairs.size());
auto start = std::chrono::high_resolution_clock::now(); auto start = std::chrono::high_resolution_clock::now();
#pragma omp parallel for //#pragma omp parallel for
for (int patternPairIndex = 0; patternPairIndex < patternPairs.size(); for (int patternPairIndex = 0; patternPairIndex < patternPairs.size();
patternPairIndex++) { patternPairIndex++) {
const std::vector<size_t> numberOfNodesPerSlot{1, 0, 0, 2, 1, 2, 1}; const std::vector<size_t> numberOfNodesPerSlot{1, 0, 0, 2, 1, 2, 1};
@ -124,12 +124,13 @@ int main(int argc, char *argv[]) {
optimizer.initializePatterns(*patternPairs[patternPairIndex].first, optimizer.initializePatterns(*patternPairs[patternPairIndex].first,
*patternPairs[patternPairIndex].second, {}); *patternPairs[patternPairIndex].second, {});
ReducedModelOptimizer::Results optimizationResults = ReducedModelOptimizer::Results optimizationResults =
optimizer.optimize(settings_optimization); optimizer.optimize(settings_optimization, {ReducedModelOptimizer::SimulationScenario::Dome});
totalError += optimizationResults.objectiveValue; totalError += optimizationResults.objectiveValue;
optimizationResults_testSet[patternPairIndex] = optimizationResults; optimizationResults_testSet[patternPairIndex] = optimizationResults;
totalNumberOfSimulationCrashes += totalNumberOfSimulationCrashes +=
optimizationResults.numberOfSimulationCrashes; optimizationResults.numberOfSimulationCrashes;
optimizationResults.draw();
} }
auto end = std::chrono::high_resolution_clock::now(); auto end = std::chrono::high_resolution_clock::now();
auto runtime_ms = auto runtime_ms =
@ -144,7 +145,6 @@ int main(int argc, char *argv[]) {
std::filesystem::create_directories(std::filesystem::path(saveToPath)); std::filesystem::create_directories(std::filesystem::path(saveToPath));
optimizationResults_testSet[patternPairIndex].save(saveToPath.string()); optimizationResults_testSet[patternPairIndex].save(saveToPath.string());
optimizationResults_testSet[patternPairIndex].draw();
} }
csvFile statistics(std::filesystem::path(thisOptimizationDirectory) csvFile statistics(std::filesystem::path(thisOptimizationDirectory)
.append("statistics.csv") .append("statistics.csv")

View File

@ -9,12 +9,12 @@
struct GlobalOptimizationVariables { struct GlobalOptimizationVariables {
std::vector<Eigen::MatrixX3d> g_optimalReducedModelDisplacements; std::vector<Eigen::MatrixX3d> g_optimalReducedModelDisplacements;
std::vector<std::vector<Vector6d>> fullPatternDisplacements;
std::vector<double> fullPatternDisplacementNormSum;
std::vector<SimulationJob> g_fullPatternSimulationJob; std::vector<SimulationJob> g_fullPatternSimulationJob;
std::vector<std::shared_ptr<SimulationJob>> reducedPatternSimulationJobs; std::vector<std::shared_ptr<SimulationJob>> reducedPatternSimulationJobs;
std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex> std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
reducedToFullInterfaceViMap; reducedToFullInterfaceViMap;
std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
g_reducedToFullViMap;
matplot::line_handle gPlotHandle; matplot::line_handle gPlotHandle;
std::vector<double> gObjectiveValueHistory; std::vector<double> gObjectiveValueHistory;
Eigen::Vector2d g_initialX; Eigen::Vector2d g_initialX;
@ -122,39 +122,9 @@ GlobalOptimizationVariables tls[MAX_THREAD] __attribute__((aligned(64)));
// } // }
//}; //};
double ReducedModelOptimizer::computeError(
const SimulationResults &reducedPatternResults,
const Eigen::MatrixX3d &optimalReducedPatternDisplacements) {
double error = 0;
auto &global = tls[omp_get_thread_num()];
for (const auto reducedFullViPair : global.reducedToFullInterfaceViMap) {
VertexIndex reducedModelVi = reducedFullViPair.first;
// const auto pos =
// g_reducedPatternSimulationJob.mesh->vert[reducedModelVi].cP();
// std::cout << "Interface vi " << reducedModelVi << " is at position "
// << pos[0] << " " << pos[1] << " " << pos[2] << std::endl;
Eigen::Vector3d vertexDisplacement(
reducedPatternResults.displacements[reducedModelVi][0],
reducedPatternResults.displacements[reducedModelVi][1],
reducedPatternResults.displacements[reducedModelVi][2]);
if (!std::isfinite(vertexDisplacement[0]) ||
!std::isfinite(vertexDisplacement[1]) ||
!std::isfinite(vertexDisplacement[2])) {
return std::numeric_limits<double>::max();
}
Eigen::Vector3d errorVector =
Eigen::Vector3d(
optimalReducedPatternDisplacements.row(reducedModelVi)) -
vertexDisplacement;
// error += errorVector.squaredNorm();
error += errorVector.norm();
}
return error;
}
double ReducedModelOptimizer::computeError( double ReducedModelOptimizer::computeError(
const std::vector<Vector6d> &reducedPatternDisplacements, const std::vector<Vector6d> &reducedPatternDisplacements,
const std::vector<Vector6d> &fullPatternDisplacements, const std::vector<Vector6d> &fullPatternDisplacements,const double& interfaceDisplacementsNormSum,
const std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex> const std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
&reducedToFullInterfaceViMap) { &reducedToFullInterfaceViMap) {
double error = 0; double error = 0;
@ -182,7 +152,9 @@ double ReducedModelOptimizer::computeError(
// error += errorVector.squaredNorm(); // error += errorVector.squaredNorm();
error += errorVector.norm(); error += errorVector.norm();
} }
return error;
return error/std::max(interfaceDisplacementsNormSum,0.00003);
//return error;
} }
void updateMesh(long n, const double *x) { void updateMesh(long n, const double *x) {
@ -317,9 +289,8 @@ double ReducedModelOptimizer::objective(long n, const double *x) {
// simulationSettings); // simulationSettings);
global.numOfSimulationCrashes++; global.numOfSimulationCrashes++;
} else { } else {
error += computeError( error += computeError(
reducedModelResults, reducedModelResults.displacements, global.fullPatternDisplacements[simulationScenarioIndex],global.fullPatternDisplacementNormSum[simulationScenarioIndex], global.reducedToFullInterfaceViMap);
global.g_optimalReducedModelDisplacements[simulationScenarioIndex]);
filename = "/home/iason/Coding/Projects/Approximating shapes with flat " filename = "/home/iason/Coding/Projects/Approximating shapes with flat "
"patterns/RodModelOptimizationForPatterns/build/" "patterns/RodModelOptimizationForPatterns/build/"
"ProblematicSimulationJobs/conv_dimensions.txt"; "ProblematicSimulationJobs/conv_dimensions.txt";
@ -1081,8 +1052,14 @@ void ReducedModelOptimizer::visualizeResults(
reducedPatternSimulationJobs[simulationScenarioIndex]; reducedPatternSimulationJobs[simulationScenarioIndex];
SimulationResults reducedModelResults = SimulationResults reducedModelResults =
simulator.executeSimulation(pReducedPatternSimulationJob); simulator.executeSimulation(pReducedPatternSimulationJob);
double interfaceDisplacementNormSum = 0;
for (const auto& interfaceViPair : reducedToFullInterfaceViMap) {
const int fullPatternInterfaceIndex = interfaceViPair.second;
Eigen::Vector3d fullPatternDisplacementVector(fullModelResults.displacements[fullPatternInterfaceIndex][0], fullModelResults.displacements[fullPatternInterfaceIndex][1], fullModelResults.displacements[fullPatternInterfaceIndex][2]);
interfaceDisplacementNormSum += fullPatternDisplacementVector.norm();
}
double error = computeError(reducedModelResults.displacements, double error = computeError(reducedModelResults.displacements,
fullModelResults.displacements, fullModelResults.displacements,interfaceDisplacementNormSum,
reducedToFullInterfaceViMap); reducedToFullInterfaceViMap);
std::cout << "Error of simulation scenario " std::cout << "Error of simulation scenario "
<< simulationScenarioStrings[simulationScenarioIndex] << " is " << simulationScenarioStrings[simulationScenarioIndex] << " is "
@ -1124,6 +1101,8 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize(
createScenarios(m_pFullPatternSimulationMesh); createScenarios(m_pFullPatternSimulationMesh);
global.g_optimalReducedModelDisplacements.resize(6); global.g_optimalReducedModelDisplacements.resize(6);
global.reducedPatternSimulationJobs.resize(6); global.reducedPatternSimulationJobs.resize(6);
global.fullPatternDisplacements.resize(6);
global.fullPatternDisplacementNormSum.resize(6);
global.g_firstRoundIterationIndex = 0; global.g_firstRoundIterationIndex = 0;
global.minY = std::numeric_limits<double>::max(); global.minY = std::numeric_limits<double>::max();
global.numOfSimulationCrashes = 0; global.numOfSimulationCrashes = 0;
@ -1137,11 +1116,20 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize(
simulationJobs[simulationScenarioIndex]; simulationJobs[simulationScenarioIndex];
SimulationResults fullModelResults = SimulationResults fullModelResults =
simulator.executeSimulation(pFullPatternSimulationJob, settings); simulator.executeSimulation(pFullPatternSimulationJob, settings);
global.g_optimalReducedModelDisplacements[simulationScenarioIndex].resize( global.fullPatternDisplacements[simulationScenarioIndex] = fullModelResults.displacements;
m_pReducedPatternSimulationMesh->VN(), 3); double interfaceDisplacementNormSum = 0;
computeDesiredReducedModelDisplacements( for (const auto& interfaceViPair : global.reducedToFullInterfaceViMap) {
fullModelResults, global.reducedToFullInterfaceViMap, const int fullPatternInterfaceIndex = interfaceViPair.second;
global.g_optimalReducedModelDisplacements[simulationScenarioIndex]); Eigen::Vector3d fullPatternDisplacementVector(fullModelResults.displacements[fullPatternInterfaceIndex][0], fullModelResults.displacements[fullPatternInterfaceIndex][1], fullModelResults.displacements[fullPatternInterfaceIndex][2]);
interfaceDisplacementNormSum += fullPatternDisplacementVector.norm();
}
global.fullPatternDisplacementNormSum[simulationScenarioIndex] = interfaceDisplacementNormSum;
//global.g_optimalReducedModelDisplacements[simulationScenarioIndex].resize(
// m_pReducedPatternSimulationMesh->VN(), 3);
//computeDesiredReducedModelDisplacements(
// fullModelResults, global.reducedToFullInterfaceViMap,
// global.g_optimalReducedModelDisplacements[simulationScenarioIndex]);
SimulationJob reducedPatternSimulationJob; SimulationJob reducedPatternSimulationJob;
reducedPatternSimulationJob.pMesh = m_pReducedPatternSimulationMesh; reducedPatternSimulationJob.pMesh = m_pReducedPatternSimulationMesh;
computeReducedModelSimulationJob(*pFullPatternSimulationJob, computeReducedModelSimulationJob(*pFullPatternSimulationJob,
@ -1161,7 +1149,7 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize(
// optResults.draw(); // optResults.draw();
// visualizeResults(simulationJobs, global.simulationScenarioIndices); // visualizeResults(simulationJobs, global.simulationScenarioIndices);
// visualizeResults(simulationJobs, global.g_reducedPatternSimulationJob, visualizeResults(simulationJobs, global.reducedPatternSimulationJobs,
// global.g_simulationScenarioIndices); global.simulationScenarioIndices,global.reducedToFullInterfaceViMap);
return optResults; return optResults;
} }

View File

@ -46,7 +46,8 @@ public:
struct Settings { struct Settings {
std::vector<xRange> xRanges; std::vector<xRange> xRanges;
int numberOfFunctionCalls{100}; int numberOfFunctionCalls{100};
double solutionAccuracy{1e-5}; double solutionAccuracy{1e-2};
bool normalizeObjectiveValue{ true };
std::string toString() const { std::string toString() const {
std::string settingsString; std::string settingsString;
@ -146,7 +147,7 @@ public:
&reducedToFullInterfaceViMap); &reducedToFullInterfaceViMap);
static double computeError(const std::vector<Vector6d> &reducedPatternResults, static double computeError(const std::vector<Vector6d> &reducedPatternResults,
const std::vector<Vector6d> &fullPatternResults, const std::vector<Vector6d> &fullPatternResults,const double& interfaceDisplacementNormSum,
const std::unordered_map<ReducedPatternVertexIndex, const std::unordered_map<ReducedPatternVertexIndex,
FullPatternVertexIndex> FullPatternVertexIndex>
&reducedToFullInterfaceViMap); &reducedToFullInterfaceViMap);