SIRF  3.4.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 <map>
26 
37 namespace sirf {
38 
39  typedef std::map<std::string, int> Dimensions;
40 
41  class DataContainer {
42  public:
43  virtual ~DataContainer() {}
44  //virtual DataContainer* new_data_container() const = 0;
45  virtual ObjectHandle<DataContainer>* new_data_container_handle() const = 0;
46  virtual unsigned int items() const = 0;
47  virtual bool is_complex() const = 0;
48 
50  virtual float norm() const = 0;
51 
53  virtual void dot(const DataContainer& dc, void* ptr) const = 0;
54 
56  virtual void multiply
57  (const DataContainer& x, const DataContainer& y) = 0;
58 
60  virtual void divide
61  (const DataContainer& x, const DataContainer& y) = 0;
62 
64  virtual void maximum
65  (const DataContainer& x, const DataContainer& y) = 0;
66 
68  virtual void minimum
69  (const DataContainer& x, const DataContainer& y) = 0;
70 
72  virtual void axpby(
73  const void* ptr_a, const DataContainer& x,
74  const void* ptr_b, const DataContainer& y) = 0;
76  virtual void xapyb(
77  const DataContainer& x, const void* ptr_a,
78  const DataContainer& y, const void* ptr_b) = 0;
79 
81  virtual void xapyb(
82  const DataContainer& x, const DataContainer& a,
83  const DataContainer& y, const DataContainer& b) = 0;
84 
85  virtual void write(const std::string &filename) const = 0;
86 
87  bool is_empty() const
88  {
89  return items() < 1;
90  }
91 
92  std::unique_ptr<DataContainer> clone() const
93  {
94  return std::unique_ptr<DataContainer>(this->clone_impl());
95  }
96 
98  void conjugate()
99  {
100  this->conjugate_impl();
101  }
102 
104  std::unique_ptr<DataContainer> conjugate() const
105  {
106  DataContainer* ptr = this->clone_impl();
107  ptr->conjugate();
108  return std::unique_ptr<DataContainer>(ptr);
109  }
110 
111  protected:
112  virtual DataContainer* clone_impl() const = 0;
114  virtual void conjugate_impl()
115  {
116  if (is_complex())
117  THROW("complex data containes must override conjugate_impl()");
118  }
119  };
120 }
121 
122 #endif
virtual void minimum(const DataContainer &x, const DataContainer &y)=0
*this = the elementwise min(x, y)
virtual void xapyb(const DataContainer &x, const void *ptr_a, const DataContainer &y, const void *ptr_b)=0
alternative interface to the above
std::unique_ptr< DataContainer > conjugate() const
returns unique pointer to the complex-conjugated copy of this container
Definition: DataContainer.h:104
virtual float norm() const =0
returns the norm of this container viewed as a vector
virtual void multiply(const DataContainer &x, const DataContainer &y)=0
*this = the elementwise product x*y
void conjugate()
overwrites this container&#39;s complex data with complex conjugate values
Definition: DataContainer.h:98
Abstract data container.
Definition: GeometricalInfo.cpp:141
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
Definition: DataHandle.h:159
virtual void dot(const DataContainer &dc, void *ptr) const =0
calculates the dot product of this container with another one
virtual void conjugate_impl()
we assume data to be real, complex data containers must override this
Definition: DataContainer.h:114
virtual void divide(const DataContainer &x, const DataContainer &y)=0
*this = the elementwise ratio x/y
Definition: DataContainer.h:41
Execution status type and wrappers for C++ objects.
virtual void maximum(const DataContainer &x, const DataContainer &y)=0
*this = the elementwise max(x, y)