"""
Bayesian Quadrature.
This module provides routines to integrate functions through Bayesian quadrature,
meaning a model over the integrand is constructed in order to actively select evaluation
points of the integrand to estimate the value of the integral. Bayesian quadrature
methods return a random variable with a distribution, specifying the belief about the
true value of the integral.
"""
from probnum.quad.quadrature import Quadrature
[docs]def bayesquad(fun, fun0, bounds, nevals=None, type="vanilla", **kwargs):
"""
One-dimensional Bayesian quadrature.
Parameters
----------
fun : function
Function to be integrated.
fun0 : RandomProcess
Stochastic process modelling the function to be integrated.
bounds : ndarray, shape=(2,)
Lower and upper limit of integration.
nevals : int
Number of function evaluations.
type : str
Type of Bayesian quadrature to use. The available options are
==================== ===========
vanilla ``vanilla``
WSABI ``wsabi``
==================== ===========
kwargs : optional
Keyword arguments passed on.
Returns
-------
F : RandomVariable
The integral of ``func`` from ``a`` to ``b``.
fun0 : RandomProcess
Stochastic process modelling the function to be integrated after ``neval``
observations.
info : dict
Information on the performance of the method.
References
----------
See Also
--------
nbayesquad : N-dimensional Bayesian quadrature.
"""
# Choose Method
bqmethod = None
if type == "vanilla":
bqmethod = VanillaBayesianQuadrature()
elif type == "wsabi":
bqmethod = WSABIBayesianQuadrature()
# Integrate
F, fun0, info = bqmethod.integrate(
fun=fun, fun0=fun0, nevals=nevals, domain=bounds, **kwargs
)
return F, fun0, info
[docs]def nbayesquad(fun, fun0, domain, nevals=None, type=None, **kwargs):
"""
N-dimensional Bayesian quadrature.
Parameters
----------
fun : function
Function to be integrated.
fun0 : RandomProcess
Stochastic process modelling the function to be integrated.
domain : ndarray
Domain of integration.
nevals : int
Number of function evaluations.
type : str
Type of Bayesian quadrature to use. The available options are
==================== ===========
vanilla ``vanilla``
WASABI ``wasabi``
==================== ===========
kwargs : optional
Keyword arguments passed on.
Returns
-------
F : RandomVariable
The integral of ``func`` on the domain.
fun0 : RandomProcess
Stochastic process modelling the function to be integrated after ``neval``
observations.
info : dict
Information on the performance of the method.
References
----------
See Also
--------
bayesquad : 1-dimensional Bayesian quadrature.
"""
raise NotImplementedError
class BayesianQuadrature(Quadrature):
"""
An abstract base class for Bayesian quadrature methods.
This class is designed to be subclassed by implementations of Bayesian quadrature
with an :meth:`integrate` method.
"""
[docs] def integrate(self, fun, fun0, domain, nevals, **kwargs):
"""
Integrate the function ``fun``.
Parameters
----------
fun : function
Function to be integrated.
fun0 : RandomProcess
Stochastic process modelling function to be integrated.
domain : ndarray, shape=()
Domain to integrate over.
nevals : int
Number of function evaluations.
kwargs
Returns
-------
"""
raise NotImplementedError
[docs]class VanillaBayesianQuadrature(BayesianQuadrature):
"""
Vanilla Bayesian quadrature in 1D.
"""
[docs] def integrate(self, fun, fun0, domain, nevals, **kwargs):
"""
Integrate the function ``fun``.
Parameters
----------
fun : function
Function to be integrated.
fun0 : RandomProcess
Stochastic process modelling function to be integrated.
domain : ndarray, shape=()
Domain to integrate over.
nevals : int
Number of function evaluations.
Returns
-------
"""
# Initialization
F = None
# Iteration
for _ in range(nevals):
# Predictive Distribution
# fun_pred = None
# Observation
# Update Distribution
self.fun0 = None
# Information on result
info = {"model_fit_diagnostic": None}
return F, self.fun0, info
[docs]class WSABIBayesianQuadrature(BayesianQuadrature):
"""
Warped Sequential Active Bayesian Integration (WSABI).
"""
[docs] def integrate(self, fun, fun0, domain, nevals, **kwargs):
"""
Integrate the function ``fun``.
Parameters
----------
fun : function
Function to be integrated.
fun0 : RandomProcess
Stochastic process modelling function to be integrated.
domain : ndarray, shape=()
Domain to integrate over.
nevals : int
Number of function evaluations.
Returns
-------
"""
raise NotImplementedError