The UML diagram below explains the class hierarchy of the distributions module. In case of distributions a series of abstract base classes are defined. .Distribution
is the basis, with classes such as .Distribution1D
and .DistributionND
abstract base classes refining this hierarchy according to the distribution dimensionality. The 1D case if further refined with .DistributionContinuous1D
and .DistributionDiscrete1D
to take into account different types of random variables. Finally, the .Copula
abstract base class serves as the common interface for all copula implementations. Note that all the above are abstract classes and cannot be directly instantiated.
The sampling module contains multiple methods and the UML diagrams below are focused to one method at a time to reduce the complexity of the graphs. Before starting with hierarchy of each different method, we should mention that the classes .MonteCarloSampling
, .SimplexSampling
and .ImportanceSampling
are independent object and do not extend any baseclass.
Starting with the Markov Chain Monte Carlo algorithms, the diagram below makes obvious the dependency between the different implementations. the .MCMC
abstract base class includes the common functionality between the methods, while the specific algorithms only override the abstract methods of that base class.
The case of stratified sampling is more elaborate, as it includes a family of algorithms. The abstract base class .StratifiedSampling
serves as the interface between the concrete implementations .LatinHypercubeSampling
, .TrueStratifiedSampling
and .RefinedStratifiedSampling
. In the case of .LatinHypercubeSampling
the Strategy Design Pattern was used to extract the Latin Hypercube criteria from the sampling. Here the .Criterion
base class provides the interface that the specific criteria need to override. In a similar manner, the geometric stratification in the case of .TrueStratifiedSampling
is extracted under the .Strata
abstract base class. Last but not least, in the case of .RefinedStratifiedSampling
the different strata refinement strategies are extracted using the .Refinement
baseclass as their common interface.
In the case of .AdaptiveKriging
sampling methods, again the different learning functions are extracted into separate classes under the common .LearningFunction
class.
The transformations module is one of the most simple in :pyUQpy
with three independent classes available, namely .Nataf
, .Correlate
and .Decorrelate
.
The stochastic process module is has again simple structure with five independent classes available.
In case of the RunModel module, the final algorithm to run is constructed by object composition of two different inputs. Initially, the type of the model to run, with .PythonModel
and .ThirdPartyModel
being the two available options, while the execution part is delegated to either the .SerialExecution
or .ParallelExecution
alternatives.
Compared to v3, the inference module has undergone a major refactoring towards v4. The initial .InferenceModel
class that contained all cases of computing the posterior log-likelihood is now split into three independent cases. Given the inference models, backward uncertainty propagation can be performed be choosing between .MLE
, .BayesParameterEstimation
to infer the parameter distributions of a model, or .InformationModelSelection
and .BayesModelSelection
to select the model that best describes the available data. In the case of .InformationModelSelection
the selection criteria have been extracted into separate classes under the .InformationCriterion
baseclass. Similarly, the evidence methods of .BayesModelSelection
are also parameters that implement the abstract base class .EvidenceMethod
.
The reliability module maintained the same class hierarachy as in v3, with .SubsetSimulation
being an independent class and .FORM
and .SORM
methods providing concrete implementations to the .TaylorSeries
abstract base class.
Another module that has extensively restructured in v4 is the surrogates. Apart from the .SROM
method which was retained as an independent algorithm, the previous Kriging functionality was removed. It is now replaced with .GaussianProcessRegression
. The functionality of the Gaussian is constructed using object composition, and the specific implementation of .Regression
and Kernel
abstract base classes. An additional functionality of constrained surrogates is added by implementing the .ConstraintsGPR
abstract class. The functionality of .PolynomialChaosExpansion
was rewritten from scratch to address some performance issues of v3. The Strategy Design pattern was used here as well, with three abstract base classes .Polynomials
, .PolynomialBasis
ans .Regression
serving as the interface for the concrete classes.
The sensitivity module has significantly benefited from the enhanced of modularity of the code introduced in v4. Apart from the existing independent .MorrisSensitivity
method, the .PceSensitivity
was added as an independent class. Finally, based on the common .Sensitivity
abstract base class, a series of new algorithms were introduced such as .SobolSensitivity
, .GeneralizedSobolSensitivity
, .ChatterjeeSensitivity
and .CramerVonMisesSensitivity
.
The final but one of the most import modules in :pyUQpy
is dimension reduction. The .SnapshotPOD
and .DirectPOD
methods were retained under the .POD
abstract base class. .HigherOrderSVD
method was introduced as independent class, while special attention was given to Grassmann Manifolds. The abstract base class .GrassmannProjection
serves as an interface for different methods to project data on the Grassmann Manifold, with .GrassmannOperations
and .GrassmannInterpolation
support all related operations.