KratosOptimizationApplication 10.4.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. KratosMultiphysics/.libs/KratosOptimizationApplication.so +0 -0
  2. KratosMultiphysics/.libs/libKratosOptimizationCore.dylib +0 -0
  3. KratosMultiphysics/OptimizationApplication/__init__.py +19 -0
  4. KratosMultiphysics/OptimizationApplication/algorithms/NLOPT_algorithms.py +255 -0
  5. KratosMultiphysics/OptimizationApplication/algorithms/SciPy_algorithms.py +154 -0
  6. KratosMultiphysics/OptimizationApplication/algorithms/__init__.py +0 -0
  7. KratosMultiphysics/OptimizationApplication/algorithms/algorithm.py +78 -0
  8. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_adam.py +68 -0
  9. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_base.py +393 -0
  10. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_gradient_projection.py +355 -0
  11. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_momentum_relaxed_gradient_projection.py +70 -0
  12. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_nesterov_accelarated_gradient.py +60 -0
  13. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_relaxed_gradient_projection.py +263 -0
  14. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_steepest_descent.py +205 -0
  15. KratosMultiphysics/OptimizationApplication/algorithms/standardized_NLOPT_constraint.py +194 -0
  16. KratosMultiphysics/OptimizationApplication/algorithms/standardized_NLOPT_objective.py +191 -0
  17. KratosMultiphysics/OptimizationApplication/algorithms/standardized_SciPy_constraint.py +123 -0
  18. KratosMultiphysics/OptimizationApplication/algorithms/standardized_SciPy_objective.py +148 -0
  19. KratosMultiphysics/OptimizationApplication/algorithms/standardized_constraint.py +180 -0
  20. KratosMultiphysics/OptimizationApplication/algorithms/standardized_objective.py +133 -0
  21. KratosMultiphysics/OptimizationApplication/algorithms/standardized_rgp_constraint.py +268 -0
  22. KratosMultiphysics/OptimizationApplication/analyses_controller.py +75 -0
  23. KratosMultiphysics/OptimizationApplication/controls/control.py +123 -0
  24. KratosMultiphysics/OptimizationApplication/controls/external_response_function_control.py +149 -0
  25. KratosMultiphysics/OptimizationApplication/controls/master_control.py +198 -0
  26. KratosMultiphysics/OptimizationApplication/controls/material/material_properties_control.py +115 -0
  27. KratosMultiphysics/OptimizationApplication/controls/material/simp_control.py +229 -0
  28. KratosMultiphysics/OptimizationApplication/controls/shape/vertex_morphing_shape_control.py +289 -0
  29. KratosMultiphysics/OptimizationApplication/controls/thickness/shell_thickness_control.py +180 -0
  30. KratosMultiphysics/OptimizationApplication/controls_controller.py +205 -0
  31. KratosMultiphysics/OptimizationApplication/convergence_criteria/avg_abs_improvement_conv_criterion.py +98 -0
  32. KratosMultiphysics/OptimizationApplication/convergence_criteria/combined_conv_criterion.py +87 -0
  33. KratosMultiphysics/OptimizationApplication/convergence_criteria/constraint_conv_criterion.py +68 -0
  34. KratosMultiphysics/OptimizationApplication/convergence_criteria/convergence_criterion.py +26 -0
  35. KratosMultiphysics/OptimizationApplication/convergence_criteria/l2_conv_criterion.py +77 -0
  36. KratosMultiphysics/OptimizationApplication/convergence_criteria/magnitude_reduction_conv_criterion.py +85 -0
  37. KratosMultiphysics/OptimizationApplication/convergence_criteria/max_iter_conv_criterion.py +48 -0
  38. KratosMultiphysics/OptimizationApplication/convergence_criteria/patience_conv_criterion.py +116 -0
  39. KratosMultiphysics/OptimizationApplication/convergence_criteria/target_value_conv_criterion.py +64 -0
  40. KratosMultiphysics/OptimizationApplication/execution_policies/execution_policy.py +46 -0
  41. KratosMultiphysics/OptimizationApplication/execution_policies/execution_policy_decorator.py +67 -0
  42. KratosMultiphysics/OptimizationApplication/execution_policies/independent_analysis_execution_policy.py +78 -0
  43. KratosMultiphysics/OptimizationApplication/execution_policies/kratos_analysis_execution_policy.py +137 -0
  44. KratosMultiphysics/OptimizationApplication/execution_policies/stepping_analysis_execution_policy.py +88 -0
  45. KratosMultiphysics/OptimizationApplication/filtering/explicit_filter.py +124 -0
  46. KratosMultiphysics/OptimizationApplication/filtering/filter.py +188 -0
  47. KratosMultiphysics/OptimizationApplication/filtering/filter_utils.py +55 -0
  48. KratosMultiphysics/OptimizationApplication/filtering/helmholtz_analysis.py +139 -0
  49. KratosMultiphysics/OptimizationApplication/filtering/helmholtz_scalar_solver.py +39 -0
  50. KratosMultiphysics/OptimizationApplication/filtering/helmholtz_shape_solver.py +67 -0
  51. KratosMultiphysics/OptimizationApplication/filtering/helmholtz_solver_base.py +275 -0
  52. KratosMultiphysics/OptimizationApplication/filtering/helmholtz_vector_solver.py +39 -0
  53. KratosMultiphysics/OptimizationApplication/filtering/implicit_filter.py +192 -0
  54. KratosMultiphysics/OptimizationApplication/filtering/python_solvers_wrapper_implicit_filters.py +56 -0
  55. KratosMultiphysics/OptimizationApplication/model_part_controllers/connectivity_preserving_model_part_controller.py +72 -0
  56. KratosMultiphysics/OptimizationApplication/model_part_controllers/external_response_function_model_part_controller.py +110 -0
  57. KratosMultiphysics/OptimizationApplication/model_part_controllers/mdpa_model_part_controller.py +44 -0
  58. KratosMultiphysics/OptimizationApplication/model_part_controllers/model_part_controller.py +19 -0
  59. KratosMultiphysics/OptimizationApplication/model_parts_controller.py +92 -0
  60. KratosMultiphysics/OptimizationApplication/optimization_analysis.py +146 -0
  61. KratosMultiphysics/OptimizationApplication/optimizations_controller.py +223 -0
  62. KratosMultiphysics/OptimizationApplication/optimizer.py +61 -0
  63. KratosMultiphysics/OptimizationApplication/processes/optimization_problem_ascii_output_process.py +212 -0
  64. KratosMultiphysics/OptimizationApplication/processes/optimization_problem_field_output_process.py +122 -0
  65. KratosMultiphysics/OptimizationApplication/processes/optimization_problem_graph_output_process.py +184 -0
  66. KratosMultiphysics/OptimizationApplication/processes/optimization_problem_hdf5_output_process.py +84 -0
  67. KratosMultiphysics/OptimizationApplication/processes/optimization_problem_vtu_output_process.py +94 -0
  68. KratosMultiphysics/OptimizationApplication/processes/spatial_statistics_computation_process.py +81 -0
  69. KratosMultiphysics/OptimizationApplication/responses/__init__.py +0 -0
  70. KratosMultiphysics/OptimizationApplication/responses/additive_manufacturing_responses.py +410 -0
  71. KratosMultiphysics/OptimizationApplication/responses/analysis_based_response_function_factory.py +14 -0
  72. KratosMultiphysics/OptimizationApplication/responses/analysis_free_response_function_factory.py +14 -0
  73. KratosMultiphysics/OptimizationApplication/responses/base_response.py +66 -0
  74. KratosMultiphysics/OptimizationApplication/responses/binary_operator_response_function.py +103 -0
  75. KratosMultiphysics/OptimizationApplication/responses/combined_response_function.py +127 -0
  76. KratosMultiphysics/OptimizationApplication/responses/discrete_value_residual_response_function.py +131 -0
  77. KratosMultiphysics/OptimizationApplication/responses/evaluation_response_function.py +68 -0
  78. KratosMultiphysics/OptimizationApplication/responses/external_response_function.py +87 -0
  79. KratosMultiphysics/OptimizationApplication/responses/geometric_centroid_deviation_response_function.py +97 -0
  80. KratosMultiphysics/OptimizationApplication/responses/linear_strain_energy_response_function.py +72 -0
  81. KratosMultiphysics/OptimizationApplication/responses/literal_value_response_function.py +33 -0
  82. KratosMultiphysics/OptimizationApplication/responses/log_response_function.py +47 -0
  83. KratosMultiphysics/OptimizationApplication/responses/mass_response_function.py +71 -0
  84. KratosMultiphysics/OptimizationApplication/responses/response_function.py +126 -0
  85. KratosMultiphysics/OptimizationApplication/responses/response_routine.py +158 -0
  86. KratosMultiphysics/OptimizationApplication/responses/structural_responses.py +335 -0
  87. KratosMultiphysics/OptimizationApplication/responses_controller.py +390 -0
  88. KratosMultiphysics/OptimizationApplication/utilities/buffered_dict.py +399 -0
  89. KratosMultiphysics/OptimizationApplication/utilities/component_data_view.py +74 -0
  90. KratosMultiphysics/OptimizationApplication/utilities/helper_utilities.py +40 -0
  91. KratosMultiphysics/OptimizationApplication/utilities/logger_utilities.py +222 -0
  92. KratosMultiphysics/OptimizationApplication/utilities/model_part_utilities.py +117 -0
  93. KratosMultiphysics/OptimizationApplication/utilities/opt_line_search.py +173 -0
  94. KratosMultiphysics/OptimizationApplication/utilities/opt_projection.py +191 -0
  95. KratosMultiphysics/OptimizationApplication/utilities/optimization_problem.py +237 -0
  96. KratosMultiphysics/OptimizationApplication/utilities/optimization_problem_utilities.py +237 -0
  97. KratosMultiphysics/OptimizationApplication/utilities/response_utilities.py +249 -0
  98. KratosMultiphysics/OptimizationApplication/utilities/timer.py +45 -0
  99. KratosMultiphysics/OptimizationApplication/utilities/union_utilities.py +6 -0
  100. kratosoptimizationapplication-10.4.4.dist-info/METADATA +25 -0
  101. kratosoptimizationapplication-10.4.4.dist-info/RECORD +106 -0
  102. kratosoptimizationapplication-10.4.4.dist-info/WHEEL +6 -0
  103. kratosoptimizationapplication.dylibs/libKratosCore.dylib +4 -0
  104. kratosoptimizationapplication.dylibs/libgcc_s.1.1.dylib +0 -0
  105. kratosoptimizationapplication.dylibs/libgomp.1.dylib +0 -0
  106. kratosoptimizationapplication.dylibs/libstdc++.6.dylib +0 -0
@@ -0,0 +1,146 @@
1
+ import KratosMultiphysics as Kratos
2
+ from KratosMultiphysics.process_factory import KratosProcessFactory
3
+ from KratosMultiphysics.OptimizationApplication.algorithms.algorithm import Algorithm
4
+ from KratosMultiphysics.OptimizationApplication.model_part_controllers.model_part_controller import ModelPartController
5
+ from KratosMultiphysics.OptimizationApplication.execution_policies.execution_policy_decorator import ExecutionPolicyDecorator
6
+ from KratosMultiphysics.OptimizationApplication.responses.response_function import ResponseFunction
7
+ from KratosMultiphysics.OptimizationApplication.utilities.optimization_problem_utilities import OptimizationComponentFactory
8
+ from KratosMultiphysics.OptimizationApplication.utilities.helper_utilities import CallOnAll
9
+ from KratosMultiphysics.OptimizationApplication.utilities.optimization_problem import OptimizationProblem
10
+ from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import OptimizationAnalysisTimeLogger
11
+
12
+ class OptimizationAnalysis:
13
+ @classmethod
14
+ def GetDefaultParameters(cls) -> Kratos.Parameters:
15
+ return Kratos.Parameters("""{
16
+ "problem_data" : {},
17
+ "model_parts" : [],
18
+ "analyses" : [],
19
+ "responses" : [],
20
+ "controls" : [],
21
+ "algorithm_settings": {},
22
+ "processes" : {
23
+ "kratos_processes" : {},
24
+ "optimization_data_processes": {}
25
+ }
26
+ }""")
27
+
28
+ def __init__(self, model: Kratos.Model, project_parameters: Kratos.Parameters):
29
+ self.model = model
30
+ self.project_parameters = project_parameters
31
+ self.project_parameters.ValidateAndAssignDefaults(self.GetDefaultParameters())
32
+
33
+ self.optimization_problem = OptimizationProblem(self.project_parameters["problem_data"]["echo_level"].GetInt())
34
+
35
+ self.__list_of_model_part_controllers: 'list[ModelPartController]' = []
36
+ self.__algorithm: Algorithm = None
37
+
38
+ self._CreateModelPartControllers()
39
+ self._CreateAnalyses()
40
+ self._CreateControls()
41
+ self._CreateResponses()
42
+ self._CreateAlgorithm()
43
+ self._CreateProcesses()
44
+
45
+ def Initialize(self):
46
+ CallOnAll(self.__list_of_model_part_controllers, ModelPartController.ImportModelPart)
47
+ CallOnAll(self.__list_of_model_part_controllers, ModelPartController.Initialize)
48
+ for process_type in self.__algorithm.GetProcessesOrder():
49
+ CallOnAll(self.optimization_problem.GetListOfProcesses(process_type), Kratos.Process.ExecuteInitialize)
50
+ CallOnAll(self.optimization_problem.GetListOfExecutionPolicies(), ExecutionPolicyDecorator.Initialize)
51
+
52
+ self.__algorithm.Initialize()
53
+
54
+ def Check(self):
55
+ for process_type in self.__algorithm.GetProcessesOrder():
56
+ CallOnAll(self.optimization_problem.GetListOfProcesses(process_type), Kratos.Process.Check)
57
+ CallOnAll(self.optimization_problem.GetListOfExecutionPolicies(), ExecutionPolicyDecorator.Check)
58
+
59
+ self.__algorithm.Check()
60
+
61
+ def Finalize(self):
62
+ self.__algorithm.Finalize()
63
+
64
+ CallOnAll(self.__list_of_model_part_controllers, ModelPartController.Finalize)
65
+ for process_type in self.__algorithm.GetProcessesOrder():
66
+ CallOnAll(self.optimization_problem.GetListOfProcesses(process_type), Kratos.Process.ExecuteFinalize)
67
+ CallOnAll(self.optimization_problem.GetListOfExecutionPolicies(), ExecutionPolicyDecorator.Finalize)
68
+
69
+ def Run(self):
70
+ with OptimizationAnalysisTimeLogger():
71
+ self.Initialize()
72
+ self.Check()
73
+ self.__algorithm.Solve()
74
+ self.Finalize()
75
+
76
+ def _CreateModelPartControllers(self):
77
+ default_settings = Kratos.Parameters("""{
78
+ "type": "mdpa_model_part_controller",
79
+ "module": "KratosMultiphysics.OptimizationApplication.model_part_controllers"
80
+ }""")
81
+ for model_part_controller_settings in self.project_parameters["model_parts"].values():
82
+ model_part_controller_settings.AddMissingParameters(default_settings)
83
+ model_part_controller: ModelPartController = OptimizationComponentFactory(self.model, model_part_controller_settings, self.optimization_problem)
84
+ self.__list_of_model_part_controllers.append(model_part_controller)
85
+
86
+ def _CreateAnalyses(self):
87
+ default_settings = Kratos.Parameters("""{
88
+ "module": "KratosMultiphysics.OptimizationApplication.execution_policies"
89
+ }""")
90
+ for analyses_settings in self.project_parameters["analyses"].values():
91
+ analyses_settings.AddMissingParameters(default_settings)
92
+ execution_policy = OptimizationComponentFactory(self.model, analyses_settings, self.optimization_problem)
93
+ self.optimization_problem.AddComponent(execution_policy)
94
+
95
+ def _CreateResponses(self):
96
+ default_settings = Kratos.Parameters("""{
97
+ "module": "KratosMultiphysics.OptimizationApplication.responses"
98
+ }""")
99
+ for response_settings in self.project_parameters["responses"].values():
100
+ response_settings.AddMissingParameters(default_settings)
101
+ response_function: ResponseFunction = OptimizationComponentFactory(self.model, response_settings, self.optimization_problem)
102
+ self.optimization_problem.AddComponent(response_function)
103
+
104
+ def _CreateControls(self):
105
+ default_settings = Kratos.Parameters("""{
106
+ "module" : "KratosMultiphysics.OptimizationApplication.controls"
107
+ }""")
108
+ for control_settings in self.project_parameters["controls"].values():
109
+ control_settings.AddMissingParameters(default_settings)
110
+ control = OptimizationComponentFactory(self.model, control_settings, self.optimization_problem)
111
+ self.optimization_problem.AddComponent(control)
112
+
113
+ def _CreateProcesses(self):
114
+ process_settings = self.project_parameters["processes"]
115
+ process_settings.ValidateAndAssignDefaults(self.GetDefaultParameters()["processes"])
116
+
117
+ kratos_processes = process_settings["kratos_processes"]
118
+ optimization_data_processes = process_settings["optimization_data_processes"]
119
+
120
+ factory = KratosProcessFactory(self.model)
121
+
122
+ optimization_data_process_default_settings = Kratos.Parameters("""{
123
+ "module" : "KratosMultiphysics.OptimizationApplication.optimization_data_processes"
124
+ }""")
125
+
126
+ for process_type in self.__algorithm.GetProcessesOrder():
127
+ self.optimization_problem.AddProcessType(process_type)
128
+ if kratos_processes.Has(process_type):
129
+ for process in factory.ConstructListOfProcesses(kratos_processes[process_type]):
130
+ self.optimization_problem.AddProcess(process_type, process)
131
+ if optimization_data_processes.Has(process_type):
132
+ for process_settings in optimization_data_processes[process_type].values():
133
+ process_settings.AddMissingParameters(optimization_data_process_default_settings)
134
+ process = OptimizationComponentFactory(self.model, process_settings, self.optimization_problem)
135
+ self.optimization_problem.AddProcess(process_type, process)
136
+
137
+ def _CreateAlgorithm(self):
138
+ default_settings = Kratos.Parameters("""{
139
+ "module" : "KratosMultiphysics.OptimizationApplication.algorithms"
140
+ }""")
141
+ algorithm_settings = self.project_parameters["algorithm_settings"]
142
+ algorithm_settings.AddMissingParameters(default_settings)
143
+ self.__algorithm = OptimizationComponentFactory(self.model, algorithm_settings, self.optimization_problem)
144
+
145
+ def GetAlgorithm(self):
146
+ return self.__algorithm
@@ -0,0 +1,223 @@
1
+ # ==============================================================================
2
+ # KratosOptimizationApplication
3
+ #
4
+ # License: BSD License
5
+ # license: OptimizationApplication/license.txt
6
+ #
7
+ # Main authors: Reza Najian Asl, https://github.com/RezaNajian
8
+ #
9
+ # ==============================================================================
10
+
11
+ # Kratos Core and Apps
12
+ import KratosMultiphysics as KM
13
+
14
+ # Additional imports
15
+ import KratosMultiphysics.OptimizationApplication.algorithms.algorithm_steepest_descent as steepest_descent
16
+ import KratosMultiphysics.OptimizationApplication.algorithms.algorithm_gradient_projection as gradient_projection
17
+ import time as timer
18
+
19
+ # ==============================================================================
20
+ def CreateController(optimizations_settings,model,model_parts_controller,analyses_controller,responses_controller,controls_controller):
21
+ return OptimizationsController(optimizations_settings,model,model_parts_controller,analyses_controller,responses_controller,controls_controller)
22
+
23
+ # ==============================================================================
24
+ class OptimizationsController:
25
+ # --------------------------------------------------------------------------
26
+ def __init__(self,optimizations_settings,model,model_parts_controller,analyses_controller,responses_controller,controls_controller):
27
+
28
+ self.optimizations_settings = optimizations_settings
29
+ self.controls_controller = controls_controller
30
+ self.responses_controller = responses_controller
31
+ self.model = model
32
+
33
+ default_settings = KM.Parameters("""
34
+ {
35
+ "name" : "OPT_NAME",
36
+ "type" : "OPT_TYPE",
37
+ "settings" : {
38
+ "objectives": [],
39
+ "objectives_improvements": [],
40
+ "constraints": [],
41
+ "constraints_types": [],
42
+ "constraints_ref_values": [],
43
+ "controls": [],
44
+ "objectives_controls_weights": [],
45
+ "constraints_controls_weights": [],
46
+ "controls_lower_bounds": [],
47
+ "controls_lower_bounds_values": [],
48
+ "controls_upper_bounds": [],
49
+ "controls_upper_bounds_values": [],
50
+ "algorithm" : "ALG_NAME",
51
+ "algorithm_settings" : {
52
+ "max_iterations" : 100,
53
+ "step_size" : 0.1,
54
+ "relative_tolerance" : 1e-3
55
+ }
56
+ }
57
+ }""")
58
+
59
+ if not self.optimizations_settings.size()>0:
60
+ raise RuntimeError("OptimizationsController: optimizations list in optimizer's parameters can not be empty !")
61
+
62
+
63
+ self.optimizations = {}
64
+ self.optimizations_types={}
65
+
66
+
67
+ self.optimizations_objectives={}
68
+ self.optimizations_objectives_improvements={}
69
+
70
+
71
+ self.optimizations_constraints={}
72
+ self.optimizations_constraints_types={}
73
+ self.optimizations_constraints_ref_values={}
74
+
75
+
76
+ self.optimizations_controls={}
77
+ self.optimizations_objectives_controls_weights={}
78
+ self.optimizations_constraints_controls_weights={}
79
+
80
+
81
+ self.optimizations_algorithm={}
82
+ self.supported_opt_types = ["gradient_based"]
83
+ self.supported_algorithms = ["gradient_projection"]
84
+
85
+
86
+
87
+ for itr in range(self.optimizations_settings.size()):
88
+ opt_settings = self.optimizations_settings[itr]
89
+ opt_name = opt_settings["name"].GetString()
90
+ opt_type = opt_settings["type"].GetString()
91
+ # check for name
92
+ if opt_name in self.optimizations.keys():
93
+ raise RuntimeError("OptimizationsController: Optimization name '{}' already exists.".format(opt_name))
94
+
95
+
96
+ # check for type
97
+ if not opt_type in self.supported_opt_types:
98
+ raise RuntimeError("OptimizationsController: Optimization type '{}' is not supported, supported types {}.".format(opt_type,self.supported_opt_types))
99
+ self.optimizations_types[opt_name]=opt_type
100
+
101
+
102
+ # checks for objectives
103
+ objectives_names = opt_settings["settings"]["objectives"].GetStringArray()
104
+ if not len(objectives_names)>0:
105
+ raise RuntimeError("OptimizationsController: Objectives list of optimization '{}' can not be empty.".format(opt_name))
106
+ if len(set(objectives_names)) != len(objectives_names):
107
+ raise RuntimeError("OptimizationsController: Objectives list of optimization '{}' has duplicate response names '{}'.".format(opt_name,objectives_names))
108
+ self.responses_controller.CheckIfResponsesExist(objectives_names)
109
+ self.optimizations_objectives[opt_name]=objectives_names
110
+
111
+
112
+ # check for objectives improvements
113
+ if not opt_settings["settings"]["objectives_improvements"].IsVector():
114
+ raise RuntimeError("OptimizationsController:'objectives_improvements' of optimization '{}' should be vector of doubles.".format(opt_name))
115
+ objectives_improvements = opt_settings["settings"]["objectives_improvements"].GetVector()
116
+ if not len(objectives_improvements) == len(objectives_names):
117
+ raise RuntimeError("OptimizationsController:'objectives_improvements' of optimization '{}' should be of the same size of objectives list.".format(opt_name))
118
+ self.optimizations_objectives_improvements[opt_name]=objectives_improvements
119
+
120
+
121
+ # checks for constraints
122
+ if opt_settings["settings"]["constraints"].size()>0:
123
+ constraints_names = opt_settings["settings"]["constraints"].GetStringArray()
124
+ if len(set(constraints_names)) != len(constraints_names):
125
+ raise RuntimeError("OptimizationsController: Constraint list of optimization '{}' has duplicate response names .".format(opt_name))
126
+ self.responses_controller.CheckIfResponsesExist(constraints_names)
127
+
128
+ for constraints_name in constraints_names:
129
+ if constraints_name in objectives_names:
130
+ raise RuntimeError("OptimizationsController: Response {} in optimization {} is used as both objective and constraint.".format(constraints_name,opt_name))
131
+ self.optimizations_constraints[opt_name]=constraints_names
132
+
133
+ constraints_types = opt_settings["settings"]["constraints_types"].GetStringArray()
134
+ if not len(constraints_types) == len(constraints_names):
135
+ raise RuntimeError("OptimizationsController:'constraints_types' of optimization '{}' should be of the same size of constraint list.".format(opt_name))
136
+ for index, type in enumerate(constraints_types):
137
+ if not type in ["equality","smaller_than","bigger_than","initial_value_equality","smaller_than_initial_value","bigger_than_initial_value"]:
138
+ raise RuntimeError("OptimizationsController: constraint type {} of constraint {} of optimization '{}' should be either 'equality' or 'inequality'.".format(type,constraints_names[index],opt_name,))
139
+ self.optimizations_constraints_types[opt_name]=constraints_types
140
+
141
+ if not opt_settings["settings"]["constraints_ref_values"].IsVector():
142
+ raise RuntimeError("OptimizationsController:'constraints_ref_values' of optimization '{}' should be vector of doubles.".format(opt_name))
143
+ constraints_ref_values = opt_settings["settings"]["constraints_ref_values"].GetVector()
144
+ if not len(constraints_ref_values) == len(constraints_names):
145
+ raise RuntimeError("OptimizationsController:'constraints_ref_values' of optimization '{}' should be of the same size of constraint list.".format(opt_name))
146
+ self.optimizations_constraints_ref_values[opt_name]=constraints_ref_values
147
+
148
+
149
+ # checks for controls
150
+ controls_names = opt_settings["settings"]["controls"].GetStringArray()
151
+ if not len(controls_names)>0:
152
+ raise RuntimeError("OptimizationsController: Controls list of optimization '{}' can not be empty.".format(opt_name))
153
+ if len(set(controls_names)) != len(controls_names):
154
+ raise RuntimeError("OptimizationsController: Controls list of optimization '{}' has duplicate control names .".format(opt_name))
155
+ self.controls_controller.CheckIfControlsExist(controls_names)
156
+
157
+ for key,values in self.optimizations_controls.items():
158
+ compare_results = set(controls_names) & set(values)
159
+ if len(compare_results):
160
+ raise RuntimeError("OptimizationsController: Controls {} can not be shared between optimizations '{}' and '{}' .".format(compare_results,key,opt_name))
161
+
162
+ self.optimizations_controls[opt_name]=controls_names
163
+
164
+
165
+ # checks for objectives controls weights
166
+ if opt_settings["settings"]["objectives_controls_weights"].size() != len(controls_names):
167
+ raise RuntimeError("OptimizationsController: 'objectives_controls_weights' of optimization '{}' should be of the same size of control list .".format(opt_name))
168
+
169
+ objectives_controls_weights=[]
170
+ for i in range(opt_settings["settings"]["objectives_controls_weights"].size()):
171
+ if not opt_settings["settings"]["objectives_controls_weights"][i].IsNumber():
172
+ raise RuntimeError("OptimizationsController: entry {} of 'objectives_controls_weights' of optimization '{}' should be a number .".format(i+1,opt_name))
173
+ else:
174
+ objectives_controls_weights.append(opt_settings["settings"]["objectives_controls_weights"][i].GetDouble())
175
+
176
+ self.optimizations_objectives_controls_weights[opt_name] = objectives_controls_weights
177
+
178
+
179
+ # checks for constraints controls weights
180
+ if opt_settings["settings"]["constraints_controls_weights"].size() != len(controls_names):
181
+ raise RuntimeError("OptimizationsController: 'constraints_controls_weights' of optimization '{}' should be of the same size of control list .".format(opt_name))
182
+
183
+ constraints_controls_weights=[]
184
+ for i in range(opt_settings["settings"]["constraints_controls_weights"].size()):
185
+ if not opt_settings["settings"]["constraints_controls_weights"][i].IsNumber():
186
+ raise RuntimeError("OptimizationsController: entry {} of 'constraints_controls_weights' of optimization '{}' should be a number .".format(i+1,opt_name))
187
+ else:
188
+ constraints_controls_weights.append(opt_settings["settings"]["constraints_controls_weights"][i].GetDouble())
189
+
190
+ self.optimizations_constraints_controls_weights[opt_name] = constraints_controls_weights
191
+
192
+
193
+ # checks for algorithms settings
194
+ algorithm = opt_settings["settings"]["algorithm"].GetString()
195
+ if not algorithm in self.supported_algorithms:
196
+ raise RuntimeError("OptimizationsController: Optimization algorithm '{}' is not supported, supported types {}.".format(algorithm,self.supported_algorithms))
197
+
198
+ if algorithm == "gradient_projection":
199
+ self.optimizations[opt_name] = gradient_projection.AlgorithmGradientProjection(opt_name,opt_settings["settings"],model,model_parts_controller,analyses_controller,responses_controller,controls_controller)
200
+
201
+
202
+ # --------------------------------------------------------------------------
203
+ def Initialize(self):
204
+ for opt in self.optimizations.values():
205
+ opt.InitializeOptimizationLoop()
206
+
207
+ # --------------------------------------------------------------------------
208
+ def Optimize(self,opt_name):
209
+ if not opt_name in self.optimizations.keys():
210
+ raise RuntimeError("OptimizationsController:Optimize: Optimization {} doesn not exist !.".format(opt_name))
211
+
212
+ self.optimizations[opt_name].RunOptimizationLoop()
213
+ # --------------------------------------------------------------------------
214
+ def OptimizeAll(self):
215
+ for opt in self.optimizations.values():
216
+ opt.RunOptimizationLoop()
217
+
218
+
219
+
220
+
221
+
222
+
223
+
@@ -0,0 +1,61 @@
1
+ # ==============================================================================
2
+ # KratosOptimizationApplication
3
+ #
4
+ # License: BSD License
5
+ # license: OptimizationApplication/license.txt
6
+ #
7
+ # Main authors: Reza Najian Asl, https://github.com/RezaNajian
8
+ #
9
+ # ==============================================================================
10
+
11
+ # Kratos Core and Apps
12
+ import KratosMultiphysics as KM
13
+ from KratosMultiphysics.OptimizationApplication import model_parts_controller
14
+ from KratosMultiphysics.OptimizationApplication import analyses_controller
15
+ from KratosMultiphysics.OptimizationApplication import responses_controller
16
+ from KratosMultiphysics.OptimizationApplication import controls_controller
17
+ from KratosMultiphysics.OptimizationApplication import optimizations_controller
18
+
19
+ # additional imports
20
+
21
+
22
+ ## Purely for backward compatibility, should be removed soon.
23
+ def CreateOptimizer(optimization_settings,model):
24
+ return Optimizer(optimization_settings,model)
25
+
26
+ def Create(optimization_settings,model):
27
+ return Optimizer(optimization_settings,model)
28
+
29
+ # ==============================================================================
30
+ class Optimizer:
31
+ # --------------------------------------------------------------------------
32
+ def __init__(self, optimization_settings,model):
33
+ self._ValidateSettings(optimization_settings)
34
+ self.optimization_settings = optimization_settings
35
+ self.model_parts_controller = model_parts_controller.CreateController(optimization_settings["model_parts"],model)
36
+ self.analyses_controller = analyses_controller.CreateController(optimization_settings["analyses"],model,self.model_parts_controller)
37
+ self.responses_controller = responses_controller.CreateController(optimization_settings["responses"],model,self.model_parts_controller,self.analyses_controller)
38
+ self.controls_controller = controls_controller.CreateController(optimization_settings["controls"],model,self.model_parts_controller)
39
+ self.optimizations_controller = optimizations_controller.CreateController(optimization_settings["optimizations"],model,self.model_parts_controller,self.analyses_controller,self.responses_controller,self.controls_controller)
40
+
41
+
42
+ def _ValidateSettings(self, optimization_settings):
43
+ self._ValidateTopLevelSettings(optimization_settings)
44
+ # ------------------------------------------------------------------------------
45
+ def _ValidateTopLevelSettings(self, optimization_settings):
46
+ default_settings = KM.Parameters("""
47
+ {
48
+ "model_parts" : [ ],
49
+ "analyses" : [ ],
50
+ "responses" : [ ],
51
+ "controls" : [ ],
52
+ "optimizations" : [ ]
53
+ }""")
54
+
55
+ for key in default_settings.keys():
56
+ if not optimization_settings.Has(key):
57
+ raise RuntimeError("Optimizer: Required setting '{}' missing in optimizer's input parameters !".format(key))
58
+
59
+ optimization_settings.ValidateAndAssignDefaults(default_settings)
60
+
61
+
@@ -0,0 +1,212 @@
1
+ from datetime import datetime
2
+ from typing import Union, Any
3
+
4
+ import KratosMultiphysics as Kratos
5
+ from KratosMultiphysics.OptimizationApplication.responses.response_function import ResponseFunction
6
+ from KratosMultiphysics.OptimizationApplication.controls.control import Control
7
+ from KratosMultiphysics.OptimizationApplication.execution_policies.execution_policy import ExecutionPolicy
8
+ from KratosMultiphysics.OptimizationApplication.utilities.component_data_view import ComponentDataView
9
+ from KratosMultiphysics.OptimizationApplication.utilities.optimization_problem import OptimizationProblem
10
+ from KratosMultiphysics.OptimizationApplication.utilities.optimization_problem_utilities import GetAllComponentFullNamesWithData
11
+ from KratosMultiphysics.OptimizationApplication.utilities.optimization_problem_utilities import GetComponentHavingDataByFullName
12
+
13
+ def Factory(_: Kratos.Model, parameters: Kratos.Parameters, optimization_problem: OptimizationProblem) -> ExecutionPolicy:
14
+ if not parameters.Has("settings"):
15
+ raise RuntimeError(f"OptimizationProblemAsciiOutputProcess instantiation requires a \"settings\" in parameters [ parameters = {parameters}].")
16
+ return OptimizationProblemAsciiOutputProcess(parameters["settings"], optimization_problem)
17
+
18
+ class Header:
19
+ def __init__(self, header_name: str, value: Any, format_info: dict):
20
+ header_name = header_name.strip()
21
+ header_length = len(header_name)
22
+
23
+ if isinstance(value, bool):
24
+ value_length = max(len(format_info[bool][0]), len(format_info[bool][1]))
25
+ value_format_post_fix = "s"
26
+ self.__value_converter = lambda x: format_info[bool][1] if x else format_info[bool][0]
27
+ elif isinstance(value, int):
28
+ value_length = len(("{:" + str(format_info[int]) + "d}").format(value))
29
+ value_format_post_fix = "d"
30
+ self.__value_converter = lambda x: int(x)
31
+ elif isinstance(value, float):
32
+ value_length = len(("{:0." + str(format_info[float]) + "e}").format(value))
33
+ value_format_post_fix = f".{format_info[float]}e"
34
+ self.__value_converter = lambda x: float(x)
35
+ else:
36
+ value_length = format_info[str]
37
+ value_format_post_fix = "s"
38
+ self.__value_converter = lambda x: str(x)
39
+
40
+ if header_length > value_length:
41
+ self.__header_name = header_name
42
+ self.__value_format = "{:>" + str(header_length) + value_format_post_fix + "}"
43
+ else:
44
+ self.__header_name = ("{:>" + str(value_length) + "s}").format(header_name)
45
+ self.__value_format = "{:>" + str(value_length) + value_format_post_fix + "}"
46
+
47
+ def GetHeaderName(self) -> str:
48
+ return self.__header_name
49
+
50
+ def GetValueStr(self, value: Any) -> str:
51
+ return self.__value_format.format(self.__value_converter(value))
52
+
53
+ class OptimizationProblemAsciiOutputProcess(Kratos.OutputProcess):
54
+ def GetDefaultParameters(self):
55
+ return Kratos.Parameters(
56
+ """
57
+ {
58
+ "output_file_name" : "SPECIFY_OUTPUT_FILE_NAME",
59
+ "write_kratos_version" : true,
60
+ "write_time_stamp" : true,
61
+ "write_initial_values" : true,
62
+ "list_of_output_components": ["all"],
63
+ "format_info": {
64
+ "int_length" : 7,
65
+ "float_precision": 9,
66
+ "bool_values" : ["no", "yes"],
67
+ "string_length" : 10
68
+ }
69
+ }
70
+ """
71
+ )
72
+
73
+ def __init__(self, parameters: Kratos.Parameters, optimization_problem: OptimizationProblem):
74
+ Kratos.OutputProcess.__init__(self)
75
+
76
+ self.optimization_problem = optimization_problem
77
+ parameters.RecursivelyValidateAndAssignDefaults(self.GetDefaultParameters())
78
+
79
+ self.output_file_name = parameters["output_file_name"].GetString()
80
+ if not self.output_file_name.endswith(".csv"):
81
+ self.output_file_name += ".csv"
82
+
83
+ self.write_kratos_version = parameters["write_kratos_version"].GetBool()
84
+ self.write_time_stamp = parameters["write_time_stamp"].GetBool()
85
+ self.write_initial_values = parameters["write_initial_values"].GetBool()
86
+
87
+ self.format_info = {
88
+ int : parameters["format_info"]["int_length"].GetInt(),
89
+ float: parameters["format_info"]["float_precision"].GetInt(),
90
+ bool : parameters["format_info"]["bool_values"].GetStringArray(),
91
+ str : parameters["format_info"]["string_length"].GetInt(),
92
+ }
93
+
94
+ self.list_of_component_names = parameters["list_of_output_components"].GetStringArray()
95
+
96
+ if len(self.format_info[bool]) != 2:
97
+ raise RuntimeError("The \"bool_values\" should have only two strings corresponding to False and True values in the mentioned order.")
98
+
99
+ self.list_of_headers: 'list[tuple[Any, dict[str, Header]]]' = []
100
+ self.initialized_headers = False
101
+
102
+ def IsOutputStep(self) -> bool:
103
+ return True
104
+
105
+ def PrintOutput(self) -> None:
106
+ if not self.initialized_headers:
107
+ # now get the buffered data headers
108
+ self.list_of_headers = self._GetHeaders(lambda x: x.GetBufferedData())
109
+ # write the ehader information
110
+ self._WriteHeaders()
111
+ self.initialized_headers = True
112
+
113
+ if self._IsWritingProcess():
114
+ # now write step data
115
+ with open(self.output_file_name, "a") as file_output:
116
+ # write the step
117
+ file_output.write("{:>7d}".format(self.optimization_problem.GetStep()))
118
+
119
+ # write the values
120
+ for component, header_info_dict in self.list_of_headers:
121
+ componend_data_view = ComponentDataView(component, self.optimization_problem)
122
+ buffered_dict = componend_data_view.GetBufferedData()
123
+ for k, header in header_info_dict.items():
124
+ file_output.write(", " + header.GetValueStr(buffered_dict[k]))
125
+
126
+ file_output.write("\n")
127
+
128
+ def ExecuteFinalize(self):
129
+ if self._IsWritingProcess():
130
+ with open(self.output_file_name, "a") as file_output:
131
+ file_output.write("# End of file")
132
+
133
+ def _IsWritingProcess(self):
134
+ if Kratos.IsDistributedRun():
135
+ data_communicator: Kratos.DataCommunicator = Kratos.ParallelEnvironment.GetDefaultDataCommunicator()
136
+ return data_communicator.Rank() == 0
137
+ else:
138
+ return True
139
+
140
+ def _WriteHeaders(self):
141
+ if (self._IsWritingProcess()):
142
+ kratos_version = "not_given"
143
+ if (self.write_kratos_version):
144
+ kratos_version = str(Kratos.KratosGlobals.Kernel.Version())
145
+
146
+ time_stamp = "not_specified"
147
+ if (self.write_time_stamp):
148
+ time_stamp = str(datetime.now())
149
+
150
+ msg_header = ""
151
+ msg_header = f"{msg_header}# Optimization problem ascii output\n"
152
+ msg_header = f"{msg_header}# Kratos version: {kratos_version}\n"
153
+ msg_header = f"{msg_header}# Timestamp : {time_stamp}\n"
154
+ msg_header = f"{msg_header}# -----------------------------------------------\n"
155
+
156
+ if self.write_initial_values:
157
+ msg_header = f"{msg_header}# --------------- Initial values ----------------\n"
158
+
159
+ initial_headers = self._GetHeaders(lambda x: x.GetUnBufferedData())
160
+ # now write the initial value container data
161
+ for component, header_info_dict in initial_headers:
162
+ componend_data_view = ComponentDataView(component, self.optimization_problem)
163
+ buffered_dict = componend_data_view.GetUnBufferedData()
164
+ component_name = componend_data_view.GetComponentName()
165
+ msg_header = f"{msg_header}# \t" + component_name + ":\n"
166
+ for k, header in header_info_dict.items():
167
+ component_name_header = header.GetHeaderName().strip()[len(component_name)+1:]
168
+ msg_header = f"{msg_header}# \t\t" + component_name_header + ": " + header.GetValueStr(buffered_dict[k]).strip() + "\n"
169
+
170
+ msg_header = f"{msg_header}# ------------ End of initial values ------------\n"
171
+ msg_header = f"{msg_header}# -----------------------------------------------\n"
172
+
173
+ msg_header = f"{msg_header}# ------------ Start of step values -------------\n"
174
+ msg_header = f"{msg_header}# Headers:\n"
175
+
176
+ msg_header = f"{msg_header}# STEP"
177
+
178
+ for _, header_info_dict in self.list_of_headers:
179
+ for header in header_info_dict.values():
180
+ msg_header = f"{msg_header}, " + header.GetHeaderName()
181
+
182
+ msg_header = f"{msg_header}\n"
183
+
184
+ # write the header
185
+ with open(self.output_file_name, "w") as file_output:
186
+ file_output.write(msg_header)
187
+
188
+ def _GetHeaders(self, dict_getter_method) -> 'list[tuple[Any, dict[str, Header]]]':
189
+ self.list_of_components: 'list[Union[str, ResponseFunction, Control, ExecutionPolicy]]' = []
190
+
191
+ if len(self.list_of_component_names) == 1 and self.list_of_component_names[0] == "all":
192
+ self.list_of_component_names = GetAllComponentFullNamesWithData(self.optimization_problem)
193
+
194
+ for component_name in self.list_of_component_names:
195
+ component = GetComponentHavingDataByFullName(component_name, self.optimization_problem)
196
+ if ComponentDataView(component, self.optimization_problem).HasDataBuffer():
197
+ self.list_of_components.append(component)
198
+
199
+ list_of_headers: 'list[tuple[Any, dict[str, Header]]]' = []
200
+ for component in self.list_of_components:
201
+ componend_data_view = ComponentDataView(component, self.optimization_problem)
202
+ values_map = dict_getter_method(componend_data_view).GetMap()
203
+ header_info_dict: 'dict[str, Header]' = {}
204
+ component_name = componend_data_view.GetComponentName()
205
+ for k, v in values_map.items():
206
+ if isinstance(v, (bool, int, float, str)):
207
+ header_name = component_name + ":" + k[k.rfind("/") + 1:]
208
+ if header_name in [header.GetHeaderName().strip() for header in header_info_dict.values()]:
209
+ Kratos.Logger.PrintWarning(self.__class__.__name__, "Second value with same header name = \"" + header_name + "\" found.")
210
+ header_info_dict[k] = Header(header_name, v, self.format_info)
211
+ list_of_headers.append([component, header_info_dict])
212
+ return list_of_headers