# Source code for gemseo_umdo.statistics.multilevel.mlmc_mlcv.level

```
# 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.
r"""A level $\ell$ for the MLMC-MLCV algorithm."""
from __future__ import annotations
from dataclasses import dataclass
from gemseo.core.mdofunctions.mdo_function import MDOFunction
[docs]@dataclass
class Level:
r"""A level $\ell$ for the MLMC-MLCV algorithm."""
model: MDOFunction
r"""The model $f_\ell$ to sample.
This model can be set from any callable taking a NumPy array of float numbers as
input and outputting either a float number or a NumPy array of float numbers.
"""
surrogate_model: tuple[MDOFunction, float]
r"""The surrogate model $g_\ell$ approximating $f_\ell$.
More precisely,
$g_\ell$ and its statistic for the
[MLMCMLCV][gemseo_umdo.statistics.multilevel.mlmc_mlcv.mlmc_mlcv.MLMCMLCV]
algorithm.
The surrogate model can be set from any callable
taking a NumPy array of float numbers as input
and outputting either a float number or a NumPy array of float numbers.
"""
difference_surrogate_model: tuple[MDOFunction, float] = ()
r"""The surrogate model $h_\ell$ approximating $f_\ell-f_{\ell-1}$.
More precisely,
$h_\ell$ and its statistic for the
[MLMCMLCV][gemseo_umdo.statistics.multilevel.mlmc_mlcv.mlmc_mlcv.MLMCMLCV]
algorithm.
Empty at level $\ell=0$.
The surrogate model can be set from any callable
taking a NumPy array of float numbers as input
and outputting either a float number or a NumPy array of float numbers.
"""
cost: float | None = None
r"""The cost $\mathcal{C}_\ell$ to evaluate $f_\ell$, if known."""
n_cost_estimation_samples: int = 1
r"""The number of $f_\ell$ calls to estimate $\mathcal{C}_\ell$.
It will be used only if ``cost`` is ``None``.
"""
n_initial_samples: int = 10
r"""The number of samples $n_\ell$ at the first iteration of the algorithm."""
sampling_ratio: float = 2.0
r"""The factor $r_\ell$ by which $n_\ell$ is increased."""
def __post_init__(self) -> None:
if self.difference_surrogate_model:
self.difference_surrogate_model = (
MDOFunction(self.difference_surrogate_model[0], "h"),
self.difference_surrogate_model[1],
)
self.model = MDOFunction(self.model, "f")
self.surrogate_model = (
MDOFunction(self.surrogate_model[0], "g"),
self.surrogate_model[1],
)
```