Optimization settings file path as input to the reduced model optimizer

This commit is contained in:
iasonmanolas 2022-01-03 15:57:57 +02:00
parent da04f1f9c3
commit 58e04fe162
2 changed files with 17 additions and 197 deletions

View File

@ -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<std::string> split = Utilities::split(optimizationParametersTag, ",");
//parse parameter tag
std::vector<std::vector<ReducedPatternOptimization::OptimizationParameterIndex>>
optimizationParameters;
std::vector<ReducedPatternOptimization::OptimizationParameterIndex> parameterGroup;
for (std::string &s : split) {
// std::cout<<s<<std::endl;
// s=Utilities::trimLeftAndRightSpaces(s);
if (boost::algorithm::contains(s, "{")) {
// std::cout<<"{ detected"<<std::endl;
parameterGroup.clear();
}
if (boost::algorithm::contains(s,
std::to_string(
static_cast<int>(ReducedPatternOptimization::E)))) {
parameterGroup.push_back(ReducedPatternOptimization::E);
} else if (boost::algorithm::contains(s,
std::to_string(static_cast<int>(
ReducedPatternOptimization::A)))) {
parameterGroup.push_back(ReducedPatternOptimization::A);
} else if (boost::algorithm::contains(s,
std::to_string(static_cast<int>(
ReducedPatternOptimization::I2)))) {
parameterGroup.push_back(ReducedPatternOptimization::I2);
} else if (boost::algorithm::contains(s,
std::to_string(static_cast<int>(
ReducedPatternOptimization::I3)))) {
parameterGroup.push_back(ReducedPatternOptimization::I3);
} else if (boost::algorithm::contains(s,
std::to_string(static_cast<int>(
ReducedPatternOptimization::J)))) {
parameterGroup.push_back(ReducedPatternOptimization::J);
} else if (boost::algorithm::contains(s,
std::to_string(static_cast<int>(
ReducedPatternOptimization::R)))) {
parameterGroup.push_back(ReducedPatternOptimization::R);
} else if (boost::algorithm::contains(s,
std::to_string(static_cast<int>(
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<ReducedPatternOptimization::OptimizationParameterIndex> &v :
settings_optimization.optimizationStrategy) {
for (const ReducedPatternOptimization::OptimizationParameterIndex &i : v) {
std::cout << static_cast<int>(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<std::vector<ReducedPatternOptimization::OptimizationParameterIndex>>>
optimizationParameters = [&]() {
std::vector<
std::vector<std::vector<ReducedPatternOptimization::OptimizationParameterIndex>>>
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<size_t> 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,

View File

@ -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);