SIRF  3.5.0
DataContainer.h
1 /*
2 SyneRBI Synergistic Image Reconstruction Framework (SIRF)
3 Copyright 2015 - 2019 Rutherford Appleton Laboratory STFC
4 
5 This is software developed for the Collaborative Computational
6 Project in Synergistic Reconstruction for Biomedical Imaging (formerly CCP PETMR)
7 (http://www.ccpsynerbi.ac.uk/).
8 
9 Licensed under the Apache License, Version 2.0 (the "License");
10 you may not use this file except in compliance with the License.
11 You may obtain a copy of the License at
12 http://www.apache.org/licenses/LICENSE-2.0
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18 
19 */
20 
21 #ifndef SIRF_ABSTRACT_DATA_CONTAINER_TYPE
22 #define SIRF_ABSTRACT_DATA_CONTAINER_TYPE
23 
24 #include<complex>
25 #include <map>
27 
38 namespace sirf {
39 
40  typedef std::map<std::string, int> Dimensions;
41 
42  class DataContainer {
43  public:
44  virtual ~DataContainer() {}
45  //virtual DataContainer* new_data_container() const = 0;
46  virtual ObjectHandle<DataContainer>* new_data_container_handle() const = 0;
47  virtual unsigned int items() const = 0;
48  virtual bool is_complex() const = 0;
50  virtual int bits() const
51  {
52  // default value
53  return is_complex() ? 16 * sizeof(float) : 8 * sizeof(float);
54  }
55 
57  virtual float norm() const = 0;
58 
61 
63  virtual void dot(const DataContainer& dc, void* ptr) const = 0;
64 
66  virtual void sum(void* ptr) const = 0;
67 
69  virtual void max(void* ptr) const = 0;
70 
72  virtual void multiply
73  (const DataContainer& x, const DataContainer& y) = 0;
75  virtual void multiply
76  (const DataContainer& x, const void* ptr_y) = 0;
77 
79  virtual void add
80  (const DataContainer& x, const void* ptr_y) = 0;
81 
83  virtual void divide
84  (const DataContainer& x, const DataContainer& y) = 0;
85 
87  virtual void maximum
88  (const DataContainer& x, const DataContainer& y) = 0;
89  virtual void maximum
90  (const DataContainer& x, const void* ptr_y) = 0;
91 
93  virtual void minimum
94  (const DataContainer& x, const DataContainer& y) = 0;
95  virtual void minimum
96  (const DataContainer& x, const void* ptr_y) = 0;
97 
99  virtual void power
100  (const DataContainer& x, const DataContainer& y) = 0;
101  virtual void power
102  (const DataContainer& x, const void* ptr_y) = 0;
103 
105  virtual void exp(const DataContainer& x) = 0;
107  virtual void log(const DataContainer& x) = 0;
109  virtual void sqrt(const DataContainer& x) = 0;
111  virtual void sign(const DataContainer& x) = 0;
113  virtual void abs(const DataContainer& x) = 0;
114 
116  virtual void axpby(
117  const void* ptr_a, const DataContainer& x,
118  const void* ptr_b, const DataContainer& y) = 0;
120  virtual void xapyb(
121  const DataContainer& x, const void* ptr_a,
122  const DataContainer& y, const void* ptr_b) = 0;
123 
125  virtual void xapyb(
126  const DataContainer& x, const DataContainer& a,
127  const DataContainer& y, const DataContainer& b) = 0;
128 
130  virtual void xapyb(
131  const DataContainer& a_x, const void* ptr_a,
132  const DataContainer& a_y, const DataContainer& a_b) = 0;
133 
135  void xapyb(
136  const DataContainer& a_x, const DataContainer& a_a,
137  const DataContainer& a_y, const void* ptr_b)
138  {
139  xapyb(a_y, ptr_b, a_x, a_a);
140  }
141 
142  virtual void write(const std::string &filename) const = 0;
143 
144  bool is_empty() const
145  {
146  return items() < 1;
147  }
148 
149  std::unique_ptr<DataContainer> clone() const
150  {
151  return std::unique_ptr<DataContainer>(this->clone_impl());
152  }
153 
155  void conjugate()
156  {
157  this->conjugate_impl();
158  }
159 
161  std::unique_ptr<DataContainer> conjugate() const
162  {
163  DataContainer* ptr = this->clone_impl();
164  ptr->conjugate();
165  return std::unique_ptr<DataContainer>(ptr);
166  }
167 
168  template<typename T>
169  static T product(T x, T y)
170  {
171  return x * y;
172  }
173 
174  template<typename T>
175  static T ratio(T x, T y)
176  {
177  return x / y;
178  }
179 
180  template<typename T>
181  static T inverse_ratio(T x, T y)
182  {
183  return y / x;
184  }
185 
186  template<typename T>
187  static T sum(T x, T y)
188  {
189  return x + y;
190  }
191 
192  template<typename T>
193  static T maximum(T x, T y)
194  {
195  return std::max(x, y);
196  }
197  template<typename T>
198  static T maxabs(T x, T y)
199  {
200  return std::max(std::abs(x), std::abs(y));
201  }
202  template<typename T>
203  static T maxreal(T x, T y)
204  {
205  return std::real(x) > std::real(y) ? x : y;
206  }
207 
208  template<typename T>
209  static T minimum(T x, T y)
210  {
211  return std::min(x, y);
212  }
213  template<typename T>
214  static T minabs(T x, T y)
215  {
216  return std::min(std::abs(x), std::abs(y));
217  }
218  template<typename T>
219  static T minreal(T x, T y)
220  {
221  return std::real(x) < std::real(y) ? x : y;
222  }
223  static std::complex<float> power(std::complex<float> x, std::complex<float> y)
224  {
225  return std::pow(x, y);
226  }
227  static std::complex<float> exp(std::complex<float> x)
228  {
229  return std::exp(x);
230  }
231  static std::complex<float> log(std::complex<float> x)
232  {
233  return std::log(x);
234  }
235  static std::complex<float> sqrt(std::complex<float> x)
236  {
237  return std::sqrt(x);
238  }
239  template<typename T>
240  static T sign(T x)
241  {
242  return (std::real(x) > 0) - (std::real(x) < 0);
243  }
244  template<typename T>
245  static T abs(T x)
246  {
247  return T(std::abs(x));
248  }
249 
250  protected:
251  virtual DataContainer* clone_impl() const = 0;
253  virtual void conjugate_impl()
254  {
255  if (is_complex())
256  THROW("complex data containes must override conjugate_impl()");
257  }
258  };
259 }
260 
261 #endif
Execution status type and wrappers for C++ objects.
Definition: DataHandle.h:159
Definition: DataContainer.h:42
virtual void conjugate_impl()
we assume data to be real, complex data containers must override this
Definition: DataContainer.h:253
std::unique_ptr< DataContainer > conjugate() const
returns unique pointer to the complex-conjugated copy of this container
Definition: DataContainer.h:161
void xapyb(const DataContainer &a_x, const DataContainer &a_a, const DataContainer &a_y, const void *ptr_b)
*this = elementwise sum of elementwise x*a and y*b
Definition: DataContainer.h:135
virtual void xapyb(const DataContainer &x, const DataContainer &a, const DataContainer &y, const DataContainer &b)=0
*this = elementwise sum of two elementwise products x*a and y*b
virtual void sum(void *ptr) const =0
calculates the sum of this container elements
virtual float norm() const =0
returns the norm of this container viewed as a vector
virtual void xapyb(const DataContainer &a_x, const void *ptr_a, const DataContainer &a_y, const DataContainer &a_b)=0
*this = elementwise sum of x*a and elementwise y*b
virtual void add(const DataContainer &x, const void *ptr_y)=0
*this = the sum x + y with scalar y
virtual void multiply(const DataContainer &x, const void *ptr_y)=0
*this = the product x * y with scalar y
virtual void multiply(const DataContainer &x, const DataContainer &y)=0
*this = the elementwise product x*y
virtual void maximum(const DataContainer &x, const DataContainer &y)=0
*this = the elementwise max(x, y)
void conjugate()
overwrites this container's complex data with complex conjugate values
Definition: DataContainer.h:155
virtual void sign(const DataContainer &x)=0
*this = the elementwise sign(x)
virtual void abs(const DataContainer &x)=0
*this = the elementwise abs(x)
virtual void exp(const DataContainer &x)=0
*this = the elementwise exp(x)
virtual void power(const DataContainer &x, const DataContainer &y)=0
*this = the elementwise pow(x, y)
virtual void axpby(const void *ptr_a, const DataContainer &x, const void *ptr_b, const DataContainer &y)=0
*this = the linear combination of x and y
virtual void minimum(const DataContainer &x, const DataContainer &y)=0
*this = the elementwise min(x, y)
virtual void dot(const DataContainer &dc, void *ptr) const =0
calculates the dot product of this container with another one
virtual void divide(const DataContainer &x, const DataContainer &y)=0
*this = the elementwise ratio x / y
virtual void log(const DataContainer &x)=0
*this = the elementwise log(x)
virtual int bits() const
returns the size of data elements
Definition: DataContainer.h:50
virtual void xapyb(const DataContainer &x, const void *ptr_a, const DataContainer &y, const void *ptr_b)=0
alternative interface to the above
virtual void sqrt(const DataContainer &x)=0
*this = the elementwise sqrt(x)
virtual void max(void *ptr) const =0
calculates the value of this container's element with the largest real part
Abstract data container.
Definition: GeometricalInfo.cpp:141