33 for (iteHSB.
begin(); iteHSB.
end()!=
true; iteHSB.
next()) {
34 double halfSpaceNorm =
35 std::inner_product(iteHSB.
current()->begin(), iteHSB.
current()->end(), iteHSB.
current()->begin(), 0.);
36 halfSpaceNorm = sqrt(halfSpaceNorm);
37 double scalarProduct =
38 std::inner_product(thisPoint.
begin(), thisPoint.
end(), iteHSB.
current()->begin(), 0.);
39 double distanceToHyperplane = (scalarProduct+iteHSB.
current()->getConstant()) / halfSpaceNorm;
49 const boost::shared_ptr<Generator_Rn>& point,
50 const boost::shared_ptr<HalfSpace_Rn>& halfSpace,
51 double halfSpaceNorm)
const {
53 throw std::invalid_argument(std::string(
"Invalid point in PolyhedralCone_Rn::checkPoint()"));
55 throw std::invalid_argument(std::string(
"Invalid half space in PolyhedralCone_Rn::checkPoint()"));
57 double scalarProduct =
58 std::inner_product(point->begin(), point->end(), halfSpace->begin(), 0.);
59 double distanceToHyperplane = (scalarProduct+halfSpace->getConstant()) / halfSpaceNorm;
77 {
for (iteGN1.
begin(); iteGN1.
end()!=
true; iteGN1.
next()) {
80 {
for (iteGN2.
begin(); iteGN2.
end()!=
true; iteGN2.
next()) {
84 {
for (
unsigned int j=0; j<RnDIM; j++) {
85 double distj = fabs(iteGN1.
current()->getCoordinate(j)-iteGN2.
current()->getCoordinate(j));
90 dist = dist + distj*distj;
92 if (dist<TOL && goNext==
false) {
96 std::cout <<
"@ same vertices (a=" << a <<
", b=" << b <<
")" << std::endl;
97 std::cout <<
"### V" << a <<
" = (";
98 {
for (
unsigned int ii=0; ii<RnDIM; ii++) {
99 std::cout << iteGN1.
current()->getCoordinate(ii);
103 std::cout <<
")" << std::endl <<
"{ ";
104 {
for (
unsigned int ii=0; ii<iteGN1.
current()->numberOfFacets(); ii++) {
106 {
for (
unsigned int jj=0; jj<RnDIM; jj++) {
107 std::cout << iteGN1.
current()->getFacet(ii)->getCoefficient(jj) <<
" ";
109 std::cout << iteGN1.
current()->getFacet(ii)->getSideAsText() <<
" " << -iteGN1.
current()->getFacet(ii)->getConstant();
113 std::cout <<
"}" << std::endl;
114 std::cout <<
"### V" << b <<
" = (";
115 {
for (
unsigned int ii=0; ii<RnDIM; ii++) {
116 std::cout << iteGN2.
current()->getCoordinate(ii);
120 std::cout <<
")" << std::endl <<
"{ ";
121 {
for (
unsigned int ii=0; ii<iteGN2.
current()->numberOfFacets(); ii++) {
123 {
for (
unsigned int jj=0; jj<RnDIM; jj++) {
124 std::cout << iteGN2.
current()->getFacet(ii)->getCoefficient(jj) <<
" ";
126 std::cout << iteGN2.
current()->getFacet(ii)->getSideAsText() <<
" " << -iteGN2.
current()->getFacet(ii)->getConstant();
130 std::cout <<
"}" << std::endl;
139 if (check ==
false) {
165 throw std::out_of_range(errorMessage);
171 throw std::invalid_argument(std::string(
"Invalid generator G in PolyhedralCone_Rn::removeHalfSpaceFromListAndGenerators()"));
180 for (
unsigned int j=0; j<iteGN.
current()->numberOfFacets(); ++j) {
181 if (iteGN.
current()->getFacet(j) == hs) {
182 iteGN.
current()->removeFacet(j);
196 throw std::out_of_range(errorMessage);
202 throw std::invalid_argument(std::string(
"Invalid generator G in PolyhedralCone_Rn::getGeneratorNumber(G)"));
204 throw std::out_of_range(std::string(
"Non allocated array of generators in PolyhedralCone_Rn::getGeneratorNumber(G)"));
211 if (iteGN.
end()==
true) {
212 std::ostringstream stream_;
213 stream_ <<
"Generator G ";
215 stream_ <<
" is not stored in array in PolyhedralCone_Rn::getGeneratorNumber(G)";
216 std::string valString = stream_.str();
217 throw std::out_of_range(valString);
228 this_ostream << std::endl <<
"#POLYTOPE" << std::endl;
232 this_ostream << std::endl;
237 this_ostream << iteHS.
current()->getConstant() <<
"\t";
238 {
for (
unsigned int j=0; j<
dimension(); j++) {
239 this_ostream << iteHS.
current()->getCoefficient(j) <<
"\t";
241 this_ostream << iteHS.
current()->getSideAsText() <<
"\t0." << std::endl;
243 this_ostream << std::endl;
249 {
for (
unsigned int j=0; j<
dimension(); j++) {
250 this_ostream << iteGN.
current()->getCoordinate(j) <<
"\t";
252 this_ostream << std::endl;
254 this_ostream << std::endl;
262 boost::shared_ptr<HalfSpace_Rn> F = iteGN.
current()->getFacet(j);
263 this_ostream << F <<
" " << std::endl;
273 this_ostream << std::endl;
275 this_ostream << std::endl;
282 unsigned int currentDimension =
dimension();
283 this_ostream << std::endl <<
"#" << std::endl;
284 this_ostream << currentDimension <<
" ";
287 this_ostream << std::endl;
289 {
for (
unsigned int i=0; i<currentDimension; ++i) {
291 this_ostream <<
"x" << i+1 <<
" = [ ";
294 this_ostream << iteGN.
current()->getCoordinate(i) <<
" ";
296 this_ostream <<
"]" << std::endl;
299 this_ostream << std::endl;
305 boost::shared_ptr<PolyhedralCone_Rn> dualCone;
309 std::vector< boost::shared_ptr<HalfSpace_Rn> > HSvect;
314 boost::shared_ptr<HalfSpace_Rn> HS;
318 for (
unsigned int coord_count=0; coord_count<
dimension(); coord_count++) {
319 HS->setCoefficient(coord_count,
getGenerator(i)->getCoordinate(coord_count));
321 dualCone->addHalfSpace(HS);
322 HSvect.push_back(HS);
328 boost::shared_ptr<Generator_Rn> VX;
330 for (iteHSA.
begin(); iteHSA.
end()!=
true; iteHSA.
next()) {
332 for (
unsigned int coord_count=0; coord_count<
dimension(); coord_count++) {
333 VX->setCoordinate(coord_count, iteHSA.
current()->getCoefficient(coord_count));
335 dualCone->addGenerator(VX);
343 for (iteHSA.
begin(); iteHSA.
end()!=
true; iteHSA.
next()) {
349 for (
unsigned int j=0; j<iteGN.
current()->numberOfFacets(); j++) {
350 boost::shared_ptr<HalfSpace_Rn> Fj = iteGN.
current()->getFacet(j);
362 const boost::shared_ptr<Generator_Rn_SD>& currentGeneratorOut,
363 const boost::shared_ptr<Generator_Rn_SD>& currentGeneratorIn,
364 boost::shared_ptr<Generator_Rn_SD> newV,
double ay,
double az,
double)
const {
373 double coef1 = az/(az-ay);
374 double coef2 =-ay/(az-ay);
375 newV->makeCoefSum(currentGeneratorOut, currentGeneratorIn, coef1, coef2);
398 {
for (iteHS_B.
begin(); iteHS_B.
end()!=
true; iteHS_B.
next()) {
399 double halfSpaceNorm = std::inner_product(iteHS_B.
current()->begin(), iteHS_B.
current()->end(), iteHS_B.
current()->begin(), 0.);
400 halfSpaceNorm = sqrt(halfSpaceNorm);
402 {
for (iteGN_A.
begin(); iteGN_A.
end()!=
true; iteGN_A.
next()) {
415 boost::numeric::ublas::vector<double> averagePoint(
dimension());
416 for (
unsigned i=0; i<averagePoint.size(); ++i)
417 averagePoint(i) = 0.;
418 bool isVeryClose =
true;
419 {
for (
unsigned int j=0; j<iteGN.
current()->numberOfFacets(); j++) {
420 boost::shared_ptr<HalfSpace_Rn> HS = iteGN.
current()->getFacet(j);
421 boost::numeric::ublas::vector<double> projectedPoint;
422 double halfSpaceNorm = norm_2(HS->vect());
424 double disPoint2Hyp = HS->computeDistancePointHyperplane(iteGN.
current()->vect(), projectedPoint, halfSpaceNorm);
426 if (disPoint2Hyp > 0.25*TOL || disPoint2Hyp < -0.25*TOL)
428 averagePoint += projectedPoint;
430 if (isVeryClose ==
false) {
431 averagePoint /= iteGN.
current()->numberOfFacets();
432 iteGN.
current()->setCoordinates(averagePoint);
439 std::cout <<
"Check generators of A inside the half-spaces of B ..... ";
441 std::cout <<
"Check generators of B inside the half-spaces of A ..... ";
443 if (getFaceMapping && res1 && res2) {
472 std::vector<int> VbVa(B->_listOfGenerators.size());
473 std::cout <<
"Mapping Va <-> Vb" << std::endl;
476 {
for (iteGN_A_.
begin(); iteGN_A_.
end()!=
true; iteGN_A_.
next()) {
479 {
for (iteGN_B_.
begin(); iteGN_B_.
end()!=
true && eq==
false; iteGN_B_.
next()) {
480 double dist = iteGN_B_.
current()->distanceFrom(*iteGN_A_.
current());
490 std::cout <<
"Mapping Fa <=> Fb" << std::endl;
491 std::vector< std::vector<int> > FacetsOfB_WithGeneratorOfB(B->_listOfHalfSpaces.size());
493 {
for (iteHS_B.
begin(); iteHS_B.
end()!=
true; iteHS_B.
next()) {
494 double halfSpaceNorm =
495 std::inner_product(iteHS_B.
current()->begin(), iteHS_B.
current()->end(), iteHS_B.
current()->begin(), 0.);
496 halfSpaceNorm = sqrt(halfSpaceNorm);
498 {
for (iteGN_B_.
begin(); iteGN_B_.
end()!=
true; iteGN_B_.
next()) {
506 {
for (iteHS_A.
begin(); iteHS_A.
end()!=
true; iteHS_A.
next()) {
507 double halfSpaceNorm =
508 std::inner_product(iteHS_A.
current()->begin(), iteHS_A.
current()->end(), iteHS_A.
current()->begin(), 0.);
509 halfSpaceNorm = sqrt(halfSpaceNorm);
511 {
for (iteGN_B_.
begin(); iteGN_B_.
end()!=
true; iteGN_B_.
next()) {
518 std::vector< std::vector<int> >::iterator itV = FacetsOfB_WithGeneratorOfB.begin();
519 {
for (; itV!=FacetsOfB_WithGeneratorOfB.end(); ++itV) {
520 std::sort(itV->begin(), itV->end());
522 itV = FacetsOfA_WithGeneratorOfB.begin();
523 {
for (; itV!=FacetsOfA_WithGeneratorOfB.end(); ++itV) {
524 std::sort(itV->begin(), itV->end());
539 {
for (std::vector< std::vector<int> >::const_iterator iteFacetA = FacetsOfA_WithGeneratorOfB.begin();
540 iteFacetA != FacetsOfA_WithGeneratorOfB.end(); ++iteFacetA) {
541 const std::vector<int>& currentGeneratorsOfB = *iteFacetA;
542 std::vector<int> equivalentGeneratorsOfA(currentGeneratorsOfB.size());
544 {
for (
unsigned int i=0; i<currentGeneratorsOfB.size(); ++i) {
545 equivalentGeneratorsOfA[i] = VbVa[currentGeneratorsOfB[i]];
547 std::sort(equivalentGeneratorsOfA.begin(), equivalentGeneratorsOfA.end());
549 std::vector< std::vector<int> >::const_iterator iteFacetB =
550 std::find(FacetsOfB_WithGeneratorOfB.begin(), FacetsOfB_WithGeneratorOfB.end(), currentGeneratorsOfB);
551 int d1 = iteFacetA - FacetsOfA_WithGeneratorOfB.begin();
552 int d2 = iteFacetB - FacetsOfB_WithGeneratorOfB.begin();
553 std::cout << d1 <<
" <=> " << d2 << std::endl;
556 return (res1 || res2);