politopix  5.0.0
GeometricObjectIterator_Rn.h
Go to the documentation of this file.
1 // politopix allows to make computations on polytopes such as finding vertices, intersecting, Minkowski sums, ...
2 // Copyright (C) 2012-2015 : Delos Vincent
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
16 //
19 // I2M (UMR CNRS 5295 / University of Bordeaux)
20 
21 #ifndef GEOMETRIC_OBJECT_ITERATOR_Rn
22 #define GEOMETRIC_OBJECT_ITERATOR_Rn
23 
24 #include <boost/numeric/ublas/io.hpp>
25 #include <boost/shared_ptr.hpp>
26 #include <stdexcept>
27 #include <exception>
28 #include <vector>
29 #include <stack>
30 #include <set>
31 #include "Generator_Rn.h"
32 #include "HalfSpace_Rn.h"
33 #include "Rn.h"
34 
35 using namespace boost::numeric::ublas;
36 
37 
40 template< class GEOMETRIC_OBJECT > class listOfGeometricObjects {
41 
42  public:
45 
47  void push_back(const GEOMETRIC_OBJECT& gn) {_GO.push_back(gn);}
48 
50  const GEOMETRIC_OBJECT& operator [](unsigned int i) const {return _GO[i];}
51 
54  {_GO.clear(); _GO = listOfGN._GO;}
55 
58  {_GO.clear(); _GO = listOfGN._GO;}
59 
61  bool empty() const {return _GO.empty();}
62 
64  unsigned int size() const {return _GO.size();}
65 
67  void clear() {_GO.clear();}
68 
70  void negate() {
71  for (typename std::vector< GEOMETRIC_OBJECT >::iterator it=_GO.begin(); it!=_GO.end(); ++it)
72  (*it)->negate();
73  }
74 
76  unsigned int find(const GEOMETRIC_OBJECT& GO) const {
77  unsigned int index=0;
78  typename std::vector< GEOMETRIC_OBJECT >::const_iterator it;
79  for (it=_GO.begin(); it!=_GO.end() && *it!=GO; ++it)
80  index++;
81  if (it == _GO.end()) {
82  std::ostringstream stream_;
83  stream_ << "listOfGeometricObjects::find() The current object is not stored in array";
84  std::string valString = stream_.str();
85  throw std::out_of_range(valString);
86  }
87  return index;
88  }
89 
91  void removeGeometricObjects(const std::set< GEOMETRIC_OBJECT >& setToRemove) {
92  for (typename std::vector< GEOMETRIC_OBJECT >::iterator it=_GO.begin(); it!=_GO.end(); ) {
93  if (setToRemove.find(*it) != setToRemove.end())
94  it = _GO.erase(it);
95  else
96  ++it;
97  }
98  }
99 
101  void removeGeometricObject(unsigned int j) {_GO.erase(_GO.begin()+j);}
102 
104  static bool inferior(const GEOMETRIC_OBJECT& HS1, const GEOMETRIC_OBJECT& HS2) {
105  unsigned int i=0;
106  unsigned int n=HS1->dimension();
107  do {
108  if (HS1->getCoefficient(i) < HS2->getCoefficient(i))
109  return true;
110  else if (HS1->getCoefficient(i) > HS2->getCoefficient(i))
111  return false;
112  else
113  i++;
114  } while (i < n);
115  return true;
116  }
117 
119  static bool superior(const GEOMETRIC_OBJECT& HS1, const GEOMETRIC_OBJECT& HS2) {
120  return !inferior(HS1, HS2);
121  }
122 
123  void lexminSort(unsigned int step) {
124  typename std::vector< GEOMETRIC_OBJECT >::iterator it = _GO.begin();
125  std::advance(it, step);
126  std::sort( it, _GO.end(), &inferior );
127  }
128 
129  void lexmaxSort(unsigned int step) {
130  typename std::vector< GEOMETRIC_OBJECT >::iterator it = _GO.begin();
131  std::advance(it, step);
132  std::sort( it, _GO.end(), &superior );
133  }
134 
135  protected:
137  std::vector< GEOMETRIC_OBJECT > _GO;
138 };
139 
140 
142 template< class GEOMETRIC_OBJECT > class constIteratorOfListOfGeometricObjects {
143 
144  public:
147  {_iterator=0;_step=0;}
148 
150  void begin() {_iterator=_step;}
151 
153  void next() {_iterator++;}
154 
156  void setStep(unsigned int n) {_step=n; advance(n);}
157 
159  unsigned int size() const {return _list.size();}
160 
162  void advance(unsigned int n) {
163  if (n > _list.size()) return;
164  _iterator = _iterator+n;
165  //while (_iterator < _list._fullSize && counter < n) {
166  //_iterator++;
167  //if (_list._activeFacets[_iterator] == true) {
168  //counter++;
169  //}
170  //}
171  }
172 
174  bool end() const {return (_iterator==_list.size());}
175 
177  const GEOMETRIC_OBJECT current() {
179  if (_iterator < _list.size())
180  return _list[_iterator];
181  else
182  return GEOMETRIC_OBJECT();
183  }
184 
185  void swapElements(unsigned int ind1, unsigned int ind2) {
186  GEOMETRIC_OBJECT el1 = _list[ind1];
187  _list[ind1] = _list[ind2];
188  _list[ind2] = el1;
189  }
190 
192  int currentIteratorNumber() const {return _iterator;}
193 
194  protected:
196  unsigned int _iterator;
200  unsigned int _step;
201 };
202 
204 template< class GEOMETRIC_OBJECT > class lexIteratorOfListOfGeometricObjects {
205 
206  public:
209  _iterator(0),_list(l),_alreadySorted(false),_step(0)
210  {}
211 
213  void begin() {_iterator=_step;}
214 
216  void next() {_iterator++;}
217 
219  void setStep(unsigned int n) {_step=n;}
220 
222  bool end() const {return (_iterator==_list.size());}
223 
225  const GEOMETRIC_OBJECT current() {
226  if (_iterator < _list.size())
227  return _list[_iterator];
228  else
229  return GEOMETRIC_OBJECT();
230  }
231 
233  int currentIteratorNumber() const {return _iterator;}
234 
235  protected:
237  unsigned int _iterator;
243  unsigned int _step;
244 
245 };
246 
248 template< class GEOMETRIC_OBJECT > class lexminIteratorOfListOfGeometricObjects :
249  public lexIteratorOfListOfGeometricObjects< GEOMETRIC_OBJECT > {
250 
251  public:
254  lexIteratorOfListOfGeometricObjects< GEOMETRIC_OBJECT >(l) {}
255 
257  void setStep(unsigned int n) {
258  this->_step = n;
259  this->_iterator = 0;
260  if (this->_alreadySorted == false) {
261  this->_list.lexminSort(this->_step);
262  this->_alreadySorted = true;
263  }
264  this->_iterator = this->_step;
265  }
266 
268  void begin() {this->_iterator = this->_step;}
269 
270 };
271 
273 template< class GEOMETRIC_OBJECT > class lexmaxIteratorOfListOfGeometricObjects :
274  public lexIteratorOfListOfGeometricObjects< GEOMETRIC_OBJECT > {
275 
276  public:
279  lexIteratorOfListOfGeometricObjects< GEOMETRIC_OBJECT >(l) {}
280 
282  void setStep(unsigned int n) {
283  this->_step = n;
284  this->_iterator = 0;
285  if (this->_alreadySorted == false) {
286  this->_list.lexmaxSort(this->_step);
287  this->_alreadySorted = true;
288  }
289  this->_iterator = this->_step;
290  }
291 
293  void begin() {this->_iterator = this->_step;}
294 
295 };
296 
297 
298 #endif // GEOMETRIC_OBJECT_ITERATOR_Rn
lexminIteratorOfListOfGeometricObjects::setStep
void setStep(unsigned int n)
Step forward in the list geometric elements.
Definition: GeometricObjectIterator_Rn.h:257
constIteratorOfListOfGeometricObjects::constIteratorOfListOfGeometricObjects
constIteratorOfListOfGeometricObjects(const listOfGeometricObjects< GEOMETRIC_OBJECT > &l)
Constructor.
Definition: GeometricObjectIterator_Rn.h:146
constIteratorOfListOfGeometricObjects::setStep
void setStep(unsigned int n)
Step forward in the list geometric elements.
Definition: GeometricObjectIterator_Rn.h:156
lexIteratorOfListOfGeometricObjects::_step
unsigned int _step
Sort after a step.
Definition: GeometricObjectIterator_Rn.h:243
listOfGeometricObjects::push_back
void push_back(const GEOMETRIC_OBJECT &gn)
Include a new half space in the list.
Definition: GeometricObjectIterator_Rn.h:47
lexminIteratorOfListOfGeometricObjects
Insert the half-spaces in the list in lexicographically increasing order.
Definition: GeometricObjectIterator_Rn.h:248
listOfGeometricObjects::superior
static bool superior(const GEOMETRIC_OBJECT &HS1, const GEOMETRIC_OBJECT &HS2)
The opposite of the function inferior(HS1, HS2)
Definition: GeometricObjectIterator_Rn.h:119
lexIteratorOfListOfGeometricObjects::end
bool end() const
Tell whether we have reached the end of the list.
Definition: GeometricObjectIterator_Rn.h:222
lexmaxIteratorOfListOfGeometricObjects::setStep
void setStep(unsigned int n)
Move the iterator at the beginning of the list.
Definition: GeometricObjectIterator_Rn.h:282
listOfGeometricObjects::clear
void clear()
Clear the whole list.
Definition: GeometricObjectIterator_Rn.h:67
lexIteratorOfListOfGeometricObjects::begin
void begin()
Move the iterator at the beginning of the list.
Definition: GeometricObjectIterator_Rn.h:213
lexIteratorOfListOfGeometricObjects::_list
listOfGeometricObjects< GEOMETRIC_OBJECT > & _list
The actual list of geometric elements.
Definition: GeometricObjectIterator_Rn.h:239
constIteratorOfListOfGeometricObjects::swapElements
void swapElements(unsigned int ind1, unsigned int ind2)
Definition: GeometricObjectIterator_Rn.h:185
lexmaxIteratorOfListOfGeometricObjects
Insert the half-spaces in the list in lexicographically decreasing order.
Definition: GeometricObjectIterator_Rn.h:273
lexIteratorOfListOfGeometricObjects::current
const GEOMETRIC_OBJECT current()
Return the current geometric element.
Definition: GeometricObjectIterator_Rn.h:225
listOfGeometricObjects
This class is designed to contain the list of all generators or half-spaces representing a polytope o...
Definition: GeometricObjectIterator_Rn.h:40
constIteratorOfListOfGeometricObjects::current
const GEOMETRIC_OBJECT current()
Return the current geometric element.
Definition: GeometricObjectIterator_Rn.h:177
constIteratorOfListOfGeometricObjects::currentIteratorNumber
int currentIteratorNumber() const
Return the current position in the list.
Definition: GeometricObjectIterator_Rn.h:192
listOfGeometricObjects::lexminSort
void lexminSort(unsigned int step)
Definition: GeometricObjectIterator_Rn.h:123
listOfGeometricObjects::listOfGeometricObjects
listOfGeometricObjects()
Constructor.
Definition: GeometricObjectIterator_Rn.h:44
lexIteratorOfListOfGeometricObjects::next
void next()
Move the iterator one step forward.
Definition: GeometricObjectIterator_Rn.h:216
lexmaxIteratorOfListOfGeometricObjects::lexmaxIteratorOfListOfGeometricObjects
lexmaxIteratorOfListOfGeometricObjects(listOfGeometricObjects< GEOMETRIC_OBJECT > &l)
Constructor.
Definition: GeometricObjectIterator_Rn.h:278
constIteratorOfListOfGeometricObjects::end
bool end() const
Tell whether we have reached the end of the list.
Definition: GeometricObjectIterator_Rn.h:174
lexminIteratorOfListOfGeometricObjects::lexminIteratorOfListOfGeometricObjects
lexminIteratorOfListOfGeometricObjects(listOfGeometricObjects< GEOMETRIC_OBJECT > &l)
Constructor.
Definition: GeometricObjectIterator_Rn.h:253
Rn.h
listOfGeometricObjects::_GO
std::vector< GEOMETRIC_OBJECT > _GO
The full list of half spaces or generators for example.
Definition: GeometricObjectIterator_Rn.h:137
listOfGeometricObjects::empty
bool empty() const
Check whether the set is empty or not.
Definition: GeometricObjectIterator_Rn.h:61
listOfGeometricObjects::assign
void assign(const listOfGeometricObjects< GEOMETRIC_OBJECT > &listOfGN)
Copies all elements from listOfGN to _GN.
Definition: GeometricObjectIterator_Rn.h:57
listOfGeometricObjects::operator=
void operator=(const listOfGeometricObjects< GEOMETRIC_OBJECT > &listOfGN)
Copies all elements from listOfGN to _GN.
Definition: GeometricObjectIterator_Rn.h:53
Generator_Rn.h
constIteratorOfListOfGeometricObjects
This class is designed to run the list of all geometric objects representing a polytope.
Definition: GeometricObjectIterator_Rn.h:142
constIteratorOfListOfGeometricObjects::_iterator
unsigned int _iterator
The current position in the list.
Definition: GeometricObjectIterator_Rn.h:196
lexIteratorOfListOfGeometricObjects::_alreadySorted
bool _alreadySorted
Not to do the same job twice.
Definition: GeometricObjectIterator_Rn.h:241
constIteratorOfListOfGeometricObjects::_list
const listOfGeometricObjects< GEOMETRIC_OBJECT > & _list
The actual list of geometric elements.
Definition: GeometricObjectIterator_Rn.h:198
constIteratorOfListOfGeometricObjects::_step
unsigned int _step
To perform a step.
Definition: GeometricObjectIterator_Rn.h:200
constIteratorOfListOfGeometricObjects::begin
void begin()
Move the iterator at the beginning of the list.
Definition: GeometricObjectIterator_Rn.h:150
constIteratorOfListOfGeometricObjects::advance
void advance(unsigned int n)
Step forward in the list geometric elements.
Definition: GeometricObjectIterator_Rn.h:162
listOfGeometricObjects::negate
void negate()
Multiply all generators or half-spaces by -1.
Definition: GeometricObjectIterator_Rn.h:70
listOfGeometricObjects::find
unsigned int find(const GEOMETRIC_OBJECT &GO) const
Find a given object in list..
Definition: GeometricObjectIterator_Rn.h:76
listOfGeometricObjects::size
unsigned int size() const
Get the total number of stored elements.
Definition: GeometricObjectIterator_Rn.h:64
listOfGeometricObjects::lexmaxSort
void lexmaxSort(unsigned int step)
Definition: GeometricObjectIterator_Rn.h:129
lexmaxIteratorOfListOfGeometricObjects::begin
void begin()
Move the iterator at the beginning of the list.
Definition: GeometricObjectIterator_Rn.h:293
lexIteratorOfListOfGeometricObjects
Insert the half-spaces in the list in a lexicographically order, whether min or max.
Definition: GeometricObjectIterator_Rn.h:204
lexminIteratorOfListOfGeometricObjects::begin
void begin()
Move the iterator at the beginning of the list.
Definition: GeometricObjectIterator_Rn.h:268
constIteratorOfListOfGeometricObjects::size
unsigned int size() const
Get the total number of stored elements.
Definition: GeometricObjectIterator_Rn.h:159
lexIteratorOfListOfGeometricObjects::_iterator
unsigned int _iterator
The current position in the list.
Definition: GeometricObjectIterator_Rn.h:237
constIteratorOfListOfGeometricObjects::next
void next()
Move the iterator one step forward.
Definition: GeometricObjectIterator_Rn.h:153
listOfGeometricObjects::removeGeometricObjects
void removeGeometricObjects(const std::set< GEOMETRIC_OBJECT > &setToRemove)
Get rid of all the objects stored in the set.
Definition: GeometricObjectIterator_Rn.h:91
lexIteratorOfListOfGeometricObjects::setStep
void setStep(unsigned int n)
Step forward in the list geometric elements.
Definition: GeometricObjectIterator_Rn.h:219
listOfGeometricObjects::inferior
static bool inferior(const GEOMETRIC_OBJECT &HS1, const GEOMETRIC_OBJECT &HS2)
Tell whether a given object is declared inferior to another one.
Definition: GeometricObjectIterator_Rn.h:104
listOfGeometricObjects::removeGeometricObject
void removeGeometricObject(unsigned int j)
Remove the geometric object number j from the list.
Definition: GeometricObjectIterator_Rn.h:101
lexIteratorOfListOfGeometricObjects::currentIteratorNumber
int currentIteratorNumber() const
Return the current position in the list.
Definition: GeometricObjectIterator_Rn.h:233
HalfSpace_Rn.h
lexIteratorOfListOfGeometricObjects::lexIteratorOfListOfGeometricObjects
lexIteratorOfListOfGeometricObjects(listOfGeometricObjects< GEOMETRIC_OBJECT > &l)
Constructor.
Definition: GeometricObjectIterator_Rn.h:208