154{
  155  typedef typename SB::Integer 
Integer;
 
  156  typedef typename SB::Quotient Quotient;
  157  typedef typename SB::Fraction Fraction;
  159  typedef typename MyPattern::Vector2I Vector2I;
  160  unsigned int nbok = 0;
  161  unsigned int nb = 0;
  164  MyPattern pattern( p*6, q*6 );
  166 
  167  
  168  trace.
beginBlock ( 
"Testing block: Smallest covering subpatterns of ODD pattern." );
 
  169  MyPattern pat_odd( 5, 12 );
  170  trace.
info() << 
"ODD  " << pat_odd << 
" " << pat_odd.rE() << endl;
 
  171  MyPattern sp;
  172  Quotient np;
  173  Vector2I start;
  174 
  175  
  176  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  177                                         0, 17 );
  178  trace.
info() << 
"sub(0,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  179  ++nb; nbok += sp.slope() == SB::fraction( 5, 12 ) ? 1 : 0;
  180  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  181                                         1, 17 );
  182  trace.
info() << 
"sub(1,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  183  ++nb; nbok += sp.slope() == SB::fraction( 5, 12 ) ? 1 : 0;
  184  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  185                                         7, 17 );
  186  trace.
info() << 
"sub(7,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  187  ++nb; nbok += sp.slope() == SB::fraction( 3, 7 ) ? 1 : 0;
  188  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  189                                         8, 17 );
  190  trace.
info() << 
"sub(8,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  191  ++nb; nbok += sp.slope() == SB::fraction( 3, 7 ) ? 1 : 0;
  192  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  193                                         13, 17 );
  194  trace.
info() << 
"sub(13,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  195  ++nb; nbok += sp.slope() == SB::fraction( 3, 7 ) ? 1 : 0;
  196  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  197                                         14, 17 );
  198  trace.
info() << 
"sub(14,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  199  ++nb; nbok += sp.slope() == SB::fraction( 1, 2 ) ? 1 : 0;
  200  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  201                                         15, 17 );
  202  trace.
info() << 
"sub(15,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  203  ++nb; nbok += sp.slope() == SB::fraction( 1, 2 ) ? 1 : 0;
  204 
  205  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering left Subpatterns." << endl;
 
  206 
  207  
  208  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  209                                         0, 16 );
  210  trace.
info() << 
"sub(0,16) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  211  ++nb; nbok += sp.slope() == SB::fraction( 5, 12 ) ? 1 : 0;
  212  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  213                                         0, 15 );
  214  trace.
info() << 
"sub(0,15) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  215  ++nb; nbok += sp.slope() == SB::fraction( 5, 12 ) ? 1 : 0;
  216  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  217                                         0, 14 );
  218  trace.
info() << 
"sub(0,14) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  219  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 2 ? 1 : 0;
  220  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  221                                         0, 8 );
  222  trace.
info() << 
"sub(0,8) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  223  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 2 ? 1 : 0;
  224  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  225                                         0, 7 );
  226  trace.
info() << 
"sub(0,7) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  227  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 1 ? 1 : 0;
  228  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  229                                         0, 1 );
  230  trace.
info() << 
"sub(0,1) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  231  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 1 ? 1 : 0;
  232 
  233  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering right Subpatterns." << endl;
 
  234 
  235  
  236  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  237                                         1, 16 );
  238  trace.
info() << 
"sub(1,16) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  239  ++nb; nbok += sp.slope() == SB::fraction( 5, 12 ) ? 1 : 0;
  240  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  241                                         2, 14 );
  242  trace.
info() << 
"sub(2,14) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  243  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 2 ? 1 : 0;
  244  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  245                                         7, 15 );
  246  trace.
info() << 
"sub(7,15) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  247  ++nb; nbok += sp.slope() == SB::fraction( 3, 7 ) && np == 1 ? 1 : 0;
  248  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  249                                         7, 14 );
  250  trace.
info() << 
"sub(7,14) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  251  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 1 ? 1 : 0;
  252  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  253                                         3, 6 );
  254  trace.
