Objective value takes into account the rotational displacemenets between the full and the reduced pattern.

This commit is contained in:
iasonmanolas 2021-03-30 12:35:00 +03:00
parent 4893f03667
commit 107a2ce66c
2 changed files with 75 additions and 33 deletions

View File

@ -56,7 +56,7 @@ int main(int argc, char *argv[]) {
settings_optimization.normalizationStrategy
= ReducedModelOptimization::Settings::NormalizationStrategy::Epsilon;
settings_optimization.normalizationParameter = 0.0003;
settings_optimization.solutionAccuracy = 0.01;
settings_optimization.solutionAccuracy = 0.001;
// Optimize pair
const std::string pairName =
@ -97,7 +97,7 @@ int main(int argc, char *argv[]) {
// .string(),
// false);
csv_results << "Name";
optimizationResults.writeHeaderTo(settings_optimization, csv_results);
optimizationResults.writeHeaderTo(csv_results);
settings_optimization.writeHeaderTo(csv_results);
csv_results << endrow;
csv_results << pairName;

View File

@ -13,7 +13,8 @@ struct GlobalOptimizationVariables {
std::vector<Eigen::MatrixX3d> g_optimalReducedModelDisplacements;
// std::vector<std::vector<Vector6d>> fullPatternDisplacements;
std::vector<SimulationResults> fullPatternResults;
std::vector<double> objectiveNormalizationValues;
std::vector<double> translationalDisplacementNormalizationValues;
std::vector<double> rotationalDisplacementNormalizationValues;
std::vector<std::shared_ptr<SimulationJob>> fullPatternSimulationJobs;
std::vector<std::shared_ptr<SimulationJob>> reducedPatternSimulationJobs;
std::unordered_map<ReducedPatternVertexIndex, FullPatternVertexIndex>
@ -67,12 +68,6 @@ double ReducedModelOptimizer::computeRawDisplacementError(
reducedPatternDisplacements[reducedModelVi][0],
reducedPatternDisplacements[reducedModelVi][1],
reducedPatternDisplacements[reducedModelVi][2]);
if (!std::isfinite(reducedVertexDisplacement[0]) ||
!std::isfinite(reducedVertexDisplacement[1]) ||
!std::isfinite(reducedVertexDisplacement[2])) {
std::cout << "Displacements are not finite" << std::endl;
std::terminate();
}
const VertexIndex fullModelVi = reducedFullViPair.second;
Eigen::Vector3d fullVertexDisplacement(
fullPatternDisplacements[fullModelVi][0],
@ -134,11 +129,24 @@ double ReducedModelOptimizer::objective(long n, const double *x) {
reducedModelResults.internalPotentialEnergy
- global.fullPatternResults[simulationScenarioIndex].internalPotentialEnergy);
} else {
simulationScenarioError = computeDisplacementError(
const double translationalError = computeDisplacementError(
reducedModelResults.displacements,
global.fullPatternResults[simulationScenarioIndex].displacements,
global.reducedToFullInterfaceViMap,
global.objectiveNormalizationValues[simulationScenarioIndex]);
global.translationalDisplacementNormalizationValues[simulationScenarioIndex]);
double rotationalError = 0;
for (const auto &reducedToFullInterfaceViPair : global.reducedToFullInterfaceViMap) {
const double vertexRotationalError
= global.fullPatternResults[simulationScenarioIndex]
.rotationalDisplacementQuaternion[reducedToFullInterfaceViPair.second]
.angularDistance(reducedModelResults.rotationalDisplacementQuaternion
[reducedToFullInterfaceViPair.first]);
rotationalError += vertexRotationalError;
}
simulationScenarioError += translationalError
+ rotationalError
/ global.rotationalDisplacementNormalizationValues
[simulationScenarioIndex];
}
//#ifdef POLYSCOPE_DEFINED
// std::cout << "sim error:" << simulationScenarioError << std::endl;
@ -549,10 +557,9 @@ void ReducedModelOptimizer::visualizeResults(
std::shared_ptr<SimulationMesh> pFullPatternSimulationMesh =
fullPatternSimulationJobs[0]->pMesh;
pFullPatternSimulationMesh->registerForDrawing();
pFullPatternSimulationMesh->savePly(pFullPatternSimulationMesh->getLabel() +
"_undeformed.ply");
reducedPatternSimulationJobs[0]->pMesh->savePly(
reducedPatternSimulationJobs[0]->pMesh->getLabel() + "_undeformed.ply");
pFullPatternSimulationMesh->save(pFullPatternSimulationMesh->getLabel() + "_undeformed.ply");
reducedPatternSimulationJobs[0]->pMesh->save(reducedPatternSimulationJobs[0]->pMesh->getLabel()
+ "_undeformed.ply");
double totalError = 0;
for (const int simulationScenarioIndex : simulationScenarios) {
const std::shared_ptr<SimulationJob> &pFullPatternSimulationJob =
@ -570,8 +577,8 @@ void ReducedModelOptimizer::visualizeResults(
double normalizationFactor = 1;
if (global.optimizationSettings.normalizationStrategy !=
ReducedModelOptimization::Settings::NormalizationStrategy::NonNormalized) {
normalizationFactor =
global.objectiveNormalizationValues[simulationScenarioIndex];
normalizationFactor
= global.translationalDisplacementNormalizationValues[simulationScenarioIndex];
}
reducedModelResults.saveDeformedModel();
fullModelResults.saveDeformedModel();
@ -680,10 +687,10 @@ ReducedModelOptimizer::runOptimization(const Settings &settings) {
std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
ReducedModelOptimization::Results results;
results.numberOfSimulationCrashes = global.numOfSimulationCrashes;
results.optimalXNameValuePairs.reserve(settings.xRanges.size());
results.optimalXNameValuePairs.resize(settings.xRanges.size());
for(int xVariableIndex=0;xVariableIndex<settings.xRanges.size();xVariableIndex++){
results.optimalXNameValuePairs[settings.xRanges[xVariableIndex].label]=
global.minX[xVariableIndex];
results.optimalXNameValuePairs[xVariableIndex]
= std::make_pair(settings.xRanges[xVariableIndex].label, global.minX[xVariableIndex]);
}
results.objectiveValue = global.minY;
#ifdef POLYSCOPE_DEFINED
@ -713,7 +720,7 @@ ReducedModelOptimizer::runOptimization(const Settings &settings) {
reducedModelResults.displacements,
global.fullPatternResults[simulationScenarioIndex].displacements,
global.reducedToFullInterfaceViMap,
global.objectiveNormalizationValues[simulationScenarioIndex]);
global.translationalDisplacementNormalizationValues[simulationScenarioIndex]);
results.rawObjectiveValue += computeRawDisplacementError(
reducedModelResults.displacements,
global.fullPatternResults[simulationScenarioIndex].displacements,
@ -877,27 +884,61 @@ void ReducedModelOptimizer::computeObjectiveValueNormalizationFactors() {
Settings::NormalizationStrategy::Epsilon) {
// Compute the sum of the displacement norms
std::vector<double> fullPatternDisplacementNormSum(
NumberOfSimulationScenarios);
std::vector<double> fullPatternTranslationalDisplacementNormSum(NumberOfSimulationScenarios);
std::vector<double> fullPatternAngularDistance(NumberOfSimulationScenarios);
for (int simulationScenarioIndex : global.simulationScenarioIndices) {
double displacementNormSum = 0;
double translationalDisplacementNormSum = 0;
double angularDistanceSum = 0;
for (auto interfaceViPair : global.reducedToFullInterfaceViMap) {
const int fullPatternVi = interfaceViPair.second;
//If the full pattern vertex is translationally constrained dont take it into account
if (global.fullPatternSimulationJobs[simulationScenarioIndex]
->constrainedVertices.contains(fullPatternVi)) {
const std::unordered_set<int> constrainedDof
= global.fullPatternSimulationJobs[simulationScenarioIndex]
->constrainedVertices.at(fullPatternVi);
if (constrainedDof.contains(0) && constrainedDof.contains(1)
&& constrainedDof.contains(2)) {
continue;
}
}
const Vector6d &vertexDisplacement = global
.fullPatternResults[simulationScenarioIndex]
.displacements[interfaceViPair.second];
displacementNormSum += vertexDisplacement.getTranslation().norm();
.displacements[fullPatternVi];
translationalDisplacementNormSum += vertexDisplacement.getTranslation().norm();
//If the full pattern vertex is rotationally constrained dont take it into account
if (global.fullPatternSimulationJobs[simulationScenarioIndex]
->constrainedVertices.contains(fullPatternVi)) {
const std::unordered_set<int> constrainedDof
= global.fullPatternSimulationJobs[simulationScenarioIndex]
->constrainedVertices.at(fullPatternVi);
if (constrainedDof.contains(3) && constrainedDof.contains(5)
&& constrainedDof.contains(4)) {
continue;
}
}
angularDistanceSum += global.fullPatternResults[simulationScenarioIndex]
.rotationalDisplacementQuaternion[fullPatternVi]
.angularDistance(Eigen::Quaterniond::Identity());
}
fullPatternDisplacementNormSum[simulationScenarioIndex] =
displacementNormSum;
fullPatternTranslationalDisplacementNormSum[simulationScenarioIndex]
= translationalDisplacementNormSum;
fullPatternAngularDistance[simulationScenarioIndex] = angularDistanceSum;
}
for (int simulationScenarioIndex : global.simulationScenarioIndices) {
if (global.optimizationSettings.normalizationStrategy ==
Settings::NormalizationStrategy::Epsilon) {
const double epsilon =
global.optimizationSettings.normalizationParameter;
global.objectiveNormalizationValues[simulationScenarioIndex] = std::max(
fullPatternDisplacementNormSum[simulationScenarioIndex], epsilon);
const double epsilon_translationalDisplacement = global.optimizationSettings
.normalizationParameter;
global.translationalDisplacementNormalizationValues[simulationScenarioIndex]
= std::max(fullPatternTranslationalDisplacementNormSum[simulationScenarioIndex],
epsilon_translationalDisplacement);
const double epsilon_rotationalDisplacement = vcg::math::ToRad(2.0);
global.rotationalDisplacementNormalizationValues[simulationScenarioIndex]
= std::max(fullPatternAngularDistance[simulationScenarioIndex],
epsilon_rotationalDisplacement);
}
}
}
@ -919,7 +960,8 @@ Results ReducedModelOptimizer::optimize(
global.g_optimalReducedModelDisplacements.resize(NumberOfSimulationScenarios);
global.reducedPatternSimulationJobs.resize(NumberOfSimulationScenarios);
global.fullPatternResults.resize(NumberOfSimulationScenarios);
global.objectiveNormalizationValues.resize(NumberOfSimulationScenarios);
global.translationalDisplacementNormalizationValues.resize(NumberOfSimulationScenarios);
global.rotationalDisplacementNormalizationValues.resize(NumberOfSimulationScenarios);
global.minY = std::numeric_limits<double>::max();
global.numOfSimulationCrashes = 0;
global.numberOfFunctionCalls = 0;