#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 #include "reducedmodel.hpp" #include "reducedmodeloptimizer_structs.hpp" #include "simulationmesh.hpp" #ifdef DLIB_DEFINED #include #include #endif #ifdef POLYSCOPE_DEFINED #include "polyscope/color_management.h" #endif // POLYSCOPE_DEFINED using PatternVertexIndex = VertexIndex; using ReducedModelVertexIndex = VertexIndex; class ReducedModelOptimizer { public: struct OptimizationState { std::vector fullPatternResults; std::vector translationalDisplacementNormalizationValues; std::vector rotationalDisplacementNormalizationValues; std::vector> pSimulationJobs_pattern; std::vector> simulationJobs_reducedModel; 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 pFullPatternSimulationEdgeMesh; std::array& pReducedPatternSimulationEdgeMesh)>, 7> functions_updateReducedPatternParameter; std::vector xMin; std::vector xMax; std::vector scenarioWeights; std::vector objectiveWeights; std::string simulationModelLabel_reducedModel; }; private: OptimizationState optimizationState; vcg::Triangle3 baseTriangle; std::function>&, SimulationJob&)> constructScenarioFunction; std::shared_ptr m_pReducedModelSimulationEdgeMesh; std::shared_ptr m_pSimulationEdgeMesh_pattern; std::unordered_map m_fullToReducedInterfaceViMap; std::vector> m_fullPatternOppositeInterfaceViPairs; std::unordered_map nodeToSlot; std::unordered_map> slotToNode; std::string optimizationNotes; std::array< std::function>&, SimulationJob&)>, ReducedModelOptimization::NumberOfBaseSimulationScenarios> constructBaseScenarioFunctions; std::vector scenarioIsSymmetrical; int fullPatternNumberOfEdges; 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< std::string, ReducedModelOptimization::NumberOfOptimizationVariables> parameterLabels = {"E", "A", "I2", "I3", "J", "Theta", "R"}; constexpr static std:: array simulationScenariosResolution = {12, 12, 22, 22, 22, 22}; // simulationScenariosResolution = {2, 2, 2, 22, 22, 22}; constexpr static std:: array baseScenarioWeights = {1, 1, 2, 2, 2}; inline static int totalNumberOfSimulationScenarios = std::accumulate(simulationScenariosResolution.begin(), simulationScenariosResolution.end(), 0); inline static int fanCardinality{6}; inline static double initialValue_R{0.3}; inline static double initialValue_theta{0}; 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 createSimulationEdgeMeshes( PatternGeometry& pattern, PatternGeometry& reducedModel, const ReducedModelOptimization::Settings& optimizationSettings, std::shared_ptr& pFullPatternSimulationEdgeMesh, std::shared_ptr& pReducedPatternSimulationEdgeMesh); 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& pReducedPatternSimulationEdgeMesh)> function_updateReducedPattern; static std::function& pReducedPatternSimulationEdgeMesh)> function_updateReducedPattern_material_E; static std::function& pReducedPatternSimulationEdgeMesh)> function_updateReducedPattern_material_A; static std::function& pReducedPatternSimulationEdgeMesh)> function_updateReducedPattern_material_I; static std::function& pReducedPatternSimulationEdgeMesh)> function_updateReducedPattern_material_I2; static std::function& pReducedPatternSimulationEdgeMesh)> function_updateReducedPattern_material_I3; static std::function& pReducedPatternSimulationEdgeMesh)> 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& reducedModel, const ReducedModelOptimization::Settings& optimizationSettings); 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 createSimulationEdgeMeshes( PatternGeometry& fullModel, PatternGeometry& reducedModel, const ReducedModelOptimization::Settings& optimizationSettings); void initializeOptimizationParameters( const std::shared_ptr& mesh, const std::array& optimizationParamters); 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< double, ReducedModelOptimization::NumberOfBaseSimulationScenarios>& 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& pReducedPatternSimulationEdgeMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_E; inline std::function& pReducedPatternSimulationEdgeMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_A; inline std::function& pReducedPatternSimulationEdgeMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_I; inline std::function& pReducedPatternSimulationEdgeMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_I2; inline std::function& pReducedPatternSimulationEdgeMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_I3; inline std::function& pReducedPatternSimulationEdgeMesh)> ReducedModelOptimizer::function_updateReducedPattern_material_J; inline std::function& x, std::shared_ptr& m)> ReducedModelOptimizer::function_updateReducedPattern; extern ReducedModelOptimizer::OptimizationState global; #endif // REDUCEDMODELOPTIMIZER_HPP