2 #ifndef OPENGM_SINGLESITEFUNCTION_HXX
3 #define OPENGM_SINGLESITEFUNCTION_HXX
16 template<
class T,
size_t SIZE>
21 template<
class ITERATOR>
22 const T & operator()(ITERATOR iter)
const {
24 return this->dataPointer_[*iter];
26 template<
class ITERATOR>
27 T & operator()(ITERATOR iter) {
29 return this->dataPointer_[*iter];
31 T & operator[](
const size_t index) {
33 return this->dataPointer_[index];
35 const T & operator[](
const size_t index)
const {
37 return this->dataPointer_[index];
44 template<
class T,
size_t SIZE>
48 dataPointer_ =
new T[SIZE];
51 delete[] dataPointer_;
53 T& operator[](
const size_t index) {
55 return this->dataPointer_[index];
57 const T& operator[](
const size_t index)
const {
59 return this->dataPointer_[index];
61 template<
class ITERATOR>
62 const T& operator()(ITERATOR iter)
const {
64 return this->dataPointer_[*iter];
66 template<
class ITERATOR>
67 T& operator()(ITERATOR iter) {
69 return this->dataPointer_[*iter];
81 template<
class T,
size_t SIZE,
template<
typename,
size_t>
class STORAGE>
84 public FunctionBase<StaticSingleSiteFunction<T, SIZE, STORAGE>, T, size_t, size_t>
94 for(
size_t i=0;i<SIZE;++i){
95 (*this).operator [](i)=other[i];
102 for(
size_t i=0;i<SIZE;++i) {
103 (*this).operator [](i)=other[i];
109 template<
class ITERATOR>
const T&
operator()(ITERATOR iter)
const
127 size_t shape(
const size_t index)
const
147 dataPointer_ =
new T[
size];
155 dataPointer_ =
new T[
size];
156 std::fill(dataPointer_, dataPointer_+size_, value);
163 delete[] dataPointer_;
169 if(other.size_ != 0) {
170 dataPointer_ =
new T[other.size_];
172 std::copy(other.dataPointer_, other.dataPointer_+size_, dataPointer_);
182 if(other.size_ > size_) {
183 delete[] dataPointer_;
184 dataPointer_ =
new T[other.size_];
186 std::copy(other.dataPointer_, other.dataPointer_ + size_, dataPointer_);
188 else if(other.size_ < size_) {
189 delete[] dataPointer_;
190 if(other.size_!= 0) {
191 dataPointer_=
new T[other.size_];
193 std::copy(other.dataPointer_, other.dataPointer_+size_, dataPointer_);
199 if(other.size_ == size_) {
200 std::copy(other.dataPointer_, other.dataPointer_+size_, dataPointer_);
209 delete[] dataPointer_;
211 dataPointer_ =
new T[
size];
223 delete[] dataPointer_;
225 dataPointer_ =
new T[
size];
227 std::fill(dataPointer_, dataPointer_+size_, value);
234 std::fill(dataPointer_, dataPointer_+size_, value);
244 size_t shape(
const size_t index)
const
253 return dataPointer_[index];
259 return dataPointer_[index];
262 template<
class ITERATOR>
266 return dataPointer_[*iter];
269 template<
class ITERATOR>
273 return dataPointer_[*iter];
283 template<
class T,
size_t SIZE,
template <
typename ,
size_t >
class STORAGE>
284 struct FunctionRegistration< StaticSingleSiteFunction<T, SIZE,
STORAGE> > {
290 struct FunctionRegistration< DynamicSingleSiteFunction<T> > {
295 template<
class T,
size_t SIZE,
template <
typename ,
size_t >
class STORAGE>
296 class FunctionSerialization< StaticSingleSiteFunction<T, SIZE,
STORAGE> > {
298 typedef typename StaticSingleSiteFunction<T, SIZE, STORAGE> ::ValueType ValueType;
300 static size_t indexSequenceSize(
const StaticSingleSiteFunction<T, SIZE, STORAGE> & f){
304 static size_t valueSequenceSize(
const StaticSingleSiteFunction<T, SIZE, STORAGE> & f){
308 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
309 static void serialize(
const StaticSingleSiteFunction<T, SIZE, STORAGE> & f, INDEX_OUTPUT_ITERATOR ii, VALUE_OUTPUT_ITERATOR vi){
310 for(
size_t i=0;i<SIZE;++i){
317 template<
class INDEX_INPUT_ITERATOR ,
class VALUE_INPUT_ITERATOR>
318 static void deserialize( INDEX_INPUT_ITERATOR ii, VALUE_INPUT_ITERATOR vi, StaticSingleSiteFunction<T, SIZE, STORAGE> & f){
319 for(
size_t i=0;i<SIZE;++i){
329 class FunctionSerialization< DynamicSingleSiteFunction<T> > {
331 typedef typename DynamicSingleSiteFunction<T>::ValueType ValueType;
333 static size_t indexSequenceSize(
const DynamicSingleSiteFunction<T> & f){
337 static size_t valueSequenceSize(
const DynamicSingleSiteFunction<T> & f){
341 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
342 static void serialize(
const DynamicSingleSiteFunction<T> & f, INDEX_OUTPUT_ITERATOR ii, VALUE_OUTPUT_ITERATOR vi){
343 for(
size_t i=0;i<f.size();++i){
350 template<
class INDEX_INPUT_ITERATOR ,
class VALUE_INPUT_ITERATOR>
351 static void deserialize( INDEX_INPUT_ITERATOR ii, VALUE_INPUT_ITERATOR vi, DynamicSingleSiteFunction<T> & f){
352 const size_t size=*ii;
354 for(
size_t i=0;i<size;++i){
365 #endif // #ifndef OPENGM_SINGLESITEFUNCTION_HXX
size_t shape(const size_t index) const
void assign(const size_t size, const T value)
Fallback implementation of member functions of OpenGM functions.
StaticSingleSiteFunction()
DynamicSingleSiteFunction(const size_t size, ValueType value)
#define OPENGM_ASSERT(expression)
Single site function with dynamic size.
const T & operator()(ITERATOR iter) const
T & operator()(ITERATOR iter)
Single site function whose size is fixed at compile time.
StaticSingleSiteFunction & operator=(const StaticSingleSiteFunction &other)
DynamicSingleSiteFunction(const DynamicSingleSiteFunction &other)
StaticSingleSiteFunction(const StaticSingleSiteFunction &other)
DynamicSingleSiteFunction(const size_t size=0)
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
~DynamicSingleSiteFunction()
T & operator()(ITERATOR iter)
const T & operator()(ITERATOR iter) const
const T & operator[](const size_t index) const
void assign(const size_t size)
DynamicSingleSiteFunction & operator=(const DynamicSingleSiteFunction &other)
T & operator[](const size_t index)
size_t shape(const size_t index) const