politopix  4.1.0
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Generator_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) 2011-2016 : Delos Vincent
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
13 //
14 // You should have received a copy of the GNU Lesser 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 GENERATOR_Rn
22 #define GENERATOR_Rn
23 
24 #include <stdexcept>
25 #include <exception>
26 #include <vector>
27 #include <cmath>
28 #include <set>
29 #include "polito_Export.h"
30 #include "Rn.h"
31 #include "Tracking.h"
32 #include "Point_Rn.h"
33 #include "HalfSpace_Rn.h"
34 
35 
39  friend class Generator_Rn_SD;
40 
41  public:
43  Generator_Rn(unsigned int n);
44 
48  _supportFacets = gn._supportFacets;
49  }
50 
52  ~Generator_Rn();
53 
54  int dimension() const {return _coordinates.size();}
55 
56  void setCoordinate(unsigned int i, double val) {_coordinates[i] = val;}
57 
58  double getCoordinate(unsigned int i) const {return _coordinates[i];}
59 
60  vector<double>::const_iterator begin() const {return _coordinates.begin();}
61 
62  vector<double>::const_iterator end() const {return _coordinates.end();}
63 
64  const vector<double>& vect() const {return _coordinates;}
65 
66  void setCoordinates(const vector<double>& vec) {_coordinates = vec;}
67 
68  void negate() { _coordinates = -1.*_coordinates; }
69 
70  bool isEqual1(const boost::shared_ptr<Generator_Rn>& gn, unsigned int RnDIM, double TOL2) {
71  unsigned int i=0;
72  double sum=0.;
73  while (i < RnDIM) {
74  sum = sum + fabs(getCoordinate(i) - gn->getCoordinate(i));
75  if (sum > TOL2)
76  return false;
77  i++;
78  }
79  return true;
80  }
81 
82  bool isEqual2(const boost::shared_ptr<Generator_Rn>& gn, unsigned int RnDIM, double TOL2) {
83  unsigned int i=0;
84  double sum=0.;
85  while (i < RnDIM) {
86  sum = sum + fabs(getCoordinate(i) - gn->getCoordinate(i)) * fabs(getCoordinate(i) - gn->getCoordinate(i));
87  if (sum > TOL2)
88  return false;
89  i++;
90  }
91  return true;
92  }
93 
95  void clearFacets() {_supportFacets.clear();}
96 
98  void switchFacets(const std::vector< boost::shared_ptr<HalfSpace_Rn> >& tab) {
99  _supportFacets.clear();
100  _supportFacets = tab;
101  }
102 
104  void setFacet(boost::shared_ptr<HalfSpace_Rn> F) {_supportFacets.push_back(F);}
105 
107  void importFacets(const std::set< boost::shared_ptr<HalfSpace_Rn> >& setOfFacets) {
108  _supportFacets.clear();
109  std::set< boost::shared_ptr<HalfSpace_Rn> >::const_iterator it;
110  {for (it=setOfFacets.begin(); it!=setOfFacets.end(); ++it) {
111  _supportFacets.push_back(*it);
112  }}
113  }
114 
116  void exportFacets(std::set< boost::shared_ptr<HalfSpace_Rn> >& setOfFacets) const {
117  std::vector< boost::shared_ptr<HalfSpace_Rn> >::const_iterator it;
118  {for (it=_supportFacets.begin(); it!=_supportFacets.end(); ++it) {
119  setOfFacets.insert(*it);
120  }}
121  }
122 
124  void removeFacet(unsigned int i) throw (std::out_of_range,std::domain_error);
125 
128  boost::shared_ptr<HalfSpace_Rn> getFacet(unsigned int i) const throw (std::out_of_range) {
129  if (i < _supportFacets.size()) {
130  return _supportFacets[i];
131  }
132  else {
133  std::string errorMessage = Point_Rn::concatStrings(i, "Generator_Rn::getFacet");
134  throw std::out_of_range(errorMessage);
135  }
136  }
137 
139  HalfSpace_Rn* getRawFacet(unsigned int i) {return _supportFacets[i].get();}
140 
142  bool isFacetInside(boost::shared_ptr<HalfSpace_Rn> F) const;
143 
145  unsigned int numberOfFacets() const {return _supportFacets.size();}
146 
147  void makeDiff(const boost::shared_ptr<Generator_Rn>& gn1, const boost::shared_ptr<Generator_Rn>& gn2) {
148  _coordinates = gn1->_coordinates - gn2->_coordinates;
149  }
150 
151  void makeSum( const boost::shared_ptr<Generator_Rn>& gn1, const boost::shared_ptr<Generator_Rn>& gn2) {
152  _coordinates = gn1->_coordinates + gn2->_coordinates;
153  }
154 
156  const boost::shared_ptr<Generator_Rn>& gn1,
157  const boost::shared_ptr<Generator_Rn>& gn2,
158  double coef1,
159  double coef2) {
160  _coordinates = coef1*gn1->_coordinates + coef2*gn2->_coordinates;
161  }
162 
165  double getNormalDistance(const boost::shared_ptr<Generator_Rn>& gn1, double coef, unsigned int RnDIM) {
166  double sum=0.;
167  {for (unsigned int ii=0; ii<RnDIM; ++ii) {
168  sum += (gn1->_coordinates[ii] - _coordinates[ii]*coef)*(gn1->_coordinates[ii] - _coordinates[ii]*coef);
169  }}
170  //std::cout << " (sum=" << sum << ") ";
171  return sum;
172  }
173 
174  double normalize() {
175  double norm = norm_2(_coordinates);
176  _coordinates = _coordinates / norm;
177  return norm;
178  }
179 
180  double distanceFrom(const Generator_Rn& P) {
181  vector<double> distV = _coordinates;
182  distV -= P._coordinates;
183  double dist = norm_2(distV);
184  return dist;
185  }
186 
187  void dump(std::ostream &this_ostream) const {
188  this_ostream << "[";
189  //unsigned int RnDIM=Rn::getDimension();
190  {for (unsigned int ii=0; ii<_coordinates.size(); ++ii) {
191  this_ostream << getCoordinate(ii);
192  if (ii != _coordinates.size()-1)
193  this_ostream << ", ";
194  }}
195  this_ostream << "]";
196  }
197 
198  void load(std::istream &this_istream) {
199  double val;
200  for (unsigned int coord_count=0; coord_count<_coordinates.size(); coord_count++) {
201  this_istream >> val;
202  setCoordinate(coord_count, val);
203  }
204  }
205 
206  void save(std::ostream &this_ostream) const {
207  for (unsigned int coord_count=0; coord_count<_coordinates.size(); coord_count++) {
208  this_ostream << getCoordinate(coord_count) << " ";
209  }
210  //this_ostream << std::endl;
211  }
212 
213 
214  protected:
216  vector<double> _coordinates;
218  std::vector< boost::shared_ptr<HalfSpace_Rn> > _supportFacets;
219 
220 };
221 
226  friend class Generator_Rn;
227 
228  public:
229 
230  enum Status {
231  // When just made as a copy of a Generator_Rn
233  // When some half-spaces have been modified
235  // When it was created as the result of an operation
237  // When it was created as the result of an operation and then some half-spaces have been modified
239  // When it was deleted by an operation
242  };
243 
245  Generator_Rn_SD(unsigned int n, unsigned int nb, Status st):_generatorNumber(nb),_status(st) {_coordinates.resize(n);}
246 
251  }
252 
254  Generator_Rn_SD(const Generator_Rn& gn, unsigned int nb, Status st):_generatorNumber(nb),_status(st) {
256  }
257 
260 
261  int dimension() const {return _coordinates.size();}
262 
264  boost::shared_ptr<Generator_Rn> makeGenerator_Rn() const {
265  boost::shared_ptr<Generator_Rn> gn(new Generator_Rn( _coordinates.size() ));
266  gn->_coordinates = _coordinates;
267  return gn;
268  }
269 
270  void setCoordinate(unsigned int i, double val) {_coordinates[i] = val;}
271 
272  double getCoordinate(unsigned int i) const {return _coordinates[i];}
273 
274  void setGeneratorNumber(unsigned int gn) {_generatorNumber = gn;}
275 
276  unsigned int getGeneratorNumber() const {return _generatorNumber;}
277 
278  void setStatus(Status st) {_status = st;}
279 
280  Status getStatus() const {return _status;}
281 
282  vector<double>::const_iterator begin() const {return _coordinates.begin();}
283 
284  vector<double>::const_iterator end() const {return _coordinates.end();}
285 
286  const vector<double>& vect() const {return _coordinates;}
287 
289 
290  bool isEqual1(const boost::shared_ptr<Generator_Rn_SD>& gn, unsigned int RnDIM, double TOL2) {
291  unsigned int i=0;
292  double sum=0.;
293  while (i < RnDIM) {
294  sum = sum + fabs(getCoordinate(i) - gn->getCoordinate(i));
295  if (sum > TOL2)
296  return false;
297  i++;
298  }
299  return true;
300  }
301 
302  bool isEqual2(const boost::shared_ptr<Generator_Rn_SD>& gn, unsigned int RnDIM, double TOL2) {
303  unsigned int i=0;
304  double sum=0.;
305  while (i < RnDIM) {
306  sum = sum + fabs(getCoordinate(i) - gn->getCoordinate(i)) * fabs(getCoordinate(i) - gn->getCoordinate(i));
307  if (sum > TOL2)
308  return false;
309  i++;
310  }
311  return true;
312  }
313 
315  void setFacet(unsigned int F) {_supportIntFacets.push_back(F);}
316 
318  void setAllFacets(const std::vector<unsigned int>& AF) {_supportIntFacets = AF;}
319 
321  void importFacets(const std::set< unsigned int >& setOfFacets) {
322  _supportIntFacets.clear();
323  std::set< unsigned int >::const_iterator it;
324  {for (it=setOfFacets.begin(); it!=setOfFacets.end(); ++it) {
325  _supportIntFacets.push_back(*it);
326  }}
327  }
328 
330  void exportFacets(std::set< unsigned int >& setOfFacets) const {
331  std::vector< unsigned int >::const_iterator it;
332  {for (it=_supportIntFacets.begin(); it!=_supportIntFacets.end(); ++it) {
333  setOfFacets.insert(*it);
334  }}
335  }
336 
338  void removeFacet(unsigned int i) throw (std::out_of_range,std::domain_error) {
339  std::vector< unsigned int >::iterator itRemove = _supportIntFacets.begin() + i;
340  // Now, actually remove this element from the array
341  _supportIntFacets.erase(itRemove);
342  }
343 
345  unsigned int getFacet(unsigned int i) const throw (std::out_of_range) {
346  if (i < _supportIntFacets.size()) {
347  return _supportIntFacets[i];
348  }
349  else {
350  std::string errorMessage = Point_Rn::concatStrings(i, "Generator_Rn::getFacet");
351  throw std::out_of_range(errorMessage);
352  }
353  }
354 
356  unsigned int getRawFacet(unsigned int i) {return _supportIntFacets[i];}
357 
359  bool isFacetInside(unsigned int F) const {
360  std::vector< unsigned int >::const_iterator it = _supportIntFacets.begin();
361  {for (; it!=_supportIntFacets.end(); ++it) {
362  if (*it == F)
363  return true;
364  }}
365  return false;
366  }
367 
368  void orderFacets() { std::sort(_supportIntFacets.begin(), _supportIntFacets.end());}
369 
370  std::vector<unsigned int>::const_iterator facetsBegin() const {return _supportIntFacets.begin();}
371 
372  std::vector<unsigned int>::const_iterator facetsEnd() const {return _supportIntFacets.end();}
373 
375  unsigned int numberOfFacets() const {return _supportIntFacets.size();}
376 
377  void makeDiff(const boost::shared_ptr<Generator_Rn_SD>& gn1, const boost::shared_ptr<Generator_Rn_SD>& gn2) {
378  _coordinates = gn1->_coordinates - gn2->_coordinates;
379  }
380 
381  void makeSum( const boost::shared_ptr<Generator_Rn_SD>& gn1, const boost::shared_ptr<Generator_Rn_SD>& gn2) {
382  _coordinates = gn1->_coordinates + gn2->_coordinates;
383  }
384 
386  const boost::shared_ptr<Generator_Rn_SD>& gn1,
387  const boost::shared_ptr<Generator_Rn_SD>& gn2,
388  double coef1,
389  double coef2) {
390  _coordinates = coef1*gn1->_coordinates + coef2*gn2->_coordinates;
391  }
392 
395  double getNormalDistance(const boost::shared_ptr<Generator_Rn_SD>& gn1, double coef, unsigned int RnDIM) {
396  double sum=0.;
397  {for (unsigned int ii=0; ii<RnDIM; ++ii) {
398  sum += (gn1->_coordinates[ii] - _coordinates[ii]*coef)*(gn1->_coordinates[ii] - _coordinates[ii]*coef);
399  }}
400  //std::cout << " (sum=" << sum << ") ";
401  return sum;
402  }
403 
404  double normalize() {
405  double norm = norm_2(_coordinates);
406  _coordinates = _coordinates / norm;
407  return norm;
408  }
409 
410  double distanceFrom(const Generator_Rn_SD& P) {
411  vector<double> distV = _coordinates;
412  distV -= P._coordinates;
413  double dist = norm_2(distV);
414  return dist;
415  }
416 
417  void dump(std::ostream &this_ostream) const {
418  this_ostream << "[";
419  //unsigned int RnDIM=Rn::getDimension();
420  {for (unsigned int ii=0; ii<_coordinates.size(); ++ii) {
421  this_ostream << getCoordinate(ii);
422  if (ii != _coordinates.size()-1)
423  this_ostream << ", ";
424  }}
425  this_ostream << "]";
426  }
427 
428  void load(std::istream &this_istream) {
429  double val;
430  for (unsigned int coord_count=0; coord_count<_coordinates.size(); coord_count++) {
431  this_istream >> val;
432  setCoordinate(coord_count, val);
433  }
434  }
435 
436  void save(std::ostream &this_ostream) const {
437  for (unsigned int coord_count=0; coord_count<_coordinates.size(); coord_count++) {
438  this_ostream << getCoordinate(coord_count) << " ";
439  }
440  //this_ostream << std::endl;
441  }
442 
443 
444  protected:
446  vector<double> _coordinates;
448  std::vector< unsigned int > _supportIntFacets;
450  unsigned int _generatorNumber;
453 
454 };
455 
456 
457 #endif // GENERATOR_Rn
double normalize()
Definition: Generator_Rn.h:404
void makeSum(const boost::shared_ptr< Generator_Rn > &gn1, const boost::shared_ptr< Generator_Rn > &gn2)
Definition: Generator_Rn.h:151
std::vector< boost::shared_ptr< HalfSpace_Rn > > _supportFacets
Contain the list of all support facets.
Definition: Generator_Rn.h:218
std::vector< unsigned int >::const_iterator facetsEnd() const
Definition: Generator_Rn.h:372
bool isFacetInside(unsigned int F) const
Check whether the given half-space is inside the generator's list.
Definition: Generator_Rn.h:359
const vector< double > & vect() const
Definition: Generator_Rn.h:64
void setGeneratorNumber(unsigned int gn)
Definition: Generator_Rn.h:274
void negate()
Definition: Generator_Rn.h:68
void makeCoefSum(const boost::shared_ptr< Generator_Rn_SD > &gn1, const boost::shared_ptr< Generator_Rn_SD > &gn2, double coef1, double coef2)
Definition: Generator_Rn.h:385
bool isEqual1(const boost::shared_ptr< Generator_Rn_SD > &gn, unsigned int RnDIM, double TOL2)
Definition: Generator_Rn.h:290
void load(std::istream &this_istream)
Definition: Generator_Rn.h:428
boost::shared_ptr< Generator_Rn > makeGenerator_Rn() const
To make a Generator_Rn out of a Generator_Rn_SD.
Definition: Generator_Rn.h:264
unsigned int getFacet(unsigned int i) const
Return the i-th facet number.
Definition: Generator_Rn.h:345
double normalize()
Definition: Generator_Rn.h:174
void makeCoefSum(const boost::shared_ptr< Generator_Rn > &gn1, const boost::shared_ptr< Generator_Rn > &gn2, double coef1, double coef2)
Definition: Generator_Rn.h:155
bool isEqual2(const boost::shared_ptr< Generator_Rn > &gn, unsigned int RnDIM, double TOL2)
Definition: Generator_Rn.h:82
A half-space whose frontier is a linear (n-1) dimension space. _constant + _coefficients[0].x1 + ... + _coefficients[n-1].xn >= 0.
Definition: HalfSpace_Rn.h:37
unsigned int numberOfFacets() const
Return the total number of support faces.
Definition: Generator_Rn.h:375
friend class Generator_Rn
Definition: Generator_Rn.h:226
void importFacets(const std::set< boost::shared_ptr< HalfSpace_Rn > > &setOfFacets)
Insert all facets stored in the argument.
Definition: Generator_Rn.h:107
unsigned int numberOfFacets() const
Return the total number of support faces.
Definition: Generator_Rn.h:145
int dimension() const
Definition: Generator_Rn.h:54
Generator_Rn_SD(unsigned int n, unsigned int nb, Status st)
Creates a n-coordinates generator.
Definition: Generator_Rn.h:245
void setFacet(unsigned int F)
Insert a new support facet for the current generator.
Definition: Generator_Rn.h:315
void load(std::istream &this_istream)
Definition: Generator_Rn.h:198
std::vector< unsigned int > _supportIntFacets
Contain the list of all support facets.
Definition: Generator_Rn.h:448
double getCoordinate(unsigned int i) const
Definition: Generator_Rn.h:272
boost::shared_ptr< HalfSpace_Rn > getFacet(unsigned int i) const
Definition: Generator_Rn.h:128
void removeFacet(unsigned int i)
Remove the i-th facet in list.
Definition: Generator_Rn.h:338
unsigned int _generatorNumber
The SD generator embeds its own number.
Definition: Generator_Rn.h:450
void save(std::ostream &this_ostream) const
Definition: Generator_Rn.h:436
void setStatus(Status st)
Definition: Generator_Rn.h:278
vector< double >::const_iterator end() const
Definition: Generator_Rn.h:62
void setCoordinate(unsigned int i, double val)
Definition: Generator_Rn.h:56
unsigned int getGeneratorNumber() const
Definition: Generator_Rn.h:276
void importFacets(const std::set< unsigned int > &setOfFacets)
Insert all facets stored in the argument.
Definition: Generator_Rn.h:321
void save(std::ostream &this_ostream) const
Definition: Generator_Rn.h:206
vector< double >::const_iterator end() const
Definition: Generator_Rn.h:284
void setAllFacets(const std::vector< unsigned int > &AF)
Insert a new support facet for the current generator.
Definition: Generator_Rn.h:318
Status getStatus() const
Definition: Generator_Rn.h:280
void makeSum(const boost::shared_ptr< Generator_Rn_SD > &gn1, const boost::shared_ptr< Generator_Rn_SD > &gn2)
Definition: Generator_Rn.h:381
void dump(std::ostream &this_ostream) const
Definition: Generator_Rn.h:187
double getCoordinate(unsigned int i) const
Definition: Generator_Rn.h:58
void switchFacets(const std::vector< boost::shared_ptr< HalfSpace_Rn > > &tab)
Clear the list of facets.
Definition: Generator_Rn.h:98
vector< double >::const_iterator begin() const
Definition: Generator_Rn.h:282
A n-coordinates generator, which can be a vertex or an edge whether it is contained by a polytope or ...
Definition: Generator_Rn.h:38
std::vector< unsigned int >::const_iterator facetsBegin() const
Definition: Generator_Rn.h:370
void exportFacets(std::set< unsigned int > &setOfFacets) const
Store all facets in a set.
Definition: Generator_Rn.h:330
double getNormalDistance(const boost::shared_ptr< Generator_Rn_SD > &gn1, double coef, unsigned int RnDIM)
Definition: Generator_Rn.h:395
static std::string concatStrings(int i, const std::string &functionName)
Useful function to provide error message to the exception mechanism.
Definition: Point_Rn.cpp:79
~Generator_Rn_SD()
Destructor.
Definition: Generator_Rn.h:259
void setFacet(boost::shared_ptr< HalfSpace_Rn > F)
Insert a new support facet for the current generator.
Definition: Generator_Rn.h:104
void makeDiff(const boost::shared_ptr< Generator_Rn_SD > &gn1, const boost::shared_ptr< Generator_Rn_SD > &gn2)
Definition: Generator_Rn.h:377
void clearFacets()
Clear the list of facets.
Definition: Generator_Rn.h:95
const vector< double > & vect() const
Definition: Generator_Rn.h:286
#define polito_EXPORT
Definition: polito_Export.h:15
void makeDiff(const boost::shared_ptr< Generator_Rn > &gn1, const boost::shared_ptr< Generator_Rn > &gn2)
Definition: Generator_Rn.h:147
Generator_Rn(const Generator_Rn &gn)
Copy constructor.
Definition: Generator_Rn.h:46
Generator_Rn_SD(const Generator_Rn_SD &gn)
Copy constructor.
Definition: Generator_Rn.h:248
int dimension() const
Definition: Generator_Rn.h:261
double distanceFrom(const Generator_Rn &P)
Definition: Generator_Rn.h:180
A n-coordinates generator for internal data structure. It can be a vertex or an edge whether it is em...
Definition: Generator_Rn.h:225
double distanceFrom(const Generator_Rn_SD &P)
Definition: Generator_Rn.h:410
void exportFacets(std::set< boost::shared_ptr< HalfSpace_Rn > > &setOfFacets) const
Store all facets in a set.
Definition: Generator_Rn.h:116
vector< double > _coordinates
The set of coordinates.
Definition: Generator_Rn.h:446
Status _status
The SD generator embeds its status to trace the operations.
Definition: Generator_Rn.h:452
double getNormalDistance(const boost::shared_ptr< Generator_Rn > &gn1, double coef, unsigned int RnDIM)
Definition: Generator_Rn.h:165
vector< double >::const_iterator begin() const
Definition: Generator_Rn.h:60
bool isEqual1(const boost::shared_ptr< Generator_Rn > &gn, unsigned int RnDIM, double TOL2)
Definition: Generator_Rn.h:70
vector< double > _coordinates
The set of coordinates.
Definition: Generator_Rn.h:216
void setCoordinates(const vector< double > &vec)
Definition: Generator_Rn.h:66
void dump(std::ostream &this_ostream) const
Definition: Generator_Rn.h:417
unsigned int getRawFacet(unsigned int i)
Return the i-th facet. No check is performed!
Definition: Generator_Rn.h:356
HalfSpace_Rn * getRawFacet(unsigned int i)
Return the i-th facet as a pointer for very fast comparisons. No check is performed! ...
Definition: Generator_Rn.h:139
Generator_Rn_SD(const Generator_Rn &gn, unsigned int nb, Status st)
Constructor with a Generator_Rn.
Definition: Generator_Rn.h:254
void setCoordinate(unsigned int i, double val)
Definition: Generator_Rn.h:270
bool isEqual2(const boost::shared_ptr< Generator_Rn_SD > &gn, unsigned int RnDIM, double TOL2)
Definition: Generator_Rn.h:302