info() << 
"sub(3,6) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  255  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 1 ? 1 : 0;
  256  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  257                                         6, 8 );
  258  trace.
info() << 
"sub(6,8) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  259  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 2 ? 1 : 0;
  260  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  261                                         8, 12 );
  262  trace.
info() << 
"sub(8,12) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  263  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 1 ? 1 : 0;
  264  pat_odd.getSmallestCoveringSubpattern( sp, np, start,
  265                                         15, 16 );
  266  trace.
info() << 
"sub(15,16) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  267  ++nb; nbok += sp.slope() == SB::fraction( 1, 2 ) && np == 1 ? 1 : 0;
  268 
  269  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering middle Subpatterns." << endl;
 
  271 
  272  
  273  trace.
beginBlock ( 
"Testing block: Smallest covering subpatterns of EVEN pattern." );
 
  274  MyPattern pat_even( 12, 17 );
  275  trace.
info() << 
"EVEN " << pat_even << 
" " << pat_even.rE() << endl;
 
  276 
  277  
  278  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  279                                          0, 29 );
  280  trace.
info() << 
"sub(0,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  281  ++nb; nbok += sp.slope() == SB::fraction( 12, 17 ) ? 1 : 0;
  282  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  283                                          0, 25 );
  284  trace.
info() << 
"sub(0,25) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  285  ++nb; nbok += sp.slope() == SB::fraction( 12, 17 ) ? 1 : 0;
  286  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  287                                          0, 17 );
  288  trace.
info() << 
"sub(0,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  289  ++nb; nbok += sp.slope() == SB::fraction( 7, 10 ) ? 1 : 0;
  290  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  291                                          0, 6 );
  292  trace.
info() << 
"sub(0,6) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  293  ++nb; nbok += sp.slope() == SB::fraction( 7, 10 ) ? 1 : 0;
  294  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  295                                          0, 5 );
  296  trace.
info() << 
"sub(0,5) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  297  ++nb; nbok += sp.slope() == SB::fraction( 2, 3 ) ? 1 : 0;
  298  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering left Subpatterns." << endl;
 
  299 
  300  
  301  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  302                                          4, 29 );
  303  trace.
info() << 
"sub(4,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  304  ++nb; nbok += sp.slope() == SB::fraction( 12, 17 ) ? 1 : 0;
  305  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  306                                          5, 29 );
  307  trace.
info() << 
"sub(5,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  308  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 2 ? 1 : 0;
  309  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  310                                          16, 29 );
  311  trace.
info() << 
"sub(16,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  312  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 2 ? 1 : 0;
  313  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  314                                          17, 29 );
  315  trace.
info() << 
"sub(17,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  316  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 1 ? 1 : 0;
  317  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering right Subpatterns." << endl;
 
  318 
  319  
  320  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  321                                          1, 27 );
  322  trace.
info() << 
"sub(1,27) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  323  ++nb; nbok += sp.slope() == SB::fraction( 12, 17 ) ? 1 : 0;
  324  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  325                                          5, 24 );
  326  trace.
info() << 
"sub(5,24) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  327  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 2 ? 1 : 0;
  328  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  329                                          4, 17 );
  330  trace.
info() << 
"sub(4,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  331  ++nb; nbok += sp.slope() == SB::fraction( 7, 10 ) && np == 1 ? 1 : 0;
  332  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  333                                          5, 17 );
  334  trace.
info() << 
"sub(5,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  335  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 1 ? 1 : 0;
  336  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  337                                          7, 12 );
  338  trace.
info() << 
"sub(7,12) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  339  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 1 ? 1 : 0;
  340  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  341                                          1, 4 );
  342  trace.
info() << 
"sub(1,4) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  343  ++nb; nbok += sp.slope() == SB::fraction( 2, 3 ) && np == 1 ? 1 : 0;
  344  pat_even.getSmallestCoveringSubpattern( sp, np, start,
  345                                          18, 25 );
  346  trace.
info() << 
"sub(18,20) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  347  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 1 ? 1 : 0;
  348  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering middle Subpatterns." << endl;
 
  350 
  351  
  352  
  353  
  354  trace.
