DGtal 1.4.0
Loading...
Searching...
No Matches
testPowerMap.cpp File Reference
#include <iostream>
#include <array>
#include "DGtal/base/Common.h"
#include "DGtal/helpers/StdDefs.h"
#include "DGtal/geometry/volumes/distance/PowerMap.h"
#include "DGtal/geometry/volumes/distance/ExactPredicateLpPowerSeparableMetric.h"
#include "DGtal/geometry/volumes/distance/ReverseDistanceTransformation.h"
#include "DGtal/kernel/sets/DigitalSetDomain.h"
#include "DGtal/images/ImageContainerBySTLMap.h"
#include "DGtal/images/ImageContainerBySTLVector.h"
#include "DGtal/kernel/sets/DigitalSetBySTLSet.h"
Include dependency graph for testPowerMap.cpp:

Go to the source code of this file.

Functions

template<std::size_t N>
std::array< bool, N > getPeriodicityFromInteger (std::size_t anInteger)
 
template<std::size_t N>
std::string formatPeriodicity (std::array< bool, N > const &aPeriodicity)
 
template<typename PowerMap >
bool checkPowerMap (const PowerMap &aPowerMap)
 
bool testPowerMap (std::array< bool, 2 > const &aPeriodicity={{ false, false }})
 
bool testCheckConcept ()
 
template<typename Set >
bool testPowerMapFromSites (const Set &aSet)
 
template<typename Set >
bool testPowerMapFromSites (const Set &aSet, std::array< bool, Set::Space::dimension > const &periodicity)
 
bool testSimple2D ()
 
bool testSimple3D ()
 
bool testSimple4D ()
 
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
David Coeurjolly (david.nosp@m..coe.nosp@m.urjol.nosp@m.ly@l.nosp@m.iris..nosp@m.cnrs.nosp@m..fr ) Laboratoire d'InfoRmatique en Image et Systèmes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
Date
2012/10/25

Functions for testing class PowerMap.

This file is part of the DGtal library.

Definition in file testPowerMap.cpp.

Function Documentation

◆ checkPowerMap()

template<typename PowerMap >
bool checkPowerMap ( const PowerMap & aPowerMap)

Validates the PowerMap

Definition at line 91 of file testPowerMap.cpp.

