Cached Parameterization Concept#

This concept provides the interface expected by the MonotoneComponent class for the definition of the generally non-monotone function f(x):RdR. This concept defines the ExpansionType template argument in the MonotoneComponent definition.

The MonotoneComponent class will evaluate f(x) at many points x(k) that differ only in the dth component. That is, for any k1 and k2, xj(k1)=xj(k2) for j<d. In many cases, it is possible to take advantage of this fact to precompute some quantities related to x1:d1 that we know will not change as the MonotoneComponent class varies xd.

To enable this, ExpansionType needs to be able to interact with a preallocated block of memory called the cache below. The cache will be allocated outside the ExpansionType class, and then passed to ExpansionType::FillCache1 to do any necessary precomputations.

When the value of the last component xd is altered, the ExpansionType::FillCache2 function will then be called, before calling ExpansionType::Evaluate to actually evaluate f(x). The ExpansionType::Evaluate function only has access to the memory in the cache, so its important to perform all necessary computations in either the ExpansionType::FillCache1 or ExpansionType::FillCache2 functions.

The details of these functions, as well as all the functions that MonotoneComponent expects ExpansionType to have, are provided in the Specific Requirements section below.

Potential Usage#

Below is an example of how a class implementing the cached parameterization concept could be used to evaluate f(x;c) at a randomly chosen point x and randomly chosen coefficients c.

ExpansionType expansion;
// ... Define the expansion

// Evaluate the
std::vector<double> cache( expansion.CacheSize() );

Eigen::VectorXd coeffs = Eigen::VectorXd::Random( expansion.NumCoeffs() );

unsigned int dim = expansion.InputSize();
Eigen::VectorXd evalPt = Eigen::VectorXd::Random( dim );

expansion.FillCache1(&cache[0], evalPt, DerivativeFlags::None);
expansion.FillCache2(&cache[0], evalPt, evalPt(dim-1), DerivativeFlags::None);

double f = expansion.Evaluate(&cache[0], coeffs);

// Now perturb x_d and re-evaluate
double xd = evalPt(dim-1) + 1e-2;
expansion.FillCache2(&cache[0], evalPt, xd, DerivativeFlags::None);

double f2 = expansion.Evaluate(&cache[0], coeffs);

Specific Requirements#

Implementations#

The following classes currently implement this concept.