A UQ test function requires an input specification; this input is, in general, multi-variate and probabilistic.
Each of the input dimension has a parametrized marginal density (e.g., uniform, normal, log-normal).
Dependence between input dimensions may also be defined, for instance, via copula formulation.
All of these requires a consistent container. I would propose to use data class to store the information regarding the input.
Perhaps two classes are required: one for the individual dimension and another for a collection of dimensions.
For the individual dimension, I'd define the following fields:
name
: the name of the input dimension
distribution
: the type of probability density function
parameters
: the parameters related to the distribution
For the collection of dimensions, I'd define the following fields:
spatial_dimension
: the number of dimensions of the multi-dimensional input
marginals
: the list of individual dimensions
Some methods (tentative): generate sample points, pretty print, etc.
For this early incarnation of the project, I would postpone the specification of dependence/copula, though we can define an empty field for that.
In terms of usage, creating an instance of multi-dimensional probabilistic input would require either list of named tuples or dictionaries:
>>> my_input_dicts = [
{"name": "X1",
"distribution": "uniform",
"parameters": [-10,10]
},
{"name": "X2",
"distribution": "normal",
"parameters": [0, 1]
},
{"name": "X3",
"distribution": "UNIFORM",
"parameters": np.array([-100.5, 200.5])}
]
>>> my_input = MultivariateInput(my_input_dicts)