92{
93 using Point = typename PowerMap::Point;
94
95 // Domain extent
96 Point const extent = aPowerMap.domain().upperBound() - aPowerMap.domain().lowerBound() + Point::diagonal();
97
98 // Site shifting depending on the periodicity.
99 std::vector< typename PowerMap::PeriodicitySpec > periodicShift;
100 for ( typename PowerMap::Space::Dimension i = 0; i < ( 1u << PowerMap::Space::dimension ); ++i )
101 {
103
104 // Checking if this periodicity possibility is valid.
105 bool isValid = true;
106 for ( typename PowerMap::Space::Dimension j = 0; j < periodicity.size(); ++j )
107 if ( periodicity[j] && ! aPowerMap.isPeriodic(j) )
108 {
109 isValid = false;
110 break;
111 }
112
113 if ( isValid )
114 periodicShift.push_back( periodicity );
115 }
116
117 // Weight image
118 auto const& image = *(aPowerMap.weightImagePtr());
119
120 // Power metric
121 auto const& metric = *(aPowerMap.metricPtr());
122
123 // Pruning sites.
125 for ( auto const& pt : image.domain() )
126 if ( image(pt) > 0 )
127 aSet.insertNew( pt );
128
129 // Checking site for all domain points.
130 for ( auto const& pt : aPowerMap.domain() )
131 {
132 // Getting reference size.
133 const Point psite = aPowerMap(pt);
134 const Point boundedPSite = aPowerMap.projectPoint( psite );
135
136 // Checking that the reference site is actually a given site.
137 // Also testing projectPoint method.
138 if ( std::find( aSet.begin(), aSet.end(), boundedPSite ) == aSet.end() )
139 {
140 trace.error() << "The PowerMap point " << psite
141 << " projected to " << aPowerMap.projectPoint( psite )
142 << " is not a valid site." << std::endl;
143 return false;
144 }
145
146 // Calculating reference power distance.
147 const auto dist = metric.powerDistance( pt, psite, image( boundedPSite ) );
148
149 // Checking if we can found a better site.
150 for ( auto site : aSet )
151 {
152 // Trying all shifting possibilities of the site depending on the domain periodicity.
153 for ( auto const & periodicity : periodicShift )
154 {
155 auto currSite = site;
156
157 // Shifting site.
158 for ( typename PowerMap::Space::Dimension dim = 0; dim < PowerMap::Space::dimension ; ++dim )
159 if ( periodicity[dim] )
160 currSite[dim] += ( pt[dim] < currSite[dim] ? -1 : 1 ) * extent[dim];
161
162 // Checking raw-distance.
163 const auto dbis = metric.powerDistance( pt, currSite, image( site ) );
164 if ( dbis < dist )
165 {
166 trace.error() << "DT Error at " << pt
167 << " PowerMap:" << psite << "@" << image(boundedPSite) << " (" << dist << ")"
168 << " from set:" << site << "@" << image(site) << " (" << dbis << ")"
169 << " projected from " << currSite << "." << std::endl;
170 return false;
171 }
172 }
173 }
174 }
175
176 return true;
177}
Aim: A container class for storing sets of digital points within some given domain.
const WeightImage * weightImagePtr() const
Definition PowerMap.h:275
Point projectPoint(Point aPoint) const
bool isPeriodic(const Dimension n) const
Definition PowerMap.h:295
const Domain & domain() const
Definition PowerMap.h:239
const PowerSeparableMetric * metricPtr() const
Definition PowerMap.h:267
Space::Point Point
Definition PowerMap.h:124
std::ostream & error()
Trace trace
Definition Common.h:153
MyPointD Point
std::array< bool, N > getPeriodicityFromInteger(std::size_t anInteger)
Domain domain

References DGtal::DigitalSetBySTLSet< TDomain, TCompare >::begin(), dim, DGtal::PowerMap< TWeightImage, TPowerSeparableMetric, TImageContainer >::domain(), DGtal::DigitalSetBySTLSet< TDomain, TCompare >::end(), DGtal::Trace::error(), getPeriodicityFromInteger(), DGtal::DigitalSetBySTLSet< TDomain, TCompare >::insertNew(), DGtal::PowerMap< TWeightImage, TPowerSeparableMetric, TImageContainer >::isPeriodic(), DGtal::PowerMap< TWeightImage, TPowerSeparableMetric, TImageContainer >::metricPtr(), DGtal::PowerMap< TWeightImage, TPowerSeparableMetric, TImageContainer >::projectPoint(), DGtal::trace, and DGtal::PowerMap< TWeightImage, TPowerSeparableMetric, TImageContainer >::weightImagePtr().

Referenced by testPowerMapFromSites().

◆ formatPeriodicity()

template<std::size_t N>
std::string formatPeriodicity ( std::array< bool, N > const & aPeriodicity)

Format a periodicity specification array as a string.

Parameters
aPeriodicitythe periodicity specification array.
Returns
a string which ith character is '0' if the ith dimension is non-periodic, '1' otherwise.

Definition at line 79 of file testPowerMap.cpp.

80{
81 std::string str;
82 for ( std::size_t i = 0; i < N; ++i )
83 str += aPeriodicity[i] ? '1' : '0';
84
85 return str;
86}

Referenced by testSimple2D(), testSimple3D(), and testSimple4D().

◆ getPeriodicityFromInteger()

template<std::size_t N>
std::array< bool, N > getPeriodicityFromInteger ( std::size_t anInteger)

Returns periodicity specification from an integer between 0 and 2^n - 1.

From an integer between 0 and 2^n-1, it returns a boolean array of size n whith value true at position i if the ith bit of the integer is set, false otherwise.

Template Parameters
Nsize of the periodicity specification array.
Parameters
anIntegeran integer between 0 and 2^N-1.
Returns
a periodicity specification array.

Definition at line 63 of file testPowerMap.cpp.