beginBlock ( 
"Testing block: greatest included subpatterns of ODD pattern." );
 
  355  trace.
info() << 
"ODD  " << pat_odd << 
" " << pat_odd.rE() << endl;
 
  356 
  357  
  358  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  359                                         0, 17 );
  360  trace.
info() << 
"sub(0,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  361  ++nb; nbok += sp.slope() == SB::fraction( 5, 12 ) ? 1 : 0;
  362  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  363                                         1, 17 );
  364  trace.
info() << 
"sub(1,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  365  ++nb; nbok += sp.slope() == SB::fraction( 3, 7 ) ? 1 : 0;
  366  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  367                                         7, 17 );
  368  trace.
info() << 
"sub(7,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  369  ++nb; nbok += sp.slope() == SB::fraction( 3, 7 ) ? 1 : 0;
  370  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  371                                         8, 17 );
  372  trace.
info() << 
"sub(8,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  373  ++nb; nbok += sp.slope() == SB::fraction( 1, 2 ) ? 1 : 0;
  374  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  375                                         13, 17 );
  376  trace.
info() << 
"sub(13,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  377  ++nb; nbok += sp.slope() == SB::fraction( 1, 2 ) ? 1 : 0;
  378  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  379                                         14, 17 );
  380  trace.
info() << 
"sub(14,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  381  ++nb; nbok += sp.slope() == SB::fraction( 1, 2 ) ? 1 : 0;
  382  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  383                                         15, 17 );
  384  trace.
info() << 
"sub(15,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  385  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  386 
  387  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering left Subpatterns." << endl;
 
  388 
  389  
  390  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  391                                         0, 15 );
  392  trace.
info() << 
"sub(0,15) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  393  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 2 ? 1 : 0;
  394  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  395                                         0, 14 );
  396  trace.
info() << 
"sub(0,14) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  397  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 2 ? 1 : 0;
  398  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  399                                         0, 13 );
  400  trace.
info() << 
"sub(0,13) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  401  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 1 ? 1 : 0;
  402  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  403                                         0, 7 );
  404  trace.
info() << 
"sub(0,7) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  405  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 1 ? 1 : 0;
  406  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  407                                         0, 6 );
  408  trace.
info() << 
"sub(0,6) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  409  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  410  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  411                                         0, 1 );
  412  trace.
info() << 
"sub(0,1) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  413  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  414 
  415  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering right Subpatterns." << endl;
 
  416 
  417  
  418  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  419                                         1, 16 );
  420  trace.
info() << 
"sub(1,16) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  421  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) ? 1 : 0;
  422  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  423                                         2, 14 );
  424  trace.
info() << 
"sub(2,14) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  425  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 1 ? 1 : 0;
  426  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  427                                         7, 15 );
  428  trace.
info() << 
"sub(7,15) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  429  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 1 ? 1 : 0;
  430  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  431                                         7, 14 );
  432  trace.
info() << 
"sub(7,14) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  433  ++nb; nbok += sp.slope() == SB::fraction( 2, 5 ) && np == 1 ? 1 : 0;
  434  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  435                                         3, 6 );
  436  trace.
info() << 
"sub(3,6) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  437  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  438  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  439                                         6, 8 );
  440  trace.
info() << 
"sub(6,8) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  441  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  442  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  443                                         8, 12 );
  444  trace.
info() << 
"sub(8,12) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  445  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  446  pat_odd.getGreatestIncludedSubpattern( sp, np, start,
  447                                         15, 16 );
  448  trace.
info() << 
"sub(15,16) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  449  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  450 
  451  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering middle Subpatterns." << endl;
 
  453 
  454  
  455  trace.
beginBlock ( 
"Testing block: Greatest included subpatterns of EVEN pattern." );
 
  456  trace.
info() << 
"EVEN " << pat_even << 
" " << pat_even.rE() << endl;
 
  457 
  458  
  459  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  460                                          0, 29 );
  461  trace.
info() << 
"sub(0,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  462  ++nb; nbok += sp.slope() == SB::fraction( 12, 17 ) ? 1 : 0;
  463  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  464                                          0, 25 );
  465  trace.
