/*!
  \file
  \brief Support for testing descendants of mpdf.
  \author Vaclav Barta.

  -----------------------------------
  BDM++ - C++ library for Bayesian Decision Making under Uncertainty

  Using IT++ for numerical operations
  -----------------------------------
*/

#ifndef MPDF_HARNESS_H
#define MPDF_HARNESS_H

#define BDMLIB // not an ideal way to prevent double registration of UI factories...

#include "bdmroot.h"
#include "itpp_ext.h"
#include "shared_ptr.h"
#include "base/bdmbase.h"
#include "base/user_info.h"

namespace bdm {

class mpdf_harness : public root {
private:
	shared_ptr<mpdf> hmpdf;
	vec cond;
	vec mean;
	vec variance;
	int nsamples;
	mat R;
	double tolerance;

public:
	static void test_config ( const char *config_file_name );

	mpdf_harness() : nsamples ( 1000 ), tolerance ( 0.1 ) { }

	virtual void test ( const char *config_name, int idx );

	void from_setting ( const Setting &set );

protected:
	mpdf *get_mpdf() {
		return hmpdf.get();
	}

private:
	void check_mean();

	// assumes R is valid
	void check_covariance();
};

}

#endif