64{
65 std::array<bool, N> periodicity;
66 for ( std::size_t i = 0, mask = 1 ; i < N ; ++i, mask *= 2 )
67 periodicity[i] = anInteger & mask;
68
69 return periodicity;
70}

Referenced by checkPowerMap(), testSimple2D(), testSimple3D(), and testSimple4D().

◆ main()

int main ( int argc,
char ** argv )

Definition at line 428 of file testPowerMap.cpp.

429{
430 trace.beginBlock ( "Testing class PowerMap" );
431 trace.info() << "Args:";
432 for ( int i = 0; i < argc; ++i )
433 trace.info() << " " << argv[ i ];
434 trace.info() << endl;
435
436 bool res = testCheckConcept()
437 && testPowerMap()
438 && testPowerMap( {{ true, false }} )
439 && testPowerMap( {{ false, true }} )
440 && testPowerMap( {{ true, true }} )
441 && testSimple2D()
442 && testSimple3D()
443 && testSimple4D()
444 ; // && ... other tests
445
446 trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
447 trace.endBlock();
448 return res ? 0 : 1;
449}
void beginBlock(const std::string &keyword="")
std::ostream & emphase()
std::ostream & info()
double endBlock()
bool testSimple2D()
bool testSimple3D()
bool testCheckConcept()
bool testSimple4D()
bool testPowerMap(std::array< bool, 2 > const &aPeriodicity={{ false, false }})

References DGtal::Trace::beginBlock(), DGtal::Trace::emphase(), DGtal::Trace::endBlock(), DGtal::Trace::info(), testCheckConcept(), testPowerMap(), testSimple2D(), testSimple3D(), testSimple4D(), and DGtal::trace.

◆ testCheckConcept()

bool testCheckConcept ( )

Definition at line 277 of file testPowerMap.cpp.

278{
281 using PowerMetric = Z2i::L2PowerMetric;
282
283 BOOST_CONCEPT_ASSERT(( concepts::CConstImage< PowerMap< Image, PowerMetric > >));
284
285 return true;
286}
Aim: Constructs a domain limited to the given digital set.
Aim: implements association bewteen points lying in a digital domain and values.
Definition Image.h:70
Aim: Implementation of the linear in time Power map construction.
Definition PowerMap.h:111
ExactPredicateLpPowerSeparableMetric< Space, 2 > L2PowerMetric
Definition StdDefs.h:120
Aim: Defines the concept describing a read-only image, which is a refinement of CPointFunctor.
Definition CConstImage.h:95

Referenced by main().

◆ testPowerMap()

bool testPowerMap ( std::array< bool, 2 > const & aPeriodicity = {{ false, false }})

Example of a test. To be completed.

Definition at line 183 of file testPowerMap.cpp.