info() << 
"sub(0,25) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  466  ++nb; nbok += sp.slope() == SB::fraction( 7, 10 ) ? 1 : 0;
  467  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  468                                          0, 17 );
  469  trace.
info() << 
"sub(0,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  470  ++nb; nbok += sp.slope() == SB::fraction( 7, 10 ) ? 1 : 0;
  471  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  472                                          0, 16 );
  473  trace.
info() << 
"sub(0,16) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  474  ++nb; nbok += sp.slope() == SB::fraction( 2, 3 ) ? 1 : 0;
  475  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  476                                          0, 6 );
  477  trace.
info() << 
"sub(0,6) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  478  ++nb; nbok += sp.slope() == SB::fraction( 2, 3 ) ? 1 : 0;
  479  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  480                                          0, 5 );
  481  trace.
info() << 
"sub(0,5) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  482  ++nb; nbok += sp.slope() == SB::fraction( 2, 3 ) ? 1 : 0;
  483  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  484                                          0, 4 );
  485  trace.
info() << 
"sub(0,4) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  486  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  487  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering left Subpatterns." << endl;
 
  488 
  489  
  490  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  491                                          4, 29 );
  492  trace.
info() << 
"sub(4,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  493  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 2 ? 1 : 0;
  494  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  495                                          5, 29 );
  496  trace.
info() << 
"sub(5,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  497  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 2 ? 1 : 0;
  498  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  499                                          16, 29 );
  500  trace.
info() << 
"sub(16,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  501  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 1 ? 1 : 0;
  502  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  503                                          17, 29 );
  504  trace.
info() << 
"sub(17,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  505  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 1 ? 1 : 0;
  506  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  507                                          18, 29 );
  508  trace.
info() << 
"sub(18,29) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  509  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  510  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering right Subpatterns." << endl;
 
  511 
  512  
  513  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  514                                          1, 27 );
  515  trace.
info() << 
"sub(1,27) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  516  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 1 ? 1 : 0;
  517  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  518                                          5, 24 );
  519  trace.
info() << 
"sub(5,24) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  520  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 1 ? 1 : 0;
  521  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  522                                          4, 17 );
  523  trace.
info() << 
"sub(4,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  524  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 1 ? 1 : 0;
  525  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  526                                          5, 17 );
  527  trace.
info() << 
"sub(5,17) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  528  ++nb; nbok += sp.slope() == SB::fraction( 5, 7 ) && np == 1 ? 1 : 0;
  529  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  530                                          7, 16 );
  531  trace.
info() << 
"sub(5,16) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  532  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  533  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  534                                          1, 4 );
  535  trace.
info() << 
"sub(1,4) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  536  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  537  pat_even.getGreatestIncludedSubpattern( sp, np, start,
  538                                          18, 25 );
  539  trace.
info() << 
"sub(18,20) = " << sp << 
" " << sp.rE() << 
"^" << np << endl;
 
  540  ++nb; nbok += sp.slope() == Fraction() ? 1 : 0;
  541  trace.
info() << 
"(" << nbok << 
"/" << nb << 
") covering middle Subpatterns." << endl;
 
  543 
  544  trace.
info() << 
"Odd pattern " << pat_odd << endl;
 
  545  trace.
info() << 
" U(0)=" << pat_odd.U( 0 )
 
  546               << " L(0)=" << pat_odd.L( 0 )
  547               << " U(1)=" << pat_odd.U( 1 )
  548               << " L(1)=" << pat_odd.L( 1 ) << endl;
  549 
  550  trace.
info() << 
"Even pattern " << pat_even << endl;
 
  551  trace.
info() << 
" U(0)=" << pat_even.U( 0 )
 
  552               << " L(0)=" << pat_even.L( 0 )
  553               << " U(1)=" << pat_even.U( 1 )
  554               << " L(1)=" << pat_even.L( 1 ) << endl;
  555                                        
  556  return nbok == nb;
  557}
Aim: This class represents a pattern, i.e. the path between two consecutive upper leaning points on a...