ReducedModelOptimization/src/main.cpp

169 lines
7.1 KiB
C++
Raw Normal View History

2020-11-23 10:06:45 +01:00
#include "beamformfinder.hpp"
2021-01-22 15:39:36 +01:00
#include "csvfile.hpp"
2020-11-23 10:06:45 +01:00
#include "edgemesh.hpp"
#include "flatpattern.hpp"
#include "polyscope/curve_network.h"
#include "polyscope/point_cloud.h"
#include "polyscope/polyscope.h"
#include "reducedmodeloptimizer.hpp"
#include "simulationhistoryplotter.hpp"
2020-12-09 16:58:48 +01:00
#include "trianglepattterntopology.hpp"
2020-11-23 10:06:45 +01:00
#include <chrono>
#include <filesystem>
#include <iostream>
#include <stdexcept>
#include <string>
2020-12-09 16:58:48 +01:00
#include <vcg/complex/algorithms/update/position.h>
2020-11-23 10:06:45 +01:00
int main(int argc, char *argv[]) {
// Create reduced models
2020-12-16 20:31:58 +01:00
// FormFinder::runUnitTests();
const std::vector<size_t> numberOfNodesPerSlot{1, 0, 0, 2, 1, 2, 1};
std::vector<vcg::Point2i> singleBarReducedModelEdges{vcg::Point2i(0, 3)};
FlatPattern singleBarReducedModel(numberOfNodesPerSlot,
singleBarReducedModelEdges);
singleBarReducedModel.setLabel("Single bar reduced model");
singleBarReducedModel.scale(0.03);
2021-01-29 18:07:13 +01:00
singleBarReducedModel.savePly(singleBarReducedModel.getLabel() + ".ply");
std::vector<vcg::Point2i> CWreducedModelEdges{vcg::Point2i(1, 5),
vcg::Point2i(3, 1)};
FlatPattern CWReducedModel(numberOfNodesPerSlot, CWreducedModelEdges);
CWReducedModel.setLabel("CW reduced model");
CWReducedModel.scale(0.03);
std::vector<vcg::Point2i> CCWreducedModelEdges{vcg::Point2i(1, 5),
vcg::Point2i(3, 5)};
FlatPattern CCWReducedModel(numberOfNodesPerSlot, CCWreducedModelEdges);
CCWReducedModel.setLabel("CCW reduced model");
CCWReducedModel.scale(0.03);
std::vector<FlatPattern *> reducedModels{&singleBarReducedModel,
&CWReducedModel, &CCWReducedModel};
ReducedModelOptimizer optimizer(numberOfNodesPerSlot);
2021-01-29 18:07:13 +01:00
// for (double rangeOffset = 0.15; rangeOffset <= 0.95; rangeOffset += 0.05)
// {
ReducedModelOptimizer::Settings settings;
for (settings.maxSimulations = 600; settings.maxSimulations < 2000;
settings.maxSimulations += 100) {
2021-01-22 15:39:36 +01:00
ReducedModelOptimizer::xRange beamWidth{"B", 0.5, 1.5};
2021-01-29 18:07:13 +01:00
ReducedModelOptimizer::xRange beamDimensionsRatio{"bOverh", 0.7, 1.3};
ReducedModelOptimizer::xRange beamE{"E", 0.1, 1.9};
2021-01-22 15:39:36 +01:00
std::string xRangesString = beamWidth.toString() + " " +
beamDimensionsRatio.toString() + " " +
beamE.toString();
std::cout << xRangesString << std::endl;
settings.xRanges = {beamWidth, beamDimensionsRatio, beamE};
std::filesystem::path thisOptimizationDirectory(
std::filesystem::path("../OptimizationResults").append(xRangesString));
std::filesystem::create_directory(thisOptimizationDirectory);
2021-01-29 18:07:13 +01:00
// csvfile thisOptimizationStatistics(
// std::filesystem::path(thisOptimizationDirectory)
// .append("statistics.csv")
// .string(),
// true);
2021-01-22 15:39:36 +01:00
double totalError = 0;
int totalNumberOfSimulationCrashes = 0;
std::vector<double> errors;
std::string fullPatternsTestSetDirectory = "../TestSet";
// "/home/iason/Documents/PhD/Research/Approximating shapes with flat "
// "patterns/Pattern_enumerator/Results/1v_0v_2e_1e_1c_6fan/3/Valid";
2021-01-29 18:07:13 +01:00
std::vector<std::pair<std::string, ReducedModelOptimizer::Results>>
resultsPerPattern;
auto start = std::chrono::high_resolution_clock::now();
2021-01-22 15:39:36 +01:00
for (const auto &entry :
filesystem::directory_iterator(fullPatternsTestSetDirectory)) {
const auto filepath =
// std::filesystem::path(fullPatternsTestSetDirectory).append("305.ply");
entry.path();
const auto filepathString = filepath.string();
// Use only the base triangle version
const std::string tiledSuffix = "_tiled.ply";
if (filepathString.compare(filepathString.size() - tiledSuffix.size(),
tiledSuffix.size(), tiledSuffix) == 0) {
continue;
}
// std::cout << "Full pattern:" << filepathString << std::endl;
FlatPattern pattern(filepathString);
pattern.setLabel(filepath.stem().string());
pattern.scale(0.03);
// for (int reducedPatternIndex = 0;
// reducedPatternIndex < reducedModels.size();
// reducedPatternIndex++) {
// FlatPattern *pReducedModel =
// reducedModels[reducedPatternIndex];
std::unordered_set<size_t> optimizationExcludedEi;
// if (pReducedModel !=
// reducedModels[0]) { // assumes that the singleBar reduced model
// // is
// // the
// // first in the reducedModels vector
// optimizationExcludedEi.insert(0);
// }
// FlatPattern cp;
// cp.copy(*reducedModels[0]);
optimizer.initializePatterns(pattern, *reducedModels[0],
optimizationExcludedEi);
// optimizer.optimize({ReducedModelOptimizer::Axial});
ReducedModelOptimizer::Results optimizationResults =
optimizer.optimize(settings);
2021-01-29 18:07:13 +01:00
// errors.push_back(optimizationResults.objectiveValue);
// SimulationResultsReporter::createPlot(
// "", "Objective value", errors,
// std::filesystem::path(thisOptimizationDirectory)
// .append("ObjectiveValues.png")
// .string());
// thisOptimizationStatistics << filepath.stem().string()
// << optimizationResults.objectiveValue;
// if (optimizationResults.numberOfSimulationCrashes == 0) {
// thisOptimizationStatistics << "No crashes";
// } else {
// thisOptimizationStatistics
// << optimizationResults.numberOfSimulationCrashes;
// }
// thisOptimizationStatistics << endrow;
2021-01-22 15:39:36 +01:00
totalError += optimizationResults.objectiveValue;
2021-01-29 18:07:13 +01:00
resultsPerPattern.push_back(
std::make_pair(filepath.stem().string(), optimizationResults));
2021-01-22 15:39:36 +01:00
totalNumberOfSimulationCrashes +=
optimizationResults.numberOfSimulationCrashes;
// }
}
2021-01-29 18:07:13 +01:00
auto end = std::chrono::high_resolution_clock::now();
auto runtime_ms =
std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
2020-11-23 10:06:45 +01:00
2021-01-22 15:39:36 +01:00
csvfile statistics(std::filesystem::path("../OptimizationResults")
.append("statistics.csv")
.string(),
false);
for (const auto &range : settings.xRanges) {
statistics << range.min << range.max;
}
statistics << settings.maxSimulations;
if (totalNumberOfSimulationCrashes == 0) {
statistics << "No crashes";
} else {
statistics << totalNumberOfSimulationCrashes;
}
2020-12-09 16:58:48 +01:00
2021-01-29 18:07:13 +01:00
statistics << totalError;
for (const auto &patternObjectiveValue : resultsPerPattern) {
statistics << patternObjectiveValue.second.objectiveValue;
}
statistics << runtime_ms.count() / 1000.0;
for (const auto &patternObjectiveValue : resultsPerPattern) {
for (const double &optimalX : patternObjectiveValue.second.x) {
statistics << optimalX;
}
}
statistics << endrow;
2021-01-22 15:39:36 +01:00
}
2020-11-23 10:06:45 +01:00
return 0;
}