///////////////////////////////////////////////////////////////////////////////
// //
// This file is part of ModelBlocks. Copyright 2009, ModelBlocks developers. //
// //
// ModelBlocks is free software: you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation, either version 3 of the License, or //
// (at your option) any later version. //
// //
// ModelBlocks is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with ModelBlocks. If not, see . //
// //
// ModelBlocks developers designate this particular file as subject to //
// the "Moses" exception as provided by ModelBlocks developers in //
// the LICENSE file that accompanies this code. //
// //
///////////////////////////////////////////////////////////////////////////////
#ifndef _NL_PROBMODEL__
#define _NL_PROBMODEL__
#include "nl-prob.h"
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// XDModel
//
////////////////////////////////////////////////////////////////////////////////
template
class Generic1DModel {
public:
typedef Y RVType;
typedef P ProbType;
bool setFirst ( const Y& ) const { assert(false); return false; } // if you need it, you have to write it
bool setNext ( const Y& ) const { assert(false); return false; } // if you need it, you have to write it
P getProb ( const Y& ) const { assert(false); return 0.0; } // if you need it, you have to write it
};
////////////////////////////////////////////////////////////
template
class Generic2DModel {
public:
typedef Y RVType;
typedef X1 Dep1Type;
typedef P ProbType;
bool setFirst ( const Y& ) const { assert(false); return false; } // if you need it, you have to write it
bool setNext ( const Y& ) const { assert(false); return false; } // if you need it, you have to write it
bool setFirst ( const Y&, const X1& x1 ) const { assert(false); return false; } // if you need it, you have to write it
bool setNext ( const Y&, const X1& x1 ) const { assert(false); return false; } // if you need it, you have to write it
P getProb ( const Y&, const X1& x1 ) const { assert(false); return 0.0; } // if you need it, you have to write it
};
////////////////////////////////////////////////////////////
template
class Generic3DModel {
public:
typedef Y RVType;
typedef X1 Dep1Type;
typedef X2 Dep2Type;
typedef P ProbType;
bool setFirst ( const Y& ) const { assert(false); return false; } // if you need it, you have to write it
bool setNext ( const Y& ) const { assert(false); return false; } // if you need it, you have to write it
bool setFirst ( const Y&, const X1& x1, const X2& x2 ) const { assert(false); return false; } // if you need it, you have to write it
bool setNext ( const Y&, const X1& x1, const X2& x2 ) const { assert(false); return false; } // if you need it, you have to write it
P getProb ( const Y&, const X1& x1, const X2& x2 ) const { assert(false); return 0.0; } // if you need it, you have to write it
};
////////////////////////////////////////////////////////////
template
class Generic4DModel {
public:
typedef Y RVType;
typedef X1 Dep1Type;
typedef X2 Dep2Type;
typedef X3 Dep3Type;
typedef P ProbType;
bool setFirst ( const Y& ) const { assert(false); return false; }
bool setNext ( const Y& ) const { assert(false); return false; }
bool setFirst ( const Y&, const X1& x1, const X2& x2, const X3& x3 ) const { assert(false); return false; }
bool setNext ( const Y&, const X1& x1, const X2& x2, const X3& x3 ) const { assert(false); return false; }
P getProb ( const Y&, const X1& x1, const X2& x2, const X3& x3 ) const { assert(false); return 0.0; }
};
////////////////////////////////////////////////////////////
template
class Generic5DModel {
public:
typedef Y RVType;
typedef X1 Dep1Type;
typedef X2 Dep2Type;
typedef X3 Dep3Type;
typedef X4 Dep4Type;
typedef P ProbType;
bool setFirst ( const Y& ) const { assert(false); return false; }
bool setNext ( const Y& ) const { assert(false); return false; }
bool setFirst ( const Y&, const X1& x1, const X2& x2, const X3& x3, const X4& x4 ) const { assert(false); return false; }
bool setNext ( const Y&, const X1& x1, const X2& x2, const X3& x3, const X4& x4 ) const { assert(false); return false; }
P getProb ( const Y&, const X1& x1, const X2& x2, const X3& x3, const X4& x4 ) const { assert(false); return 0.0; }
};
////////////////////////////////////////////////////////////
template
class Generic6DModel {
public:
typedef Y RVType;
typedef X1 Dep1Type;
typedef X2 Dep2Type;
typedef X3 Dep3Type;
typedef X4 Dep4Type;
typedef X5 Dep5Type;
typedef P ProbType;
bool setFirst ( const Y& ) const { assert(false); return false; }
bool setNext ( const Y& ) const { assert(false); return false; }
bool setFirst ( const Y&, const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5 ) const { assert(false); return false; }
bool setNext ( const Y&, const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5 ) const { assert(false); return false; }
P getProb ( const Y&, const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5 ) const { assert(false); return 0.0; }
};
////////////////////////////////////////////////////////////
template
class Generic7DModel {
public:
typedef Y RVType;
typedef X1 Dep1Type;
typedef X2 Dep2Type;
typedef X3 Dep3Type;
typedef X4 Dep4Type;
typedef X5 Dep5Type;
typedef X6 Dep6Type;
typedef P ProbType;
bool setFirst ( const Y& ) const { assert(false); return false; }
bool setNext ( const Y& ) const { assert(false); return false; }
bool setFirst ( const Y&, const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X5& x6 ) const { assert(false); return false; }
bool setNext ( const Y&, const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X5& x6 ) const { assert(false); return false; }
P getProb ( const Y&, const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X5& x6 ) const { assert(false); return 0.0; }
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// ModeledXDRV
//
////////////////////////////////////////////////////////////////////////////////
template
class Modeled1DRV : public M::RVType {
public:
// Constructor / destructor methods...
Modeled1DRV ( ) { }
//Modeled1DRV ( int i ) { M::RVType::operator=(i); }
Modeled1DRV ( string& s ) { M::RVType::operator=(s); }
// Static specification methods...
static M& setModel ( ) { return m; }
// Static extraction methods...
static const M& getModel ( ) { return m; }
// Extraction methods...
typename M::ProbType getProb ( ) const { return m.getProb(*this); }
};
////////////////////////////////////////////////////////////
template
class Modeled2DRV : public M::RVType {
public:
typedef M Model;
// Constructor / destructor methods...
Modeled2DRV ( ) { }
// Modeled2DRV ( int i ) { M::RVType::operator=(i); }
Modeled2DRV ( const Modeled2DRV& mrv ) : M::RVType(mrv) { }
Modeled2DRV ( const typename M::RVType& x ) { M::RVType::operator=(x); }
Modeled2DRV ( string& s ) { M::RVType::operator=(s); }
// Static specification methods...
static M& setModel ( ) { return m; }
// Static extraction methods...
static const M& getModel ( ) { return m; }
// Specification methods...
bool setFirst ( ) { return M::RVType::setFirst(); }
bool setNext ( ) { return M::RVType::setNext(); }
bool setFirst ( const typename M::Dep1Type& x1 ) { return m.setFirst(*this,x1); }
bool setFirstConsistent ( const typename M::Dep1Type& x1 ) { return m.setFirstConsistent(*this,x1); }
bool setNext ( const typename M::Dep1Type& x1 ) { return m.setNext (*this,x1); }
bool setSample ( const typename M::Dep1Type& x1 ) { return m.setSample(*this,x1); }
// Extraction methods...
typename M::ProbType getProb ( const typename M::Dep1Type& x1 ) const { return m.getProb(*this,x1); }
};
////////////////////////////////////////////////////////////
template
class DetermModeled2DRV : public Modeled2DRV {
public:
DetermModeled2DRV ( const typename M::Dep1Type& x1 ) { m.setFirst(*this,x1); assert(LogProb(1.0)==m.getProb(*this,x1)); }
};
////////////////////////////////////////////////////////////
template
class Modeled3DRV : public M::RVType {
public:
// Constructor / destructor methods...
Modeled3DRV ( ) { }
//Modeled3DRV ( int i ) { M::RVType::operator=(i); }
Modeled3DRV ( string& s ) { M::RVType::operator=(s); }
// Static specification methods...
static M& setModel ( ) { return m; }
// Static extraction methods...
static const M& getModel ( ) { return m; }
// Specification methods...
bool setFirst ( ) { return M::RVType::setFirst(); }
bool setNext ( ) { return M::RVType::setNext(); }
bool setFirst ( const typename M::Dep1Type& x1, const typename M::Dep2Type& x2 ) { return m.setFirst(*this,x1,x2); }
bool setFirstConsistent ( const typename M::Dep1Type& x1, const typename M::Dep2Type& x2 ) { return m.setFirstConsistent(*this,x1,x2); }
bool setNext ( const typename M::Dep1Type& x1, const typename M::Dep2Type& x2 ) { return m.setNext (*this,x1,x2); }
bool setSample ( const typename M::Dep1Type& x1, const typename M::Dep2Type& x2 ) { return m.setSample(*this,x1,x2); }
// Extraction methods...
typename M::ProbType getProb ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2 ) const { return m.getProb(*this,x1,x2); }
};
////////////////////////////////////////////////////////////
template
class Modeled4DRV : public M::RVType {
public:
// Constructor / destructor methods...
Modeled4DRV ( ) { }
//Modeled4DRV ( int i ) { M::RVType::operator=(i); }
Modeled4DRV ( string& s ) { M::RVType::operator=(s); }
// Static specification methods...
static M& setModel ( ) { return m; }
// Static extraction methods...
static const M& getModel ( ) { return m; }
// Specification methods...
bool setFirst ( ) { return M::RVType::setFirst(); }
bool setNext ( ) { return M::RVType::setNext(); }
bool setFirst ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3 ) { return m.setFirst(*this,x1,x2,x3); }
bool setFirstConsistent ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3 ) { return m.setFirstConsistent(*this,x1,x2,x3); }
bool setNext ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3 ) { return m.setNext (*this,x1,x2,x3); }
bool setSample ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3 ) { return m.setSample(*this,x1,x2,x3); }
// Extraction methods...
typename M::ProbType getProb ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3 ) const { return m.getProb(*this,x1,x2,x3); }
};
////////////////////////////////////////////////////////////
template
class Modeled5DRV : public M::RVType {
public:
// Constructor / destructor methods...
Modeled5DRV ( ) { }
//Modeled5DRV ( int i ) { M::RVType::operator=(i); }
Modeled5DRV ( string& s ) { M::RVType::operator=(s); }
// Static specification methods...
static M& setModel ( ) { return m; }
// Static extraction methods...
static const M& getModel ( ) { return m; }
// Specification methods...
bool setFirst ( ) { return M::RVType::setFirst(); }
bool setNext ( ) { return M::RVType::setNext(); }
bool setFirst ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4 ) { return m.setFirst(*this,x1,x2,x3,x4); }
bool setFirstConsistent ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4 ) { return m.setFirstConsistent(*this,x1,x2,x3,x4); }
bool setNext ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4 ) { return m.setNext (*this,x1,x2,x3,x4); }
bool setSample (const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4 ) { return m.setSample(*this,x1,x2,x3,x4); }
// Extraction methods...
typename M::ProbType getProb ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4 ) const { return m.getProb(*this,x1,x2,x3,x4); }
};
///////////////////////////////////////////////////////////////////////////////
template
class Modeled6DRV : public M::RVType {
public:
// Constructor / destructor methods...
Modeled6DRV ( ) { }
//Modeled5DRV ( int i ) { M::RVType::operator=(i); }
Modeled6DRV ( string& s ) { M::RVType::operator=(s); }
// Static specification methods...
static M& setModel ( ) { return m; }
// Static extraction methods...
static const M& getModel ( ) { return m; }
// Specification methods...
bool setFirst ( ) { return M::RVType::setFirst(); }
bool setNext ( ) { return M::RVType::setNext(); }
bool setFirst ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4,
const typename M::Dep5Type& x5 ) { return m.setFirst(*this,x1,x2,x3,x4,x5); }
bool setFirstConsistent ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4,
const typename M::Dep5Type& x5 ) { return m.setFirstConsistent(*this,x1,x2,x3,x4,x5); }
bool setNext ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4,
const typename M::Dep5Type& x5 ) { return m.setNext (*this,x1,x2,x3,x4,x5); }
bool setSample (const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4,
const typename M::Dep5Type& x5 ) { return m.setSample(*this,x1,x2,x3,x4,x5); }
// Extraction methods...
typename M::ProbType getProb ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4,
const typename M::Dep5Type& x5 ) const { return m.getProb(*this,x1,x2,x3,x4,x5); }
};
///////////////////////////////////////////////////////////////////////////////
template
class Modeled7DRV : public M::RVType {
public:
// Constructor / destructor methods...
Modeled7DRV ( ) { }
//Modeled5DRV ( int i ) { M::RVType::operator=(i); }
Modeled7DRV ( string& s ) { M::RVType::operator=(s); }
// Static specification methods...
static M& setModel ( ) { return m; }
// Static extraction methods...
static const M& getModel ( ) { return m; }
// Specification methods...
bool setFirst ( ) { return M::RVType::setFirst(); }
bool setNext ( ) { return M::RVType::setNext(); }
bool setFirst ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4,
const typename M::Dep5Type& x5,
const typename M::Dep6Type& x6 ) { return m.setFirst(*this,x1,x2,x3,x4,x5,x6); }
bool setFirstConsistent ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4,
const typename M::Dep5Type& x5,
const typename M::Dep6Type& x6 ) { return m.setFirstConsistent(*this,x1,x2,x3,x4,x5,x6); }
bool setNext ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4,
const typename M::Dep5Type& x5,
const typename M::Dep6Type& x6 ) { return m.setNext (*this,x1,x2,x3,x4,x5,x6); }
bool setSample (const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4,
const typename M::Dep5Type& x5,
const typename M::Dep6Type& x6 ) { return m.setSample(*this,x1,x2,x3,x4,x5,x6); }
// Extraction methods...
typename M::ProbType getProb ( const typename M::Dep1Type& x1,
const typename M::Dep2Type& x2,
const typename M::Dep3Type& x3,
const typename M::Dep4Type& x4,
const typename M::Dep5Type& x5,
const typename M::Dep6Type& x6 ) const { return m.getProb(*this,x1,x2,x3,x4,x5,x6); }
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// PrecomputedModeledXDRV
//
////////////////////////////////////////////////////////////////////////////////
template
class PrecomputedModeled2DRV : public Modeled2DRV {
private:
SafeArray1D apr;
void precompute ( ) { apr.init(M::Dep1Type::getDomain().getSize());
typename M::Dep1Type x1;
for(bool b=x1.setFirst(); b; b=x1.setNext()) apr.set(x1)=m.getProb(*this,x1); }
public:
typename M::ProbType getProb ( const typename M::Dep1Type& x1 ) const { return apr.get(x1); }
typename M::RVType set ( const S s ) { M::RVType::set(s); precompute(); return *this; }
};
//template SafeArray1D PrecomputedModeled2DRV::apr;
#endif /* _NL_PROBMODEL__ */