37#include <forward_list>
38#include <boost/version.hpp>
39#include <boost/random/mersenne_twister.hpp>
40#include <boost/random/uniform_smallint.hpp>
41#include <boost/random/uniform_01.hpp>
42#include <boost/random/geometric_distribution.hpp>
43#include <boost/random/variate_generator.hpp>
45#include "DGtal/base/Common.h"
46#include "DGtal/base/LabelledMap.h"
50#define BOOST_MAJOR_VERSION (BOOST_VERSION / 100000)
51#define BOOST_MINOR_VERSION (( BOOST_VERSION / 100) % 1000)
52#define BOOST_SUBMINOR_VERSION (BOOST_VERSION % 100)
72template <
typename Value,
unsigned int L,
unsigned int X,
unsigned int Y>
88 for (
unsigned int l = 0; l <
L; ++l )
89 for (
unsigned int y = 0; y < Y; ++y )
90 for (
unsigned int x = 0; x < X; ++x )
95 const Value &
value(
unsigned int l,
unsigned int x,
unsigned int y )
const
97 return _data[ l ][ x ][ y ];
95 const Value &
value(
unsigned int l,
unsigned int x,
unsigned int y )
const {
…}
100 unsigned int erase(
unsigned int l,
unsigned int x,
unsigned int y )
100 unsigned int erase(
unsigned int l,
unsigned int x,
unsigned int y ) {
…}
111 void setValue(
const Value & val,
unsigned int l,
unsigned int x,
unsigned int y )
113 _data[ l ][ x ][ y ] = val;
111 void setValue(
const Value & val,
unsigned int l,
unsigned int x,
unsigned int y ) {
…}
118 _data[ l ][ x ][ y ] = val;
121 bool hasLabel(
unsigned int l,
unsigned int x,
unsigned int y )
const
121 bool hasLabel(
unsigned int l,
unsigned int x,
unsigned int y )
const {
…}
127 unsigned int x,
unsigned int y )
const
130 for (
unsigned int l = 0; l <
L; ++l )
132 labels.push_back( l );
135 unsigned int nbLabels(
unsigned int x,
unsigned int y )
const
138 for (
unsigned int l = 0; l <
L; ++l )
135 unsigned int nbLabels(
unsigned int x,
unsigned int y )
const {
…}
143 void display ( ostream & ,
unsigned int ,
unsigned int ,
unsigned int )
143 void display ( ostream & ,
unsigned int ,
unsigned int ,
unsigned int ) {
…}
147 unsigned long long area()
const
149 return L * X * Y *
sizeof(
Value );
160template <
typename Value,
unsigned int L,
unsigned int X,
unsigned int Y>
162 typedef typename std::map<unsigned int, Value>
MyMap;
175 for (
unsigned int y = 0; y < Y; ++y )
176 for (
unsigned int x = 0; x < X; ++x )
181 const Value &
value(
unsigned int l,
unsigned int x,
unsigned int y )
183 return _data[ x ][ y ][ l ];
181 const Value &
value(
unsigned int l,
unsigned int x,
unsigned int y ) {
…}
186 unsigned int erase(
unsigned int l,
unsigned int x,
unsigned int y )
188 return _data[ x ][ y ].erase( l );
186 unsigned int erase(
unsigned int l,
unsigned int x,
unsigned int y ) {
…}
192 void setValue(
const Value & val,
unsigned int l,
unsigned int x,
unsigned int y )
194 _data[ x ][ y ][ l ] = val;
192 void setValue(
const Value & val,
unsigned int l,
unsigned int x,
unsigned int y ) {
…}
199 _data[ x ][ y ][ l ] = val;
202 bool hasLabel(
unsigned int l,
unsigned int x,
unsigned int y )
const
204 return _data[ x ][ y ].count( l ) != 0;
202 bool hasLabel(
unsigned int l,
unsigned int x,
unsigned int y )
const {
…}
208 unsigned int x,
unsigned int y )
const
213 labels.push_back( (*it).first );
216 unsigned int nbLabels(
unsigned int x,
unsigned int y )
const
218 return (
unsigned int)
_data[ x ][ y ].size();
216 unsigned int nbLabels(
unsigned int x,
unsigned int y )
const {
…}
221 void display ( ostream & ,
unsigned int,
unsigned int ,
unsigned int )
221 void display ( ostream & ,
unsigned int,
unsigned int ,
unsigned int ) {
…}
226 unsigned long long area()
const
228 unsigned long long total = 0;
229 for (
unsigned int y = 0; y < Y; ++y )
230 for (
unsigned int x = 0; x < X; ++x )
232 unsigned int size =
nbLabels( x, y );
233 total += ( size + 1 ) *
235 + 3 *
sizeof(
Value* )
255template <
typename Value,
unsigned int L,
unsigned int X,
unsigned int Y>
257 typedef typename std::pair<DGtal::uint16_t, Value>
MyPair;
258 typedef typename std::forward_list<MyPair>
MyList;
272 for (
unsigned int y = 0; y < Y; ++y )
273 for (
unsigned int x = 0; x < X; ++x )
278 const Value &
value(
unsigned int l,
unsigned int x,
unsigned int y )
281 Iterator it = list.begin(), it_end = list.end();
282 for ( ; it != it_end; ++it )
284 if ( it->first == l )
return it->second;
286 ASSERT ( it == it_end ) ;
287 list.emplace_front( std::make_pair( l,
Value() ) );
288 return list.front().second;
278 const Value &
value(
unsigned int l,
unsigned int x,
unsigned int y ) {
…}
291 unsigned int erase(
unsigned int l,
unsigned int x,
unsigned int y )
294 Iterator it_prev = list.before_begin();
295 Iterator it = list.begin(), it_end = list.end();
296 for ( ; it != it_end; ++it )
298 if ( it->first == l )
300 list.erase_after( it_prev );
291 unsigned int erase(
unsigned int l,
unsigned int x,
unsigned int y ) {
…}
309 void setValue(
const Value & val,
unsigned int l,
unsigned int x,
unsigned int y )
312 Iterator it = list.begin(), it_end = list.end();
313 for ( ; it != it_end; ++it )
315 if ( it->first == l )
322 list.emplace_front( std::make_pair( l, val ) );
309 void setValue(
const Value & val,
unsigned int l,
unsigned int x,
unsigned int y ) {
…}
328 Iterator it = list.begin(), it_end = list.end();
329 for ( ; it != it_end; ++it )
331 if ( it->first == l )
338 list.emplace_front( std::make_pair( l, val ) );
341 bool hasLabel(
unsigned int l,
unsigned int x,
unsigned int y )
const
345 for ( ; it != it_end; ++it )
347 if ( it->first == l )
return true;
341 bool hasLabel(
unsigned int l,
unsigned int x,
unsigned int y )
const {
…}
353 unsigned int x,
unsigned int y )
const
358 for ( ; it != it_end; ++it )
360 labels.push_back( (*it).first );
364 unsigned int nbLabels(
unsigned int x,
unsigned int y )
const
369 for ( ; it != it_end; ++it )
364 unsigned int nbLabels(
unsigned int x,
unsigned int y )
const {
…}
374 void display ( ostream & ,
unsigned int ,
unsigned int ,
unsigned int )
374 void display ( ostream & ,
unsigned int ,
unsigned int ,
unsigned int ) {
…}
379 unsigned long long area()
const
381 unsigned long long total = 0;
382 for (
unsigned int y = 0; y < Y; ++y )
383 for (
unsigned int x = 0; x < X; ++x )
385 unsigned int size =
nbLabels( x, y );
386 total +=
sizeof(
Value* )
410template <
typename Value,
unsigned int L,
unsigned int X,
unsigned int Y,
411 typename TWord,
unsigned int N,
unsigned int M >
421 const Value &
value(
unsigned int l,
unsigned int x,
unsigned int y )
const
423 return _data[ x ][ y ].fastAt( l );
421 const Value &
value(
unsigned int l,
unsigned int x,
unsigned int y )
const {
…}
427 void setValue(
const Value & val,
unsigned int l,
unsigned int x,
unsigned int y )
429 _data[ x ][ y ][ l ] = val;
427 void setValue(
const Value & val,
unsigned int l,
unsigned int x,
unsigned int y ) {
…}
433 unsigned int erase(
unsigned int l,
unsigned int x,
unsigned int y )
435 return _data[ x ][ y ].erase( l );
433 unsigned int erase(
unsigned int l,
unsigned int x,
unsigned int y ) {
…}
441 _data[ x ][ y ].fastAt( l ) = val;
445 bool hasLabel(
unsigned int l,
unsigned int x,
unsigned int y )
const
447 return _data[ x ][ y ].count( l );
445 bool hasLabel(
unsigned int l,
unsigned int x,
unsigned int y )
const {
…}
452 unsigned int x,
unsigned int y )
const
454 _data[ x ][ y ].labels().getLabels( labels );
458 unsigned int nbLabels(
unsigned int x,
unsigned int y )
const
460 return _data[ x ][ y ].size();
458 unsigned int nbLabels(
unsigned int x,
unsigned int y )
const {
…}
462 inline void display ( ostream & ,
unsigned int ,
unsigned int x,
unsigned int y )
464 std::cerr <<
_data[ x ][ y ] << endl;
462 inline void display ( ostream & ,
unsigned int ,
unsigned int x,
unsigned int y ) {
…}
468 unsigned long long area()
const
470 unsigned long long total = 0;
471 for (
unsigned int y = 0; y < Y; ++y )
472 for (
unsigned int x = 0; x < X; ++x )
474 unsigned int size =
nbLabels( x, y );
477 total += ( 1 + ( size - N - 1 ) / M ) * ( M *
sizeof(
Value ) + 8 );
485#if (BOOST_MAJOR_VERSION >= 1 ) && (BOOST_MINOR_VERSION >= 47 )
486template <
typename MapLXY,
unsigned int L,
unsigned int X,
unsigned int Y>
488generateData( MapLXY & m,
double proba_no_label,
double proba_label )
490 boost::random::mt19937 rng;
492 boost::random::uniform_smallint<> diceL(0,
L-1);
493 boost::random::uniform_01<> diceDouble;
494 boost::random::geometric_distribution<> diceNbLabels( proba_label );
496 std::cerr <<
"E(Y)=" << ( (1-proba_label)/proba_label )
497 <<
" Var(Y)=" << ( (1-proba_label)/(proba_label*proba_label) )
499 unsigned int total = 0;
500 for (
unsigned int y = 0; y < Y; ++y )
501 for (
unsigned int x = 0; x < X; ++x )
503 if ( diceDouble( rng ) >= proba_no_label )
505 unsigned int nb = diceNbLabels( rng );
506 for (
unsigned int i = 0; i < nb; ++i )
508 unsigned int l = diceL( rng );
509 double v = diceDouble( rng );
510 m.setValue( v, l, x, y );
515 std::cerr <<
"- " << total <<
" insertions." << endl;
520template <
typename MapLXY,
unsigned int L,
unsigned int X,
unsigned int Y>
526 boost::uniform_smallint<> diceL(0,
L-1);
527 boost::uniform_01<> diceDouble;
528 boost::geometric_distribution<> nbLabelsDist( proba_label );
529 boost::variate_generator
531 boost::geometric_distribution<> > diceNbLabels( rng, nbLabelsDist);
533 std::cerr <<
"E(Y)=" << ( (1-proba_label)/proba_label )
534 <<
" Var(Y)=" << ( (1-proba_label)/(proba_label*proba_label) )
536 unsigned int total = 0;
537 for (
unsigned int y = 0; y < Y; ++y )
538 for (
unsigned int x = 0; x < X; ++x )
540 if ( diceDouble( rng ) >= proba_no_label )
542 unsigned int nb = diceNbLabels();
543 for (
unsigned int i = 0; i < nb; ++i )
545 unsigned int l = diceL( rng );
546 double v = diceDouble( rng );
547 m.setValue( v, l, x, y );
552 std::cerr <<
"- " << total <<
" insertions." << endl;
557template <
typename MapLXY,
unsigned int L,
unsigned int X,
unsigned int Y>
562 std::vector<unsigned int> labels;
563 for (
unsigned int y = 0; y < Y; ++y )
564 for (
unsigned int x = 0; x < X; ++x )
566 m.getLabels( labels, x, y );
567 for (
unsigned int i = 0; i < labels.size(); ++i )
568 sum += m.value( labels[ i ], x, y );
570 std::cerr <<
"- sum = " << sum <<
"." << endl;
574template <
typename MapLXY,
unsigned int L,
unsigned int X,
unsigned int Y>
579 for (
unsigned int y = 0; y < Y; ++y )
580 for (
unsigned int x = 0; x < X; ++x )
582 if ( m.hasLabel( l, x, y ) )
583 sum += m.value( l, x, y );
585 std::cerr <<
"- sum = " << sum <<
"." << endl;
589template <
typename MapLXY,
unsigned int L,
unsigned int X,
unsigned int Y>
593 unsigned int loc3 = 0;
594 for (
unsigned int y = 0; y < Y; ++y )
595 for (
unsigned int x = 0; x < X; ++x )
597 if ( ( m.hasLabel( l1, x, y ) )
598 && ( m.hasLabel( l2, x, y ) )
599 && ( m.hasLabel( l3, x, y ) ) )
602 std::cerr <<
"- " << loc3 <<
" places with " << l1 <<
", " << l2 <<
" ," << l3 << endl;
606template <
typename MapLXY,
unsigned int L,
unsigned int X,
unsigned int Y>
611 for (
unsigned int y = 0; y < Y; ++y )
612 for (
unsigned int x = 0; x < X; ++x )
614 nb += m.erase( l, x, y );
616 std::cerr <<
"- " << nb <<
" values deleted." << endl;
622 typedef double Value;
623 static const unsigned int X = 100;
624 static const unsigned int Y = 100;
625 static const unsigned int L = 16;
627 static const unsigned int N = 1;
628 static const unsigned int M = 5;
630 static const double PROBA_NO_LABEL = 0.75;
635 static const double PROBA_LABEL = 0.5;
643 trace.beginBlock (
"---------- ArrayLXY ---------------" );
644 trace.beginBlock (
"Generating ArrayLXY" );
645 MyArrayLXY* arrayLXY =
new MyArrayLXY( -1.0 );
649 trace.beginBlock (
"Memory usage in ArrayLXY" );
650 std::cerr << arrayLXY->area() <<
" bytes." << std::endl;
653 trace.beginBlock (
"Sum all values ArrayLXY" );
657 trace.beginBlock (
"Sum label 0 values ArrayLXY" );
661 trace.beginBlock (
"Sum label 15 values ArrayLXY" );
665 trace.beginBlock (
"Locate places (3, 7, 8) in ArrayLXY" );
669 trace.beginBlock (
"Erase label 9 in ArrayLXY" );
673 trace.beginBlock (
"Delete ArrayLXY" );
679 trace.beginBlock (
"---------- ArrayXYOfMap ---------------" );
680 trace.beginBlock (
"Generating ArrayXYOfMap" );
681 MyArrayXYOfMap* arrayXYOfMap =
new MyArrayXYOfMap();
685 trace.beginBlock (
"Memory usage in ArrayXYOfMap" );
686 std::cerr << arrayXYOfMap->area() <<
" bytes." << std::endl;
689 trace.beginBlock (
"Sum all values ArrayXYOfMap" );
693 trace.beginBlock (
"Sum label 0 values ArrayXYOfMap" );
697 trace.beginBlock (
"Sum label 15 values ArrayXYOfMap" );
701 trace.beginBlock (
"Locate places (3, 7, 8) in ArrayXYOfMap" );
705 trace.beginBlock (
"Erase label 9 in ArrayXYOfMap" );
709 trace.beginBlock (
"Delete ArrayXYOfMap" );
715 trace.beginBlock (
"---------- ArrayXYOfList ---------------" );
716 trace.beginBlock (
"Generating ArrayXYOfList" );
717 MyArrayXYOfList* arrayXYOfList =
new MyArrayXYOfList();
721 trace.beginBlock (
"Memory usage in ArrayXYOfList" );
722 std::cerr << arrayXYOfList->area() <<
" bytes." << std::endl;
725 trace.beginBlock (
"Sum all values ArrayXYOfList" );
729 trace.beginBlock (
"Sum label 0 values ArrayXYOfList" );
733 trace.beginBlock (
"Sum label 15 values ArrayXYOfList" );
737 trace.beginBlock (
"Locate places (3, 7, 8) in ArrayXYOfList" );
741 trace.beginBlock (
"Erase label 9 in ArrayXYOfList" );
745 trace.beginBlock (
"Delete ArrayXYOfList" );
746 delete arrayXYOfList;
751 trace.beginBlock (
"---------- ArrayXYOfLabelledMap ---------------" );
752 trace.beginBlock (
"Generating ArrayXYOfLabelledMap" );
753 MyArrayXYOfLabelledMap* arrayXYOfLabelledMap =
new MyArrayXYOfLabelledMap;
757 trace.beginBlock (
"Memory usage in ArrayXYOfLabelledMap" );
758 std::cerr << arrayXYOfLabelledMap->area() <<
" bytes." << std::endl;
761 trace.beginBlock (
"Sum all values ArrayXYOfLabelledMap" );
765 trace.beginBlock (
"Sum label 0 values ArrayXYOfLabelledMap" );
769 trace.beginBlock (
"Sum label 15 values ArrayXYOfLabelledMap" );
773 trace.beginBlock (
"Locate places (3, 7, 8) in ArrayXYOfLabelledMap" );
777 trace.beginBlock (
"Erase label 9 in ArrayXYOfLabelledMap" );
781 trace.beginBlock (
"Delete ArrayXYOfLabelledMap" );
782 delete arrayXYOfLabelledMap;
unsigned int nbLabels(unsigned int x, unsigned int y) const
const Value & value(unsigned int l, unsigned int x, unsigned int y) const
unsigned int erase(unsigned int l, unsigned int x, unsigned int y)
void setValue(const Value &val, unsigned int l, unsigned int x, unsigned int y)
unsigned long long area() const
void display(ostream &, unsigned int, unsigned int, unsigned int)
bool hasLabel(unsigned int l, unsigned int x, unsigned int y) const
void setValueNoNewLabel(const Value &val, unsigned int l, unsigned int x, unsigned int y)
void getLabels(std::vector< unsigned int > &labels, unsigned int x, unsigned int y) const
unsigned int erase(unsigned int l, unsigned int x, unsigned int y)
MyLabelledMap _data[X][Y]
void setValueNoNewLabel(const Value &val, unsigned int l, unsigned int x, unsigned int y)
const Value & value(unsigned int l, unsigned int x, unsigned int y) const
LabelledMap< Value, L, TWord, N, M > MyLabelledMap
void getLabels(std::vector< unsigned int > &labels, unsigned int x, unsigned int y) const
bool hasLabel(unsigned int l, unsigned int x, unsigned int y) const
void display(ostream &, unsigned int, unsigned int x, unsigned int y)
unsigned int nbLabels(unsigned int x, unsigned int y) const
void setValue(const Value &val, unsigned int l, unsigned int x, unsigned int y)
unsigned long long area() const
MyList::const_iterator ConstIterator
void setValue(const Value &val, unsigned int l, unsigned int x, unsigned int y)
std::pair< DGtal::uint16_t, Value > MyPair
unsigned int erase(unsigned int l, unsigned int x, unsigned int y)
void display(ostream &, unsigned int, unsigned int, unsigned int)
std::forward_list< MyPair > MyList
const Value & value(unsigned int l, unsigned int x, unsigned int y)
void setValueNoNewLabel(const Value &val, unsigned int l, unsigned int x, unsigned int y)
bool hasLabel(unsigned int l, unsigned int x, unsigned int y) const
unsigned int nbLabels(unsigned int x, unsigned int y) const
MyList::iterator Iterator
unsigned long long area() const
void getLabels(std::vector< unsigned int > &labels, unsigned int x, unsigned int y) const
void getLabels(std::vector< unsigned int > &labels, unsigned int x, unsigned int y) const
void setValue(const Value &val, unsigned int l, unsigned int x, unsigned int y)
unsigned int erase(unsigned int l, unsigned int x, unsigned int y)
const Value & value(unsigned int l, unsigned int x, unsigned int y)
MyMap::const_iterator ConstIterator
bool hasLabel(unsigned int l, unsigned int x, unsigned int y) const
unsigned int nbLabels(unsigned int x, unsigned int y) const
void setValueNoNewLabel(const Value &val, unsigned int l, unsigned int x, unsigned int y)
std::map< unsigned int, Value > MyMap
void display(ostream &, unsigned int, unsigned int, unsigned int)
unsigned long long area() const
Aim: Represents a map label -> data, where the label is an integer between 0 and a constant L-1....
DGtal is the top-level namespace which contains all DGtal functions and types.
std::uint8_t uint8_t
unsigned 8-bit integer.
unsigned int generateData(MapLXY &m, double proba_no_label, double proba_label)
double sumAllData(MapLXY &m)
unsigned int eraseOneData(MapLXY &m, unsigned int l)
double sumOneData(MapLXY &m, unsigned int l)
unsigned int locateThreeData(MapLXY &m, unsigned int l1, unsigned int l2, unsigned int l3)