35 #include <boost/math/common_factor_rt.hpp>
46 template <
typename TIterator,
typename TInteger,
int connectivity>
64 template <
typename TIterator,
typename TInteger,
int connectivity>
71 template <
typename TIterator,
typename TInteger,
int connectivity>
95 template <
typename TIterator,
typename TInteger,
int connectivity>
99 myA(other.myA), myB(other.myB), myMu(other.myMu), myOmega(other.myOmega),
100 myNbUpPat(other.myNbUpPat),myNbLowPat(other.myNbLowPat),
101 myUf(other.myUf), myUl(other.myUl), myLf(other.myLf), myLl(other.myLl),
102 myF(other.myF), myL(other.myL) {
108 template <
typename TIterator,
typename TInteger,
int connectivity>
114 if (
this != &other )
134 template <
typename TIterator,
typename TInteger,
int connectivity>
142 template <
typename TIterator,
typename TInteger,
int connectivity>
152 template <
typename TIterator,
typename TInteger,
int connectivity>
157 return ( ( (myOmega == other.
myOmega) &&
158 (myUf == other.
myUf) &&
159 (myUl == other.
myUl) &&
160 (myLf == other.
myLf) &&
161 (myLl == other.
myLl) &&
162 (*myF == *other.
myF) &&
163 (*myL == *other.
myL) ) ||
164 ( (myOmega == other.
myOmega) &&
165 (myUf == other.
myLl) &&
166 (myUl == other.
myLf) &&
167 (myLf == other.
myUl) &&
168 (myLl == other.
myUf) &&
169 (*myF == *other.
myL) &&
170 (*myL == *other.
myF) ) );
173 template <
typename TIterator,
typename TInteger,
int connectivity>
178 return (!(*
this == other));
182 template <
typename TIterator,
typename TInteger,
int connectivity>
193 Point lastPoint(*it);
196 ::norm(lastMove[0],lastMove[1]);
207 else if (mySteps.size()<2) {
211 if (mySteps.size()==0) {
213 mySteps.push_back(lastMove);
221 myMu = getRemainder(myUl);
230 if (lastMove == mySteps.at(0)) {
244 Vector diff = ( lastMove-mySteps.at(0) );
251 Integer r = getRemainder(lastPoint);
255 myA = myNbUpPat*mySteps.at(0)[1] + lastMove[1];
256 myB = myNbUpPat*mySteps.at(0)[0] + lastMove[0];
262 myA = myNbUpPat*mySteps.at(0)[1] + lastMove[1];
263 myB = myNbUpPat*mySteps.at(0)[0] + lastMove[0];
267 myMu = getRemainder(myUl);
270 mySteps.push_back(lastMove);
286 if (hasLessThanTwoSteps(lastMove)) {
289 Integer r = getRemainder(lastPoint);
291 if ( (r < myMu-1)||(r > myMu+myOmega) )
302 if (r == myMu+myOmega-1) {
310 myA = myUl[1] - myUf[1];
311 myB = myUl[0] - myUf[0];
312 myMu = getRemainder(myUl);
316 }
else if (r == myMu+myOmega) {
319 myA = myLl[1] - myLf[1];
320 myB = myLl[0] - myLf[0];
321 myMu = getRemainder(myUl);
341 template <
typename TIterator,
typename TInteger,
int connectivity>
347 return extendForward(it, myL, (
Point(*it) -
Point(*myL)), myUf, myUl, myLf, myLl);
353 template <
typename TIterator,
typename TInteger,
int connectivity>
359 return extendForward(it, myF, (
Point(*myF) -
Point(*it)), myUl, myUf, myLl, myLf);
365 template <
typename TIterator,
typename TInteger,
int connectivity>
372 return extendForward(it, myL, (
Point(*it) -
Point(*myL)), myUf, myUl, myLf, myLl);
377 template <
typename TIterator,
typename TInteger,
int connectivity>
384 return extendForward(it, myF, (
Point(*myF) -
Point(*it)), myUl, myUf, myLl, myLf);
390 template <
typename TIterator,
typename TInteger,
int connectivity>
424 Point ptToRemove = *firstIt;
428 if (ptToRemove == Uf) {
433 Vector newMainVector = ( Lf - ( Uf + vectorFrom0ToOmega() ) )*s;
434 myA = newMainVector[1];
435 myB = newMainVector[0];
441 Uf = Ul - newMainVector*k*s;
446 Ll = Lf + newMainVector*k*s;
449 myMu = getRemainder(myUl);
452 Uf = Uf +
Vector(myB,myA)*s;
458 if (ptToRemove == Lf) {
463 Vector newMainVector = ( Uf - (Lf - vectorFrom0ToOmega() ) )*s;
464 myA = newMainVector[1];
465 myB = newMainVector[0];
471 Lf = Ll - newMainVector*k*s;
473 Vector toLastIt = Point(*lastIt) - Uf;
476 Ul = Uf + newMainVector*k*s;
479 myMu = getRemainder(myUl);
482 Lf = Lf +
Vector(myB,myA)*s;
488 if (
Vector(myB,myA) == mySteps.at(0)) {
489 Vector tmp(mySteps.at(0));
491 mySteps.push_back(tmp);
492 }
else if (
Vector(myB,myA) == mySteps.at(1)) {
493 Vector tmp(mySteps.at(1));
495 mySteps.push_back(tmp);
506 template <
typename TIterator,
typename TInteger,
int connectivity>
513 if ( (v[0] == 0) && (v[1] == 0) ) {
517 return retractForward(myF, myL, next, myUf, myUl, myLf, myLl, 1);
523 template <
typename TIterator,
typename TInteger,
int connectivity>
530 if ( (v[0] == 0) && (v[1] == 0) ) {
534 return retractForward(myL, myF, previous, myUl, myUf, myLl, myLf, -1);
540 template <
typename TIterator,
typename TInteger,
int connectivity>
546 Point lastPoint(*it);
550 ::norm(lastMove[0],lastMove[1]);
557 else if (mySteps.size()<2) {
561 if (mySteps.size()==0) {
567 if (lastMove == mySteps.at(0)) {
574 Vector diff = ( lastMove-mySteps.at(0) );
591 if (hasLessThanTwoSteps(lastMove)) {
594 Integer r = getRemainder(lastPoint);
596 if ( (r < myMu-1)||(r > myMu+myOmega) )
613 template <
typename TIterator,
typename TInteger,
int connectivity>
620 return isExtendableForward(*it, (
Point(*it) -
Point(*myL)) );
625 template <
typename TIterator,
typename TInteger,
int connectivity>
632 return isExtendableForward(*it, (
Point(*myF) -
Point(*it)) );
636 template <
typename TIterator,
typename TInteger,
int connectivity>
640 const Point & lastPoint,
646 ::norm(lastMove[0],lastMove[1]);
653 else if (mySteps.size()<2) {
657 if (mySteps.size()==0) {
663 if (lastMove == mySteps.at(0)) {
670 Vector diff = ( lastMove-mySteps.at(0) );
687 if (hasLessThanTwoSteps(lastMove)) {
690 Integer r = getRemainder(lastPoint);
692 if ( (r < myMu-1)||(r > myMu+myOmega) )
708 template <
typename TIterator,
typename TInteger,
int connectivity>
713 return myA *
static_cast<Integer>(aPoint[0])
714 - myB * static_cast<Integer>(aPoint[1]);
718 template <
typename TIterator,
typename TInteger,
int connectivity>
723 return getRemainder(*it);
727 template <
typename TIterator,
typename TInteger,
int connectivity>
732 return myA *
static_cast<Integer>(aPoint[0])
733 + myB * static_cast<Integer>(aPoint[1]);
736 template <
typename TIterator,
typename TInteger,
int connectivity>
741 return getPosition(*it);
745 template <
typename TIterator,
typename TInteger,
int connectivity>
750 Integer r = getRemainder(aPoint);
751 return ( (r >= myMu)&&(r < myMu+myOmega) );
755 template <
typename TIterator,
typename TInteger,
int connectivity>
764 template <
typename TIterator,
typename TInteger,
int connectivity>
769 Integer s = getPosition(aPoint);
770 Integer smin = getPosition(myF);
771 Integer smax = getPosition(myL);
772 return (isInDSL(aPoint) && ( (s >= smin)&&(s <= smax) ) );
776 template <
typename TIterator,
typename TInteger,
int connectivity>
787 template <
typename TIterator,
typename TInteger,
int connectivity>
794 template <
typename TIterator,
typename TInteger,
int connectivity>
801 template <
typename TIterator,
typename TInteger,
int connectivity>
808 template <
typename TIterator,
typename TInteger,
int connectivity>
815 template <
typename TIterator,
typename TInteger,
int connectivity>
821 template <
typename TIterator,
typename TInteger,
int connectivity>
828 template <
typename TIterator,
typename TInteger,
int connectivity>
835 template <
typename TIterator,
typename TInteger,
int connectivity>
842 template <
typename TIterator,
typename TInteger,
int connectivity>
849 template <
typename TIterator,
typename TInteger,
int connectivity>
856 template <
typename TIterator,
typename TInteger,
int connectivity>
863 template <
typename TIterator,
typename TInteger,
int connectivity>
870 template <
typename TIterator,
typename TInteger,
int connectivity>
877 template <
typename TIterator,
typename TInteger,
int connectivity>
884 template <
typename TIterator,
typename TInteger,
int connectivity>
891 template <
typename TIterator,
typename TInteger,
int connectivity>
900 template <
typename TIterator,
typename TInteger,
int connectivity>
914 &&(myNbLowPat==0) )
return true;
920 if (getRemainder(myUf) != myMu)
return false;
921 else if (getRemainder(myUl) != myMu)
return false;
922 else if (getRemainder(myLf) != myMu+myOmega-1)
return false;
923 else if (getRemainder(myLl) != myMu+myOmega-1)
return false;
925 else if ( (
Vector(myB,myA)*myNbUpPat) != (myUl - myUf) )
return false;
926 else if ( (
Vector(myB,myA)*myNbLowPat) != (myLl - myLf) )
return false;
935 template <
typename TIterator,
typename TInteger,
int connectivity>
948 double alpha = ( mu + (omega - 1.0)/2.0 );
949 double d2 = ( a * a + b * b );
950 double s = b * xm + a * ym;
951 double xp = ( b * s + a * alpha ) / d2;
952 double yp = ( a * s - b * alpha ) / d2;
956 template <
typename TIterator,
typename TInteger,
int connectivity>
967 double d2 = ( a * a + b * b );
968 double s = b * xm + a * ym;
969 double xp = ( b * s + a * r ) / d2;
970 double yp = ( a * s - b * r ) / d2;
976 template <
typename TIterator,
typename TInteger,
int connectivity>
987 template <
typename TIterator,
typename TInteger,
int connectivity>
992 PointD v = project( *myL );
993 PointD u = project( *myF );
995 return v.
norm(PointD::L_2);
999 template <
typename TIterator,
typename TInteger,
int connectivity>
1004 return "ArithmeticalDSS";
1012 template <
typename TIterator,
typename TInteger,
int connectivity>
1018 out <<
"[ArithmeticalDSS]" << endl;
1019 out <<
"Parameters (a,b,mu,omega)=";
1020 out <<
"("<< myA <<
", " << myB <<
", ";
1021 out << myMu <<
", " << myOmega <<
")" << endl;
1022 out <<
"Number of upper patterns: " << myNbUpPat << endl;
1023 out <<
"Number of lower patterns: " << myNbLowPat << endl;
1024 out <<
"First point " <<
Point(*myF) <<
" Last point " <<
Point(*myL) << endl;
1025 out <<
"Leaning points:" << endl;
1026 out <<
" Uf " << myUf << endl <<
" Ul " << myUl << endl;
1027 out <<
" Lf " << myLf << endl <<
" Ll " << myLl << endl;
1028 out <<
"Steps:" << endl;
1029 for (
unsigned int i = 0; i < mySteps.size(); i++) {
1030 out <<
" " << mySteps.at(i) << endl;
1032 out <<
"[End ArithmeticalDSS]" << endl;
1037 template <
typename TIterator,
typename TInteger,
int connectivity>
1041 const Vector& aStep)
const
1043 if ( (aStep == mySteps.at(0)) ||
1044 (aStep == mySteps.at(1)) ) {
1052 template <
typename TIterator,
typename TInteger,
int connectivity>
1057 Vector v = mySteps.at(1) - mySteps.at(0);
1058 if ( getRemainder(v) == myOmega) {
1061 return ( mySteps.at(0) - mySteps.at(1) );