From 135c9fd97593eb63f6140752685b7b60d82a03fd Mon Sep 17 00:00:00 2001 From: iasonmanolas Date: Fri, 12 Feb 2021 19:58:40 +0200 Subject: [PATCH] Normalizing per simulation scenario using the max(sum(fullPatternDisplacementNorm,d_e)) --- src/main.cpp | 18 ++++---- src/reducedmodeloptimizer.cpp | 78 +++++++++++++++-------------------- src/reducedmodeloptimizer.hpp | 5 ++- 3 files changed, 45 insertions(+), 56 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ccbf59d..cc95582 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -72,15 +72,15 @@ int main(int argc, char *argv[]) { FlatPattern fullPattern(filepathString); fullPattern.setLabel(filepath.stem().string()); fullPattern.scale(0.03); - for (int reducedPatternIndex = 0; - reducedPatternIndex < reducedModels.size(); reducedPatternIndex++) { + //for (int reducedPatternIndex = 0; + // reducedPatternIndex < reducedModels.size(); reducedPatternIndex++) { FlatPattern *pFullPattern = new FlatPattern(); pFullPattern->copy(fullPattern); FlatPattern *pReducedPattern = new FlatPattern(); - pReducedPattern->copy(*reducedModels[reducedPatternIndex]); - //pReducedPattern->copy(*reducedModels[0]); + //pReducedPattern->copy(*reducedModels[reducedPatternIndex]); + pReducedPattern->copy(*reducedModels[0]); patternPairs.push_back(std::make_pair(pFullPattern, pReducedPattern)); - } + //} } // 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; // settings_optimization.numberOfFunctionCalls < 5000; // settings_optimization.numberOfFunctionCalls += 100) { - settings_optimization.numberOfFunctionCalls = 10; + settings_optimization.numberOfFunctionCalls = 100; const std::string optimizationSettingsString = settings_optimization.toString(); std::string optimiziationResultsDirectory = "../OptimizationResults"; @@ -116,7 +116,7 @@ int main(int argc, char *argv[]) { patternPairs.size()); auto start = std::chrono::high_resolution_clock::now(); - #pragma omp parallel for + //#pragma omp parallel for for (int patternPairIndex = 0; patternPairIndex < patternPairs.size(); patternPairIndex++) { const std::vector numberOfNodesPerSlot{1, 0, 0, 2, 1, 2, 1}; @@ -124,12 +124,13 @@ int main(int argc, char *argv[]) { optimizer.initializePatterns(*patternPairs[patternPairIndex].first, *patternPairs[patternPairIndex].second, {}); ReducedModelOptimizer::Results optimizationResults = - optimizer.optimize(settings_optimization); + optimizer.optimize(settings_optimization, {ReducedModelOptimizer::SimulationScenario::Dome}); totalError += optimizationResults.objectiveValue; optimizationResults_testSet[patternPairIndex] = optimizationResults; totalNumberOfSimulationCrashes += optimizationResults.numberOfSimulationCrashes; + optimizationResults.draw(); } auto end = std::chrono::high_resolution_clock::now(); auto runtime_ms = @@ -144,7 +145,6 @@ int main(int argc, char *argv[]) { std::filesystem::create_directories(std::filesystem::path(saveToPath)); optimizationResults_testSet[patternPairIndex].save(saveToPath.string()); - optimizationResults_testSet[patternPairIndex].draw(); } csvFile statistics(std::filesystem::path(thisOptimizationDirectory) .append("statistics.csv") diff --git a/src/reducedmodeloptimizer.cpp b/src/reducedmodeloptimizer.cpp index 8cfb7fd..a4807a6 100644 --- a/src/reducedmodeloptimizer.cpp +++ b/src/reducedmodeloptimizer.cpp @@ -9,12 +9,12 @@ struct GlobalOptimizationVariables { std::vector g_optimalReducedModelDisplacements; + std::vector> fullPatternDisplacements; + std::vector fullPatternDisplacementNormSum; std::vector g_fullPatternSimulationJob; std::vector> reducedPatternSimulationJobs; std::unordered_map reducedToFullInterfaceViMap; - std::unordered_map - g_reducedToFullViMap; matplot::line_handle gPlotHandle; std::vector gObjectiveValueHistory; 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::max(); - } - Eigen::Vector3d errorVector = - Eigen::Vector3d( - optimalReducedPatternDisplacements.row(reducedModelVi)) - - vertexDisplacement; - // error += errorVector.squaredNorm(); - error += errorVector.norm(); - } - return error; -} - double ReducedModelOptimizer::computeError( const std::vector &reducedPatternDisplacements, - const std::vector &fullPatternDisplacements, + const std::vector &fullPatternDisplacements,const double& interfaceDisplacementsNormSum, const std::unordered_map &reducedToFullInterfaceViMap) { double error = 0; @@ -182,7 +152,9 @@ double ReducedModelOptimizer::computeError( // error += errorVector.squaredNorm(); error += errorVector.norm(); } - return error; + + return error/std::max(interfaceDisplacementsNormSum,0.00003); + //return error; } void updateMesh(long n, const double *x) { @@ -317,9 +289,8 @@ double ReducedModelOptimizer::objective(long n, const double *x) { // simulationSettings); global.numOfSimulationCrashes++; } else { - error += computeError( - reducedModelResults, - global.g_optimalReducedModelDisplacements[simulationScenarioIndex]); + error += computeError( + reducedModelResults.displacements, global.fullPatternDisplacements[simulationScenarioIndex],global.fullPatternDisplacementNormSum[simulationScenarioIndex], global.reducedToFullInterfaceViMap); filename = "/home/iason/Coding/Projects/Approximating shapes with flat " "patterns/RodModelOptimizationForPatterns/build/" "ProblematicSimulationJobs/conv_dimensions.txt"; @@ -1081,8 +1052,14 @@ void ReducedModelOptimizer::visualizeResults( reducedPatternSimulationJobs[simulationScenarioIndex]; SimulationResults reducedModelResults = 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, - fullModelResults.displacements, + fullModelResults.displacements,interfaceDisplacementNormSum, reducedToFullInterfaceViMap); std::cout << "Error of simulation scenario " << simulationScenarioStrings[simulationScenarioIndex] << " is " @@ -1124,6 +1101,8 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize( createScenarios(m_pFullPatternSimulationMesh); global.g_optimalReducedModelDisplacements.resize(6); global.reducedPatternSimulationJobs.resize(6); + global.fullPatternDisplacements.resize(6); + global.fullPatternDisplacementNormSum.resize(6); global.g_firstRoundIterationIndex = 0; global.minY = std::numeric_limits::max(); global.numOfSimulationCrashes = 0; @@ -1137,11 +1116,20 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize( simulationJobs[simulationScenarioIndex]; SimulationResults fullModelResults = simulator.executeSimulation(pFullPatternSimulationJob, settings); - global.g_optimalReducedModelDisplacements[simulationScenarioIndex].resize( - m_pReducedPatternSimulationMesh->VN(), 3); - computeDesiredReducedModelDisplacements( - fullModelResults, global.reducedToFullInterfaceViMap, - global.g_optimalReducedModelDisplacements[simulationScenarioIndex]); + global.fullPatternDisplacements[simulationScenarioIndex] = fullModelResults.displacements; + double interfaceDisplacementNormSum = 0; + for (const auto& interfaceViPair : global.reducedToFullInterfaceViMap) { + const int fullPatternInterfaceIndex = interfaceViPair.second; + 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; reducedPatternSimulationJob.pMesh = m_pReducedPatternSimulationMesh; computeReducedModelSimulationJob(*pFullPatternSimulationJob, @@ -1161,7 +1149,7 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize( // optResults.draw(); // visualizeResults(simulationJobs, global.simulationScenarioIndices); - // visualizeResults(simulationJobs, global.g_reducedPatternSimulationJob, - // global.g_simulationScenarioIndices); + visualizeResults(simulationJobs, global.reducedPatternSimulationJobs, + global.simulationScenarioIndices,global.reducedToFullInterfaceViMap); return optResults; } diff --git a/src/reducedmodeloptimizer.hpp b/src/reducedmodeloptimizer.hpp index b404592..22ebd03 100644 --- a/src/reducedmodeloptimizer.hpp +++ b/src/reducedmodeloptimizer.hpp @@ -46,7 +46,8 @@ public: struct Settings { std::vector xRanges; int numberOfFunctionCalls{100}; - double solutionAccuracy{1e-5}; + double solutionAccuracy{1e-2}; + bool normalizeObjectiveValue{ true }; std::string toString() const { std::string settingsString; @@ -146,7 +147,7 @@ public: &reducedToFullInterfaceViMap); static double computeError(const std::vector &reducedPatternResults, - const std::vector &fullPatternResults, + const std::vector &fullPatternResults,const double& interfaceDisplacementNormSum, const std::unordered_map &reducedToFullInterfaceViMap);