2 #ifndef OPENGM_SPARSEMARRAY
3 #define OPENGM_SPARSEMARRAY
13 template<
class T,
class I,
class L,
class CONTAINER=std::map<I,T> >
17 typedef typename ContainerType::key_type
KeyType;
39 template<
class SHAPE_ITERATOR>
41 dimension_(
std::distance(shapeBegin,shapeEnd)),
42 defaultValue_(defaultValue),
44 shape_.resize(dimension_);
45 strides_.resize(dimension_);
47 LabelType strideVal=1;
48 for(
unsigned short dim=0;dim<dimension_;++dim){
49 shape_[dim]=*shapeBegin;
50 strides_[dim]=strideVal;
51 strideVal*=shape_[dim];
58 for(
unsigned short dim=0;dim<dimension_;++dim){
59 size*=
static_cast<size_t>(shape_[dim]);
73 const LabelType
shape(
const IndexType i)
const{
79 template<
class COORDINATE_ITERATOR>
81 typedef typename std::iterator_traits<COORDINATE_ITERATOR>::value_type CoordType;
84 for(
unsigned short d=0;d<dimension_;++d){
85 const unsigned short dim=(dimension_-1)-d;
86 const KeyType c=keyRest/
static_cast<KeyType
>( strides_[dim] );
87 keyRest=keyRest-c*
static_cast<KeyType
>( strides_[dim] );
88 coordinate[dim]=
static_cast<CoordType
>(c);
92 *coordinate=
static_cast<CoordType
>(key);
97 template<
class COORDINATE_ITERATOR>
99 KeyType key=
static_cast<KeyType
>(0);
100 for(
unsigned short dim=0;dim<dimension_;++dim){
101 key+=strides_[dim]*
static_cast<KeyType
>(*coordinate);
107 template<
class COORDINATE_ITERATOR,
size_t DIM>
109 KeyType key=
static_cast<KeyType
>(0);
110 for(
unsigned short dim=0;dim<DIM;++dim){
111 key+=strides_[dim]*
static_cast<KeyType
>(coordinate[dim]);
116 template<
class COORDINATE_ITERATOR>
118 typedef COORDINATE_ITERATOR CoordType;
124 return valueFromKey(coordinateToKeyWithDim<CoordType,1>(coordinate));
126 return valueFromKey(coordinateToKeyWithDim<CoordType,2>(coordinate));
128 return valueFromKey(coordinateToKeyWithDim<CoordType,3>(coordinate));
130 return valueFromKey(coordinateToKeyWithDim<CoordType,4>(coordinate));
132 return valueFromKey(coordinateToKeyWithDim<CoordType,5>(coordinate));
134 return valueFromKey(coordinateToKeyWithDim<CoordType,6>(coordinate));
136 return valueFromKey(coordinateToKeyWithDim<CoordType,7>(coordinate));
138 return valueFromKey(coordinateToKeyWithDim<CoordType,8>(coordinate));
140 return valueFromKey(coordinateToKeyWithDim<CoordType,9>(coordinate));
142 return valueFromKey(coordinateToKeyWithDim<CoordType,10>(coordinate));
144 return valueFromKey(coordinateToKeyWithDim<CoordType,11>(coordinate));
146 return valueFromKey(coordinateToKeyWithDim<CoordType,12>(coordinate));
148 return valueFromKey(coordinateToKeyWithDim<CoordType,13>(coordinate));
150 return valueFromKey(coordinateToKeyWithDim<CoordType,14>(coordinate));
152 return valueFromKey(coordinateToKeyWithDim<CoordType,15>(coordinate));
154 return valueFromKey(coordinateToKeyWithDim<CoordType,16>(coordinate));
161 return defaultValue_;
165 ConstContainerIteratorType iter=container_.find(key);
166 if(iter!=container_.end()){
170 return defaultValue_;
174 template<
class COORDINATE_ITERATOR>
175 void insert(COORDINATE_ITERATOR coordinate,
const ValueType value){
180 unsigned short dimension_;
181 ValueType defaultValue_;
182 ContainerType container_;
183 std::vector<LabelType> shape_;
184 std::vector<size_t> strides_;
void insert(COORDINATE_ITERATOR coordinate, const ValueType value)
const size_t dimension() const
Fallback implementation of member functions of OpenGM functions.
KeyType coordinateToKeyWithDim(COORDINATE_ITERATOR coordinate) const
ContainerType::mapped_type MappedType
SparseFunction(SHAPE_ITERATOR shapeBegin, SHAPE_ITERATOR shapeEnd, const ValueType defaultValue)
const ContainerType & container() const
const LabelType shape(const IndexType i) const
ContainerType::key_type KeyType
ValueType operator()(COORDINATE_ITERATOR coordinate) const
ContainerType::const_iterator ConstContainerIteratorType
ValueType valueFromKey(const KeyType key) const
void keyToCoordinate(const KeyType key, COORDINATE_ITERATOR coordinate) const
KeyType coordinateToKey(COORDINATE_ITERATOR coordinate) const
std::pair< KeyType, MappedType > KeyValPairType
ContainerType::iterator ContainerIteratorType
ContainerType & container()
ValueType defaultValue() const