DGtal 1.4.0
Loading...
Searching...
No Matches
test2x2DetComputers.cpp File Reference
#include <iostream>
#include "DGtal/base/Common.h"
#include "DGtal/kernel/NumberTraits.h"
#include "DGtal/geometry/tools/determinant/C2x2DetComputer.h"
#include "DGtal/geometry/tools/determinant/Simple2x2DetComputer.h"
#include "DGtal/geometry/tools/determinant/SimpleIncremental2x2DetComputer.h"
#include "DGtal/geometry/tools/determinant/AvnaimEtAl2x2DetSignComputer.h"
#include "DGtal/geometry/tools/determinant/Filtered2x2DetComputer.h"
Include dependency graph for test2x2DetComputers.cpp:

Go to the source code of this file.

Functions

template<typename DetComputer >
bool simpleTest2x2DetComputer (DetComputer aComputer)
 
template<typename I1 , typename I2 >
bool hasTheSameSign (I1 x1, I2 x2)
 
DGtal::int32_t randomBelow2exp15 ()
 
DGtal::int32_t adHocRandom ()
 
template<typename DetComputer >
bool randomTest2x2DetComputer (DetComputer aComputer)
 
int main (int argc, char **argv)
 

Detailed Description

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Author
Tristan Roussillon (trist.nosp@m.an.r.nosp@m.oussi.nosp@m.llon.nosp@m.@liri.nosp@m.s.cn.nosp@m.rs.fr ) Laboratoire d'InfoRmatique en Image et Systèmes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
Date
2013/11/18

Functions for testing classes that implements a model of C2x2DetComputer.

This file is part of the DGtal library.

Definition in file test2x2DetComputers.cpp.

Function Documentation

◆ adHocRandom()

DGtal::int32_t adHocRandom ( )

Definition at line 188 of file test2x2DetComputers.cpp.

189{
191 32768 * ( randomBelow2exp15() );
192 return ((rand() % 2) ? x : -x);
193}
boost::int32_t int32_t
signed 32-bit integer.
Definition BasicTypes.h:72
DGtal::int32_t randomBelow2exp15()

References randomBelow2exp15().

Referenced by randomTest2x2DetComputer().

◆ hasTheSameSign()

template<typename I1 , typename I2 >
bool hasTheSameSign ( I1 x1,
I2 x2 )

Function that retuns 'true' if x1 and x2 have the same sign:

  • both strictly positive
  • both strictly negative
  • both null and 'false' otherwise.
Parameters
x1a first integer
x2a second integer
Template Parameters
I1type of the first integer
I2type of the second integer

Definition at line 159 of file test2x2DetComputers.cpp.

160{
161 if (x1 == NumberTraits<I1>::ZERO)
162 {
163 if (x2 == NumberTraits<I2>::ZERO)
164 return true;
165 else
166 return false;
167 }
168 else if (x1 > NumberTraits<I1>::ZERO)
169 {
170 if (x2 > NumberTraits<I2>::ZERO)
171 return true;
172 else
173 return false;
174 }
175 else //if (x1 < NumberTraits<I1>::ZERO)
176 {
177 if (x2 < NumberTraits<I2>::ZERO)
178 return true;
179 else
180 return false;
181 }
182}
Aim: The traits class for all models of Cinteger.

Referenced by randomTest2x2DetComputer().

◆ main()

int main ( int argc,
char ** argv )

Definition at line 245 of file test2x2DetComputers.cpp.

246{
247 trace.beginBlock ( "Testing class 2x2DetComputers" );
248 trace.info() << "Args:";
249 for ( int i = 0; i < argc; ++i )
250 trace.info() << " " << argv[ i ];
251 trace.info() << endl;
252
253 bool res = true;
254
255
256 res = res
259#ifdef WITH_BIGINTEGER
261#endif
264#ifdef WITH_BIGINTEGER
266#endif
272
273#ifdef WITH_BIGINTEGER
276#endif
279 ;
280
281 trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
282 trace.endBlock();
283 return res ? 0 : 1;
284}
Aim: Class that provides a way of computing the sign of the determinant of a 2x2 matrix from its four...
Aim: Class that provides a way of computing the sign of the determinant of a 2x2 matrix from its four...
Aim: Small class useful to compute the determinant of a 2x2 matrix from its four coefficients,...
Aim: Small class useful to compute, in an incremental way, the determinant of a 2x2 matrix from its f...
void beginBlock(const std::string &keyword="")
std::ostream & emphase()
std::ostream & info()
double endBlock()
Trace trace
Definition Common.h:153
bool randomTest2x2DetComputer(DetComputer aComputer)
bool simpleTest2x2DetComputer(DetComputer aComputer)

References DGtal::Trace::beginBlock(), DGtal::Trace::emphase(), DGtal::Trace::endBlock(), DGtal::Trace::info(), randomTest2x2DetComputer(), simpleTest2x2DetComputer(), and DGtal::trace.

◆ randomBelow2exp15()

DGtal::int32_t randomBelow2exp15 ( )

Definition at line 184 of file test2x2DetComputers.cpp.

