43 template <
typename TConstIterator,
typename TInteger >
49 template <
typename TConstIterator,
typename TInteger >
57 template <
typename TConstIterator,
typename TInteger >
65 myCodeHandler.init( it );
75 myLeftPatternLength = 0;
80 myDisplacements = displacements;
83 myLastPoint = myFirstPoint + displacement( getCode( myFirstLetter) );
89 template <
typename TConstIterator,
typename TInteger >
98 template <
typename TConstIterator,
typename TInteger >
102 init( fc.
chain.begin(), fc.
firstPoint(), FreemanChainCode::displacement );
107 template <
typename TConstIterator,
typename TInteger >
111 std::string::const_iterator string_it = it.
getChain()->
chain.begin();
113 init( string_it, *it, FreemanChainCode::displacement );
120 template <
typename TConstIterator,
typename TInteger >
123 myCodeHandler ( other.myCodeHandler ),
124 myBegin ( other.myBegin ),
125 myEnd ( other.myEnd ),
126 myFirstPoint ( other.myFirstPoint ),
127 myLastPoint ( other.myLastPoint ),
128 myFirstLetter ( other.myFirstLetter ),
129 myLastLetter ( other.myLastLetter ),
130 myNbRepeat ( other.myNbRepeat ),
131 myPatternBegin ( other.myPatternBegin ),
132 myPatternEnd ( other.myPatternEnd ),
133 myLeftPatternLength ( other.myLeftPatternLength ),
134 myNextBefore ( other.myNextBefore ),
135 myNextAfter ( other.myNextAfter ),
136 myDisplacements ( other.myDisplacements )
144 template <
typename TConstIterator,
typename TInteger >
167 template <
typename TConstIterator,
typename TInteger >
178 template <
typename TConstIterator,
typename TInteger >
182 return ( ( begin() == other.
begin() ) && ( end() == other.
end() ) );
191 template <
typename TConstIterator,
typename TInteger >
195 return !(*
this == other);
199 template <
typename TConstIterator,
typename TInteger >
212 template <
typename TConstIterator,
typename TInteger >
216 Code letterRead = getCode( myLastLetter + 1 );
217 Code letterExpected = getCode( myNextAfter );
222 if ( letterRead == letterExpected ) {
224 if ( myNextAfter == myPatternEnd ) {
226 myNextAfter = myPatternBegin;
231 }
else if ( isTrivial() ) {
232 myLeftPatternLength = 1;
234 myPatternEnd = myLastLetter + 1;
235 myNextBefore = myPatternEnd;
237 }
else if ( nextIsLL( myNextAfter ) && ( letterRead == getBigLetter() ) ) {
239 myLeftPatternLength = mainPatternLength();
241 Size myOldSuffixLength = suffixLength();
242 myPatternEnd = myLastLetter + 1;
243 myNextBefore = myPatternEnd - myOldSuffixLength;
244 myNextAfter = myPatternBegin;
246 }
else if ( isUL( myNextAfter ) && ( letterRead == getSmallLetter() ) ) {
248 Size myOldLeftPatternLength = myLeftPatternLength;
249 Size myOldSuffixLength = suffixLength();
251 myLeftPatternLength = mainPatternLength();
252 myPatternEnd = myLastLetter + 1;
256 if ( myOldSuffixLength < myOldLeftPatternLength ) {
257 myPatternBegin = myPatternBegin + myLeftPatternLength
258 - myOldLeftPatternLength;
259 myNextBefore = myPatternEnd - myLeftPatternLength +
260 myOldLeftPatternLength - myOldSuffixLength;
263 myPatternBegin = myPatternBegin - myOldLeftPatternLength;
264 myNextBefore = myPatternEnd - (myOldSuffixLength - myOldLeftPatternLength);
266 myNextAfter = myPatternBegin;
273 myLastPoint += displacement( getCode( myLastLetter ) );
281 template <
typename TConstIterator,
typename TInteger >
285 Code letterRead = getCode( myFirstLetter - 1 );
286 Code letterExpected = getCode( myNextBefore );
291 if ( letterRead == letterExpected ) {
293 if ( myNextBefore == myPatternBegin ) {
298 Size mpl = mainPatternLength();
299 myPatternBegin -= mpl;
302 myNextBefore = myPatternEnd;
309 }
else if ( isTrivial() ) {
311 myLeftPatternLength = myNbRepeat;
312 myPatternEnd += myNbRepeat-1;
314 myPatternBegin = myFirstLetter - 1;
315 myNextBefore = myPatternEnd;
316 myNextAfter = myPatternBegin;
318 }
else if ( previousIsLL( myNextBefore ) && ( letterRead == getSmallLetter() ) ) {
321 Size myOldMainPatternLength = mainPatternLength();
322 Size myOldLeftPatternLength = myLeftPatternLength;
325 myPatternBegin = myFirstLetter - 1;
326 myPatternEnd += (myNbRepeat-1) * myOldMainPatternLength;
327 myLeftPatternLength = mainPatternLength() - myOldMainPatternLength;
329 myNextBefore = myPatternEnd;
330 myNextAfter -= myOldLeftPatternLength;
332 }
else if ( isUL( myNextBefore ) && ( letterRead == getBigLetter() ) ) {
334 Size myOldMainPatternLength = mainPatternLength();
335 Size myOldRightPatternLength = myOldMainPatternLength - myLeftPatternLength;
336 Size myOldPrefixLength = prefixLength();
338 myPatternBegin = myFirstLetter - 1;
342 if ( myOldPrefixLength < myOldRightPatternLength ) {
344 myNextAfter = myNextAfter - myOldMainPatternLength + myLeftPatternLength;
345 myPatternEnd = myPatternEnd
346 + (myNbRepeat - 1)*myOldMainPatternLength
347 - myLeftPatternLength;
351 myNextAfter = myNextAfter - myOldMainPatternLength - myOldRightPatternLength;
352 myPatternEnd = myPatternEnd
353 + myNbRepeat*myOldMainPatternLength
354 - myLeftPatternLength;
357 myNextBefore = myPatternEnd;
358 myLeftPatternLength = mainPatternLength() - myOldMainPatternLength;
366 myFirstPoint -= displacement( getCode( myFirstLetter ) );
375 template <
typename TConstIterator,
typename TInteger >
380 if ( myNextBefore != myPatternEnd ) {
385 }
else if ( isTrivial() ) {
389 if ( myNbRepeat == 1 )
return false;
390 myPatternBegin = myPatternEnd = myNextBefore = ++myNextAfter;
393 }
else if ( myNbRepeat >= 2 ) {
397 Size myOldMainPatternLength = mainPatternLength();
398 myPatternBegin += myOldMainPatternLength;
399 myPatternEnd += myOldMainPatternLength;
400 myNextAfter += myOldMainPatternLength;
401 myNextBefore = myPatternBegin;
406 Size myOldMainPatternLength = mainPatternLength();
407 Size myOldLeftPatternLength = myLeftPatternLength;
408 Size myOldRightPatternLength = myOldMainPatternLength - myOldLeftPatternLength;
410 if ( prefixLength() >= myOldRightPatternLength ) {
414 myLeftPatternLength = myOldRightPatternLength;
415 myPatternBegin += myOldRightPatternLength;
416 myPatternEnd += myOldRightPatternLength;
417 myNextBefore = myPatternEnd - myOldRightPatternLength + 1;
419 }
else if ( myOldLeftPatternLength < myOldRightPatternLength ) {
422 myPatternBegin += myOldLeftPatternLength;
423 myNextBefore -= ( myOldLeftPatternLength - 1 );
424 myNextAfter += myOldLeftPatternLength;
426 }
else if ( myOldLeftPatternLength > myOldRightPatternLength ) {
429 Size myNbBerstelRight = (myOldRightPatternLength > 1) ?
430 myOldMainPatternLength / myOldRightPatternLength :
431 myOldMainPatternLength - 1;
432 Size myBerstelLeftLength = myOldMainPatternLength -
433 ( myNbBerstelRight * myOldRightPatternLength );
435 myNbRepeat = myNbBerstelRight;
436 myPatternBegin += myBerstelLeftLength;
437 myPatternEnd = myPatternBegin + myOldRightPatternLength - 1;
438 myNextBefore = myPatternEnd - myBerstelLeftLength + 1;
439 myNextAfter += myBerstelLeftLength;
440 myLeftPatternLength = (myPatternBegin == myPatternEnd) ?
441 0 : myBerstelLeftLength;
447 myNextBefore = myNextAfter = myPatternBegin = myPatternEnd;
448 myLeftPatternLength = 0;
453 myFirstPoint += displacement( getCode( myFirstLetter ) );
462 template <
typename TConstIterator,
typename TInteger >
466 if ( myNextAfter != myPatternBegin ) {
471 }
else if ( isTrivial() ) {
475 if ( myNbRepeat == 1 )
return false;
478 }
else if ( myNbRepeat >= 2 ) {
483 myNextAfter = myPatternEnd;
487 Size myOldMainPatternLength = mainPatternLength();
488 Size myOldLeftPatternLength = myLeftPatternLength;
489 Size myOldRightPatternLength = myOldMainPatternLength -
490 myOldLeftPatternLength;
492 if ( suffixLength() >= myOldLeftPatternLength ) {
496 myLeftPatternLength = myOldRightPatternLength;
497 myPatternBegin -= myOldLeftPatternLength;
498 myPatternEnd -= myOldLeftPatternLength;
499 myNextAfter = myPatternBegin + myOldLeftPatternLength - 1;
501 }
else if ( myOldLeftPatternLength > myOldRightPatternLength ) {
504 myPatternEnd -= myOldRightPatternLength;
505 myNextAfter += ( myOldRightPatternLength - 1 );
506 myNextBefore -= myOldRightPatternLength;
507 myLeftPatternLength -= myOldRightPatternLength;
509 }
else if ( myOldLeftPatternLength < myOldRightPatternLength ) {
512 Size myNbBerstelLeft = (myOldLeftPatternLength > 1) ?
513 myOldMainPatternLength / myOldLeftPatternLength :
514 myOldMainPatternLength - 1;
515 Size myBerstelRightLength = myOldMainPatternLength -
516 ( myNbBerstelLeft * myOldLeftPatternLength );
517 Size myOldSuffixLength = suffixLength();
520 myNbRepeat = myNbBerstelLeft;
521 myLeftPatternLength = myOldLeftPatternLength - myBerstelRightLength;
522 myPatternEnd = myPatternBegin + myOldLeftPatternLength - 1;
523 myNextBefore = myPatternEnd - myOldSuffixLength;
524 myNextAfter = myPatternBegin + myBerstelRightLength - 1;
530 myNextBefore = myNextAfter = myPatternEnd = myPatternBegin;
531 myLeftPatternLength = 0;
535 myLastPoint -= displacement( getCode( myLastLetter ) );
544 template <
typename TConstIterator,
typename TInteger >
548 Code letterRead = getCode( myLastLetter + 1 );
549 Code letterExpected = getCode( myNextAfter );
550 if ( letterRead == letterExpected )
554 else if ( isTrivial() )
558 else if ( nextIsLL( myNextAfter ) && ( letterRead == getBigLetter() ) )
562 else if ( isUL( myNextAfter ) && ( letterRead == getSmallLetter() ) )
574 template <
typename TConstIterator,
typename TInteger >
578 Code letterRead = getCode( myFirstLetter - 1);
579 Code letterExpected = getCode( myNextBefore );
580 if ( letterRead == letterExpected )
584 else if ( isTrivial() )
588 else if ( previousIsLL( myNextBefore ) && ( letterRead == getSmallLetter() ) )
592 else if ( isUL( myNextBefore ) && ( letterRead == getBigLetter() ) )
599 template <
typename TConstIterator,
typename TInteger >
604 Vector v = myLastPoint - myFirstPoint;
610 template <
typename TConstIterator,
typename TInteger >
623 template <
typename TConstIterator,
typename TInteger >
628 ( myFirstLetter <= myPatternBegin ) &&
629 ( myPatternBegin <= myPatternEnd ) &&
630 ( myPatternEnd <= myLastLetter ) &&
631 ( myNextBefore >= myPatternBegin ) &&
632 ( myNextBefore <= myPatternEnd ) &&
633 ( myNextAfter >= myPatternBegin ) &&
634 ( myNextAfter <= myPatternEnd ) &&
635 ( (myLeftPatternLength == 0 ) ||
636 (myLeftPatternLength < mainPatternLength() ) ) );
647 template <
typename TConstIterator,
typename TInteger >
653 for (
int i=myFirstLetter; i<= myLastLetter; i++)
656 for (
int i=myLastLetter+1; i<myLastLetter+4 ; i++)
659 getArithmeticalDescription(a,b,mu,omega);
660 out <<
"[CombinatorialDSS]\n";
661 out <<
"myCodes = " << s <<
"\n";
662 out <<
"myFirstPoint = " << myFirstPoint <<
"\n";
663 out <<
"myLastPoint = " << myLastPoint <<
"\n";
664 out <<
"myFirstLetter = " << myFirstLetter <<
"\n";
665 out <<
"myLastLetter = " << myLastLetter <<
"\n";
666 out <<
"myNbRepeat = " << myNbRepeat <<
"\n";
667 out <<
"myPatternBegin = " << myPatternBegin <<
"\n";
668 out <<
"myPatternEnd = " << myPatternEnd <<
"\n";
669 out <<
"myLeftPatternLength = " << myLeftPatternLength <<
"\n";
670 out <<
"myNextBefore = " << myNextBefore <<
"\n";
671 out <<
"myNextAfter = " << myNextAfter <<
"\n";
672 out <<
"(a,b,mu,omega) = (" << a <<
", " << b <<
", " << mu <<
", " <<
674 out <<
"[End CombinatorialDSS]" << endl;
684 template <
typename TConstIterator,
typename TInteger >
690 object.selfDisplay( out );
698 template <
typename TConstIterator,
typename TInteger >
704 return getCode( myPatternBegin );
711 template <
typename TConstIterator,
typename TInteger >
716 return getCode( myPatternEnd );
739 template <
typename TConstIterator,
typename TInteger >
744 return myCodeHandler.
getCode( pos );
747 template <
typename TConstIterator,
typename TInteger >
752 return myCodeHandler.
getCode( pos );
761 template <
typename TConstIterator,
typename TInteger >
766 return myPatternEnd - myPatternBegin + 1;
773 template <
typename TConstIterator,
typename TInteger >
796 template <
typename TConstIterator,
typename TInteger >
801 return ( myPatternEnd - myNextBefore );
808 template <
typename TConstIterator,
typename TInteger >
813 return ( myNextAfter - myPatternBegin );
821 template <
typename TConstIterator,
typename TInteger >
825 return ( (pos == myPatternBegin) || ( pos == myPatternEnd ) );
835 template <
typename TConstIterator,
typename TInteger >
839 return ( (pos - myPatternBegin) == mainPatternLength() - myLeftPatternLength - 1) ;
847 template <
typename TConstIterator,
typename TInteger >
851 return ( (pos - myPatternBegin) == mainPatternLength() - myLeftPatternLength ) ;
858 template <
typename TConstIterator,
typename TInteger >
863 return ( myLeftPatternLength == 0 );
867 template <
typename TConstIterator,
typename TInteger >
875 template <
typename TConstIterator,
typename TInteger >
887 template <
typename TConstIterator,
typename TInteger >
899 template <
typename TConstIterator,
typename TInteger >
914 template <
typename TConstIterator,
typename TInteger >
920 getArithmeticalDescription ( a, b, mu, omega);
927 template <
typename TConstIterator,
typename TInteger >
933 getArithmeticalDescription ( a, b, mu, omega);
942 template <
typename TConstIterator,
typename TInteger >
948 getArithmeticalDescription ( a, b, mu, omega );
956 template <
typename TConstIterator,
typename TInteger >
962 getArithmeticalDescription ( a, b, mu, omega );
973 template <
typename TConstIterator,
typename TInteger >
979 while ( itBegin.
getIndex() != myPatternBegin )
982 while ( itEnd.
getIndex() != myPatternEnd+1 )
985 Size myRightPatternLenght = mainPatternLength() - myLeftPatternLength;
987 for (
int i=0; i<myRightPatternLenght; i++)
995 Integer r1 = a*pb.at(0) - b*pb.at(1);
998 omega = ((a>0) ? a : -a) + ((b>0) ? b : -b );
1002 template <
typename TConstIterator,
typename TInteger >
1013 Vector v = mainPatternVector();
1014 ul = uf + v*myNbRepeat;
1016 while ( ! previousIsLL ( it.
getIndex() ) )
1018 lf = ( suffixLength() >= myLeftPatternLength ) ? *it - mainPatternVector() : *it;
1020 int nbLowerRepeats = ( prefixLength() >= mainPatternLength() - myLeftPatternLength )
1021 ? myNbRepeat : myNbRepeat - 1;
1022 ll = *it + v*nbLowerRepeats;
1024 if ( getRemainder( uf ) > getRemainder( lf ) )
1037 template <
typename TConstIterator,
typename TInteger >
1042 Point uf, ul, lf, ll;
1043 computeLeaningPoints( uf, ul, lf, ll );
1051 template <
typename TConstIterator,
typename TInteger >
1056 Point uf, ul, lf, ll;
1057 computeLeaningPoints( uf, ul, lf, ll );
1065 template <
typename TConstIterator,
typename TInteger >
1070 Point uf, ul, lf, ll;
1071 computeLeaningPoints( uf, ul, lf, ll );
1079 template <
typename TConstIterator,
typename TInteger >
1084 Point uf, ul, lf, ll;
1085 computeLeaningPoints( uf, ul, lf, ll );
1094 template <
typename TConstIterator,
typename TInteger >
1099 return this->myDisplacements( c );
1103 template <
typename TConstIterator,
typename TInteger >
1111 getArithmeticalDescription( a, b, mu, omega );
1127 template <
typename TConstIterator,
typename TInteger >
1132 return myFirstPoint;
1140 template <
typename TConstIterator,
typename TInteger >