2 #ifndef OPENGM_GRAPHICALMODEL_EXPLICIT_STORAGE_HXX
3 #define OPENGM_GRAPHICALMODEL_EXPLICIT_STORAGE_HXX
24 class FUNCTION_TYPE_LIST ,
30 template<
unsigned int I,
unsigned int D,
bool END>
31 class FunctionIteratation;
66 template<
unsigned int I,
unsigned int D,
bool END>
68 typedef GM GraphicalModelType;
69 typedef typename GraphicalModelType::LabelType LabelType;
70 typedef typename GraphicalModelType::IndexType IndexType;
71 typedef typename GraphicalModelType::ValueType ValueType;
72 typedef typename GraphicalModelType::OperatorType OperatorType;
73 typedef typename GraphicalModelType::FactorType FactorType;
74 typedef typename GraphicalModelType::IndependentFactorType IndependentFactorType;
75 typedef typename GraphicalModelType::FunctionIdentifier FunctionIdentifier;
80 functionSize_(GraphicalModelType::NrOfFunctionTypes),
81 functionTypeStart_(GraphicalModelType::NrOfFunctionTypes,0){
85 for(
size_t i=0;i<GraphicalModelType::NrOfFunctionTypes;++i){
86 functionSize_[i]=gm_.numberOfFunctions(i);
87 numFTotal+=functionSize_[i];
90 functionIndexToStart_.resize(numFTotal);
91 functionTypeStart_[0]=0;
92 for(
size_t i=1;i<GraphicalModelType::NrOfFunctionTypes;++i){
93 for(
size_t ii=0;ii<i;++ii){
94 functionTypeStart_[i]+=functionSize_[ii];
104 data_ =
new ValueType[storageSize];
105 dataSize_=storageSize;
108 size_t currentOffset=0;
116 ValueType
const *
operator[](
const FactorType & factor)
const{
117 const size_t scalarIndex=fidToIndex(factor.functionType(),factor.functionIndex());
118 return data_+functionIndexToStart_[scalarIndex];
123 const GraphicalModelType & gm_;
124 std::vector<size_t> functionSize_;
125 std::vector<size_t> functionTypeStart_;
126 std::vector<size_t> functionIndexToStart_;
130 size_t fidToIndex(
const size_t functionType,
const size_t functionIndex)
const{
131 return functionTypeStart_[functionType]+functionIndex;
134 ValueType
const * getFunction(
size_t functionType,
size_t functionIndex){
154 typedef typename GM::ValueType GmValueType;
155 typedef typename GM::OperatorType GmOperatorTye;
156 typedef typename GM::FunctionIdentifier GmFunctionIdentifier;
162 static void convert(
const GM & gm,ExplicitGraphicalModelType & explicitGm){
164 space.
reserve(gm.numberOfVariables());
165 for(
size_t v=0;v<gm.numberOfVariables();++v){
169 std::map<GmFunctionIdentifier,FunctionIdentifier> fidMap;
172 for(
size_t f=0;f<gm.numberOfFactors();++f){
173 const typename GM::FactorType & factor=gm[f];
174 FunctionIdentifier explicitFid=fidMap[GmFunctionIdentifier(factor.functionIndex(),factor.functionType())];
175 explicitGm.
addFactor(explicitFid,factor.variableIndicesBegin(),factor.variableIndicesEnd());
182 template<
unsigned int IX,
unsigned int DX>
185 template<
class STORAGE>
188 const size_t numF=storage.functionSize_[IX];
189 for(
size_t f=0;f<numF;++f){
190 neededStorage+=storage.gm_.
template functions<IX>()[f].size();
195 template<
class STORAGE>
198 typedef typename STORAGE::GraphicalModelType::FunctionTypeList FTypeList;
199 typedef typename meta::TypeAtTypeList<FTypeList,IX>::type FunctionType;
200 typedef typename FunctionType::FunctionShapeIteratorType FunctionShapeIteratorType;
201 const size_t numF=storage.functionSize_[IX];
202 for(
size_t f=0;f<numF;++f){
203 const FunctionType &
function = storage.gm_.
template functions<IX>()[f];
204 const size_t functionSize=
function.size();
206 const size_t fIndex=storage.fidToIndex(IX,f);
210 storage.functionIndexToStart_[fIndex]=currentOffset;
212 ShapeWalker< FunctionShapeIteratorType > walker(
function.functionShapeBegin(),
function.dimension());
213 for (
size_t i = 0; i < functionSize; ++i) {
215 storage.data_[currentOffset+i]=
function(walker.coordinateTuple().begin());
218 currentOffset+=functionSize;
223 template<
class GM,
class GM_EXPLICIT,
class FID_MAP>
224 static void convert(
const GM & gm ,GM_EXPLICIT & gmExplicit , FID_MAP & fidMap){
226 typedef typename GM::FunctionTypeList FTypeList;
227 typedef typename meta::TypeAtTypeList<FTypeList,IX>::type FunctionType;
228 typedef typename FunctionType::FunctionShapeIteratorType FunctionShapeIteratorType;
229 const size_t numF=gm.
template functions<IX>().size();
231 for(
size_t f=0;f<numF;++f){
232 const FunctionType &
function = gm.
template functions<IX>()[f];
233 const size_t functionSize=
function.size();
237 ShapeWalker< FunctionShapeIteratorType > walker(
function.functionShapeBegin(),
function.dimension());
238 for (
size_t i = 0; i < functionSize; ++i) {
239 explicitFunction(i)=
function(walker.coordinateTuple().begin());
243 typename GM::FunctionIdentifier gmFid(f,IX);
244 fidMap[gmFid]=gmExplicit.addFunction(explicitFunction);
253 template<
unsigned int IX,
unsigned int DX>
256 template<
class STORAGE>
261 template<
class STORAGE>
266 template<
class GM,
class GM_EXPLICIT,
class FID_MAP>
267 static void convert(
const GM & gm ,GM_EXPLICIT & gmExplicit , FID_MAP & fidMap){
274 #endif //OPENGM_GRAPHICALMODEL_EXPLICIT_STORAGE_HXX
IndexType addFactor(const FunctionIdentifier &, ITERATOR, ITERATOR)
add a factor to the graphical model
Discrete space in which variables can have differently many labels.
static void size(STORAGE &storage, size_t &neededStorage)
ExplicitStorage (continous storage) of a graphical model function data.
static void store(STORAGE &storage, size_t ¤tOffset)
static void store(STORAGE &storage, size_t ¤tOffset)
Convert any graphical model into an explicit graphical model.
#define OPENGM_ASSERT(expression)
ValueType const * operator[](const FactorType &factor) const
GraphicalModel< GmValueType, GmOperatorTye, ExplicitFunction< GmValueType >, DiscreteSpace< > > ExplicitGraphicalModelType
static void convert(const GM &gm, GM_EXPLICIT &gmExplicit, FID_MAP &fidMap)
ExplicitStorage(const GraphicalModelType &gm)
Function encoded as a dense multi-dimensional array, marray::Marray.
IndexType addVariable(const LabelType)
add one more variable
static void convert(const GM &gm, ExplicitGraphicalModelType &explicitGm)
void assign(const SpaceType &)
clear the graphical model and construct a new one based on a label space
void reserve(const IndexType)
allocate memory for a fixed number of variables
static void convert(const GM &gm, GM_EXPLICIT &gmExplicit, FID_MAP &fidMap)
static void size(STORAGE &storage, size_t &neededStorage)