Source code for gemseo.problems.scalable.parametric.problem
# Copyright 2021 IRT Saint Exupéry, https://www.irt-saintexupery.com
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License version 3 as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# Contributors:
# INITIAL AUTHORS - initial API and implementation and/or initial
# documentation
# :author: Matthias De Lozzo
# OTHER AUTHORS - MACROSCOPIC CHANGES
"""
Scalable problem
================
"""
from __future__ import annotations
import logging
from gemseo.algos.parameter_space import ParameterSpace
from gemseo.problems.scalable.parametric.core.problem import TMProblem
from gemseo.problems.scalable.parametric.core.variables import get_u_local_name
from gemseo.problems.scalable.parametric.disciplines import TMMainDiscipline
from gemseo.problems.scalable.parametric.disciplines import TMSubDiscipline
LOGGER = logging.getLogger(__name__)
MDA_TOLERANCE = {"tolerance": 1e-14, "linear_solver_tolerance": 1e-14}
ALGO_OPTIONS = {
"xtol_rel": 1e-4,
"ftol_rel": 1e-4,
"xtol_abs": 1e-4,
"ftol_abs": 1e-4,
"ineq_tolerance": 1e-3,
"eq_tolerance": 1e-3,
}
OBJECTIVE_NAME = "obj"
COUPLING_DIR = "coupling"
COEFF_DIR = "coefficients"
OPTIM_DIR = "opthistoryview"
[docs]class TMScalableProblem(TMProblem):
"""The scalable problem from Tedford and Martins, 2010, builds a list of strongly
coupled scalable disciplines completed by a system discipline computing the
objective function and the constraints.
These disciplines are defined on an unit design space (parameters comprised in [0,
1]).
"""
@classmethod
def _create_main_model(cls, c_constraint, default_inputs):
"""Create main model.
:param ndarray c_constraint: coefficients for constraint.
:param dict(ndarray) default_inputs: default inputs.
"""
return TMMainDiscipline(c_constraint, default_inputs)
@classmethod
def _create_sub_model(cls, index, c_shared, c_local, c_cpl, default_inputs):
"""Create sub model.
:param int index: model index.
:param ndarray c_shared: coefficients for shared design parameters.
:param ndarray c_local: coefficients for local design parameters.
:param ndarray c_cpl: coefficients for coupling variables.
:param dict(ndarray) default_inputs: default inputs.
"""
return TMSubDiscipline(index, c_shared, c_local, c_cpl, default_inputs)
@property
def disciplines(self):
"""Alias for self.models."""
return self.models
@property
def n_disciplines(self):
"""Alias for self.n_submodels."""
return self.n_submodels
@property
def main_discipline(self):
"""Main disciplines.
:return: main discipline.
:rtype: TMDiscipline
"""
return self.models[0]
@property
def sub_disciplines(self):
"""Sub-disciplines.
:return: list of disciplines.
:rtype: list(TMDiscipline)
"""
return self.models[1:]
[docs] def get_design_space(self):
"""Get the TM design space.
:return: instance of the design space
:rtype: DesignSpace
"""
d_s = super().get_design_space()
design_space = ParameterSpace()
for name in d_s.names:
size = d_s.sizes[name]
l_b = d_s.lower_bounds[name]
u_b = d_s.upper_bounds[name]
value = d_s.default_values[name]
design_space.add_variable(name, size, "float", l_b, u_b, value)
if self._noised_coupling:
for index in range(self.n_submodels):
name = get_u_local_name(index)
size = self.n_coupling
distribution = "OTNormalDistribution"
design_space.add_random_variable(name, distribution, size[index])
return design_space
[docs] def reset_disciplines(self):
"""Reset the disciplines, setting n_calls=0, n_calls_linearize=0, exec_time=0
and local_data={}."""
for discipline in self.disciplines:
discipline.n_calls = 0
discipline.exec_time = 0.0
discipline.n_calls_linearize = 0
discipline.local_data = {}