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