#ifndef REDUCEDMODELOPTIMIZER_HPP #define REDUCEDMODELOPTIMIZER_HPP #include "csvfile.hpp" #include "drmsimulationmodel.hpp" #include "edgemesh.hpp" #include "linearsimulationmodel.hpp" #ifdef POLYSCOPE_DEFINED #include "matplot/matplot.h" #endif #include "reducedmodel.hpp" #include "reducedmodeloptimizer_structs.hpp" #include "simulationmesh.hpp" #include #ifdef DLIB_DEFINED #include #include #endif #ifdef POLYSCOPE_DEFINED #include "polyscope/color_management.h" #endif // POLYSCOPE_DEFINED using FullPatternVertexIndex = VertexIndex; using ReducedPatternVertexIndex = VertexIndex; class ReducedModelOptimizer { public: struct OptimizationState { std::vector fullPatternResults; std::vector translationalDisplacementNormalizationValues; std::vector rotationalDisplacementNormalizationValues; std::vector> fullPatternSimulationJobs; std::vector> reducedPatternSimulationJobs; std::unordered_map reducedToFullInterfaceViMap; std::vector> fullPatternOppositeInterfaceViPairs; matplot::line_handle gPlotHandle; std::vector objectiveValueHistory_iteration; std::vector objectiveValueHistory; std::vector plotColors; std::array parametersInitialValue; std::array optimizationInitialValue; std::vector simulationScenarioIndices; double minY{DBL_MAX}; std::vector minX; int numOfSimulationCrashes{false}; int numberOfFunctionCalls{0}; //Variables for finding the full pattern simulation forces std::shared_ptr pFullPatternSimulationMesh; std::array &pReducedPatternSimulationMesh)>, 7> functions_updateReducedPatternParameter; std::vector xMin; std::vector xMax; std::vector scenarioWeights; std::vector objectiveWeights; }; private: OptimizationState optimizationState; vcg::Triangle3 baseTriangle; std::function> &, SimulationJob &)> constructScenarioFunction; std::shared_ptr m_pReducedPatternSimulationMesh; std::shared_ptr m_pFullPatternSimulationMesh; std::unordered_map m_fullToReducedInterfaceViMap; std::vector> m_fullPatternOppositeInterfaceViPairs; std::unordered_map nodeToSlot; std::unordered_map> slotToNode; std::string optimizationNotes; std::array> &, SimulationJob &)>, ReducedModelOptimization::NumberOfBaseSimulationScenarios> constructBaseScenarioFunctions; std::vector scenarioIsSymmetrical; int fullPatternNumberOfEdges; constexpr static double youngsModulus{1 * 1e9}; std::string fullPatternLabel; // ReducedModelOptimization::Settings optimizationSettings; public: struct FunctionEvaluation { FunctionEvaluation() = default; FunctionEvaluation(const std::vector &x, double y) : x(x), y(y) {} std::vector x; double y = std::numeric_limits::quiet_NaN(); }; // struct ParameterLabels // { // inline const static std::string E = {"E"}; // inline const static std::string A = {"A"}; // inline const static std::string I2 ={"I2"}; // inline const static std::string I3 ={"I3"}; // inline const static std::string J = {"J"}; // inline const static std::string th= {"Theta"}; // inline const static std::string R = {"R"}; // }; // inline constexpr static ParameterLabels parameterLabels(); inline static std::array parameterLabels = {"E", "A", "I2", "I3", "J", "Theta", "R"}; constexpr static std::array simulationScenariosResolution = {12, 12, 22, 22, 22, 22}; constexpr static std::array baseScenarioWeights = {1, 1, 2, 3, 2}; inline static int totalNumberOfSimulationScenarios = std::accumulate(simulationScenariosResolution.begin(), simulationScenariosResolution.end(), 0); inline static int fanSize{6}; inline static double initialHexagonSize{0.3}; int interfaceNodeIndex; double operator()(const Eigen::VectorXd &x, Eigen::VectorXd &) const; ReducedModelOptimizer(); static void computeReducedModelSimulationJob( const SimulationJob &simulationJobOfFullModel, const std::unordered_map &fullToReducedMap, SimulationJob &simulationJobOfReducedModel); SimulationJob getReducedSimulationJob(const SimulationJob &fullModelSimulationJob); static void runSimulation(const std::string &filename, std::vector &x); static std::vector> createFullPatternSimulationJobs( const std::shared_ptr &pMesh, const std::unordered_map &fullPatternOppositeInterfaceViMap); static void createSimulationMeshes( PatternGeometry &fullModel, PatternGeometry &reducedModel, std::shared_ptr &pFullPatternSimulationMesh, std::shared_ptr &pReducedPatternSimulationMesh); void computeMaps(const std::unordered_map> &slotToNode, PatternGeometry &fullPattern, ReducedModel &reducedPattern, std::unordered_map &reducedToFullInterfaceViMap, std::unordered_map &fullToReducedInterfaceViMap, std::vector> &fullPatternOppositeInterfaceViMap); static void visualizeResults( const std::vector> &fullPatternSimulationJobs, const std::vector> &reducedPatternSimulationJobs, const std::vector &simulationScenarios, const std::unordered_map &reducedToFullInterfaceViMap); static void registerResultsForDrawing( const std::shared_ptr &pFullPatternSimulationJob, const std::shared_ptr &pReducedPatternSimulationJob, const std::unordered_map &reducedToFullInterfaceViMap); static double computeRawTranslationalError( const std::vector &fullPatternDisplacements, const std::vector &reducedPatternDisplacements, const std::unordered_map &reducedToFullInterfaceViMap); static double computeDisplacementError( const std::vector &fullPatternDisplacements, const std::vector &reducedPatternDisplacements, const std::unordered_map &reducedToFullInterfaceViMap, const double &normalizationFactor); static double computeRawRotationalError( const std::vector &rotatedQuaternion_fullPattern, const std::vector &rotatedQuaternion_reducedPattern, const std::unordered_map &reducedToFullInterfaceViMap); static double computeRotationalError(const std::vector &rotatedQuaternion_fullPattern, const std::vector &rotatedQuaternion_reducedPattern, const std::unordered_map &reducedToFullInterfaceViMap, const double &normalizationFactor); static double computeError( const SimulationResults &simulationResults_fullPattern, const SimulationResults &simulationResults_reducedPattern, const std::unordered_map &reducedToFullInterfaceViMap, const double &normalizationFactor_translationalDisplacement, const double &normalizationFactor_rotationalDisplacement, const double &scenarioWeight, const ReducedModelOptimization::Settings::ObjectiveWeights &objectiveWeights); static void constructAxialSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static void constructShearSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static void constructBendingSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static void constructDomeSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static void constructSaddleSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static void constructSSimulationScenario( const double &forceMagnitude, const std::vector> &oppositeInterfaceViPairs, SimulationJob &job); static std::function &x, std::shared_ptr &pReducedPatternSimulationMesh)> function_updateReducedPattern; static std::function &pReducedPatternSimulationMesh)> function_updateReducedPattern_material_E; static std::function &pReducedPatternSimulationMesh)> function_updateReducedPattern_material_A; static std::function &pReducedPatternSimulationMesh)> function_updateReducedPattern_material_I; static std::function &pReducedPatternSimulationMesh)> function_updateReducedPattern_material_I2; static std::function &pReducedPatternSimulationMesh)> function_updateReducedPattern_material_I3; static std::function &pReducedPatternSimulationMesh)> function_updateReducedPattern_material_J; static double objective(const std::vector &x); void initializeUpdateReducedPatternFunctions(); // static double objective(const double &xValue); ReducedModelOptimization::Results optimize( ConstPatternGeometry &fullPattern, const ReducedModelOptimization::Settings &optimizationSettings); void optimize(ConstPatternGeometry &fullPattern, ReducedModelOptimization::Settings &optimizationSettings, ReducedModelOptimization::Results &optimizationResults); static double objective(const std::vector &x, ReducedModelOptimizer::OptimizationState &optimizationState); private: void optimize( ReducedModelOptimization::Settings &optimizationSettings, ReducedModelOptimization::Results &results, const std::vector &simulationScenarios = std::vector( {ReducedModelOptimization::Axial, ReducedModelOptimization::Shear, ReducedModelOptimization::Bending, ReducedModelOptimization::Dome, ReducedModelOptimization::Saddle, ReducedModelOptimization::S})); void initializePatterns(PatternGeometry &fullPattern, ReducedModel &reducedPattern, const std::array &optimizationParameters); static void computeDesiredReducedModelDisplacements( const SimulationResults &fullModelResults, const std::unordered_map &displacementsReducedToFullMap, Eigen::MatrixX3d &optimalDisplacementsOfReducedModel); void runOptimization(const ReducedModelOptimization::Settings &settings, ReducedModelOptimization::Results &results); void computeMaps(PatternGeometry &fullModel, ReducedModel &reducedModel); void createSimulationMeshes(PatternGeometry &fullModel, PatternGeometry &reducedModel); void initializeOptimizationParameters( const std::shared_ptr &mesh, const std::array &optimizationParamters); DRMSimulationModel simulator; void computeObjectiveValueNormalizationFactors( const ReducedModelOptimization::Settings &optimizationSettings); void getResults(const FunctionEvaluation &optimalObjective, const ReducedModelOptimization::Settings &settings, ReducedModelOptimization::Results &results); double computeFullPatternMaxSimulationForce( const ReducedModelOptimization::BaseSimulationScenario &scenario) const; #ifdef DLIB_DEFINED static double objective(const dlib::matrix &x); #endif std::array computeFullPatternMaxSimulationForces( const std::vector &desiredBaseSimulationScenario) const; std::vector> createFullPatternSimulationJobs( const std::shared_ptr &pMesh, const std::array &baseScenarioMaxForceMagnitudes) const; std::array getFullPatternMaxSimulationForces( const std::vector &desiredBaseSimulationScenarioIndices, const std::filesystem::path &intermediateResultsDirectoryPath, const bool &recomputeForceMagnitudes); std::array getFullPatternMaxSimulationForces(); void computeScenarioWeights( const std::vector &baseSimulationScenarios, const ReducedModelOptimization::Settings &optimizationSettings); }; inline std::function &pReducedPatternSimulationMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_E; inline std::function &pReducedPatternSimulationMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_A; inline std::function &pReducedPatternSimulationMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_I; inline std::function &pReducedPatternSimulationMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_I2; inline std::function &pReducedPatternSimulationMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_I3; inline std::function &pReducedPatternSimulationMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_J; inline std::function &x, std::shared_ptr &m)> ReducedModelOptimizer::function_updateReducedPattern; extern ReducedModelOptimizer::OptimizationState global; #endif // REDUCEDMODELOPTIMIZER_HPP