185{
186 return static_cast<DGtal::int32_t>(rand() % 32768);
187}

Referenced by adHocRandom().

◆ randomTest2x2DetComputer()

template<typename DetComputer >
bool randomTest2x2DetComputer ( DetComputer aComputer)

Function that compares the result returned by aComputer against the result returned by Simple2x2DetComputer using integers on 32 and 64 bits for various matrices whose entries are random integers whose absolute value is less than 2^32.

Parameters
aComputera determinant computer to test
Template Parameters
DetComputera model of CIncremental2x2DetComputer

Definition at line 205 of file test2x2DetComputers.cpp.

206{
207 BOOST_CONCEPT_ASSERT(( C2x2DetComputer<DetComputer> ));
208
210 TrueComputer trueComputer;
211
212 trace.beginBlock ( "Testing block ..." );
213 trace.info() << trueComputer << " vs " << aComputer << endl;
214
215 bool isOk = true;
216
217 DGtal::int32_t a, b, x, y;
218
219 const int n = 10000;
220 for (int i = 0; ( (i < n)&&(isOk) ); ++i)
221 {
222 a = adHocRandom();
223 b = adHocRandom();
224 x = adHocRandom();
225 y = adHocRandom();
226 trueComputer.init(a, b);
227 aComputer.init(a, b);
228 TrueComputer::Value trueRes = trueComputer(x,y);
229 typename DetComputer::Value res = aComputer(x,y);
230 // trace.info() << a << "." << y << " - "
231 // << b << " " << x << " => "
232 // << trueRes << " / " << res << endl;
233 if ( !hasTheSameSign( trueRes, res ) )
234 isOk = false;
235 }
236
237 trace.endBlock();
238
239 return isOk;
240}
Aim: This concept gathers all models that are able to compute the (sign of the) determinant of a 2x2 ...
DGtal::int32_t adHocRandom()
bool hasTheSameSign(I1 x1, I2 x2)

References adHocRandom(), DGtal::Trace::beginBlock(), DGtal::Trace::endBlock(), hasTheSameSign(), DGtal::Trace::info(), and DGtal::trace.

Referenced by main().

◆ simpleTest2x2DetComputer()

template<typename DetComputer >
bool simpleTest2x2DetComputer ( DetComputer aComputer)

Function that compares the result returned by aComputer with a ground truth in each quadrant.

Parameters
aComputerany determinant computer
Template Parameters
DetComputera model of CIncremental2x2DetComputer

Definition at line 56 of file test2x2DetComputers.cpp.

57{
58 BOOST_CONCEPT_ASSERT(( C2x2DetComputer<DetComputer> ));
59 typedef typename DetComputer::Integer Integer;
60 typedef typename DetComputer::Value Value;
61
62 unsigned int nbok = 0;
63 unsigned int nb = 0;
64
65 trace.beginBlock ( "Testing block ..." );
66 trace.info() << aComputer << endl;
67
68 Integer a = 5;
69 Integer b = 2;
70
71
72 //first quadrant
73 aComputer.init(a,b);
74 if (aComputer(2,1) == NumberTraits<Value>::ONE)
75 nbok++;
76 nb++;
77 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
78
79 if (aComputer(3,1) == -NumberTraits<Value>::ONE)
80 nbok++;
81 nb++;
82 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
83
84 if (aComputer(5,2) == NumberTraits<Value>::ZERO)
85 nbok++;
86 nb++;
87 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
88
89 //second quadrant
90 aComputer.init(-a,b);
91 if (aComputer(2,-1) == NumberTraits<Value>::ONE)
92 nbok++;
93 nb++;
94 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
95
96 if (aComputer(3,-1) == -NumberTraits<Value>::ONE)
97 nbok++;
98 nb++;
99 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
100
101 if (aComputer(5,-2) == NumberTraits<Value>::ZERO)
102 nbok++;
103 nb++;
104 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
105
106 //third quadrant
107 aComputer.init(-a,-b);
108 if (aComputer(-2,-1) == NumberTraits<Value>::ONE)
109 nbok++;
110 nb++;
111 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
112
113 if (aComputer(-3,-1) == -NumberTraits<Value>::ONE)
114 nbok++;
115 nb++;
116 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
117
118 if (aComputer(-5,-2) == NumberTraits<Value>::ZERO)
119 nbok++;
120 nb++;
121 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
122
123 //fourth quadrant
124 aComputer.init(a,-b);
125 if (aComputer(-2,1) == NumberTraits<Value>::ONE)
126 nbok++;
127 nb++;
128 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
129
130 if (aComputer(-3,1) == -NumberTraits<Value>::ONE)
131 nbok++;
132 nb++;
133 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
134
135 if (aComputer(-5,2) == NumberTraits<Value>::ZERO)
136 nbok++;
137 nb++;
138 trace.info() << "(" << nbok << "/" << nb << ") " << endl;
139
140 trace.endBlock();
141
142 return nbok == nb;
143}

References DGtal::Trace::beginBlock(), DGtal::Trace::endBlock(), DGtal::Trace::info(), and DGtal::trace.

Referenced by main().