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,390 @@
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
+ # additional imports
12
+ # Kratos Core and Apps
13
+ import KratosMultiphysics as KM
14
+ from KratosMultiphysics import Logger
15
+
16
+ # Additional imports
17
+ import KratosMultiphysics.OptimizationApplication.responses.analysis_based_response_function_factory as analysis_based_response_function_factory
18
+ import KratosMultiphysics.OptimizationApplication.responses.analysis_free_response_function_factory as analysis_free_response_function_factory
19
+ import time as timer
20
+
21
+ # ==============================================================================
22
+ def CreateController(reponses_settings,model,model_parts_controller,analyses_controller):
23
+ return ResponsesController(reponses_settings,model,model_parts_controller,analyses_controller)
24
+
25
+ # ==============================================================================
26
+ class ResponsesController:
27
+ # --------------------------------------------------------------------------
28
+ def __init__(self,reponses_settings,model,model_parts_controller,analyses_controller):
29
+
30
+ self.reponses_settings = reponses_settings
31
+ self.analyses_controller = analyses_controller
32
+ self.model_parts_controller = model_parts_controller
33
+ self.model = model
34
+
35
+ required_settings = KM.Parameters("""
36
+ {
37
+ "name" : "REPONSE_NAME",
38
+ "type" : "RESPONSE_TYPE",
39
+ "settings" : {
40
+ "evaluated_objects": [],
41
+ "controlled_objects": [],
42
+ "control_types": []
43
+ }
44
+ }""")
45
+
46
+
47
+ for itr in range(self.reponses_settings.size()):
48
+ for key in required_settings.keys():
49
+ if not self.reponses_settings[itr].Has(key):
50
+ raise RuntimeError("ResponsesController: Required entry '{}' missing in 'response Nr.{}'!".format(key,itr+1))
51
+
52
+ for key in required_settings["settings"].keys():
53
+ if not self.reponses_settings[itr]["settings"].Has(key):
54
+ raise RuntimeError("ResponsesController: Required entry '{}' missing in settings of 'response Nr.{}'!".format(key,itr+1))
55
+
56
+
57
+ analysis_based_responses = ["partition_interface_stress"]
58
+ structural_responses = ["strain_energy", "stress"]
59
+ analysis_based_responses.extend(structural_responses)
60
+
61
+ analysis_free_responses = ["mass","linear","plane_symmetry","interface","partition_mass","am_max_overhang_angle"]
62
+ shape_opt_responses = ["plane_based_packaging","mesh_based_packaging","surface_normal_shape_change","face_angle","airfoil_chord_length",
63
+ "airfoil_perimeter","total_volume"]
64
+ analysis_free_responses.extend(shape_opt_responses)
65
+
66
+ self.supported_responses = []
67
+ self.supported_responses.extend(analysis_based_responses)
68
+ self.supported_responses.extend(analysis_free_responses)
69
+
70
+
71
+ self.responses = {}
72
+ self.responses_type = {}
73
+ self.responses_analyses = {}
74
+ self.responses_evaluated_objects = {}
75
+ self.responses_controlled_objects = {}
76
+ self.responses_control_types = {}
77
+ for itr in range(self.reponses_settings.size()):
78
+ response_settings = self.reponses_settings[itr]
79
+ response_name = response_settings["name"].GetString()
80
+ response_type = response_settings["type"].GetString()
81
+
82
+ # check for name
83
+ if response_name in self.responses.keys():
84
+ raise RuntimeError("ResponsesController: Response name {} already exists.".format(response_name))
85
+
86
+ # check for evaluated_objects
87
+ evaluated_objects = response_settings["settings"]["evaluated_objects"].GetStringArray()
88
+ if len(evaluated_objects)>0:
89
+ self.model_parts_controller.CheckIfRootModelPartsExist(evaluated_objects,True)
90
+ else:
91
+ raise RuntimeError("ResponsesController: 'evaluated_objects' of response {} can not be empty.".format(response_name))
92
+
93
+ self.responses_evaluated_objects[response_name] = evaluated_objects
94
+
95
+ # check for controlled_objects
96
+ controlled_objects = response_settings["settings"]["controlled_objects"].GetStringArray()
97
+ if len(controlled_objects)>0:
98
+ self.model_parts_controller.CheckIfRootModelPartsExist(controlled_objects,True)
99
+ else:
100
+ raise RuntimeError("ResponsesController: 'controlled_objects' of response {} can not be empty.".format(response_name))
101
+ self.responses_controlled_objects[response_name] = controlled_objects
102
+
103
+ # check if controlled_objects and evaluated_objects have the same root model parts
104
+ first_root_evaluated_model_part = evaluated_objects[0].split(".")[0]
105
+
106
+ for model_part in evaluated_objects:
107
+ if model_part.split(".")[0] != first_root_evaluated_model_part:
108
+ raise RuntimeError("ResponsesController: 'evaluated_objects' of response {} must have the same root model part.".format(response_name))
109
+
110
+ first_root_controlled_model_part = controlled_objects[0].split(".")[0]
111
+ for model_part in controlled_objects:
112
+ if model_part.split(".")[0] != first_root_controlled_model_part:
113
+ raise RuntimeError("ResponsesController: 'controlled_objects' of response {} must have the same root model part.".format(response_name))
114
+
115
+ if first_root_controlled_model_part != first_root_evaluated_model_part:
116
+ raise RuntimeError("ResponsesController: 'controlled_objects' and 'evaluated_objects' of response {} must have the same root model parts.".format(response_name))
117
+
118
+ # check for control_types
119
+ control_types = response_settings["settings"]["control_types"].GetStringArray()
120
+ if len(control_types) != len(controlled_objects):
121
+ raise RuntimeError("ResponsesController: 'control_types' of response {} must be of the same size as controlled_objects .".format(response_name))
122
+ self.responses_control_types[response_name] = control_types
123
+
124
+ response = None
125
+ if response_type in analysis_based_responses:
126
+ if not response_settings["settings"].Has("analysis_name"):
127
+ raise RuntimeError("ResponsesController: Response {} of type {} requires analysis with analysis_name entry in settings".format(response_name,response_type))
128
+ response_analysis_name = response_settings["settings"]["analysis_name"].GetString()
129
+ response_analysis = analyses_controller.GetAnalysis(response_analysis_name)
130
+ response = analysis_based_response_function_factory.CreateResponseFunction(response_name,response_type,response_settings["settings"],response_analysis,model)
131
+ self.responses_analyses[response_name] = response_analysis_name
132
+ elif response_type in analysis_free_responses:
133
+ response = analysis_free_response_function_factory.CreateResponseFunction(response_name,response_type,response_settings["settings"],model)
134
+ self.responses_analyses[response_name] = None
135
+ else:
136
+ raise RuntimeError("ResponsesController: Response {} of type {} is not supported, supported responses are {}".format(response_name,response_type,self.supported_responses))
137
+
138
+ self.responses[response_name] = response
139
+
140
+ self.responses_type[response_name] = response_type
141
+
142
+ # here we do dependency checks
143
+ for itr1 in range(self.reponses_settings.size()):
144
+ response_settings1 = self.reponses_settings[itr1]
145
+ response_name1 = response_settings1["name"].GetString()
146
+ response_type1 = response_settings1["type"].GetString()
147
+ response_analysis1 = None
148
+ if response_settings1["settings"].Has("analysis_name"):
149
+ response_analysis1 = response_settings1["settings"]["analysis_name"].GetString()
150
+ evaluated_objects1 = response_settings1["settings"]["evaluated_objects"].GetStringArray()
151
+ controlled_objects1 = response_settings1["settings"]["controlled_objects"].GetStringArray()
152
+ control_types1 = response_settings1["settings"]["control_types"].GetStringArray()
153
+
154
+ for itr2 in range(self.reponses_settings.size()):
155
+ if itr1 != itr2:
156
+ response_settings2 = self.reponses_settings[itr2]
157
+ response_name2 = response_settings2["name"].GetString()
158
+ response_type2 = response_settings2["type"].GetString()
159
+ response_analysis2 = None
160
+ if response_settings2["settings"].Has("analysis_name"):
161
+ response_analysis2 = response_settings2["settings"]["analysis_name"].GetString()
162
+ evaluated_objects2 = response_settings2["settings"]["evaluated_objects"].GetStringArray()
163
+ controlled_objects2 = response_settings2["settings"]["controlled_objects"].GetStringArray()
164
+ control_types2 = response_settings2["settings"]["control_types"].GetStringArray()
165
+ if response_name1 == response_name2:
166
+ raise RuntimeError("ResponsesController: Response name {} is duplicated.".format(response_name1))
167
+ if response_type1 == response_type2 and response_analysis1 == response_analysis2:
168
+ overlap_evaluated_objects = list(set(evaluated_objects1) & set(evaluated_objects2))
169
+ if len(overlap_evaluated_objects)>0:
170
+ overlap_controlled_objects = list(set(controlled_objects1) & set(controlled_objects2))
171
+ if len(overlap_controlled_objects)>0:
172
+ for control_obj in overlap_controlled_objects:
173
+ index_1 = controlled_objects1.index(control_obj)
174
+ index_2 = controlled_objects2.index(control_obj)
175
+ type_1 = control_types1[index_1]
176
+ type_2 = control_types2[index_2]
177
+ if type_1 == type_2:
178
+ raise RuntimeError("ResponsesController: found dependencies between Response {} and Response {}".format(response_name1,response_name2))
179
+
180
+
181
+ # --------------------------------------------------------------------------
182
+ def Initialize(self):
183
+ for response in self.responses.values():
184
+ response.Initialize()
185
+
186
+ # --------------------------------------------------------------------------
187
+ def CheckIfResponseExists(self,response_name,raise_error=True):
188
+ if not response_name in self.responses.keys():
189
+ if raise_error:
190
+ raise RuntimeError("ResponsesController:CheckIfResponseExists: Response name {} does not exist.".format(response_name))
191
+ else:
192
+ return False
193
+ else:
194
+ return True
195
+
196
+ # --------------------------------------------------------------------------
197
+ def CheckIfResponsesExist(self,responses_name,raise_error=True):
198
+ if type(responses_name) is not list:
199
+ raise RuntimeError("ResponsesController:CheckIfResponsesExist requires list of response names")
200
+
201
+ if_exist = True
202
+ for response_name in responses_name:
203
+ if not response_name in self.responses.keys():
204
+ if raise_error:
205
+ raise RuntimeError("ResponsesController:CheckIfResponsesExist: Response {} does not exist!".format(response_name))
206
+ else:
207
+ if_exist = False
208
+ break
209
+
210
+ return if_exist
211
+
212
+ # --------------------------------------------------------------------------
213
+ def CalculateResponseValue(self,response_name):
214
+ if not response_name in self.responses.keys():
215
+ raise RuntimeError("ResponsesController:CalculateResponseValue: Try to calculate response {} which does not exist.".format(response_name))
216
+ else:
217
+ response_value = self.responses[response_name].CalculateValue()
218
+ return response_value
219
+
220
+ # --------------------------------------------------------------------------
221
+ def CalculateResponsesValue(self,responses_name):
222
+ if type(responses_name) is not list:
223
+ raise RuntimeError("ResponsesController:CalculateResponsesValue requires list of response names")
224
+
225
+ responses_value = {}
226
+ for response_name in responses_name:
227
+ if not response_name in self.responses.keys():
228
+ raise RuntimeError("ResponsesController:CalculateResponsesValue: Try to calculate response {} which does not exist.".format(response_name))
229
+ responses_value[response_name] = self.responses[response_name].CalculateValue()
230
+
231
+ return responses_value
232
+
233
+ # --------------------------------------------------------------------------
234
+ def CalculateAllValues(self):
235
+ responses_values = []
236
+ Logger.PrintInfo("ResponsesController:CalculateAllValues: Starting calculation of values of responses ")
237
+ startTime = timer.time()
238
+ for name,response in self.responses.items():
239
+ response_value = response.CalculateValue()
240
+ responses_values.append(response_value)
241
+ Logger.PrintInfo("ResponsesController:CalculateAllValues: Time needed for all response values calculation ",round(timer.time() - startTime,2),"s")
242
+ return responses_values
243
+ # --------------------------------------------------------------------------
244
+ def CalculateResponseGradients(self,response_name):
245
+ if not response_name in self.responses.keys():
246
+ raise RuntimeError("ResponsesController:CalculateResponseGradient: Try to calculate all gradients of response {} which does not exist ".format(response_name))
247
+ else:
248
+ self.responses[response_name].CalculateGradients()
249
+
250
+ # --------------------------------------------------------------------------
251
+ def CalculateResponsesGradients(self,responses_name):
252
+
253
+ if type(responses_name) is not list:
254
+ raise RuntimeError("ResponsesController:CalculateResponsesGradients requires list of response names")
255
+
256
+ for response_name in responses_name:
257
+ if not response_name in self.responses.keys():
258
+ raise RuntimeError("ResponsesController:CalculateResponsesGradients: Try to calculate gradients of response {} which does not exist.".format(response_name))
259
+ self.responses[response_name].CalculateGradients()
260
+
261
+ # --------------------------------------------------------------------------
262
+ def GetResponseGradients(self,response_name):
263
+ if not response_name in self.responses.keys():
264
+ raise RuntimeError("ResponsesController:GetResponseGradients: Try to calculate all gradients of response {} which does not exist ".format(response_name))
265
+ else:
266
+ return self.responses[response_name].GetGradients()
267
+
268
+ # --------------------------------------------------------------------------
269
+ def GetResponseAnalysis(self,response_name):
270
+
271
+ if not response_name in self.responses.keys():
272
+ raise RuntimeError("ResponsesController:GetResponseAnalysis: Try to get analysis of response {} which does not exist ".format(response_name))
273
+
274
+ return self.responses_analyses[response_name]
275
+ # --------------------------------------------------------------------------
276
+ def GetResponsesAnalyses(self,responses_name):
277
+ if type(responses_name) is not list:
278
+ raise RuntimeError("ResponsesController:GetResponsesAnalyses requires list of response names")
279
+
280
+ analyses_list = []
281
+ for response_name in responses_name:
282
+ if self.responses_analyses[response_name] != None:
283
+ analyses_list.append(self.responses_analyses[response_name])
284
+
285
+ return list(set(analyses_list)) # here we remove duplicates
286
+ # --------------------------------------------------------------------------
287
+ def GetResponsesForControl(self,control_type,controlled_objects):
288
+
289
+
290
+ if type(controlled_objects) is not list:
291
+ raise RuntimeError("ResponsesController:GetResponsesForControl requires a control type and list of controlled objects")
292
+
293
+ response_dict = {}
294
+ for response_name in self.responses_controlled_objects.keys():
295
+ response_control_types = self.responses_control_types[response_name]
296
+ response_controlled_objects = self.responses_controlled_objects[response_name]
297
+ overlap_objects = list(set(controlled_objects) & set(response_controlled_objects))
298
+ if len(overlap_objects)>0:
299
+ for object in overlap_objects:
300
+ index = response_controlled_objects.index(object)
301
+ object_control_type = response_control_types[index]
302
+ if object_control_type == control_type:
303
+ if response_name in response_dict.keys():
304
+ response_dict[response_name].append(object)
305
+ else:
306
+ response_dict[response_name] = [object]
307
+
308
+
309
+ return response_dict
310
+
311
+
312
+ # --------------------------------------------------------------------------
313
+ def CalculateResponseGradientsForTypesAndObjects(self,response_name,control_types,controlled_objects,raise_error=True):
314
+
315
+ if type(controlled_objects) is not list:
316
+ raise RuntimeError("ResponsesController:CalculateResponseGradientsForTypesAndObjects requires list of controlled objects")
317
+
318
+ if type(control_types) is not list:
319
+ raise RuntimeError("ResponsesController:CalculateResponseGradientsForTypesAndObjects requires list of control types")
320
+
321
+ if len(control_types) != len(controlled_objects):
322
+ raise RuntimeError("ResponsesController:CalculateResponseGradientsForTypesAndObjects control types and control object lists should have the same size !")
323
+
324
+ if raise_error:
325
+ if response_name not in self.responses.keys():
326
+ raise RuntimeError("ResponsesController:CalculateResponseGradientsForTypesAndObjects: response {} does not exist".format(response_name))
327
+
328
+ for i_index in range(len(controlled_objects)):
329
+ controlled_object = controlled_objects[i_index]
330
+ control_type = control_types[i_index]
331
+ found = False
332
+ for r_index in range(len(self.responses_controlled_objects[response_name])):
333
+ response_controlled_object = self.responses_controlled_objects[response_name][r_index]
334
+ response_controlled_type = self.responses_control_types[response_name][r_index]
335
+ if response_controlled_object==controlled_object and control_type==response_controlled_type:
336
+ found = True
337
+ break
338
+ if not found:
339
+ raise RuntimeError("ResponsesController:CalculateResponseGradientsForTypesAndObjects: response {} does not have controlled objects {}".format(response_name,controlled_objects))
340
+
341
+ self.responses[response_name].CalculateGradientsForTypesAndObjects(control_types,controlled_objects,not raise_error)
342
+ # --------------------------------------------------------------------------
343
+ def GetResponseType(self,response_name,raise_error=True):
344
+ if raise_error:
345
+ if response_name not in self.responses.keys():
346
+ raise RuntimeError("ResponsesController:CalculateResponseGradientsForTypeAndObjects: response {} does not exist".format(response_name))
347
+
348
+ return self.responses_type[response_name]
349
+ # --------------------------------------------------------------------------
350
+ def GetResponseVariableName(self, response_name, raise_error=True):
351
+ if raise_error:
352
+ if response_name not in self.responses.keys():
353
+ raise RuntimeError("ResponsesController:GetResponseVariableName: response {} does not exist".format(response_name))
354
+ return self.responses[response_name].GetVariableName()
355
+
356
+ # --------------------------------------------------------------------------
357
+ def GetResponseControlledObjects(self, response_name, raise_error=True):
358
+ if raise_error:
359
+ if response_name not in self.responses.keys():
360
+ raise RuntimeError("ResponsesController:GetResponseControlledObjects: response {} does not exist".format(response_name))
361
+
362
+ return self.responses_controlled_objects[response_name]
363
+ # --------------------------------------------------------------------------
364
+ def GetResponseControlTypes(self, response_name, raise_error=True):
365
+ if raise_error:
366
+ if response_name not in self.responses.keys():
367
+ raise RuntimeError("ResponsesController:GetResponseControlTypes: response {} does not exist".format(response_name))
368
+
369
+ return self.responses_control_types[response_name]
370
+ # --------------------------------------------------------------------------
371
+ def GetResponseGradientsVariablesName(self, response_name, raise_error=True):
372
+ if raise_error:
373
+ if response_name not in self.responses.keys():
374
+ raise RuntimeError("ResponsesController:GetResponseGradientsVariablesName: response {} does not exist".format(response_name))
375
+ return self.responses[response_name].GetGradientsVariablesName()
376
+
377
+ # --------------------------------------------------------------------------
378
+ def GetResponseGradientVariableNameForType(self, response_name, control_type, raise_error=True):
379
+ if raise_error:
380
+ if response_name not in self.responses.keys():
381
+ raise RuntimeError("ResponsesController:GetGradientsVariablesName: response {} does not exist".format(response_name))
382
+ return self.responses[response_name].GetGradientVariableNameForType(control_type)
383
+
384
+
385
+
386
+
387
+
388
+
389
+
390
+