From 58e04fe16271c18d9c46884403619302726d81a3 Mon Sep 17 00:00:00 2001 From: iasonmanolas Date: Mon, 3 Jan 2022 15:57:57 +0200 Subject: [PATCH] Optimization settings file path as input to the reduced model optimizer --- src/main.cpp | 210 +++------------------------------- src/reducedmodeloptimizer.cpp | 4 +- 2 files changed, 17 insertions(+), 197 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 37bf2e2..58d11d3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,16 +21,14 @@ #endif int main(int argc, char *argv[]) { - if (argc <= 6) { - std::cerr << "Wrong number of input parameters. Expects at least 6 input parameters." + if (argc <= 5) { + std::cerr << "Wrong number of input parameters. Expects at least 4 input parameters." "Usage:\n" "1)full pattern file path\n" "2)reduced pattern file path\n" - "3)Number of optimizaion function calls\n" - "4)Translational error weight\n" - "5)Optimization results directory path\n" - "6)[optional]Intermediate results directory path\n" - "7)[optional]Optimization parameters\n" + "3)Optimization settings json file path\n" + "4)Optimization results directory path\n" + "5)[optional]Intermediate results directory path\n" "Exiting.." << std::endl; return 1; @@ -54,195 +52,17 @@ int main(int argc, char *argv[]) std::cerr << "Input optimization settings file does not exist:" << optimizationSettingsFilePath << std::endl; } - - ReducedPatternOptimization::xRange beamE{"E", 0.001, 1000}; - ReducedPatternOptimization::xRange beamA{"A", 0.001, 1000}; - ReducedPatternOptimization::xRange beamI2{"I2", 0.001, 1000}; - ReducedPatternOptimization::xRange beamI3{"I3", 0.001, 1000}; - ReducedPatternOptimization::xRange beamJ{"J", 0.001, 1000}; - ReducedPatternOptimization::xRange innerHexagonSize{"R", 0.05, 0.95}; - ReducedPatternOptimization::xRange innerHexagonAngle{"Theta", -30.0, 30.0}; ReducedPatternOptimization::Settings settings_optimization; - settings_optimization.variablesRanges - = {beamE, beamA, beamI2, beamI3, beamJ, innerHexagonSize, innerHexagonAngle}; - settings_optimization.numberOfFunctionCalls = std::atoi(argv[3]); - - const bool input_optimizationParametersDefined = argc >= 8; - if (input_optimizationParametersDefined) { - const std::string optimizationParametersTag = argv[7]; - std::vector split = Utilities::split(optimizationParametersTag, ","); - //parse parameter tag - std::vector> - optimizationParameters; - std::vector parameterGroup; - for (std::string &s : split) { - // std::cout<(ReducedPatternOptimization::E)))) { - parameterGroup.push_back(ReducedPatternOptimization::E); - } else if (boost::algorithm::contains(s, - std::to_string(static_cast( - ReducedPatternOptimization::A)))) { - parameterGroup.push_back(ReducedPatternOptimization::A); - } else if (boost::algorithm::contains(s, - std::to_string(static_cast( - ReducedPatternOptimization::I2)))) { - parameterGroup.push_back(ReducedPatternOptimization::I2); - } else if (boost::algorithm::contains(s, - std::to_string(static_cast( - ReducedPatternOptimization::I3)))) { - parameterGroup.push_back(ReducedPatternOptimization::I3); - } else if (boost::algorithm::contains(s, - std::to_string(static_cast( - ReducedPatternOptimization::J)))) { - parameterGroup.push_back(ReducedPatternOptimization::J); - } else if (boost::algorithm::contains(s, - std::to_string(static_cast( - ReducedPatternOptimization::R)))) { - parameterGroup.push_back(ReducedPatternOptimization::R); - } else if (boost::algorithm::contains(s, - std::to_string(static_cast( - ReducedPatternOptimization::Theta)))) { - parameterGroup.push_back(ReducedPatternOptimization::Theta); - } else { - std::cerr << "Wrong optimization parameter input: " << optimizationParametersTag - << std::endl; - } - if (boost::algorithm::contains(s, "}")) { - optimizationParameters.push_back(parameterGroup); - } - } - settings_optimization.optimizationStrategy = optimizationParameters; -#ifdef POLYSCOPE_DEFINED - for (const std::vector &v : - settings_optimization.optimizationStrategy) { - for (const ReducedPatternOptimization::OptimizationParameterIndex &i : v) { - std::cout << static_cast(i) << " "; - } - std::cout << std::endl; - } -#endif - - } else { - enum OptimizationParameterComparisonScenarioIndex { - AllVar, - GeoYM, - MatGeo, - YMMat_Geo, - YM_MatGeo, - MatGeo_YM, - Geo_YM_Mat, - YM_Geo_Mat, - Geo_Mat, - YMGeo_Mat, - NumberOfScenarios - }; - const std::vector< - std::vector>> - optimizationParameters = [&]() { - std::vector< - std::vector>> - optimizationParameters(NumberOfScenarios); - using namespace ReducedPatternOptimization; - optimizationParameters[AllVar] = {{E, A, I2, I3, J, R, Theta}}; - optimizationParameters[GeoYM] = {{R, Theta, E}}; - optimizationParameters[MatGeo] = {{A, I2, I3, J, R, Theta}}; - optimizationParameters[YMMat_Geo] = {{E, A, I2, I3, J}, {R, Theta}}; - optimizationParameters[YM_MatGeo] = {{E}, {A, I2, I3, J, R, Theta}}; - optimizationParameters[MatGeo_YM] = {{A, I2, I3, J, R, Theta}, {E}}; - optimizationParameters[Geo_YM_Mat] = {{R, Theta}, {E}, {A, I2, I3, J}}; - optimizationParameters[YM_Geo_Mat] = {{E}, {R, Theta}, {A, I2, I3, J}}; - optimizationParameters[Geo_Mat] = {{R, Theta}, {A, I2, I3, J}}; - optimizationParameters[YMGeo_Mat] = {{E, R, Theta}, {A, I2, I3, J}}; - return optimizationParameters; - }(); - - constexpr OptimizationParameterComparisonScenarioIndex scenario = MatGeo; - settings_optimization.optimizationStrategy = optimizationParameters[scenario]; - if (scenario == YMGeo_Mat) { - settings_optimization.optimizationVariablesGroupsWeights = {0.15, 0.85}; - } - } - if (settings_optimization.optimizationStrategy.empty()) { - std::cerr << "No optimization variables. Exiting.." << std::endl; - std::terminate(); - } - - settings_optimization.normalizationStrategy - = ReducedPatternOptimization::Settings::NormalizationStrategy::Epsilon; - //#ifdef POLYSCOPE_DEFINED - //#else - settings_optimization.translationNormalizationParameter = 4e-3; - settings_optimization.rotationNormalizationParameter = vcg::math::ToRad(3.0); - - // settings_optimization.translationNormalizationParameter = 0; - // settings_optimization.rotationNormalizationParameter = 0; - - // settings_optimization.translationNormalizationParameter = 1e-3; - // settings_optimization.rotationNormalizationParameter = vcg::math::ToRad(3.0); - - // settings_optimization.translationNormalizationParameter = 5e-2; - // settings_optimization.rotationNormalizationParameter = vcg::math::ToRad(3.0); - - //#endif - settings_optimization.solverAccuracy = 1e-2; - //TODO refactor that - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Axial] - .translational - = 1.5; - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Axial].rotational - = 2 - - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Axial] - .translational; - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Shear] - .translational - = 1.5; - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Shear].rotational - = 2 - - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Shear] - .translational; - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Bending] - .translational - = 1.2; - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Bending] - .rotational - = 2 - - settings_optimization - .perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Bending] - .translational; - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Dome] - .translational - = 1.95; - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Dome].rotational - = 2 - - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Dome] - .translational; - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Saddle] - .translational - = 1.2; - settings_optimization.perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Saddle] - .rotational - = 2 - - settings_optimization - .perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Saddle] - .translational; + settings_optimization.load(optimizationSettingsFilePath); // Optimize pairthere - const std::string pairName = fullPattern.getLabel(); // + "@" + reducedPattern.getLabel(); - const std::string optimizationName - = pairName + "(" + std::to_string(settings_optimization.numberOfFunctionCalls) + "_" - + to_string_with_precision( - settings_optimization - .perBaseScenarioObjectiveWeights[ReducedPatternOptimization::Axial] - .translational) - + ")"; - const std::string optimizationResultsDirectory = argv[5]; + const std::string pairName = std::to_string(fullPattern.EN()) + "#" + + fullPattern.getLabel(); // + "@" + reducedPattern.getLabel(); + const std::string optimizationName = pairName + "(" + + std::to_string( + settings_optimization.numberOfFunctionCalls) + + ")"; + const std::string optimizationResultsDirectory = argv[4]; std::string resultsOutputDir; bool optimizationResultFolderExists = false; const std::filesystem::path crashedJobsDirPath( @@ -277,9 +97,9 @@ int main(int argc, char *argv[]) const std::vector numberOfNodesPerSlot{1, 0, 0, 2, 1, 2, 1}; assert(interfaceNodeIndex == numberOfNodesPerSlot[0] + numberOfNodesPerSlot[3]); ReducedModelOptimizer optimizer(numberOfNodesPerSlot); - const bool input_intermediateResultsDirectoryDefined = argc >= 7; + const bool input_intermediateResultsDirectoryDefined = argc == 6; if (input_intermediateResultsDirectoryDefined) { - optimizer.setIntermediateResultsDirectoryPath(std::filesystem::path(argv[6])); + optimizer.setIntermediateResultsDirectoryPath(std::filesystem::path(argv[5])); } optimizer.initializePatterns(fullPattern, reducedPattern, diff --git a/src/reducedmodeloptimizer.cpp b/src/reducedmodeloptimizer.cpp index e7d3d1d..afa7dd2 100644 --- a/src/reducedmodeloptimizer.cpp +++ b/src/reducedmodeloptimizer.cpp @@ -1808,12 +1808,12 @@ void ReducedModelOptimizer::computeObjectiveValueNormalizationFactors() if (global.optimizationSettings.normalizationStrategy == Settings::NormalizationStrategy::Epsilon) { const double epsilon_translationalDisplacement = global.optimizationSettings - .translationNormalizationParameter; + .translationNormalizationEpsilon; global.translationalDisplacementNormalizationValues[simulationScenarioIndex] = std::max(fullPatternTranslationalDisplacementNormSum[simulationScenarioIndex], epsilon_translationalDisplacement); const double epsilon_rotationalDisplacement = global.optimizationSettings - .rotationNormalizationParameter; + .rotationNormalizationEpsilon; global.rotationalDisplacementNormalizationValues[simulationScenarioIndex] = std::max(fullPatternAngularDistance[simulationScenarioIndex], epsilon_rotationalDisplacement);