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.
- KratosMultiphysics/.libs/KratosOptimizationApplication.so +0 -0
- KratosMultiphysics/.libs/libKratosOptimizationCore.dylib +0 -0
- KratosMultiphysics/OptimizationApplication/__init__.py +19 -0
- KratosMultiphysics/OptimizationApplication/algorithms/NLOPT_algorithms.py +255 -0
- KratosMultiphysics/OptimizationApplication/algorithms/SciPy_algorithms.py +154 -0
- KratosMultiphysics/OptimizationApplication/algorithms/__init__.py +0 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm.py +78 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_adam.py +68 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_base.py +393 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_gradient_projection.py +355 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_momentum_relaxed_gradient_projection.py +70 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_nesterov_accelarated_gradient.py +60 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_relaxed_gradient_projection.py +263 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_steepest_descent.py +205 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_NLOPT_constraint.py +194 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_NLOPT_objective.py +191 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_SciPy_constraint.py +123 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_SciPy_objective.py +148 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_constraint.py +180 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_objective.py +133 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_rgp_constraint.py +268 -0
- KratosMultiphysics/OptimizationApplication/analyses_controller.py +75 -0
- KratosMultiphysics/OptimizationApplication/controls/control.py +123 -0
- KratosMultiphysics/OptimizationApplication/controls/external_response_function_control.py +149 -0
- KratosMultiphysics/OptimizationApplication/controls/master_control.py +198 -0
- KratosMultiphysics/OptimizationApplication/controls/material/material_properties_control.py +115 -0
- KratosMultiphysics/OptimizationApplication/controls/material/simp_control.py +229 -0
- KratosMultiphysics/OptimizationApplication/controls/shape/vertex_morphing_shape_control.py +289 -0
- KratosMultiphysics/OptimizationApplication/controls/thickness/shell_thickness_control.py +180 -0
- KratosMultiphysics/OptimizationApplication/controls_controller.py +205 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/avg_abs_improvement_conv_criterion.py +98 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/combined_conv_criterion.py +87 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/constraint_conv_criterion.py +68 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/convergence_criterion.py +26 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/l2_conv_criterion.py +77 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/magnitude_reduction_conv_criterion.py +85 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/max_iter_conv_criterion.py +48 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/patience_conv_criterion.py +116 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/target_value_conv_criterion.py +64 -0
- KratosMultiphysics/OptimizationApplication/execution_policies/execution_policy.py +46 -0
- KratosMultiphysics/OptimizationApplication/execution_policies/execution_policy_decorator.py +67 -0
- KratosMultiphysics/OptimizationApplication/execution_policies/independent_analysis_execution_policy.py +78 -0
- KratosMultiphysics/OptimizationApplication/execution_policies/kratos_analysis_execution_policy.py +137 -0
- KratosMultiphysics/OptimizationApplication/execution_policies/stepping_analysis_execution_policy.py +88 -0
- KratosMultiphysics/OptimizationApplication/filtering/explicit_filter.py +124 -0
- KratosMultiphysics/OptimizationApplication/filtering/filter.py +188 -0
- KratosMultiphysics/OptimizationApplication/filtering/filter_utils.py +55 -0
- KratosMultiphysics/OptimizationApplication/filtering/helmholtz_analysis.py +139 -0
- KratosMultiphysics/OptimizationApplication/filtering/helmholtz_scalar_solver.py +39 -0
- KratosMultiphysics/OptimizationApplication/filtering/helmholtz_shape_solver.py +67 -0
- KratosMultiphysics/OptimizationApplication/filtering/helmholtz_solver_base.py +275 -0
- KratosMultiphysics/OptimizationApplication/filtering/helmholtz_vector_solver.py +39 -0
- KratosMultiphysics/OptimizationApplication/filtering/implicit_filter.py +192 -0
- KratosMultiphysics/OptimizationApplication/filtering/python_solvers_wrapper_implicit_filters.py +56 -0
- KratosMultiphysics/OptimizationApplication/model_part_controllers/connectivity_preserving_model_part_controller.py +72 -0
- KratosMultiphysics/OptimizationApplication/model_part_controllers/external_response_function_model_part_controller.py +110 -0
- KratosMultiphysics/OptimizationApplication/model_part_controllers/mdpa_model_part_controller.py +44 -0
- KratosMultiphysics/OptimizationApplication/model_part_controllers/model_part_controller.py +19 -0
- KratosMultiphysics/OptimizationApplication/model_parts_controller.py +92 -0
- KratosMultiphysics/OptimizationApplication/optimization_analysis.py +146 -0
- KratosMultiphysics/OptimizationApplication/optimizations_controller.py +223 -0
- KratosMultiphysics/OptimizationApplication/optimizer.py +61 -0
- KratosMultiphysics/OptimizationApplication/processes/optimization_problem_ascii_output_process.py +212 -0
- KratosMultiphysics/OptimizationApplication/processes/optimization_problem_field_output_process.py +122 -0
- KratosMultiphysics/OptimizationApplication/processes/optimization_problem_graph_output_process.py +184 -0
- KratosMultiphysics/OptimizationApplication/processes/optimization_problem_hdf5_output_process.py +84 -0
- KratosMultiphysics/OptimizationApplication/processes/optimization_problem_vtu_output_process.py +94 -0
- KratosMultiphysics/OptimizationApplication/processes/spatial_statistics_computation_process.py +81 -0
- KratosMultiphysics/OptimizationApplication/responses/__init__.py +0 -0
- KratosMultiphysics/OptimizationApplication/responses/additive_manufacturing_responses.py +410 -0
- KratosMultiphysics/OptimizationApplication/responses/analysis_based_response_function_factory.py +14 -0
- KratosMultiphysics/OptimizationApplication/responses/analysis_free_response_function_factory.py +14 -0
- KratosMultiphysics/OptimizationApplication/responses/base_response.py +66 -0
- KratosMultiphysics/OptimizationApplication/responses/binary_operator_response_function.py +103 -0
- KratosMultiphysics/OptimizationApplication/responses/combined_response_function.py +127 -0
- KratosMultiphysics/OptimizationApplication/responses/discrete_value_residual_response_function.py +131 -0
- KratosMultiphysics/OptimizationApplication/responses/evaluation_response_function.py +68 -0
- KratosMultiphysics/OptimizationApplication/responses/external_response_function.py +87 -0
- KratosMultiphysics/OptimizationApplication/responses/geometric_centroid_deviation_response_function.py +97 -0
- KratosMultiphysics/OptimizationApplication/responses/linear_strain_energy_response_function.py +72 -0
- KratosMultiphysics/OptimizationApplication/responses/literal_value_response_function.py +33 -0
- KratosMultiphysics/OptimizationApplication/responses/log_response_function.py +47 -0
- KratosMultiphysics/OptimizationApplication/responses/mass_response_function.py +71 -0
- KratosMultiphysics/OptimizationApplication/responses/response_function.py +126 -0
- KratosMultiphysics/OptimizationApplication/responses/response_routine.py +158 -0
- KratosMultiphysics/OptimizationApplication/responses/structural_responses.py +335 -0
- KratosMultiphysics/OptimizationApplication/responses_controller.py +390 -0
- KratosMultiphysics/OptimizationApplication/utilities/buffered_dict.py +399 -0
- KratosMultiphysics/OptimizationApplication/utilities/component_data_view.py +74 -0
- KratosMultiphysics/OptimizationApplication/utilities/helper_utilities.py +40 -0
- KratosMultiphysics/OptimizationApplication/utilities/logger_utilities.py +222 -0
- KratosMultiphysics/OptimizationApplication/utilities/model_part_utilities.py +117 -0
- KratosMultiphysics/OptimizationApplication/utilities/opt_line_search.py +173 -0
- KratosMultiphysics/OptimizationApplication/utilities/opt_projection.py +191 -0
- KratosMultiphysics/OptimizationApplication/utilities/optimization_problem.py +237 -0
- KratosMultiphysics/OptimizationApplication/utilities/optimization_problem_utilities.py +237 -0
- KratosMultiphysics/OptimizationApplication/utilities/response_utilities.py +249 -0
- KratosMultiphysics/OptimizationApplication/utilities/timer.py +45 -0
- KratosMultiphysics/OptimizationApplication/utilities/union_utilities.py +6 -0
- kratosoptimizationapplication-10.4.4.dist-info/METADATA +25 -0
- kratosoptimizationapplication-10.4.4.dist-info/RECORD +106 -0
- kratosoptimizationapplication-10.4.4.dist-info/WHEEL +6 -0
- kratosoptimizationapplication.dylibs/libKratosCore.dylib +4 -0
- kratosoptimizationapplication.dylibs/libgcc_s.1.1.dylib +0 -0
- kratosoptimizationapplication.dylibs/libgomp.1.dylib +0 -0
- 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
|
+
|