DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
testPattern.cpp
1 
30 
31 #include <cstdlib>
32 #include <iostream>
33 #include <map>
34 #include "DGtal/base/Common.h"
35 #include "DGtal/kernel/CPointPredicate.h"
36 #include "DGtal/arithmetic/IntegerComputer.h"
37 #include "DGtal/arithmetic/SternBrocot.h"
38 #include "DGtal/arithmetic/LightSternBrocot.h"
39 #include "DGtal/arithmetic/LighterSternBrocot.h"
40 #include "DGtal/arithmetic/Pattern.h"
42 
43 using namespace std;
44 using namespace DGtal;
45 
47 // Functions for testing class LightSternBrocot.
49 
50 template <typename Fraction1, typename Fraction2>
51 bool
52 testPattern( Fraction1 f1 )
53 {
54  typedef Pattern<Fraction1> Pattern1;
55  typedef Pattern<Fraction2> Pattern2;
56  Fraction2 f2( f1.p(), f1.q() );
57 
58  std::cerr << " f1 =";
59  f1.selfDisplay( std::cerr );
60  std::cerr << std::endl;
61  std::cerr << "r(1)=";
62  f1.reduced(1).selfDisplay( std::cerr );
63  std::cerr << std::endl;
64  std::cerr << "r(2)=";
65  f1.reduced(2).selfDisplay( std::cerr );
66  std::cerr << std::endl;
67  // std::cerr << "r(3)=";
68  // f1.reduced(3).selfDisplay( std::cerr );
69  // std::cerr << std::endl;
70  // std::cerr << "r(4)=";
71  // f1.reduced(4).selfDisplay( std::cerr );
72  // std::cerr << std::endl;
73  // std::cerr << "r(5)=";
74  // f1.reduced(5).selfDisplay( std::cerr );
75  // std::cerr << std::endl;
76  // std::cerr << "r(6)=";
77  // f1.reduced(6).selfDisplay( std::cerr );
78  // std::cerr << std::endl;
79 
80  Pattern1 p1( f1 );
81  Pattern2 p2( f2 );
82  std::cerr << "p1=" << p1.rE() << std::endl;
83  std::cerr << "p2=" << p2.rE() << std::endl;
84  std::cerr << "p1=" << p1.rEs( "(|)" ) << std::endl;
85  std::cerr << "p2=" << p2.rEs( "(|)" ) << std::endl;
86  return p1.rE() == p2.rE();
87 }
88 
89 template <typename Fraction1, typename Fraction2>
90 bool
91 testPatterns()
92 {
93  unsigned int nbtests = 100;
94  unsigned int nb = 0;
95  unsigned int nbok = 0;
96  Fraction1 f1;
97  f1 = Fraction1( 5, 8 );
98  ++nb, nbok += testPattern<Fraction1,Fraction2>( f1 ) ? 1 : 0;
99  std::cerr << "(" << nbok << "/" << nb << ") f1=";
100  f1.selfDisplay( std::cerr );
101  std::cerr << endl;
102  f1 = Fraction1( 31, 24 );
103  ++nb, nbok += testPattern<Fraction1,Fraction2>( f1 ) ? 1 : 0;
104  std::cerr << "(" << nbok << "/" << nb << ") f1=";
105  f1.selfDisplay( std::cerr );
106  std::cerr << endl;
107  f1 = Fraction1( 5, 13 );
108  ++nb, nbok += testPattern<Fraction1,Fraction2>( f1 ) ? 1 : 0;
109  std::cerr << "(" << nbok << "/" << nb << ") f1=";
110  f1.selfDisplay( std::cerr );
111  std::cerr << endl;
113  for ( unsigned int i = 0; i < nbtests; ++i )
114  {
115  unsigned int p = random() % 1000;
116  unsigned int q = random() % 1000;
117  unsigned int g = ic.gcd( p, q );
118  p /= g; q /= g;
119  std::cerr << "*- p / q = " << p << "/" << q << std::endl;
120  f1 = Fraction1( p, q );
121  ++nb, nbok += testPattern<Fraction1,Fraction2>( f1 ) ? 1 : 0;
122  std::cerr << "(" << nbok << "/" << nb << ") f1=";
123  f1.selfDisplay( std::cerr );
124  std::cerr << endl;
125  }
126  return nbok == nb;
127 }
128 
129 
131 // Standard services - public :
132 int main( int , char** )
133 {
137  typedef SB::Fraction Fraction;
138  typedef LSB::Fraction LFraction;
139  typedef LLSB::Fraction LLFraction;
140  trace.beginBlock ( "Testing class Pattern" );
141  bool res = testPatterns<Fraction, LFraction>()
142  && testPatterns<Fraction, LLFraction>()
143  && testPatterns<LLFraction, LFraction>();
144  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
145  trace.endBlock();
146 
147  return res ? 0 : 1;
148 }
149 // //
151