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];
std::vector< BaseVectorRV< V, M > * > m_rvs
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.
std::vector< double > m_scales
void transformToGaussianSpace(const V &physicalPoint, V &transformedPoint) const
~TransformedScaledCovMatrixTKGroup()
Destructor.
bool symmetric() const
Whether or not the matrix is symmetric. Always 'false'.
const InvLogitGaussianVectorRV< V, M > & rv(unsigned int stageId) const
InvLogitGaussian increment property to construct a transition kernel.
bool setPreComputingPosition(const V &position, unsigned int stageId)
Sets the pre-computing positions m_preComputingPositions[stageId] with a new vector of size position...
std::ofstream * subDisplayFile() const
Access function for m_subDisplayFile (displays file on stream).
virtual void print(std::ostream &os) const
TODO: Prints the transition kernel.
void clearPreComputingPositions()
Clears the pre-computing positions m_preComputingPositions[stageId].
virtual void clearPreComputingPositions()
Clears the pre-computing positions m_preComputingPositions[stageId].
This class represents a transition kernel with a scaled covariance matrix on hybrid bounded/unbounded...
A class representing a (transformed) Gaussian vector RV with bounds.
const BaseEnvironment & m_env
This base class allows the representation of a transition kernel.
void setRVsWithZeroMean()
Sets the mean of the underlying Gaussian RVs to zero.
Class representing a subset of a vector space shaped like a hypercube.
void updateLawExpVector(const V &newLawExpVector)
Updates the vector that contains the mean values for the underlying Gaussian.
unsigned int displayVerbosity() const
const M & lawCovMatrix() const
Returns the covariance matrix; access to protected attribute m_lawCovMatrix.
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
virtual bool setPreComputingPosition(const V &position, unsigned int stageId)
Sets the pre-computing positions m_preComputingPositions[stageId] with a new vector of size position...
void print(std::ostream &os) const
TODO: Prints the transition kernel.
std::vector< const V * > m_preComputingPositions
A class for handling hybrid (transformed) Gaussians with bounds.
void updateLawCovMatrix(const M &covMatrix)
Scales the covariance matrix of the underlying Gaussian distribution.