Skip to content

Commit 8a71e99

Browse files
committed
Add another likelihood marginalization test
This one is now testing where we treat the marginal parameter pdf as the weighting function in the quadrature rule. Here, we use a zero mean/unit variance Gaussian for the 2D marginal parameter space and then use Gauss-Hermite quadrature.
1 parent 40ce267 commit 8a71e99

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

test/unit/marg_likelihood.C

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include <queso/LikelihoodBase.h>
3636
#include <queso/UniformVectorRV.h>
3737
#include <queso/1DQuadrature.h>
38+
#include <queso/GaussianVectorRV.h>
3839

3940
#include <queso/GslVector.h>
4041
#include <queso/GslMatrix.h>
@@ -120,6 +121,46 @@ namespace QUESOTesting
120121

121122
};
122123

124+
template <class V, class M>
125+
class GaussModelLikelihood : public TestlingLikelihoodBase<V,M>
126+
{
127+
public:
128+
129+
GaussModelLikelihood(const char * prefix,
130+
const QUESO::VectorSet<V, M> & domainSet,
131+
const V & observations,
132+
typename QUESO::SharedPtr<QUESO::BaseVectorRV<V,M> >::Type & marg_param_pdf,
133+
typename QUESO::SharedPtr<QUESO::MultiDQuadratureBase<V,M> >::Type & marg_integration,
134+
bool marg_pdf_is_weight_func)
135+
: TestlingLikelihoodBase<V,M>(prefix,domainSet,observations,marg_param_pdf,marg_integration,marg_pdf_is_weight_func)
136+
{}
137+
138+
virtual void evaluateModel(const V & domainVector,
139+
const V & marginalVector,
140+
V & modelOutput) const
141+
{
142+
queso_require_equal_to(1,domainVector.sizeGlobal());
143+
queso_require_equal_to(2,marginalVector.sizeGlobal());
144+
queso_require_equal_to(1,modelOutput.sizeGlobal());
145+
146+
double q1 = marginalVector[0];
147+
double q2 = marginalVector[1];
148+
double m = domainVector[0];
149+
150+
modelOutput[0] = 3.14*m + 1.1*q1 + 2.2*q2*q2;
151+
}
152+
153+
virtual double lnMargLikelihood( const V & domainVector ) const
154+
{
155+
queso_require_equal_to(1,domainVector.sizeGlobal());
156+
157+
double m = domainVector[0];
158+
159+
return std::log(3.14*m*M_PI + 2.2*M_PI/2.0);
160+
}
161+
162+
};
163+
123164
template <class V, class M>
124165
class MarginalLikelihoodTestBase : public CppUnit::TestCase
125166
{
@@ -184,6 +225,64 @@ namespace QUESOTesting
184225
param_space, tol, likelihood );
185226
}
186227

228+
void test_linear_func_gaussian_marg_space()
229+
{
230+
// Instantiate the parameter space
231+
unsigned int param_dim = 1;
232+
unsigned int marg_dim = 2;
233+
QUESO::VectorSpace<V,M> param_space( (*this->_env), "param_", param_dim, NULL);
234+
QUESO::VectorSpace<V,M> marg_space( (*this->_env), "marg_", marg_dim, NULL);
235+
236+
double param_min_domain_value = 0.0;
237+
double param_max_domain_value = 1.0;
238+
239+
double marg_min_domain_value = -INFINITY;
240+
double marg_max_domain_value = INFINITY;
241+
242+
typename QUESO::ScopedPtr<V>::Type param_min_values( param_space.newVector(param_min_domain_value) );
243+
typename QUESO::ScopedPtr<V>::Type param_max_values( param_space.newVector(param_max_domain_value) );
244+
245+
typename QUESO::ScopedPtr<V>::Type marg_min_values( marg_space.newVector(marg_min_domain_value) );
246+
typename QUESO::ScopedPtr<V>::Type marg_max_values( marg_space.newVector(marg_max_domain_value) );
247+
248+
QUESO::BoxSubset<V,M> param_domain( "param_domain_", param_space, (*param_min_values), (*param_max_values) );
249+
QUESO::BoxSubset<V,M> marg_domain( "marg_domain_", marg_space, (*marg_min_values), (*marg_max_values) );
250+
251+
typename QUESO::ScopedPtr<V>::Type var_vec( param_space.newVector(1.0) );
252+
253+
// Zero mean, unit variance Gaussian
254+
typename QUESO::SharedPtr<QUESO::BaseVectorRV<V,M> >::Type
255+
marg_param_rv( new QUESO::GaussianVectorRV<V,M>("marg_param_rv_", marg_domain,
256+
marg_space.zeroVector(),
257+
*var_vec) );
258+
259+
const V & data = param_space.zeroVector();
260+
261+
unsigned int int_order = 1;
262+
263+
QUESO::SharedPtr<QUESO::Base1DQuadrature>::Type
264+
qrule_1d( new QUESO::GaussianHermite1DQuadrature(0.0,1.0,int_order) );
265+
266+
std::vector<QUESO::SharedPtr<QUESO::Base1DQuadrature>::Type> all_1d_qrules(marg_dim,qrule_1d);
267+
268+
typename QUESO::SharedPtr<QUESO::MultiDQuadratureBase<V,M> >::Type
269+
marg_integration( new QUESO::TensorProductQuadrature<V,M>(marg_domain,all_1d_qrules) );
270+
271+
GaussModelLikelihood<V,M> likelihood( "likelihood_test_",
272+
param_domain,
273+
data,
274+
marg_param_rv,
275+
marg_integration,
276+
true );
277+
278+
// Test marginalized likelihood over a range of points in the parameter domain
279+
unsigned int n_intervals = 20;
280+
double tol = std::numeric_limits<double>::epsilon()*50;
281+
282+
this->test_likelihood_values_range( n_intervals, param_min_domain_value, param_max_domain_value,
283+
param_space, tol, likelihood );
284+
}
285+
187286
protected:
188287

189288
QUESO::EnvOptionsValues _options;
@@ -216,6 +315,7 @@ namespace QUESOTesting
216315
CPPUNIT_TEST_SUITE( MarginalLikelihoodGslTest );
217316

218317
CPPUNIT_TEST( test_linear_func_uniform_marg_space );
318+
CPPUNIT_TEST( test_linear_func_gaussian_marg_space );
219319

220320
CPPUNIT_TEST_SUITE_END();
221321
};

0 commit comments

Comments
 (0)