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