Refactoring
This commit is contained in:
parent
67c2c0c0ac
commit
6ba16b0343
25
src/main.cpp
25
src/main.cpp
|
|
@ -47,11 +47,13 @@ int main(int argc, char *argv[]) {
|
||||||
ReducedModelOptimizer::xRange beamDimensionsRatio{"bOverh", 0.7, 1.3};
|
ReducedModelOptimizer::xRange beamDimensionsRatio{"bOverh", 0.7, 1.3};
|
||||||
ReducedModelOptimizer::xRange beamE{"E", 0.1, 1.9};
|
ReducedModelOptimizer::xRange beamE{"E", 0.1, 1.9};
|
||||||
// Test set of full patterns
|
// Test set of full patterns
|
||||||
std::string fullPatternsTestSetDirectory = "TestSet";
|
std::string fullPatternsTestSetDirectory = "../TestSet";
|
||||||
if (!std::filesystem::exists(std::filesystem::path(fullPatternsTestSetDirectory))) {
|
if (!std::filesystem::exists(
|
||||||
std::cerr << "Full pattern directory does not exist:" << fullPatternsTestSetDirectory << std::endl;
|
std::filesystem::path(fullPatternsTestSetDirectory))) {
|
||||||
return 1;
|
std::cerr << "Full pattern directory does not exist: "
|
||||||
}
|
<< fullPatternsTestSetDirectory << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
// "/home/iason/Documents/PhD/Research/Approximating shapes with flat "
|
// "/home/iason/Documents/PhD/Research/Approximating shapes with flat "
|
||||||
// "patterns/Pattern_enumerator/Results/1v_0v_2e_1e_1c_6fan/3/Valid";
|
// "patterns/Pattern_enumerator/Results/1v_0v_2e_1e_1c_6fan/3/Valid";
|
||||||
std::vector<std::pair<FlatPattern *, FlatPattern *>> patternPairs;
|
std::vector<std::pair<FlatPattern *, FlatPattern *>> patternPairs;
|
||||||
|
|
@ -100,7 +102,7 @@ int main(int argc, char *argv[]) {
|
||||||
resultsPerPattern(patternPairs.size());
|
resultsPerPattern(patternPairs.size());
|
||||||
auto start = std::chrono::high_resolution_clock::now();
|
auto start = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
#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 auto filepathString = filepath.string();
|
// const auto filepathString = filepath.string();
|
||||||
|
|
@ -125,14 +127,15 @@ int main(int argc, char *argv[]) {
|
||||||
ReducedModelOptimizer optimizer(numberOfNodesPerSlot);
|
ReducedModelOptimizer optimizer(numberOfNodesPerSlot);
|
||||||
optimizer.initializePatterns(*patternPairs[patternPairIndex].first,
|
optimizer.initializePatterns(*patternPairs[patternPairIndex].first,
|
||||||
*patternPairs[patternPairIndex].second,
|
*patternPairs[patternPairIndex].second,
|
||||||
optimizationExcludedEi);
|
optimizationExcludedEi);
|
||||||
// optimizer.optimize({ReducedModelOptimizer::Axial});
|
// optimizer.optimize({ReducedModelOptimizer::Axial});
|
||||||
ReducedModelOptimizer::Results optimizationResults =
|
ReducedModelOptimizer::Results optimizationResults =
|
||||||
optimizer.optimize(settings);
|
optimizer.optimize(settings);
|
||||||
|
|
||||||
totalError += optimizationResults.objectiveValue;
|
totalError += optimizationResults.objectiveValue;
|
||||||
resultsPerPattern[patternPairIndex] =
|
resultsPerPattern[patternPairIndex] =
|
||||||
std::make_pair(patternPairs[patternPairIndex].first->getLabel(), optimizationResults);
|
std::make_pair(patternPairs[patternPairIndex].first->getLabel(),
|
||||||
|
optimizationResults);
|
||||||
totalNumberOfSimulationCrashes +=
|
totalNumberOfSimulationCrashes +=
|
||||||
optimizationResults.numberOfSimulationCrashes;
|
optimizationResults.numberOfSimulationCrashes;
|
||||||
// std::cout << "Have optimized " << ++patternsOptimized << "/"
|
// std::cout << "Have optimized " << ++patternsOptimized << "/"
|
||||||
|
|
@ -157,8 +160,10 @@ int main(int argc, char *argv[]) {
|
||||||
// resultsPerPattern[patternPairIndex].second.save(saveToPath);
|
// resultsPerPattern[patternPairIndex].second.save(saveToPath);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (!std::filesystem::exists(std::filesystem::path("OptimizationResults/"))) {
|
if (!std::filesystem::exists(
|
||||||
std::filesystem::create_directory(std::filesystem::path("OptimizationResults"));
|
std::filesystem::path("OptimizationResults/"))) {
|
||||||
|
std::filesystem::create_directory(
|
||||||
|
std::filesystem::path("OptimizationResults"));
|
||||||
}
|
}
|
||||||
|
|
||||||
csvfile statistics(std::filesystem::path("OptimizationResults")
|
csvfile statistics(std::filesystem::path("OptimizationResults")
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ struct GlobalOptimizationVariables {
|
||||||
std::vector<ReducedModelOptimizer::SimulationScenario>
|
std::vector<ReducedModelOptimizer::SimulationScenario>
|
||||||
g_simulationScenarioIndices;
|
g_simulationScenarioIndices;
|
||||||
std::vector<VectorType> g_innerHexagonVectors{6, VectorType(0, 0, 0)};
|
std::vector<VectorType> g_innerHexagonVectors{6, VectorType(0, 0, 0)};
|
||||||
double g_innerHexagonInitialPos{0};
|
double g_innerHexagonInitialPos{0};
|
||||||
bool g_optimizeInnerHexagonSize{false};
|
bool g_optimizeInnerHexagonSize{false};
|
||||||
std::vector<SimulationResults> firstOptimizationRoundResults;
|
std::vector<SimulationResults> firstOptimizationRoundResults;
|
||||||
int g_firstRoundIterationIndex{0};
|
int g_firstRoundIterationIndex{0};
|
||||||
|
|
@ -32,20 +32,16 @@ struct GlobalOptimizationVariables {
|
||||||
std::vector<std::vector<double>> failedSimulationsXRatio;
|
std::vector<std::vector<double>> failedSimulationsXRatio;
|
||||||
int numOfSimulationCrashes{false};
|
int numOfSimulationCrashes{false};
|
||||||
int numberOfFunctionCalls{0};
|
int numberOfFunctionCalls{0};
|
||||||
} ;
|
|
||||||
|
|
||||||
//static GlobalOptimizationVariables global;
|
|
||||||
|
|
||||||
const static int MAX_THREAD = 64;
|
|
||||||
|
|
||||||
struct MY_TLS_ITEM
|
|
||||||
{
|
|
||||||
std::map<int, int> theMap;
|
|
||||||
char padding[64 - sizeof(theMap)];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
__declspec(align(64)) GlobalOptimizationVariables tls[MAX_THREAD];
|
// static GlobalOptimizationVariables global;
|
||||||
|
|
||||||
|
const static int MAX_THREAD = 64;
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
__declspec(align(64)) GlobalOptimizationVariables tls[MAX_THREAD];
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
GlobalOptimizationVariables tls[MAX_THREAD] __attribute__((aligned(64)));
|
||||||
|
#endif
|
||||||
//#pragma omp threadprivate(global)
|
//#pragma omp threadprivate(global)
|
||||||
|
|
||||||
// struct OptimizationCallback {
|
// struct OptimizationCallback {
|
||||||
|
|
@ -129,7 +125,7 @@ double ReducedModelOptimizer::computeError(
|
||||||
const SimulationResults &reducedPatternResults,
|
const SimulationResults &reducedPatternResults,
|
||||||
const Eigen::MatrixX3d &optimalReducedPatternDisplacements) {
|
const Eigen::MatrixX3d &optimalReducedPatternDisplacements) {
|
||||||
double error = 0;
|
double error = 0;
|
||||||
auto& global = tls[omp_get_thread_num()];
|
auto &global = tls[omp_get_thread_num()];
|
||||||
for (const auto reducedFullViPair : global.g_reducedToFullViMap) {
|
for (const auto reducedFullViPair : global.g_reducedToFullViMap) {
|
||||||
VertexIndex reducedModelVi = reducedFullViPair.first;
|
VertexIndex reducedModelVi = reducedFullViPair.first;
|
||||||
// const auto pos =
|
// const auto pos =
|
||||||
|
|
@ -156,7 +152,7 @@ double ReducedModelOptimizer::computeError(
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateMesh(long n, const double *x) {
|
void updateMesh(long n, const double *x) {
|
||||||
auto& global = tls[omp_get_thread_num()];
|
auto &global = tls[omp_get_thread_num()];
|
||||||
std::shared_ptr<SimulationMesh> &pReducedPatternSimulationMesh =
|
std::shared_ptr<SimulationMesh> &pReducedPatternSimulationMesh =
|
||||||
global
|
global
|
||||||
.g_reducedPatternSimulationJob[global.g_simulationScenarioIndices[0]]
|
.g_reducedPatternSimulationJob[global.g_simulationScenarioIndices[0]]
|
||||||
|
|
@ -230,7 +226,7 @@ double ReducedModelOptimizer::objective(double x0, double x1, double x2,
|
||||||
}
|
}
|
||||||
|
|
||||||
double ReducedModelOptimizer::objective(long n, const double *x) {
|
double ReducedModelOptimizer::objective(long n, const double *x) {
|
||||||
auto& global = tls[omp_get_thread_num()];
|
auto &global = tls[omp_get_thread_num()];
|
||||||
// std::cout.precision(17);
|
// std::cout.precision(17);
|
||||||
|
|
||||||
// for (size_t parameterIndex = 0; parameterIndex < n; parameterIndex++) {
|
// for (size_t parameterIndex = 0; parameterIndex < n; parameterIndex++) {
|
||||||
|
|
@ -373,7 +369,7 @@ void ReducedModelOptimizer::computeMaps(
|
||||||
// std::endl;
|
// std::endl;
|
||||||
|
|
||||||
// Save excluded edges
|
// Save excluded edges
|
||||||
auto& global = tls[omp_get_thread_num()];
|
auto &global = tls[omp_get_thread_num()];
|
||||||
global.g_reducedPatternExludedEdges.clear();
|
global.g_reducedPatternExludedEdges.clear();
|
||||||
const size_t fanSize = 6;
|
const size_t fanSize = 6;
|
||||||
const size_t reducedBaseTriangleNumberOfEdges = reducedPattern.EN();
|
const size_t reducedBaseTriangleNumberOfEdges = reducedPattern.EN();
|
||||||
|
|
@ -509,7 +505,7 @@ void ReducedModelOptimizer::initializePatterns(
|
||||||
FlatPattern copyReducedPattern;
|
FlatPattern copyReducedPattern;
|
||||||
copyFullPattern.copy(fullPattern);
|
copyFullPattern.copy(fullPattern);
|
||||||
copyReducedPattern.copy(reducedPattern);
|
copyReducedPattern.copy(reducedPattern);
|
||||||
auto& global = tls[omp_get_thread_num()];
|
auto &global = tls[omp_get_thread_num()];
|
||||||
global.g_optimizeInnerHexagonSize = copyReducedPattern.EN() == 2;
|
global.g_optimizeInnerHexagonSize = copyReducedPattern.EN() == 2;
|
||||||
if (global.g_optimizeInnerHexagonSize) {
|
if (global.g_optimizeInnerHexagonSize) {
|
||||||
const double h = copyReducedPattern.getBaseTriangleHeight();
|
const double h = copyReducedPattern.getBaseTriangleHeight();
|
||||||
|
|
@ -540,7 +536,7 @@ void ReducedModelOptimizer::initializePatterns(
|
||||||
|
|
||||||
void ReducedModelOptimizer::initializeOptimizationParameters(
|
void ReducedModelOptimizer::initializeOptimizationParameters(
|
||||||
const std::shared_ptr<SimulationMesh> &mesh) {
|
const std::shared_ptr<SimulationMesh> &mesh) {
|
||||||
auto& global = tls[omp_get_thread_num()];
|
auto &global = tls[omp_get_thread_num()];
|
||||||
const int numberOfOptimizationParameters = 3;
|
const int numberOfOptimizationParameters = 3;
|
||||||
global.g_initialParameters.resize(global.g_optimizeInnerHexagonSize
|
global.g_initialParameters.resize(global.g_optimizeInnerHexagonSize
|
||||||
? numberOfOptimizationParameters + 1
|
? numberOfOptimizationParameters + 1
|
||||||
|
|
@ -633,7 +629,7 @@ void ReducedModelOptimizer::computeDesiredReducedModelDisplacements(
|
||||||
ReducedModelOptimizer::Results ReducedModelOptimizer::runOptimization(
|
ReducedModelOptimizer::Results ReducedModelOptimizer::runOptimization(
|
||||||
const Settings &settings,
|
const Settings &settings,
|
||||||
double (*pObjectiveFunction)(long, const double *)) {
|
double (*pObjectiveFunction)(long, const double *)) {
|
||||||
auto& global = tls[omp_get_thread_num()];
|
auto &global = tls[omp_get_thread_num()];
|
||||||
|
|
||||||
global.gObjectiveValueHistory.clear();
|
global.gObjectiveValueHistory.clear();
|
||||||
|
|
||||||
|
|
@ -1002,7 +998,7 @@ void ReducedModelOptimizer::visualizeResults(
|
||||||
simulator.executeSimulation(pFullPatternSimulationJob);
|
simulator.executeSimulation(pFullPatternSimulationJob);
|
||||||
fullModelResults.registerForDrawing();
|
fullModelResults.registerForDrawing();
|
||||||
fullModelResults.saveDeformedModel();
|
fullModelResults.saveDeformedModel();
|
||||||
auto& global = tls[omp_get_thread_num()];
|
auto &global = tls[omp_get_thread_num()];
|
||||||
const std::shared_ptr<SimulationJob> &pReducedPatternSimulationJob =
|
const std::shared_ptr<SimulationJob> &pReducedPatternSimulationJob =
|
||||||
global.g_reducedPatternSimulationJob[simulationScenarioIndex];
|
global.g_reducedPatternSimulationJob[simulationScenarioIndex];
|
||||||
SimulationResults reducedModelResults =
|
SimulationResults reducedModelResults =
|
||||||
|
|
@ -1033,7 +1029,7 @@ void ReducedModelOptimizer::visualizeResults(
|
||||||
ReducedModelOptimizer::Results ReducedModelOptimizer::optimize(
|
ReducedModelOptimizer::Results ReducedModelOptimizer::optimize(
|
||||||
const Settings &xRanges,
|
const Settings &xRanges,
|
||||||
const std::vector<SimulationScenario> &simulationScenarios) {
|
const std::vector<SimulationScenario> &simulationScenarios) {
|
||||||
auto& global = tls[omp_get_thread_num()];
|
auto &global = tls[omp_get_thread_num()];
|
||||||
|
|
||||||
global.g_simulationScenarioIndices = simulationScenarios;
|
global.g_simulationScenarioIndices = simulationScenarios;
|
||||||
if (global.g_simulationScenarioIndices.empty()) {
|
if (global.g_simulationScenarioIndices.empty()) {
|
||||||
|
|
@ -1046,7 +1042,7 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize(
|
||||||
std::vector<std::shared_ptr<SimulationJob>> simulationJobs =
|
std::vector<std::shared_ptr<SimulationJob>> simulationJobs =
|
||||||
createScenarios(m_pFullPatternSimulationMesh);
|
createScenarios(m_pFullPatternSimulationMesh);
|
||||||
global.g_optimalReducedModelDisplacements.resize(6);
|
global.g_optimalReducedModelDisplacements.resize(6);
|
||||||
global.g_reducedPatternSimulationJob.resize(6);
|
global.g_reducedPatternSimulationJob.resize(6);
|
||||||
global.g_firstRoundIterationIndex = 0;
|
global.g_firstRoundIterationIndex = 0;
|
||||||
global.minY = std::numeric_limits<double>::max();
|
global.minY = std::numeric_limits<double>::max();
|
||||||
global.numOfSimulationCrashes = 0;
|
global.numOfSimulationCrashes = 0;
|
||||||
|
|
@ -1069,8 +1065,8 @@ ReducedModelOptimizer::Results ReducedModelOptimizer::optimize(
|
||||||
computeReducedModelSimulationJob(*pFullPatternSimulationJob,
|
computeReducedModelSimulationJob(*pFullPatternSimulationJob,
|
||||||
m_fullToReducedInterfaceViMap,
|
m_fullToReducedInterfaceViMap,
|
||||||
reducedPatternSimulationJob);
|
reducedPatternSimulationJob);
|
||||||
global.g_reducedPatternSimulationJob[simulationScenarioIndex] =
|
global.g_reducedPatternSimulationJob[simulationScenarioIndex] =
|
||||||
std::make_shared<SimulationJob>(reducedPatternSimulationJob);
|
std::make_shared<SimulationJob>(reducedPatternSimulationJob);
|
||||||
}
|
}
|
||||||
Results optResults = runOptimization(xRanges, &objective);
|
Results optResults = runOptimization(xRanges, &objective);
|
||||||
updateMesh(optResults.x.size(), optResults.x.data());
|
updateMesh(optResults.x.size(), optResults.x.data());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue