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,393 @@
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
+ import KratosMultiphysics as KM
12
+ from KratosMultiphysics import Parameters, Logger
13
+ from KratosMultiphysics.vtk_output_process import VtkOutputProcess
14
+
15
+ # Additional imports
16
+ import csv
17
+ # ==============================================================================
18
+ class OptimizationAlgorithm:
19
+ def __init__(self,name,opt_settings,model,model_parts_controller,analyses_controller,responses_controller,controls_controller):
20
+
21
+ self.name = name
22
+ self.opt_settings = opt_settings
23
+ self.model=model
24
+ self.model_parts_controller = model_parts_controller
25
+ self.analyses_controller = analyses_controller
26
+ self.responses_controller = responses_controller
27
+ self.controls_controller = controls_controller
28
+
29
+ # objectives
30
+ self.objectives = self.opt_settings["objectives"].GetStringArray()
31
+ self.objectives_improvements = self.opt_settings["objectives_improvements"].GetVector()
32
+
33
+ # constraints
34
+ self.constraints = self.opt_settings["constraints"].GetStringArray()
35
+ self.constraints_types = self.opt_settings["constraints_types"].GetStringArray()
36
+ self.constraints_ref_values = self.opt_settings["constraints_ref_values"].GetVector()
37
+ # all responses
38
+ self.responses = self.objectives + self.constraints
39
+
40
+ # now extract analyses belong to responses
41
+ self.analyses = self.responses_controller.GetResponsesAnalyses(self.responses)
42
+
43
+ # controls
44
+ self.controls = opt_settings["controls"].GetStringArray()
45
+ self.objectives_controls_weights = opt_settings["objectives_controls_weights"].GetVector()
46
+ self.constraints_controls_weights = opt_settings["constraints_controls_weights"].GetVector()
47
+
48
+ # algorithm_settings
49
+ self.max_iterations = self.opt_settings["algorithm_settings"]["max_iterations"].GetInt()
50
+ self.projection_step_size = self.opt_settings["algorithm_settings"]["projection_step_size"].GetDouble()
51
+ self.correction_step_size = self.opt_settings["algorithm_settings"]["correction_step_size"].GetDouble()
52
+
53
+ # compile settings for responses
54
+ self.responses_controls = {}
55
+ self.responses_types = {}
56
+ self.responses_controlled_objects = {}
57
+ self.responses_control_gradient_names = {}
58
+ self.responses_control_types = {}
59
+ self.responses_control_var_names = {}
60
+ self.responses_var_names = {}
61
+ self.controls_responses={}
62
+ self.controls_response_var_names = {}
63
+ self.controls_response_gradient_names = {}
64
+ self.controls_response_control_gradient_names = {}
65
+ self.root_model_part_data_field_names = {}
66
+ self.analyses_responses = {}
67
+ self.analysis_free_responses = []
68
+ for response in self.responses:
69
+ response_type = self.responses_controller.GetResponseType(response)
70
+ response_analysis = self.responses_controller.GetResponseAnalysis(response)
71
+ if response_analysis != None:
72
+ if response_analysis in self.analyses_responses.keys():
73
+ self.analyses_responses[response_analysis].append(response)
74
+ else:
75
+ self.analyses_responses[response_analysis] = [response]
76
+ else:
77
+ self.analysis_free_responses.append(response)
78
+
79
+ self.responses_types[response] = response_type
80
+ response_controlled_objects = self.responses_controller.GetResponseControlledObjects(response)
81
+ response_control_types = self.responses_controller.GetResponseControlTypes(response)
82
+ response_variable_name = self.responses_controller.GetResponseVariableName(response)
83
+ self.responses_var_names[response] = response_variable_name
84
+ for control in self.controls:
85
+ control_type = self.controls_controller.GetControlType(control)
86
+ control_variable_name = self.controls_controller.GetControlVariableName(control)
87
+ control_update_name = self.controls_controller.GetControlUpdateName(control)
88
+ control_output_names = self.controls_controller.GetControlOutputNames(control)
89
+ control_controlling_objects = self.controls_controller.GetControlControllingObjects(control)
90
+ for control_controlling_object in control_controlling_objects:
91
+ response_controlled_object_index = 0
92
+ for response_controlled_object in response_controlled_objects:
93
+ response_controlled_object_type = response_control_types[response_controlled_object_index]
94
+ if control_controlling_object == response_controlled_object and response_controlled_object_type == control_type:
95
+ response_gradient_name = self.responses_controller.GetResponseGradientVariableNameForType(response,control_type)
96
+ response_control_gradient_field = "D_"+response_variable_name+"_D_"+control_variable_name
97
+ if response in self.responses_controlled_objects.keys():
98
+ self.responses_controlled_objects[response].append(control_controlling_object)
99
+ self.responses_controls[response].append(control)
100
+ self.responses_control_types[response].append(control_type)
101
+ self.responses_control_var_names[response].append(control_variable_name)
102
+ self.responses_control_gradient_names[response].append(response_control_gradient_field)
103
+ else:
104
+ self.responses_controlled_objects[response]=[control_controlling_object]
105
+ self.responses_control_types[response]=[control_type]
106
+ self.responses_control_var_names[response]=[control_variable_name]
107
+ self.responses_control_gradient_names[response]=[response_control_gradient_field]
108
+ self.responses_controls[response]=[control]
109
+
110
+
111
+ control_controlling_root_model_part = self.model_parts_controller.GetRootModelPart(control_controlling_object)
112
+ extracted_root_model_part_name = control_controlling_object.split(".")[0]
113
+
114
+ if extracted_root_model_part_name in self.root_model_part_data_field_names.keys():
115
+ if not response_control_gradient_field in self.root_model_part_data_field_names[extracted_root_model_part_name]:
116
+ self.root_model_part_data_field_names[extracted_root_model_part_name].append(response_control_gradient_field)
117
+ self.root_model_part_data_field_names[extracted_root_model_part_name].append(response_gradient_name)
118
+ self.root_model_part_data_field_names[extracted_root_model_part_name].extend(control_output_names)
119
+ control_controlling_root_model_part.AddNodalSolutionStepVariable(KM.KratosGlobals.GetVariable(response_control_gradient_field))
120
+ else:
121
+ self.root_model_part_data_field_names[extracted_root_model_part_name] = [response_control_gradient_field,response_gradient_name]
122
+ self.root_model_part_data_field_names[extracted_root_model_part_name].extend(control_output_names)
123
+ control_controlling_root_model_part.AddNodalSolutionStepVariable(KM.KratosGlobals.GetVariable(response_control_gradient_field))
124
+
125
+ if control in self.controls_responses.keys():
126
+ if not response in self.controls_responses[control]:
127
+ self.controls_responses[control].append(response)
128
+ self.controls_response_var_names[control].append(response_variable_name)
129
+ self.controls_response_gradient_names[control].append(response_gradient_name)
130
+ self.controls_response_control_gradient_names[control].append(response_control_gradient_field)
131
+ else:
132
+ self.controls_responses[control] = [response]
133
+ self.controls_response_var_names[control] = [response_variable_name]
134
+ self.controls_response_gradient_names[control]= [response_gradient_name]
135
+ self.controls_response_control_gradient_names[control] = [response_control_gradient_field]
136
+
137
+ response_controlled_object_index +=1
138
+
139
+ # compile settings for c++ optimizer
140
+ self.opt_parameters = Parameters()
141
+ self.opt_parameters.AddEmptyArray("objectives")
142
+ self.opt_parameters.AddEmptyArray("constraints")
143
+ self.opt_parameters.AddInt("opt_itr",0)
144
+ self.opt_parameters.AddInt("max_opt_itr",self.max_iterations)
145
+ self.opt_parameters.AddDouble("projection_step_size",self.projection_step_size)
146
+ self.opt_parameters.AddDouble("correction_step_size",self.correction_step_size)
147
+ self.opt_parameters.AddInt("num_active_consts",0)
148
+ self.opt_parameters.AddDouble("sin_alpha",0)
149
+ self.opt_parameters.AddBool("opt_converged",False)
150
+ for response in self.responses_controlled_objects.keys():
151
+ response_settings = Parameters()
152
+ response_settings.AddString("name",response)
153
+ response_settings.AddString("response_type",self.responses_types[response])
154
+ response_settings.AddString("variable_name",self.responses_var_names[response])
155
+ response_settings.AddDouble("value",0.0)
156
+ response_settings.AddDouble("weight",1.0)
157
+ response_settings.AddDouble("init_value",0.0)
158
+ response_settings.AddDouble("prev_itr_value",0.0)
159
+ response_settings.AddEmptyArray("controlled_objects")
160
+ response_settings.AddEmptyArray("control_types")
161
+ response_settings.AddEmptyArray("control_gradient_names")
162
+ response_settings.AddEmptyArray("control_variable_names")
163
+ response_settings.AddEmptyArray("controls")
164
+
165
+ for control_obj in self.responses_controlled_objects[response]:
166
+ response_settings["controlled_objects"].Append(control_obj)
167
+
168
+ for control_type in self.responses_control_types[response]:
169
+ response_settings["control_types"].Append(control_type)
170
+
171
+ for control_variable in self.responses_control_var_names[response]:
172
+ response_settings["control_variable_names"].Append(control_variable)
173
+
174
+ for control_gradient_name in self.responses_control_gradient_names[response]:
175
+ response_settings["control_gradient_names"].Append(control_gradient_name)
176
+
177
+ for control in self.responses_controls[response]:
178
+ response_settings["controls"].Append(control)
179
+
180
+ if response in self.objectives:
181
+ index = self.objectives.index(response)
182
+ response_settings.AddDouble("objective_improvement",self.objectives_improvements[index])
183
+ self.opt_parameters["objectives"].Append(response_settings)
184
+ elif response in self.constraints:
185
+ index = self.constraints.index(response)
186
+ response_settings.AddString("type",self.constraints_types[index])
187
+ response_settings.AddDouble("ref_value",self.constraints_ref_values[index])
188
+ response_settings.AddBool("is_active",True)
189
+ response_settings.AddBool("prev_itr_is_active",False)
190
+ self.opt_parameters["constraints"].Append(response_settings)
191
+ else:
192
+ raise RuntimeError("OptimizationAlgorithm:__init__:error in compile settings for c++ optimizer")
193
+
194
+ self.opt_parameters.AddEmptyArray("controls")
195
+ for control in self.controls:
196
+ control_index = self.controls.index(control)
197
+ control_objectives_weight = self.objectives_controls_weights[control_index]
198
+ control_constraints_weight = self.constraints_controls_weights[control_index]
199
+ control_type = self.controls_controller.GetControlType(control)
200
+ control_update_name = self.controls_controller.GetControlUpdateName(control)
201
+ control_variable_name = self.controls_controller.GetControlVariableName(control)
202
+ control_settings = Parameters()
203
+ control_settings.AddString("name",control)
204
+ control_settings.AddString("type",control_type)
205
+ control_settings.AddString("update_name",control_update_name)
206
+ control_settings.AddString("variable_name",control_variable_name)
207
+ control_settings.AddDouble("objectives_weight",control_objectives_weight)
208
+ control_settings.AddDouble("constraints_weight",control_constraints_weight)
209
+ if control_type == "shape":
210
+ control_settings.AddInt("size",3)
211
+ elif control_type == "thickness":
212
+ control_settings.AddInt("size",1)
213
+ elif control_type == "material":
214
+ control_settings.AddInt("size",1)
215
+ else:
216
+ raise RuntimeError("OptimizationAlgorithm:__init__:error in compile settings for c++ optimizer")
217
+
218
+ control_settings.AddEmptyArray("controlling_objects")
219
+
220
+ control_controlling_objects = self.controls_controller.GetControlControllingObjects(control)
221
+ for control_controlling_object in control_controlling_objects:
222
+ control_settings["controlling_objects"].Append(control_controlling_object)
223
+
224
+ self.opt_parameters["controls"].Append(control_settings)
225
+
226
+ Logger.PrintInfo("::[OptimizationAlgorithm]:: ", "Variables ADDED")
227
+
228
+ # --------------------------------------------------------------------------
229
+ def InitializeOptimizationLoop( self ):
230
+
231
+ # create vtkIOs
232
+ self.root_model_parts_vtkIOs = {}
233
+ for root_model_part,data_fields in self.root_model_part_data_field_names.items():
234
+ vtk_parameters = Parameters()
235
+ root_controlling_model_part = self.model_parts_controller.GetRootModelPart(root_model_part)
236
+ vtk_parameters.AddString("model_part_name",root_controlling_model_part.Name)
237
+ vtk_parameters.AddBool("write_ids",False)
238
+ vtk_parameters.AddString("file_format","ascii")
239
+ vtk_parameters.AddBool("output_sub_model_parts",False)
240
+ vtk_parameters.AddString("output_path","Optimization_Results")
241
+ vtk_parameters.AddEmptyArray("nodal_solution_step_data_variables")
242
+ for nodal_result in data_fields:
243
+ vtk_parameters["nodal_solution_step_data_variables"].Append(nodal_result)
244
+
245
+ controlling_model_part_vtkIO = VtkOutputProcess(self.model, vtk_parameters)
246
+ controlling_model_part_vtkIO.ExecuteInitialize()
247
+ controlling_model_part_vtkIO.ExecuteBeforeSolutionLoop()
248
+ self.root_model_parts_vtkIOs[root_model_part] = controlling_model_part_vtkIO
249
+
250
+ # --------------------------------------------------------------------------
251
+ def RunOptimizationLoop( self ):
252
+ raise RuntimeError("Algorithm base class is called. Please check your implementation of the function >> RunOptimizationLoop << .")
253
+
254
+ # --------------------------------------------------------------------------
255
+ def FinalizeOptimizationLoop( self ):
256
+ for vtkIO in self.root_model_parts_vtkIOs.values():
257
+ vtkIO.ExecuteFinalize()
258
+
259
+ # --------------------------------------------------------------------------
260
+ def SetResponseValue( self,response,value ):
261
+
262
+ for objective in self.opt_parameters["objectives"]:
263
+ if objective["name"].GetString() == response:
264
+ objective["prev_itr_value"].SetDouble(objective["value"].GetDouble())
265
+ objective["value"].SetDouble(value)
266
+ if self.opt_parameters["opt_itr"].GetInt()<2:
267
+ objective["init_value"].SetDouble(value)
268
+
269
+ return True
270
+
271
+ for constraint in self.opt_parameters["constraints"]:
272
+ if constraint["name"].GetString() == response:
273
+ constraint["prev_itr_value"].SetDouble(constraint["value"].GetDouble())
274
+ constraint["value"].SetDouble(value)
275
+ if self.opt_parameters["opt_itr"].GetInt()<2:
276
+ constraint["init_value"].SetDouble(value)
277
+ valid_types = ["initial_value_equality","smaller_than_initial_value","bigger_than_initial_value"]
278
+ if constraint["type"].GetString() in valid_types:
279
+ constraint["ref_value"].SetDouble(value)
280
+
281
+ ref_value = constraint["ref_value"].GetDouble()
282
+
283
+ type = constraint["type"].GetString()
284
+ is_active = False
285
+ if type == "equality" or type == "initial_value_equality":
286
+ is_active = True
287
+ elif (type == "smaller_than" or type == "smaller_than_initial_value") and value>ref_value:
288
+ is_active = True
289
+ elif (type == "bigger_than" or type == "bigger_than_initial_value") and value<ref_value:
290
+ is_active = True
291
+
292
+ if is_active:
293
+ self.num_active_consts += 1
294
+
295
+ constraint["prev_itr_is_active"].SetBool(constraint["is_active"].GetBool())
296
+ constraint["is_active"].SetBool(is_active)
297
+
298
+ return is_active
299
+
300
+ # --------------------------------------------------------------------------
301
+ def _InitializeCSVLogger(self):
302
+ self.complete_log_file_name = "optimization_log.csv"
303
+ with open(self.complete_log_file_name, 'w') as csvfile:
304
+ historyWriter = csv.writer(csvfile, delimiter=',',quotechar='|',quoting=csv.QUOTE_MINIMAL)
305
+ row = []
306
+ row.append("{:>4s}".format("itr"))
307
+ for objective in self.opt_parameters["objectives"]:
308
+ row.append("{:>4s}".format("f: "+str(objective["name"].GetString())))
309
+ row.append("{:>4s}".format("abs[%]"))
310
+ row.append("{:>4s}".format("rel[%]"))
311
+ row.append("{:>4s}".format("weight"))
312
+
313
+ for constraint in self.opt_parameters["constraints"]:
314
+ row.append("{:>4s}".format("g: "+str(constraint["name"].GetString())))
315
+ row.append("{:>4s}".format("ref_val "))
316
+ row.append("{:>4s}".format("ref_diff[%]"))
317
+ row.append("{:>4s}".format("weight"))
318
+ row.append("{:>4s}".format("is_active"))
319
+
320
+
321
+ row.append("{:>4s}".format("projection_step_size"))
322
+ if self.opt_parameters["constraints"].size() > 0:
323
+ row.append("{:>4s}".format("correction_step_size"))
324
+ row.append("{:>4s}".format("sin_alpha"))
325
+
326
+ historyWriter.writerow(row)
327
+
328
+ # --------------------------------------------------------------------------
329
+ def _WriteCurrentOptItrToCSVFile( self ):
330
+
331
+ with open(self.complete_log_file_name, 'a') as csvfile:
332
+ historyWriter = csv.writer(csvfile, delimiter=',',quotechar='|',quoting=csv.QUOTE_MINIMAL)
333
+ row = []
334
+ row.append("{:>4d}".format(self.optimization_iteration))
335
+
336
+ Logger.Print("")
337
+
338
+ for objective in self.opt_parameters["objectives"]:
339
+ objectivs_current_value = objective["value"].GetDouble()
340
+ objectivs_weight = objective["weight"].GetDouble()
341
+ objective_initial_value = objectivs_current_value
342
+ objective_previous_value = objectivs_current_value
343
+
344
+ if self.optimization_iteration>1:
345
+ objective_initial_value = objective["init_value"].GetDouble()
346
+ objective_previous_value = objective["prev_itr_value"].GetDouble()
347
+
348
+ rel_change = 100 * (objectivs_current_value-objective_previous_value)/objective_previous_value
349
+ abs_change = 100 * (objectivs_current_value-objective_initial_value)/objective_initial_value
350
+
351
+ Logger.Print(" ===== objective: ",objective["name"].GetString())
352
+ Logger.Print(" current value: ",objectivs_current_value)
353
+ Logger.Print(" rel_change: ",rel_change)
354
+ Logger.Print(" abs_change: ",abs_change)
355
+ Logger.Print(" weight: ",objectivs_weight)
356
+ row.append(" {:> .5E}".format(objectivs_current_value))
357
+ row.append(" {:> .5E}".format(abs_change))
358
+ row.append(" {:> .5E}".format(rel_change))
359
+ row.append(" {:> .5E}".format(objectivs_weight))
360
+
361
+ for constraint in self.opt_parameters["constraints"]:
362
+ constraint_current_value = constraint["value"].GetDouble()
363
+ constraint_ref_val = constraint["ref_value"].GetDouble()
364
+ constraint_weight = constraint["weight"].GetDouble()
365
+ is_active = constraint["is_active"].GetBool()
366
+ abs_change = 100 * abs(constraint_current_value-constraint_ref_val)/abs(constraint_ref_val)
367
+
368
+ Logger.Print(" ===== constraint: ",constraint["name"].GetString())
369
+ Logger.Print(" current value: ",constraint_current_value)
370
+ Logger.Print(" ref value: ",constraint_ref_val)
371
+ Logger.Print(" change: ",abs_change)
372
+ Logger.Print(" weight: ",constraint_weight)
373
+ Logger.Print(" is_active: ",is_active)
374
+
375
+ row.append(" {:> .5E}".format(constraint_current_value))
376
+ row.append(" {:> .5E}".format(constraint_ref_val))
377
+ row.append(" {:> .5E}".format(abs_change))
378
+ row.append(" {:> .5E}".format(constraint_weight))
379
+ row.append(" {:> .5E}".format(is_active))
380
+
381
+
382
+ Logger.Print(" ===== projection_step_size: ",self.opt_parameters["projection_step_size"].GetDouble())
383
+ row.append(" {:> .5E}".format(self.opt_parameters["projection_step_size"].GetDouble()))
384
+
385
+ if self.opt_parameters["constraints"].size() > 0 and self.opt_parameters["num_active_consts"].GetInt()>0:
386
+ Logger.Print(" ===== correction_step_size: ",self.opt_parameters["correction_step_size"].GetDouble())
387
+ row.append(" {:> .5E}".format(self.opt_parameters["correction_step_size"].GetDouble()))
388
+ Logger.Print(" ===== sin alpha: ",self.opt_parameters["sin_alpha"].GetDouble())
389
+ row.append(" {:> .5E}".format(self.opt_parameters["sin_alpha"].GetDouble()))
390
+
391
+ historyWriter.writerow(row)
392
+
393
+ # ==============================================================================