183 {{ false, false }} )
184{
185 unsigned int nbok = 0;
186 unsigned int nb = 0;
187
188 trace.beginBlock ( "Testing PowerMap2D with periodicity " + formatPeriodicity(aPeriodicity) );
189
191 Z2i::Domain domainLarge(Z2i::Point(0,0),Z2i::Point(10,10));
192
194 set.insertNew(Z2i::Point(3,3));
195 //set.insertNew(Z2i::Point(3,7));
196 set.insertNew(Z2i::Point(7,7));
197
200
201 Image image( new SetDomain( set ) );
202
203 //Setting some values
204 image.setValue(Z2i::Point(3,3), 9);
205 // image.setValue(Z2i::Point(3,7), 0);
206 image.setValue(Z2i::Point(7,7), 16);
207
208 Z2i::L2PowerMetric l2power;
209 PowerMap<Image, Z2i::L2PowerMetric> power(&domainLarge, &image, &l2power, aPeriodicity);
210 for(unsigned int i=0; i<11; i++)
211 {
212 for(unsigned int j=0; j<11; j++)
213 if (image.domain().isInside(Z2i::Point(i,j)))
214 trace.info()<< image(Z2i::Point(i,j))<<" ";
215 else
216 trace.info()<< "0 ";
217 trace.info()<<std::endl;
218 }
219 trace.info()<<std::endl;
220
221 //Power Map
222 for(unsigned int i=0; i<11; i++)
223 {
224 for(unsigned int j=0; j<11; j++)
225 trace.info()<< power(Z2i::Point(i,j))[0]<<","<<power(Z2i::Point(i,j))[1]<<" ";
226 trace.info()<<std::endl;
227 }
228 trace.info() << "REDT" << std::endl;
229 trace.info() << std::endl;
230
231 // Checking PowerMap validity.
232 trace.beginBlock("Validating the Power Map");
233 nbok += checkPowerMap( power ) ? 1 : 0;
234 nb++;
235 trace.endBlock();
236 trace.info() << std::endl;
237
238 //Reconstruction
239 for(unsigned int i=0; i<11; i++)
240 {
241 for(unsigned int j=0; j<11; j++)
242 {
243 Z2i::Point p(i,j);
244 DGtal::int64_t dist = (i-power(p)[0])*(i-power(p)[0]) +
245 ( j-power(p)[1])*(j-power(p)[1]) - image( power.projectPoint(power(p)) );
246 trace.info()<< dist;
247 }
248 std::cerr<<std::endl;
249 }
250 trace.info()<<std::endl;
251
252 //Reconstruction
253 for(unsigned int i=0; i<11; i++)
254 {
255 for(unsigned int j=0; j<11; j++)
256 {
257 Z2i::Point p(i,j);
258 const auto dist = (i-power(p)[0])*(i-power(p)[0]) +
259 ( j-power(p)[1])*(j-power(p)[1]) - image( power.projectPoint(power(p)) );
260 if (dist>=0)
261 std::cerr<< "0 ";
262 else
263 std::cerr<< "X ";
264 }
265 std::cerr<<std::endl;
266 }
267
268 nbok ++;
269 nb++;
270 trace.info() << "(" << nbok << "/" << nb << ") "
271 << "true == true" << std::endl;
272 trace.endBlock();
273
274 return nbok == nb;
275}
Aim: implements weighted separable l_p metrics with exact predicates.
T power(const T &aVal, const unsigned int exponent)
boost::int64_t int64_t
signed 94-bit integer.
Definition BasicTypes.h:74
std::string formatPeriodicity(std::array< bool, N > const &aPeriodicity)
bool checkPowerMap(const PowerMap &aPowerMap)

Referenced by main().

◆ testPowerMapFromSites() [1/2]

template<typename Set >
bool testPowerMapFromSites ( const Set & aSet)

Definition at line 289 of file testPowerMap.cpp.

290{
291 std::array<bool, Set::dimension> periodicity;
292 periodicity.fill( false );
293 return testPowerMapFromSites( aSet, periodicity );
294}
bool testPowerMapFromSites(const Set &aSet)

References testPowerMapFromSites().

Referenced by testPowerMapFromSites(), testSimple2D(), testSimple3D(), and testSimple4D().

◆ testPowerMapFromSites() [2/2]

template<typename Set >
bool testPowerMapFromSites ( const Set & aSet,
std::array< bool, Set::Space::dimension > const & periodicity )

Definition at line 297 of file testPowerMap.cpp.

298{
299 unsigned int nbok = 0;
300 unsigned int nb = 0;
301
302 using SetDomain = DigitalSetDomain< Set >;
304
305 // Weight image.
306 Image image( new SetDomain( aSet ) );
307
308 // Setting weights
309 typename Image::Value weight = 2;
310 for ( auto const & pt : image.domain() )
311 {
312 image.setValue( pt, weight );
313 weight *= 2;
314 }
315
316 trace.beginBlock(" Power Map computation l_2");
319 L2PowerMetric l2;
320 Power2 power2( aSet.domain(), image, l2, periodicity);
321 trace.endBlock();
322
323 trace.beginBlock("Validating the Power Map");
324 nbok += checkPowerMap( power2 ) ? 1 : 0;
325 nb++;
326 trace.endBlock();
327
328 trace.beginBlock(" Power Map computation l_3");
331 L3PowerMetric l3;
332 Power3 power3( aSet.domain(), image, l3, periodicity);
333 trace.endBlock();
334
335 trace.beginBlock("Validating the Power Map l_3");
336 nbok += checkPowerMap( power3 ) ? 1 : 0;
337 nb++;
338 trace.endBlock();
339
340 trace.beginBlock("Reverse DT computation");
342 RDT rdt(aSet.domain(), power2.weightImagePtr(), l2, periodicity);
343 trace.endBlock();
344
345 return nbok == nb;
346}
Aim: Implementation of the linear in time reverse distance transformation for separable metrics.

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

