OpenGM  2.3.x
Discrete Graphical Model Library
functions/sparsemarray.hxx
Go to the documentation of this file.
1 #pragma once
2 #ifndef OPENGM_SPARSE_FUNCTION
3 #define OPENGM_SPARSE_FUNCTION
4 
8 
9 namespace opengm {
10 
13 template<class T,class I,class L,class C>
14 struct FunctionRegistration<opengm::SparseFunction<T,I,L,C> > {
15  enum ID { Id = opengm::FUNCTION_TYPE_ID_OFFSET + 1 };
16 };
17 
21 template<class T,class I,class L,class C>
22 class FunctionSerialization< opengm::SparseFunction<T,I,L,C> > {
23 public:
24  typedef typename opengm::SparseFunction<T,I,L,C>::ValueType ValueType;
25 
26  static size_t indexSequenceSize(const opengm::SparseFunction<T,I,L,C>&);
27  static size_t valueSequenceSize(const opengm::SparseFunction<T,I,L,C>&);
28  template<class INDEX_OUTPUT_ITERATOR,class VALUE_OUTPUT_ITERATOR >
29  static void serialize(const opengm::SparseFunction<T,I,L,C>&, INDEX_OUTPUT_ITERATOR,VALUE_OUTPUT_ITERATOR );
30  template<class INDEX_INPUT_ITERATOR ,class VALUE_INPUT_ITERATOR>
31  static void deserialize( INDEX_INPUT_ITERATOR,VALUE_INPUT_ITERATOR, opengm::SparseFunction<T,I,L,C>&);
32 };
34 
35 template<class T,class I,class L,class C>
36 inline size_t
37 FunctionSerialization<opengm::SparseFunction<T,I,L,C> >::indexSequenceSize
38 (
40 ) {
41  return 1 + src.dimension()+1+src.container().size();
42 }
43 
44 template<class T,class I,class L,class C>
45 inline size_t
46 FunctionSerialization<opengm::SparseFunction<T,I,L,C> >::valueSequenceSize
47 (
49 ) {
50 
51  return src.container().size()+1;
52 }
53 
54 template<class T,class I,class L,class C>
55 template<class INDEX_OUTPUT_ITERATOR,class VALUE_OUTPUT_ITERATOR >
56 void
57 FunctionSerialization<opengm::SparseFunction<T,I,L,C> >::serialize
58 (
60  INDEX_OUTPUT_ITERATOR indexOutIterator,
61  VALUE_OUTPUT_ITERATOR valueOutIterator
62 ) {
63  *indexOutIterator=src.dimension();
64  ++indexOutIterator;
65  for(size_t i=0;i<src.dimension();++i) {
66  *indexOutIterator=src.shape(i);
67  ++indexOutIterator;
68  }
69  //save the default value
70  *valueOutIterator=src.defaultValue();
71  ++valueOutIterator;
72  //save how many not default values are in the SparseFunction
73  *indexOutIterator=src.container().size();
74  ++indexOutIterator;
76  IterType srcIter=src.container().begin();
77  for(size_t i=0;i<src.container().size();++i) {
78  *indexOutIterator=srcIter->first;
79  *valueOutIterator=srcIter->second;
80  ++valueOutIterator;
81  ++indexOutIterator;
82  ++srcIter;
83  }
84 }
85 
86 template<class T,class I,class L,class C>
87 template<class INDEX_INPUT_ITERATOR,class VALUE_INPUT_ITERATOR >
88 void
89 FunctionSerialization<opengm::SparseFunction<T,I,L,C> >::deserialize
90 (
91  INDEX_INPUT_ITERATOR indexOutIterator,
92  VALUE_INPUT_ITERATOR valueOutIterator,
94 ) {
95 
96  const size_t dim=*indexOutIterator;
97  std::vector<size_t> shape(dim);
98  ++indexOutIterator;
99  for(size_t i=0;i<dim;++i) {
100  shape[i]=*indexOutIterator;
101  ++indexOutIterator;
102  }
103  dst = opengm::SparseFunction<T,I,L,C>(shape.begin(),shape.end(),*valueOutIterator);
104  ++valueOutIterator;
105  const size_t nNonDefault=*indexOutIterator;
106  ++indexOutIterator;
107  typedef typename opengm::SparseFunction<T,I,L,C>::KeyValPairType KeyValPairType;
108  for(size_t i=0;i<nNonDefault;++i) {
109 
110  dst.container().insert(KeyValPairType(*indexOutIterator,*valueOutIterator));
111  ++valueOutIterator;
112  ++indexOutIterator;
113  }
114 
115 }
116 
117 } // namepsace opengm
118 
119 #endif // OPENGM_SPARSE_FUNCTION
120 
The OpenGM namespace.
Definition: config.hxx:43
const LabelType shape(const IndexType i) const
std::pair< KeyType, MappedType > KeyValPairType
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.