YAP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DataPartition.h
Go to the documentation of this file.
1 /* YAP - Yet another PWA toolkit
2  Copyright 2015, Technische Universitaet Muenchen,
3  Authors: Daniel Greenwald, Johannes Rauch
4 
5  This program is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
20 
21 #ifndef yap_DataPartition_h
22 #define yap_DataPartition_h
23 
24 #include "fwd/DataPartition.h"
25 
26 #include "fwd/DataPoint.h"
27 #include "fwd/DataSet.h"
28 
29 #include "StatusManager.h"
30 
31 #include <iterator>
32 
33 namespace yap {
34 
39 class DataIterator : public std::iterator<std::random_access_iterator_tag, DataPoint>
40 {
41 protected:
42 
46  : Partition_(&p) {}
47 
51  DataIterator(const DataPartition& p, DataPointVector::iterator it)
52  : Partition_(&p), Iterator_(it) {}
53 
54 public:
55 
56  const DataPartition* partition() const
57  { return Partition_; }
58 
60  DataIterator& operator+=(DataIterator::difference_type n);
61 
64  { return (*this += 1); }
65 
68  { DataIterator it(*this); ++(*this); return it; }
69 
72  { return (*this += -1); }
73 
76  { DataIterator it(*this); --(*this); return it; }
77 
79  DataIterator& operator-=(DataIterator::difference_type n)
80  { return (*this += -n); }
81 
83  friend const DataIterator::difference_type operator-(const DataIterator& lhs, const DataIterator& rhs);
84 
87  { return *Iterator_; }
88 
90  const DataPoint& operator*() const
91  { return *Iterator_; }
92 
95  { return *(this->Iterator_).operator->(); }
96 
98  bool ownedBy(const DataPartition& dp) const
99  { return Partition_ == &dp; }
100 
102  friend const bool operator<(const DataIterator& lhs, const DataIterator& rhs)
103  { return lhs.Iterator_ < rhs.Iterator_; }
104 
106  friend const bool operator>(const DataIterator& lhs, const DataIterator& rhs)
107  { return lhs.Iterator_ > rhs.Iterator_; }
108 
110  friend const bool operator==(const DataIterator& lhs, const DataIterator& rhs)
111  { return lhs.Iterator_ == rhs.Iterator_; }
112 
114  DataPoint operator[](DataIterator::difference_type n) const
115  { return *(Iterator_ + n); }
116 
119 
120 private:
121 
124 
126  DataPointVector::iterator Iterator_;
127 
128 };
129 
131 inline const DataIterator operator+(DataIterator lhs, DataIterator::difference_type n)
132 { return (lhs += n); }
133 
135 inline const DataIterator operator+(DataIterator::difference_type n, const DataIterator& rhs)
136 { return (rhs + n); }
137 
139 inline const DataIterator operator-(const DataIterator& lhs, DataIterator::difference_type n)
140 { return (lhs + (-n)); }
141 
143 inline const bool operator<=(const DataIterator& lhs, const DataIterator& rhs)
144 { return !(lhs > rhs); }
145 
147 inline const bool operator>=(const DataIterator& lhs, const DataIterator& rhs)
148 { return !(lhs < rhs); }
149 
151 inline const bool operator!=(const DataIterator& lhs, const DataIterator& rhs)
152 { return !(lhs == rhs); }
153 
159 {
160 protected:
161 
166  DataPartition(const StatusManager& sm, DataPointVector::iterator begin, DataPointVector::iterator end)
167  : StatusManager(sm), Begin_(*this, begin), End_(*this, end) {}
168 
171  DataPartition(const DataAccessorSet& sDA)
172  : StatusManager(sDA), Begin_(*this), End_(*this) {}
173 
174 public:
175 
177  virtual ~DataPartition() = default;
178 
180  DataPartition(const DataPartition&) = default;
181 
183  DataPartition(DataPartition&&) = default;
184 
186  DataPartition& operator=(const DataPartition&) = default;
187 
189  DataPartition& operator=(DataPartition&&) = default;
190 
192  virtual const DataIterator& begin() const
193  { return Begin_; }
194 
196  virtual const DataIterator& end() const
197  { return End_; }
198 
200  virtual const size_t size() const
201  { return difference(end().Iterator_, begin().Iterator_); }
202 
208  virtual const DataIterator::difference_type difference(const DataPointVector::iterator& lhs, const DataPointVector::iterator& rhs) const = 0;
209 
211  friend DataIterator;
212 
214  friend class Model;
215 
216 protected:
217 
220  virtual DataIterator& increment(DataIterator& it, DataIterator::difference_type n) const = 0;
221 
224  DataPointVector::iterator& rawIterator(DataIterator& it) const
225  { return it.Iterator_; }
226 
229  const DataPointVector::iterator& rawIterator(const DataIterator& it) const
230  { return it.Iterator_; }
231 
234  DataIterator dataIterator(DataPointVector::iterator it, const DataPartition* part) const
235  { return (part) ? DataIterator(*part, it) : DataIterator(*this, it); }
236 
238  const DataIterator& setBegin(DataPointVector::iterator it)
239  { Begin_ = DataIterator(*this, it); return Begin_; }
240 
242  const DataIterator& setEnd(DataPointVector::iterator it)
243  { End_ = DataIterator(*this, it); return End_; }
244 
246  static DataPointVector::iterator begin(DataSet& ds);
247 
249  static DataPointVector::iterator end(DataSet& ds);
250 
251 private:
252 
255 
258 
259 };
260 
266 {
267 public:
268 
274  DataPartitionWeave(const StatusManager& sm, DataPointVector::iterator begin, DataPointVector::iterator end, unsigned spacing)
275  : DataPartition(sm, begin, end), Spacing_(spacing) {}
276 
280  static DataPartitionVector create(DataSet& dataSet, unsigned n);
281 
286  virtual const DataIterator::difference_type difference(const DataPointVector::iterator& lhs, const DataPointVector::iterator& rhs) const override
287  { return DataPartition::difference(lhs, rhs) / Spacing_; }
288 
289 protected:
290 
294  DataPartitionWeave(const DataAccessorSet& sDA, unsigned spacing)
295  : DataPartition(sDA), Spacing_(spacing) {}
296 
299  virtual DataIterator& increment(DataIterator& it, DataIterator::difference_type n) const override;
300 
302  unsigned Spacing_;
303 };
304 
310 {
311 public:
312 
316  static DataPartitionVector create(DataSet& dataSet, unsigned n);
317 
321  static DataPartitionVector createBySize(DataSet& dataSet, size_t s);
322 
323 protected:
324 
329  DataPartitionBlock(const StatusManager& sm, DataPointVector::iterator begin, DataPointVector::iterator end)
330  : DataPartitionWeave(sm, begin, end, 1) {}
331 
334  DataPartitionBlock(const DataAccessorSet& sDA)
335  : DataPartitionWeave(sDA, 1) {}
336 
337 };
338 
339 }
340 
341 #endif
const bool operator<=(const DataIterator &lhs, const DataIterator &rhs)
less-than-or-equal operator
Definition: DataPartition.h:143
virtual const DataIterator::difference_type difference(const DataPointVector::iterator &lhs, const DataPointVector::iterator &rhs) const override
Definition: DataPartition.h:286
const DataIterator & setBegin(DataPointVector::iterator it)
set begin
Definition: DataPartition.h:238
static DataPartitionVector create(DataSet &dataSet, unsigned n)
Definition: DataPartition.cxx:50
virtual const DataIterator & begin() const
Definition: DataPartition.h:192
virtual const DataIterator::difference_type difference(const DataPointVector::iterator &lhs, const DataPointVector::iterator &rhs) const =0
Definition: DataPartition.cxx:43
const DataIterator & setEnd(DataPointVector::iterator it)
set end
Definition: DataPartition.h:242
DataPartitionWeave(const StatusManager &sm, DataPointVector::iterator begin, DataPointVector::iterator end, unsigned spacing)
Definition: DataPartition.h:274
DataPartition(const DataAccessorSet &sDA)
Definition: DataPartition.h:171
static DataPartitionVector create(DataSet &dataSet, unsigned n)
Definition: DataPartition.cxx:65
DataPointVector::iterator Iterator_
iterator within vector<DataPoint>
Definition: DataPartition.h:126
bool operator!=(const CachedValue::Status &S, const CalculationStatus &s)
inequality operator for checking the CalculationStatus
Definition: CachedValue.h:157
friend DataIterator
grant friend status to DataIterator to call increment
Definition: DataPartition.h:211
Partition that iterates from begin to end jumping a specified spacing every increase.
Definition: DataPartition.h:265
DataPoint & operator*()
dereference operator
Definition: DataPartition.h:86
DataPartitionWeave(const DataAccessorSet &sDA, unsigned spacing)
Definition: DataPartition.h:294
friend const DataIterator::difference_type operator-(const DataIterator &lhs, const DataIterator &rhs)
subraction operator (between DataIterators)
Definition: DataPartition.cxx:16
unsigned Spacing_
spacing between data points for the weaving
Definition: DataPartition.h:302
DataIterator & operator++()
pre-increment operator
Definition: DataPartition.h:63
Class for holding data and cached values per data point for fast calculation.
Definition: DataPoint.h:35
const DataPoint & operator*() const
dereference operator (const)
Definition: DataPartition.h:90
virtual DataIterator & increment(DataIterator &it, DataIterator::difference_type n) const =0
DataIterator(const DataPartition &p)
Definition: DataPartition.h:45
const DataIterator operator-(const DataIterator &lhs, DataIterator::difference_type n)
subraction operator
Definition: DataPartition.h:139
friend DataPartition
grant friend status to DataPartition to access Iterator_
Definition: DataPartition.h:118
friend const bool operator>(const DataIterator &lhs, const DataIterator &rhs)
greater-than operator
Definition: DataPartition.h:106
DataPoint operator->()
pointer operator
Definition: DataPartition.h:94
Class holding a set of DataPoint objects.
Definition: DataSet.h:39
virtual ~DataPartition()=default
virtual destructor (defaulted)
const bool operator>=(const DataIterator &lhs, const DataIterator &rhs)
greater-than-or-equal operator
Definition: DataPartition.h:147
DataPartition & operator=(const DataPartition &)=default
copy assignment operator (defaulted)
friend const bool operator<(const DataIterator &lhs, const DataIterator &rhs)
less-than operator
Definition: DataPartition.h:102
Class defining a partition of the DataSet.
Definition: DataPartition.h:158
Definition: StatusManager.h:32
Class implementing a PWA model.
Definition: Model.h:56
virtual DataIterator & increment(DataIterator &it, DataIterator::difference_type n) const override
Definition: DataPartition.cxx:36
DataPartitionBlock(const StatusManager &sm, DataPointVector::iterator begin, DataPointVector::iterator end)
Definition: DataPartition.h:329
DataIterator & operator+=(DataIterator::difference_type n)
addition assignment operator
Definition: DataPartition.cxx:10
DataPointVector::iterator & rawIterator(DataIterator &it) const
Definition: DataPartition.h:224
const DataPointVector::iterator & rawIterator(const DataIterator &it) const
Definition: DataPartition.h:229
DataPoint operator[](DataIterator::difference_type n) const
access operator
Definition: DataPartition.h:114
DataPartitionBlock(const DataAccessorSet &sDA)
Definition: DataPartition.h:334
Class for iterating over a DataPartition.
Definition: DataPartition.h:39
DataPartition(const StatusManager &sm, DataPointVector::iterator begin, DataPointVector::iterator end)
Definition: DataPartition.h:166
const DataPartition * Partition_
owning DataPartition
Definition: DataPartition.h:123
static DataPartitionVector createBySize(DataSet &dataSet, size_t s)
Definition: DataPartition.cxx:91
DataIterator operator++(int)
post-increment operator
Definition: DataPartition.h:67
const DataIterator operator+(DataIterator lhs, DataIterator::difference_type n)
addition operator
Definition: DataPartition.h:131
DataIterator & operator--()
pre-decrement operator
Definition: DataPartition.h:71
virtual const DataIterator & end() const
Definition: DataPartition.h:196
DataIterator dataIterator(DataPointVector::iterator it, const DataPartition *part) const
Definition: DataPartition.h:234
DataIterator(const DataPartition &p, DataPointVector::iterator it)
Definition: DataPartition.h:51
const DataIterator operator--(int)
post-decrement operator
Definition: DataPartition.h:75
bool ownedBy(const DataPartition &dp) const
check ownership
Definition: DataPartition.h:98
virtual const size_t size() const
Definition: DataPartition.h:200
DataIterator End_
end DataIterator
Definition: DataPartition.h:257
friend const bool operator==(const DataIterator &lhs, const DataIterator &rhs)
equality operator
Definition: DataPartition.h:110
DataIterator & operator-=(DataIterator::difference_type n)
subtraction assignment operator
Definition: DataPartition.h:79
A contiguous block of data.
Definition: DataPartition.h:309
DataIterator Begin_
begin DataIterator
Definition: DataPartition.h:254