◆ testSimple2D()

bool testSimple2D ( )

Definition at line 348 of file testPowerMap.cpp.

349{
350
351 Z2i::Point a(-10,-10);
352 Z2i::Point b(10,10);
353 Z2i::Domain domain(a,b);
354
356 bool ok = true;
357
358 sites.insertNew( Z2i::Point(3,-6));
359 sites.insertNew( Z2i::Point(9,0));
360 sites.insertNew( Z2i::Point(-3,0));
361
362 for ( std::size_t i = 0; i < 4; ++i )
363 {
364 auto const periodicity = getPeriodicityFromInteger<2>(i);
365 trace.beginBlock( "Simple2D with periodicity " + formatPeriodicity(periodicity) );
366 ok = ok && testPowerMapFromSites( sites, periodicity );
367 trace.endBlock();
368 }
369
370 return ok;
371
372}

References DGtal::Trace::beginBlock(), domain, DGtal::Trace::endBlock(), formatPeriodicity(), getPeriodicityFromInteger(), DGtal::DigitalSetBySTLSet< TDomain, TCompare >::insertNew(), testPowerMapFromSites(), and DGtal::trace.

Referenced by main().

◆ testSimple3D()

bool testSimple3D ( )

Definition at line 374 of file testPowerMap.cpp.

375{
376
377 Z3i::Point a(-10,-10,-10);
378 Z3i::Point b(10,10,10);
379 Z3i::Domain domain(a,b);
380
382 bool ok = true;
383
384 sites.insertNew( Z3i::Point(0,0,-6));
385 sites.insertNew( Z3i::Point(6,0,0));
386 sites.insertNew( Z3i::Point(-6,0,3));
387
388 for ( std::size_t i = 0; i < 8; ++i )
389 {
390 auto const periodicity = getPeriodicityFromInteger<3>(i);
391 trace.beginBlock( "Simple3D with periodicity " + formatPeriodicity(periodicity) );
392 ok = ok && testPowerMapFromSites( sites, periodicity );
393 trace.endBlock();
394 }
395
396 return ok;
397}

References DGtal::Trace::beginBlock(), domain, DGtal::Trace::endBlock(), formatPeriodicity(), getPeriodicityFromInteger(), DGtal::DigitalSetBySTLSet< TDomain, TCompare >::insertNew(), testPowerMapFromSites(), and DGtal::trace.

Referenced by main().

◆ testSimple4D()

bool testSimple4D ( )

Definition at line 399 of file testPowerMap.cpp.

400{
401
402 typedef SpaceND<4> Space4;
403 Space4::Point a(0,0,0,0);
404 Space4::Point b(5,5,5,5);
406
408 bool ok = true;
409
410 sites.insertNew( Space4::Point(1,4,1,1));
411 sites.insertNew( Space4::Point(3,1,3,1));
412 sites.insertNew( Space4::Point(0,0,0,0));
413
414 for ( std::size_t i = 0; i < 16; ++i )
415 {
416 auto const periodicity = getPeriodicityFromInteger<4>(i);
417 trace.beginBlock( "Simple4D with periodicity " + formatPeriodicity(periodicity) );
418 ok = ok && testPowerMapFromSites( sites, periodicity );
419 trace.endBlock();
420 }
421
422 return ok;
423}

References DGtal::Trace::beginBlock(), domain, DGtal::Trace::endBlock(), formatPeriodicity(), getPeriodicityFromInteger(), DGtal::DigitalSetBySTLSet< TDomain, TCompare >::insertNew(), testPowerMapFromSites(), and DGtal::trace.

Referenced by main().