25 #include <queso/TransformedScaledCovMatrixTKGroup.h> 
   26 #include <queso/InvLogitGaussianJointPdf.h> 
   27 #include <queso/GslVector.h> 
   28 #include <queso/GslMatrix.h> 
   32 template<
class V, 
class M>
 
   36     const std::vector<double> & scales,
 
   38   : 
BaseTKGroup<V, M>(prefix, boxSubset.vectorSpace(), scales),
 
   39     m_boxSubset(boxSubset),
 
   40     m_originalCovMatrix(covMatrix)
 
   49                            << 
": m_scales.size() = "                << 
m_scales.size()
 
   51                            << 
", m_rvs.size() = "                   << 
m_rvs.size()
 
   65 template<
class V, 
class M>
 
   70 template<
class V, 
class M>
 
   77 template<
class V, 
class M>
 
   83                       "TransformedScaledCovMatrixTKGroup<V,M>::rv1()",
 
   88                       "TransformedScaledCovMatrixTKGroup<V,M>::rv1()",
 
   93                       "TransformedScaledCovMatrixTKGroup<V,M>::rv1()",
 
   94                       "m_preComputingPositions.size() <= stageId");
 
   98                       "TransformedScaledCovMatrixTKGroup<V,M>::rv1()",
 
   99                       "m_preComputingPositions[stageId] == NULL");
 
  101   if ((m_env.subDisplayFile()        ) &&
 
  102       (m_env.displayVerbosity() >= 10)) {
 
  103     *m_env.subDisplayFile() << 
"In TransformedScaledCovMatrixTKGroup<V,M>::rv1()" 
  104                             << 
", stageId = " << stageId
 
  105                             << 
": about to call m_rvs[0]->updateLawExpVector()" 
  106                             << 
", vector = " << *m_preComputingPositions[stageId] 
 
  113   V transformedPreComputingPositions(*m_preComputingPositions[stageId]);
 
  114   transformToGaussianSpace(*m_preComputingPositions[stageId],
 
  115       transformedPreComputingPositions);
 
  119   return (*invlogit_gaussian);
 
  122 template<
class V, 
class M>
 
  128                       "TransformedScaledCovMatrixTKGroup<V,M>::rv2()",
 
  129                       "m_rvs.size() < stageIds.size()");
 
  133                       "TransformedScaledCovMatrixTKGroup<V,M>::rv2()",
 
  134                       "m_rvs[stageIds.size()-1] == NULL");
 
  138                       "TransformedScaledCovMatrixTKGroup<V,M>::rv2()",
 
  139                       "m_preComputingPositions.size() <= stageIds[0]");
 
  143                       "TransformedScaledCovMatrixTKGroup<V,M>::rv2()",
 
  144                       "m_preComputingPositions[stageIds[0]] == NULL");
 
  146   if ((m_env.subDisplayFile()        ) &&
 
  147       (m_env.displayVerbosity() >= 10)) {
 
  148     *m_env.subDisplayFile() << 
"In TransformedScaledCovMatrixTKGroup<V,M>::rv2()" 
  149                             << 
", stageIds.size() = " << stageIds.size()
 
  150                             << 
", stageIds[0] = "     << stageIds[0]
 
  151                             << 
": about to call m_rvs[stageIds.size()-1]->updateLawExpVector()" 
  152                             << 
", vector = " << *m_preComputingPositions[stageIds[0]] 
 
  159   V transformedPreComputingPositions(*m_preComputingPositions[stageIds[0]]);
 
  160   transformToGaussianSpace(*m_preComputingPositions[stageIds[0]],
 
  161       transformedPreComputingPositions);
 
  165   return (*invlogit_gaussian);
 
  168 template<
class V, 
class M>
 
  172   for (
unsigned int i = 0; i < m_scales.size(); ++i) {
 
  173     double factor = 1./m_scales[i]/m_scales[i];
 
  174     if ((m_env.subDisplayFile()        ) &&
 
  175         (m_env.displayVerbosity() >= 10)) {
 
  176       *m_env.subDisplayFile() << 
"In TransformedScaledCovMatrixTKGroup<V,M>::updateLawCovMatrix()" 
  177                               << 
", m_scales.size() = " << m_scales.size()
 
  179                               << 
", m_scales[i] = "     << m_scales[i]
 
  180                               << 
", factor = "          << factor
 
  181                               << 
": about to call m_rvs[i]->updateLawCovMatrix()" 
  182                               << 
", covMatrix = \n" << factor*covMatrix 
 
  196 template<
class V, 
class M>
 
  200   if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
 
  201     *m_env.subDisplayFile() << 
"Entering TransformedScaledCovMatrixTKGroup<V,M>::setPreComputingPosition()" 
  202                            << 
": position = " << position
 
  203                            << 
", stageId = "  << stageId
 
  210   if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
 
  211     *m_env.subDisplayFile() << 
"In TransformedScaledCovMatrixTKGroup<V,M>::setPreComputingPosition()" 
  212                            << 
", position = "        << position
 
  213                            << 
", stageId = "         << stageId
 
  214                            << 
": preComputingPos = " << *m_preComputingPositions[stageId];
 
  215     if (stageId < m_scales.size()) {
 
  216       *m_env.subDisplayFile() << 
", factor = " << 1./m_scales[stageId]/m_scales[stageId];
 
  218     if (stageId < m_rvs.size()) {
 
  220       *m_env.subDisplayFile() << 
", rvCov = " << pdfPtr->
lawCovMatrix(); 
 
  222     *m_env.subDisplayFile() << std::endl;
 
  225   if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 5)) {
 
  226     *m_env.subDisplayFile() << 
"Leaving TransformedScaledCovMatrixTKGroup<V,M>::setPreComputingPosition()" 
  227                            << 
": position = " << position
 
  228                            << 
", stageId = "  << stageId
 
  235 template<
class V, 
class M>
 
  245 template<
class V, 
class M>
 
  251                       "TransformedScaledCovMatrixTKGroup<V,M>::setRVsWithZeroMean()",
 
  256                       "TransformedScaledCovMatrixTKGroup<V,M>::setRVsWithZeroMean()",
 
  257                       "m_rvs.size() != m_scales.size()");
 
  259   for (
unsigned int i = 0; i < m_scales.size(); ++i) {
 
  260     double factor = 1./m_scales[i]/m_scales[i];
 
  263                         "TransformedScaledCovMatrixTKGroup<V,M>::setRVsWithZeroMean()",
 
  266         m_boxSubset, m_vectorSpace->zeroVector(),
 
  267         factor*m_originalCovMatrix);
 
  273 template<
class V, 
class M>
 
  281 template<
class V, 
class M>
 
  284     const V & physicalPoint, V & transformedPoint)
 const 
  286   V min_domain_bounds(this->m_boxSubset.minValues());
 
  287   V max_domain_bounds(this->m_boxSubset.maxValues());
 
  289   for (
unsigned int i = 0; i < transformedPoint.sizeLocal(); i++) {
 
  290     double min_val = min_domain_bounds[i];
 
  291     double max_val = max_domain_bounds[i];
 
  293     if (boost::math::isfinite(min_val) &&
 
  294         boost::math::isfinite(max_val)) {
 
  296         transformedPoint[i] = std::log(physicalPoint[i] - min_val) -
 
  297             std::log(max_val - physicalPoint[i]);
 
  299     else if (boost::math::isfinite(min_val) &&
 
  300              !boost::math::isfinite(max_val)) {
 
  303       transformedPoint[i] = std::log(physicalPoint[i] - min_val);
 
  305     else if (!boost::math::isfinite(min_val) &&
 
  306              boost::math::isfinite(max_val)) {
 
  309       transformedPoint[i] = -std::log(max_val - physicalPoint[i]);
 
  313       transformedPoint[i] = physicalPoint[i];
 
bool setPreComputingPosition(const V &position, unsigned int stageId)
Sets the pre-computing positions m_preComputingPositions[stageId] with a new vector of size position...
std::vector< double > m_scales
This base class allows the representation of a transition kernel. 
const BaseEnvironment & m_env
std::ofstream * subDisplayFile() const 
Access function for m_subDisplayFile (displays file on stream). 
TransformedScaledCovMatrixTKGroup(const char *prefix, const BoxSubset< V, M > &boxSubset, const std::vector< double > &scales, const M &covMatrix)
Default constructor. 
void updateLawCovMatrix(const M &newLawCovMatrix)
Updates the covariance matrix. 
virtual void clearPreComputingPositions()
Clears the pre-computing positions m_preComputingPositions[stageId]. 
virtual void print(std::ostream &os) const 
TODO: Prints the transition kernel. 
const M & lawCovMatrix() const 
Returns the covariance matrix; access to protected attribute m_lawCovMatrix. 
Class representing a subset of a vector space shaped like a hypercube. 
void setRVsWithZeroMean()
Sets the mean of the underlying Gaussian RVs to zero. 
void clearPreComputingPositions()
Clears the pre-computing positions m_preComputingPositions[stageId]. 
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
This class represents a transition kernel with a scaled covariance matrix on hybrid bounded/unbounded...
~TransformedScaledCovMatrixTKGroup()
Destructor. 
void updateLawCovMatrix(const M &covMatrix)
Scales the covariance matrix of the underlying Gaussian distribution. 
A class for handling hybrid (transformed) Gaussians with bounds. 
bool symmetric() const 
Whether or not the matrix is symmetric. Always 'false'. 
void updateLawExpVector(const V &newLawExpVector)
Updates the vector that contains the mean values for the underlying Gaussian. 
void print(std::ostream &os) const 
TODO: Prints the transition kernel. 
void transformToGaussianSpace(const V &physicalPoint, V &transformedPoint) const 
unsigned int displayVerbosity() const 
std::vector< const V * > m_preComputingPositions
virtual bool setPreComputingPosition(const V &position, unsigned int stageId)
Sets the pre-computing positions m_preComputingPositions[stageId] with a new vector of size position...
const InvLogitGaussianVectorRV< V, M > & rv(unsigned int stageId) const 
InvLogitGaussian increment property to construct a transition kernel. 
std::vector< BaseVectorRV< V, M > * > m_rvs
A class representing a (transformed) Gaussian vector RV with bounds.