25 #include <queso/ConcatenatedJointPdf.h>
26 #include <queso/GslVector.h>
27 #include <queso/GslMatrix.h>
32 template<
class V,
class M>
39 BaseJointPdf<V,M>(((std::string)(prefix)+
"concat").c_str(),concatenatedDomain),
45 unsigned int size1 =
m_densities[0]->domainSet().vectorSpace().dimLocal();
46 unsigned int size2 =
m_densities[1]->domainSet().vectorSpace().dimLocal();
47 unsigned int size = concatenatedDomain.
vectorSpace().dimLocal();
51 "ConcatenatedJointPdf<V,M>::constructor(1)",
52 "incompatible dimensions");
55 template<
class V,
class M>
61 BaseJointPdf<V,M>(((std::string)(prefix)+
"concat").c_str(),concatenatedDomain),
62 m_densities (densities.size(),(const
BaseJointPdf<V,M>*) NULL)
64 unsigned int sumSizes = 0;
67 sumSizes +=
m_densities[i]->domainSet().vectorSpace().dimLocal();
70 unsigned int size = concatenatedDomain.
vectorSpace().dimLocal();
74 "ConcatenatedJointPdf<V,M>::constructor(2)",
75 "incompatible dimensions");
78 template<
class V,
class M>
83 template<
class V,
class M>
87 for (
unsigned i = 0; i < m_densities.size(); ++i) {
88 m_densities[i]->setNormalizationStyle(value);
93 template<
class V,
class M>
96 const V& domainVector,
97 const V* domainDirection,
100 V* hessianEffect)
const
102 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 54)) {
103 *m_env.subDisplayFile() <<
"Entering ConcatenatedJointPdf<V,M>::actualValue()"
104 <<
": domainVector = " << domainVector
108 UQ_FATAL_TEST_MACRO(domainVector.sizeLocal() != this->m_domainSet.vectorSpace().dimLocal(),
110 "ConcatenatedJointPdf<V,M>::actualValue()",
115 "ConcatenatedJointPdf<V,M>::actualValue()",
116 "incomplete code for gradVector, hessianMatrix and hessianEffect calculations");
118 std::vector<V*> vecs(m_densities.size(),(V*) NULL);
119 std::vector<double> values(m_densities.size(),0.);
120 double returnValue = 1.;
121 unsigned int cummulativeSize = 0;
122 for (
unsigned int i = 0; i < vecs.size(); ++i) {
123 vecs[i] =
new V(m_densities[i]->domainSet().vectorSpace().zeroVector());
124 domainVector.cwExtract(cummulativeSize,*(vecs[i]));
125 values[i] = m_densities[i]->actualValue(*(vecs[i]),NULL,NULL,NULL,NULL);
126 returnValue *= values[i];
127 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 99)) {
128 *m_env.subDisplayFile() <<
"In ConcatenatedJointPdf<V,M>::actualValue()"
129 <<
", *(vecs[" << i <<
"]) = " << *(vecs[i])
130 <<
": values[" << i <<
"] = " << values[i]
131 <<
", temporary cumulative value = " << returnValue
134 cummulativeSize += vecs[i]->sizeLocal();
139 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 54)) {
140 *m_env.subDisplayFile() <<
"Leaving ConcatenatedJointPdf<V,M>::actualValue()"
141 <<
": domainVector = " << domainVector
142 <<
", returnValue = " << returnValue
149 template<
class V,
class M>
152 const V& domainVector,
153 const V* domainDirection,
156 V* hessianEffect)
const
158 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 54)) {
159 *m_env.subDisplayFile() <<
"Entering ConcatenatedJointPdf<V,M>::lnValue()"
160 <<
": domainVector = " << domainVector
166 "ConcatenatedJointPdf<V,M>::lnValue()",
167 "incomplete code for gradVector, hessianMatrix and hessianEffect calculations");
169 std::vector<V*> vecs(m_densities.size(),(V*) NULL);
170 std::vector<double> values(m_densities.size(),0.);
171 double returnValue = 0.;
172 unsigned int cummulativeSize = 0;
173 for (
unsigned int i = 0; i < vecs.size(); ++i) {
174 vecs[i] =
new V(m_densities[i]->domainSet().vectorSpace().zeroVector());
175 domainVector.cwExtract(cummulativeSize,*(vecs[i]));
176 values[i] = m_densities[i]->lnValue(*(vecs[i]),NULL,NULL,NULL,NULL);
177 returnValue += values[i];
178 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 99)) {
179 *m_env.subDisplayFile() <<
"In ConcatenatedJointPdf<V,M>::lnValue()"
180 <<
", *(vecs[" << i <<
"]) = " << *(vecs[i])
181 <<
": values[" << i <<
"] = " << values[i]
182 <<
", temporary cumulative value = " << returnValue
185 cummulativeSize += vecs[i]->sizeLocal();
190 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 54)) {
191 *m_env.subDisplayFile() <<
"Leaving ConcatenatedJointPdf<V,M>::lnValue()"
192 <<
": domainVector = " << domainVector
193 <<
", returnValue = " << returnValue
200 template<
class V,
class M>
206 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
207 *m_env.subDisplayFile() <<
"Entering ConcatenatedJointPdf<V,M>::computeLogOfNormalizationFactor()"
210 double volume = m_domainSet.volume();
211 if (((boost::math::isnan)(volume)) ||
212 (volume == -INFINITY ) ||
213 (volume == INFINITY ) ||
218 for (
unsigned int i = 0; i < m_densities.size(); ++i) {
219 m_densities[i]->computeLogOfNormalizationFactor(numSamples, updateFactorInternally);
222 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 2)) {
223 *m_env.subDisplayFile() <<
"Leaving ConcatenatedJointPdf<V,M>::computeLogOfNormalizationFactor()"
224 <<
", m_logOfNormalizationFactor = " << m_logOfNormalizationFactor
~ConcatenatedJointPdf()
Destructor.
A templated class for handling sets.
int worldRank() const
Returns the process world rank.
double lnValue(const V &domainVector, const V *domainDirection, V *gradVector, M *hessianMatrix, V *hessianEffect) const
Calculates the logarithm of the values of each density.
A class for handling concatenated PDFs.
const BaseEnvironment & m_env
ConcatenatedJointPdf(const char *prefix, const BaseJointPdf< V, M > &density1, const BaseJointPdf< V, M > &density2, const VectorSet< V, M > &concatenatedDomain)
Constructor.
double computeLogOfNormalizationFactor(unsigned int numSamples, bool updateFactorInternally) const
Computes the logarithm of the normalization factor.
double actualValue(const V &domainVector, const V *domainDirection, V *gradVector, M *hessianMatrix, V *hessianEffect) const
Calculates the actual values of each density.
std::vector< const BaseJointPdf< V, M > * > m_densities
virtual const VectorSpace< V, M > & vectorSpace() const =0
Vector space to which this set belongs to. See template specialization.
void setNormalizationStyle(unsigned int value) const
Sets the normalization style of all densities to value.
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
A templated (base) class for handling joint PDFs.