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