Refactoring

This commit is contained in:
Iason 2021-02-18 12:12:52 +02:00
parent 3a5ef38645
commit ae645b27d2
2 changed files with 162 additions and 137 deletions

View File

@ -16,47 +16,51 @@
#include <string> #include <string>
#include <vcg/complex/algorithms/update/position.h> #include <vcg/complex/algorithms/update/position.h>
void exportOptimizationResults(const ReducedModelOptimizer::Results& optimizationResults,const std::filesystem::path& optimizationDirectory,const ReducedModelOptimizer::Settings& settings_optimization,csvFile& statistics,const std::pair<FlatPattern *, FlatPattern *> patternPair) { void exportOptimizationResults(
std::filesystem::path saveToPath( const ReducedModelOptimizer::Results &optimizationResults,
std::filesystem::path(optimizationDirectory) const std::filesystem::path &optimizationDirectory,
.append(patternPair.first->getLabel() + "@" + const ReducedModelOptimizer::Settings &settings_optimization,
patternPair.second->getLabel())); csvFile &statistics,
std::filesystem::create_directories(std::filesystem::path(saveToPath)); const std::pair<FlatPattern *, FlatPattern *> patternPair) {
std::filesystem::path saveToPath(std::filesystem::path(optimizationDirectory)
.append(patternPair.first->getLabel() +
"@" +
patternPair.second->getLabel()));
std::filesystem::create_directories(std::filesystem::path(saveToPath));
optimizationResults.save(saveToPath.string()); optimizationResults.save(saveToPath.string());
statistics << patternPair.first->getLabel() + "@" + statistics << patternPair.first->getLabel() + "@" +
patternPair.second->getLabel(); patternPair.second->getLabel();
statistics << optimizationResults.objectiveValue; statistics << optimizationResults.objectiveValue;
for (const double &optimalX : for (const double &optimalX : optimizationResults.x) {
optimizationResults.x) { statistics << optimalX;
statistics << optimalX; }
}
for (int unusedXVarCounter = 0; for (int unusedXVarCounter = 0;
unusedXVarCounter < unusedXVarCounter <
settings_optimization.xRanges.size() - settings_optimization.xRanges.size() - optimizationResults.x.size();
optimizationResults.x.size(); unusedXVarCounter++) {
unusedXVarCounter++) { statistics << "-";
statistics << "-"; }
}
statistics << optimizationResults.time;
if (optimizationResults.numberOfSimulationCrashes == 0) {
statistics << "No crashes";
} else {
statistics << optimizationResults.numberOfSimulationCrashes;
}
statistics << endrow;
statistics << optimizationResults.time;
if (optimizationResults.numberOfSimulationCrashes == 0) {
statistics << "No crashes";
} else {
statistics << optimizationResults.numberOfSimulationCrashes;
}
statistics << endrow;
} }
void optimizeTestSet(const std::vector<std::pair<FlatPattern *, FlatPattern *>> patternPairs,const ReducedModelOptimizer::Settings& settings_optimization,const std::string& saveTo) { void optimizeTestSet(
const std::vector<std::pair<FlatPattern *, FlatPattern *>> patternPairs,
const ReducedModelOptimizer::Settings &settings_optimization,
const std::string &saveTo) {
const std::string optimizationSettingsString = const std::string optimizationSettingsString =
settings_optimization.toString(); settings_optimization.toString();
std::filesystem::path thisOptimizationDirectory( std::filesystem::path thisOptimizationDirectory(
std::filesystem::path(saveTo) std::filesystem::path(saveTo).append(optimizationSettingsString));
.append(optimizationSettingsString)); //.append("Results"));
//.append("Results"));
std::filesystem::create_directories(thisOptimizationDirectory); std::filesystem::create_directories(thisOptimizationDirectory);
std::cout << optimizationSettingsString << std::endl; std::cout << optimizationSettingsString << std::endl;
csvFile csv_settings(std::filesystem::path(thisOptimizationDirectory) csvFile csv_settings(std::filesystem::path(thisOptimizationDirectory)
@ -85,66 +89,72 @@ void optimizeTestSet(const std::vector<std::pair<FlatPattern *, FlatPattern *>>
std::vector<ReducedModelOptimizer::Results> optimizationResults_testSet( std::vector<ReducedModelOptimizer::Results> optimizationResults_testSet(
patternPairs.size()); patternPairs.size());
auto start = std::chrono::high_resolution_clock::now(); auto start = std::chrono::high_resolution_clock::now();
int pairsOptimized=0; int pairsOptimized = 0;
#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::pair<FlatPattern*, FlatPattern*>& const std::pair<FlatPattern *, FlatPattern *> &patternPair =
patternPair = patternPairs[patternPairIndex]; patternPairs[patternPairIndex];
const std::vector<size_t> numberOfNodesPerSlot{ 1, 0, 0, 2, 1, 2, 1 }; std::cout << "Optimizing " << patternPair.first->getLabel() << "@"
ReducedModelOptimizer optimizer(numberOfNodesPerSlot); << patternPair.second->getLabel() << std::endl;
optimizer.initializePatterns(*patternPair.first, const std::vector<size_t> numberOfNodesPerSlot{1, 0, 0, 2, 1, 2, 1};
*patternPair.second, {}); ReducedModelOptimizer optimizer(numberOfNodesPerSlot);
ReducedModelOptimizer::Results optimizationResults = optimizer.initializePatterns(*patternPair.first, *patternPair.second, {});
optimizer.optimize(settings_optimization); ReducedModelOptimizer::Results optimizationResults =
optimizer.optimize(settings_optimization);
totalError += optimizationResults.objectiveValue; totalError += optimizationResults.objectiveValue;
optimizationResults_testSet[patternPairIndex] = optimizationResults; optimizationResults_testSet[patternPairIndex] = optimizationResults;
totalNumberOfSimulationCrashes += totalNumberOfSimulationCrashes +=
optimizationResults.numberOfSimulationCrashes; optimizationResults.numberOfSimulationCrashes;
std::cout << "Optimized " << ++pairsOptimized << "/" << patternPairs.size() << std::endl; std::cout << "Optimized " << ++pairsOptimized << "/" << patternPairs.size()
<< std::endl;
#pragma omp critical
{
exportOptimizationResults(optimizationResults, thisOptimizationDirectory,
settings_optimization, statistics, patternPair);
optimizationResults.draw();
}
} }
for (int patternPairIndex = 0; patternPairIndex < patternPairs.size(); // for (int patternPairIndex = 0; patternPairIndex < patternPairs.size();
patternPairIndex++) { // patternPairIndex++) {
const std::pair<FlatPattern*, FlatPattern*>& // const std::pair<FlatPattern *, FlatPattern *> &patternPair =
patternPair = patternPairs[patternPairIndex]; // patternPairs[patternPairIndex];
const ReducedModelOptimizer::Results optimizationResults=optimizationResults_testSet[patternPairIndex]; // const ReducedModelOptimizer::Results optimizationResults =
//Save results // optimizationResults_testSet[patternPairIndex];
std::filesystem::path saveToPath( // // Save results
std::filesystem::path(thisOptimizationDirectory) // std::filesystem::path saveToPath(
.append(patternPair.first->getLabel() + "@" + // std::filesystem::path(thisOptimizationDirectory)
patternPair.second->getLabel())); // .append(patternPair.first->getLabel() + "@" +
std::filesystem::create_directories(std::filesystem::path(saveToPath)); // patternPair.second->getLabel()));
optimizationResults.save(saveToPath.string()); // std::filesystem::create_directories(std::filesystem::path(saveToPath));
// optimizationResults.save(saveToPath.string());
//Save statistics // // Save statistics
statistics << patternPair.first->getLabel() + "@" + // statistics << patternPair.first->getLabel() + "@" +
patternPair.second->getLabel(); // patternPair.second->getLabel();
statistics << optimizationResults.objectiveValue; // statistics << optimizationResults.objectiveValue;
for (const double& optimalX : // for (const double &optimalX : optimizationResults.x) {
optimizationResults.x) { // statistics << optimalX;
statistics << optimalX; // }
}
for (int unusedXVarCounter = 0; // for (int unusedXVarCounter = 0;
unusedXVarCounter < // unusedXVarCounter <
settings_optimization.xRanges.size() - // settings_optimization.xRanges.size() -
optimizationResults.x.size(); // optimizationResults.x.size(); unusedXVarCounter++) {
unusedXVarCounter++) { // statistics << "-";
statistics << "-"; // }
}
statistics << optimizationResults.time; // statistics << optimizationResults.time;
if (optimizationResults.numberOfSimulationCrashes == 0) { // if (optimizationResults.numberOfSimulationCrashes == 0) {
statistics << "No crashes"; // statistics << "No crashes";
} // } else {
else { // statistics << optimizationResults.numberOfSimulationCrashes;
statistics << optimizationResults.numberOfSimulationCrashes; // }
} // statistics << endrow;
statistics << endrow; // }
}
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
@ -155,18 +165,20 @@ int main(int argc, char *argv[]) {
FlatPattern singleBarReducedModel(numberOfNodesPerSlot, FlatPattern singleBarReducedModel(numberOfNodesPerSlot,
singleBarReducedModelEdges); singleBarReducedModelEdges);
singleBarReducedModel.setLabel("SingleBar_reduced"); singleBarReducedModel.setLabel("SingleBar_reduced");
singleBarReducedModel.savePly(singleBarReducedModel.getLabel());
singleBarReducedModel.scale(0.03); singleBarReducedModel.scale(0.03);
std::vector<vcg::Point2i> CWreducedModelEdges{vcg::Point2i(1, 5), std::vector<vcg::Point2i> CWreducedModelEdges{vcg::Point2i(1, 5),
vcg::Point2i(3, 1)}; vcg::Point2i(3, 5)};
FlatPattern CWReducedModel(numberOfNodesPerSlot, CWreducedModelEdges); FlatPattern CWReducedModel(numberOfNodesPerSlot, CWreducedModelEdges);
CWReducedModel.setLabel("CCW_reduced"); CWReducedModel.setLabel("CW_reduced");
CWReducedModel.scale(0.03); CWReducedModel.scale(0.03);
std::vector<vcg::Point2i> CCWreducedModelEdges{vcg::Point2i(1, 5), std::vector<vcg::Point2i> CCWreducedModelEdges{vcg::Point2i(1, 5),
vcg::Point2i(3, 5)}; vcg::Point2i(3, 1)};
FlatPattern CCWReducedModel(numberOfNodesPerSlot, CCWreducedModelEdges); FlatPattern CCWReducedModel(numberOfNodesPerSlot, CCWreducedModelEdges);
CCWReducedModel.setLabel("CW_reduced"); CCWReducedModel.setLabel("CCW_reduced");
CCWReducedModel.savePly(CWReducedModel.getLabel());
CCWReducedModel.scale(0.03); CCWReducedModel.scale(0.03);
std::vector<FlatPattern *> reducedModels{&singleBarReducedModel, std::vector<FlatPattern *> reducedModels{&singleBarReducedModel,
@ -178,7 +190,7 @@ int main(int argc, char *argv[]) {
ReducedModelOptimizer::xRange beamE{"E", 0.1, 1.9}; ReducedModelOptimizer::xRange beamE{"E", 0.1, 1.9};
ReducedModelOptimizer::xRange innerHexagonSize{"HS", 0.1, 0.9}; ReducedModelOptimizer::xRange innerHexagonSize{"HS", 0.1, 0.9};
// Test set of full patterns // Test set of full patterns
std::string fullPatternsTestSetDirectory = "TestSet"; std::string fullPatternsTestSetDirectory = "../TestSet";
if (!std::filesystem::exists( if (!std::filesystem::exists(
std::filesystem::path(fullPatternsTestSetDirectory))) { std::filesystem::path(fullPatternsTestSetDirectory))) {
std::cerr << "Full pattern directory does not exist: " std::cerr << "Full pattern directory does not exist: "
@ -201,17 +213,18 @@ 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();
FlatPattern *pFullPattern = new FlatPattern(); // reducedPatternIndex++) {
pFullPattern->copy(fullPattern); FlatPattern *pFullPattern = new FlatPattern();
FlatPattern *pReducedPattern = new FlatPattern(); pFullPattern->copy(fullPattern);
pReducedPattern->copy(*reducedModels[reducedPatternIndex]); FlatPattern *pReducedPattern = new FlatPattern();
//pReducedPattern->copy(*reducedModels[0]); // pReducedPattern->copy(*reducedModels[reducedPatternIndex]);
patternPairs.push_back(std::make_pair(pFullPattern, pReducedPattern)); pReducedPattern->copy(*reducedModels[0]);
} 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)
@ -225,19 +238,19 @@ int main(int argc, char *argv[]) {
// settings_optimization.numberOfFunctionCalls += 100) { // settings_optimization.numberOfFunctionCalls += 100) {
std::string optimiziationResultsDirectory = "OptimizationResults"; std::string optimiziationResultsDirectory = "OptimizationResults";
if (argc < 2) { if (argc < 2) {
settings_optimization.numberOfFunctionCalls =100; settings_optimization.numberOfFunctionCalls = 100;
} else if (argc == 2) {
settings_optimization.numberOfFunctionCalls = std::atoi(argv[1]);
} else if (argc == 3) {
settings_optimization.numberOfFunctionCalls = std::atoi(argv[1]);
optimiziationResultsDirectory = argv[2];
} }
else if (argc == 2) { // settings_optimization.normalizeObjectiveValue = false;
settings_optimization.numberOfFunctionCalls =std::atoi(argv[1]); // optimizeTestSet(patternPairs, settings_optimization,
} // optimiziationResultsDirectory);
else if (argc == 3) {
settings_optimization.numberOfFunctionCalls =std::atoi(argv[1]);
optimiziationResultsDirectory = argv[2];
}
settings_optimization.normalizeObjectiveValue =false;
optimizeTestSet(patternPairs,settings_optimization,optimiziationResultsDirectory);
settings_optimization.normalizeObjectiveValue = true; settings_optimization.normalizeObjectiveValue = true;
optimizeTestSet(patternPairs,settings_optimization,optimiziationResultsDirectory); optimizeTestSet(patternPairs, settings_optimization,
optimiziationResultsDirectory);
for (auto &patternPair : patternPairs) { for (auto &patternPair : patternPairs) {
delete patternPair.first; delete patternPair.first;

View File

@ -125,7 +125,8 @@ GlobalOptimizationVariables tls[MAX_THREAD] __attribute__((aligned(64)));
double ReducedModelOptimizer::computeError( double ReducedModelOptimizer::computeError(
const std::vector<Vector6d> &reducedPatternDisplacements, const std::vector<Vector6d> &reducedPatternDisplacements,
const std::vector<Vector6d> &fullPatternDisplacements,const double& interfaceDisplacementsNormSum, const std::vector<Vector6d> &fullPatternDisplacements,
const double &interfaceDisplacementsNormSum,
const std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex> const std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
&reducedToFullInterfaceViMap) { &reducedToFullInterfaceViMap) {
auto &global = tls[omp_get_thread_num()]; auto &global = tls[omp_get_thread_num()];
@ -156,7 +157,7 @@ double ReducedModelOptimizer::computeError(
} }
if (global.optimizationSettings.normalizeObjectiveValue) { if (global.optimizationSettings.normalizeObjectiveValue) {
return error/std::max(interfaceDisplacementsNormSum,0.00003); return error / std::max(interfaceDisplacementsNormSum, 0.00003);
} }
return error; return error;
} }
@ -293,8 +294,11 @@ double ReducedModelOptimizer::objective(long n, const double *x) {
// simulationSettings); // simulationSettings);
global.numOfSimulationCrashes++; global.numOfSimulationCrashes++;
} else { } else {
error += computeError( error += computeError(
reducedModelResults.displacements, global.fullPatternDisplacements[simulationScenarioIndex],global.fullPatternDisplacementNormSum[simulationScenarioIndex], global.reducedToFullInterfaceViMap); reducedModelResults.displacements,
global.fullPatternDisplacements[simulationScenarioIndex],
global.fullPatternDisplacementNormSum[simulationScenarioIndex],
global.reducedToFullInterfaceViMap);
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";
@ -327,7 +331,7 @@ double ReducedModelOptimizer::objective(long n, const double *x) {
global.minX.assign(x, x + n); global.minX.assign(x, x + n);
} }
// if (++global.numberOfFunctionCalls %100== 0) { // if (++global.numberOfFunctionCalls %100== 0) {
//std::cout << "Number of function calls:" << global.numberOfFunctionCalls // std::cout << "Number of function calls:" << global.numberOfFunctionCalls
// << std::endl; // << std::endl;
//} //}
@ -661,8 +665,8 @@ void ReducedModelOptimizer::computeDesiredReducedModelDisplacements(
} }
} }
ReducedModelOptimizer::Results ReducedModelOptimizer::runOptimization( ReducedModelOptimizer::Results
const Settings &settings) { ReducedModelOptimizer::runOptimization(const Settings &settings) {
auto &global = tls[omp_get_thread_num()]; auto &global = tls[omp_get_thread_num()];
global.gObjectiveValueHistory.clear(); global.gObjectiveValueHistory.clear();
@ -1051,20 +1055,23 @@ void ReducedModelOptimizer::visualizeResults(
SimulationResults fullModelResults = SimulationResults fullModelResults =
simulator.executeSimulation(pFullPatternSimulationJob); simulator.executeSimulation(pFullPatternSimulationJob);
fullModelResults.registerForDrawing(); fullModelResults.registerForDrawing();
//fullModelResults.saveDeformedModel(); // fullModelResults.saveDeformedModel();
const std::shared_ptr<SimulationJob> &pReducedPatternSimulationJob = const std::shared_ptr<SimulationJob> &pReducedPatternSimulationJob =
reducedPatternSimulationJobs[simulationScenarioIndex]; reducedPatternSimulationJobs[simulationScenarioIndex];
SimulationResults reducedModelResults = SimulationResults reducedModelResults =
simulator.executeSimulation(pReducedPatternSimulationJob); simulator.executeSimulation(pReducedPatternSimulationJob);
double interfaceDisplacementNormSum = 0; double interfaceDisplacementNormSum = 0;
for (const auto& interfaceViPair : reducedToFullInterfaceViMap) { for (const auto &interfaceViPair : reducedToFullInterfaceViMap) {
const int fullPatternInterfaceIndex = interfaceViPair.second; const int fullPatternInterfaceIndex = interfaceViPair.second;
Eigen::Vector3d fullPatternDisplacementVector(fullModelResults.displacements[fullPatternInterfaceIndex][0], fullModelResults.displacements[fullPatternInterfaceIndex][1], fullModelResults.displacements[fullPatternInterfaceIndex][2]); Eigen::Vector3d fullPatternDisplacementVector(
interfaceDisplacementNormSum += fullPatternDisplacementVector.norm(); fullModelResults.displacements[fullPatternInterfaceIndex][0],
fullModelResults.displacements[fullPatternInterfaceIndex][1],
fullModelResults.displacements[fullPatternInterfaceIndex][2]);
interfaceDisplacementNormSum += fullPatternDisplacementVector.norm();
} }
double error = computeError(reducedModelResults.displacements, double error = computeError(
fullModelResults.displacements,interfaceDisplacementNormSum, reducedModelResults.displacements, fullModelResults.displacements,
reducedToFullInterfaceViMap); interfaceDisplacementNormSum, reducedToFullInterfaceViMap);
std::cout << "Error of simulation scenario " std::cout << "Error of simulation scenario "
<< simulationScenarioStrings[simulationScenarioIndex] << " is " << simulationScenarioStrings[simulationScenarioIndex] << " is "
<< error << std::endl; << error << std::endl;
@ -1121,17 +1128,22 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize(
simulationJobs[simulationScenarioIndex]; simulationJobs[simulationScenarioIndex];
SimulationResults fullModelResults = SimulationResults fullModelResults =
simulator.executeSimulation(pFullPatternSimulationJob, settings); simulator.executeSimulation(pFullPatternSimulationJob, settings);
global.fullPatternDisplacements[simulationScenarioIndex] = fullModelResults.displacements; global.fullPatternDisplacements[simulationScenarioIndex] =
fullModelResults.displacements;
double interfaceDisplacementNormSum = 0; double interfaceDisplacementNormSum = 0;
for (const auto& interfaceViPair : global.reducedToFullInterfaceViMap) { for (const auto &interfaceViPair : global.reducedToFullInterfaceViMap) {
const int fullPatternInterfaceIndex = interfaceViPair.second; const int fullPatternInterfaceIndex = interfaceViPair.second;
Eigen::Vector3d fullPatternDisplacementVector(fullModelResults.displacements[fullPatternInterfaceIndex][0], fullModelResults.displacements[fullPatternInterfaceIndex][1], fullModelResults.displacements[fullPatternInterfaceIndex][2]); Eigen::Vector3d fullPatternDisplacementVector(
interfaceDisplacementNormSum += fullPatternDisplacementVector.norm(); fullModelResults.displacements[fullPatternInterfaceIndex][0],
fullModelResults.displacements[fullPatternInterfaceIndex][1],
fullModelResults.displacements[fullPatternInterfaceIndex][2]);
interfaceDisplacementNormSum += fullPatternDisplacementVector.norm();
} }
global.fullPatternDisplacementNormSum[simulationScenarioIndex] = interfaceDisplacementNormSum; global.fullPatternDisplacementNormSum[simulationScenarioIndex] =
//global.g_optimalReducedModelDisplacements[simulationScenarioIndex].resize( interfaceDisplacementNormSum;
// global.g_optimalReducedModelDisplacements[simulationScenarioIndex].resize(
// m_pReducedPatternSimulationMesh->VN(), 3); // m_pReducedPatternSimulationMesh->VN(), 3);
//computeDesiredReducedModelDisplacements( // computeDesiredReducedModelDisplacements(
// fullModelResults, global.reducedToFullInterfaceViMap, // fullModelResults, global.reducedToFullInterfaceViMap,
// global.g_optimalReducedModelDisplacements[simulationScenarioIndex]); // global.g_optimalReducedModelDisplacements[simulationScenarioIndex]);
@ -1154,7 +1166,7 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize(
// optResults.draw(); // optResults.draw();
// visualizeResults(simulationJobs, global.simulationScenarioIndices); // visualizeResults(simulationJobs, global.simulationScenarioIndices);
//visualizeResults(simulationJobs, global.reducedPatternSimulationJobs, // visualizeResults(simulationJobs, global.reducedPatternSimulationJobs,
// global.simulationScenarioIndices,global.reducedToFullInterfaceViMap); // global.simulationScenarioIndices,global.reducedToFullInterfaceViMap);
return optResults; return optResults;
} }