#include "beamformfinder.hpp" #include "csvfile.hpp" #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" #include "trianglepattterntopology.hpp" #include #include #include #include #include #include int main(int argc, char *argv[]) { // Create reduced models // FormFinder::runUnitTests(); const std::vector numberOfNodesPerSlot{1, 0, 0, 2, 1, 2, 1}; std::vector singleBarReducedModelEdges{vcg::Point2i(0, 3)}; FlatPattern singleBarReducedModel(numberOfNodesPerSlot, singleBarReducedModelEdges); singleBarReducedModel.setLabel("Single bar reduced model"); singleBarReducedModel.scale(0.03); singleBarReducedModel.savePly(singleBarReducedModel.getLabel() + ".ply"); std::vector CWreducedModelEdges{vcg::Point2i(1, 5), vcg::Point2i(3, 1)}; FlatPattern CWReducedModel(numberOfNodesPerSlot, CWreducedModelEdges); CWReducedModel.setLabel("CW reduced model"); CWReducedModel.scale(0.03); std::vector CCWreducedModelEdges{vcg::Point2i(1, 5), vcg::Point2i(3, 5)}; FlatPattern CCWReducedModel(numberOfNodesPerSlot, CCWreducedModelEdges); CCWReducedModel.setLabel("CCW reduced model"); CCWReducedModel.scale(0.03); std::vector reducedModels{&singleBarReducedModel, &CWReducedModel, &CCWReducedModel}; ReducedModelOptimizer optimizer(numberOfNodesPerSlot); // for (double rangeOffset = 0.15; rangeOffset <= 0.95; rangeOffset += 0.05) // { ReducedModelOptimizer::Settings settings; for (settings.maxSimulations = 600; settings.maxSimulations < 2000; settings.maxSimulations += 100) { ReducedModelOptimizer::xRange beamWidth{"B", 0.5, 1.5}; ReducedModelOptimizer::xRange beamDimensionsRatio{"bOverh", 0.7, 1.3}; ReducedModelOptimizer::xRange beamE{"E", 0.1, 1.9}; 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); // csvfile thisOptimizationStatistics( // std::filesystem::path(thisOptimizationDirectory) // .append("statistics.csv") // .string(), // true); double totalError = 0; int totalNumberOfSimulationCrashes = 0; std::vector 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"; std::vector> resultsPerPattern; auto start = std::chrono::high_resolution_clock::now(); 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 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); // 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; totalError += optimizationResults.objectiveValue; resultsPerPattern.push_back( std::make_pair(filepath.stem().string(), optimizationResults)); totalNumberOfSimulationCrashes += optimizationResults.numberOfSimulationCrashes; // } } auto end = std::chrono::high_resolution_clock::now(); auto runtime_ms = std::chrono::duration_cast(end - start); 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; } 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; } return 0; }