34 #include "DGtal/base/Common.h"
35 #include "DGtal/kernel/SpaceND.h"
36 #include "DGtal/kernel/domains/HyperRectDomain.h"
37 #include "DGtal/kernel/sets/DigitalSetBySTLSet.h"
38 #include "DGtal/topology/KhalimskySpaceND.h"
39 #include "DGtal/shapes/Shapes.h"
40 #include "DGtal/geometry/volumes/PConvexity.h"
41 #include "DGtal/geometry/volumes/DigitalConvexity.h"
69 using namespace DGtal;
71 double rand01() {
return double( rand() ) / double( RAND_MAX ); }
73 template <Dimension dim>
76 std::size_t nb_tries, std::size_t nb_vertices, std::size_t range,
77 double pconvexity_probability = 0.5 )
85 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
87 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
88 std::cout <<
"Computing " << nb_tries <<
" P-convexities in Z" <<
dim << std::endl;
89 for (
auto n = 0; n < nb_tries; ++n )
92 std::vector< Point > V;
93 for (
auto i = 0; i < nb_vertices; i++ ) {
95 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
99 std::vector< Point > X;
100 bool force_pconvexity =
rand01() < pconvexity_probability;
101 if ( force_pconvexity )
105 auto P = dconv.
CvxH( V );
109 std::chrono::high_resolution_clock::time_point
110 t1 = std::chrono::high_resolution_clock::now();
112 std::chrono::high_resolution_clock::time_point
113 t2 = std::chrono::high_resolution_clock::now();
114 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
115 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_pconvex ) );
116 if ( force_pconvexity && ! is_pconvex )
117 trace.
warning() <<
"Invalid computation of either FC* or P-convexity !" << std::endl;
121 template <Dimension dim>
124 std::size_t nb_tries, std::size_t nb_vertices, std::size_t range,
125 double fconvexity_probability = 0.5 )
133 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
135 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
136 std::cout <<
"Computing " << nb_tries <<
" full convexities in Z" <<
dim << std::endl;
137 for (
auto n = 0; n < nb_tries; ++n )
140 std::vector< Point > V;
141 for (
auto i = 0; i < nb_vertices; i++ ) {
143 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
147 std::vector< Point > X;
148 bool force_fconvexity =
rand01() < fconvexity_probability;
149 if ( force_fconvexity )
153 auto P = dconv.
CvxH( V );
157 std::chrono::high_resolution_clock::time_point
158 t1 = std::chrono::high_resolution_clock::now();
160 std::chrono::high_resolution_clock::time_point
161 t2 = std::chrono::high_resolution_clock::now();
162 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
163 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_fconvex ) );
164 if ( force_fconvexity && ! is_fconvex )
165 trace.
warning() <<
"Invalid computation of either FC* or full convexity !" << std::endl;
169 template <Dimension dim>
172 std::size_t nb_tries, std::size_t nb_vertices, std::size_t range,
173 double fconvexity_probability = 0.5 )
181 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
183 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
184 std::cout <<
"Computing " << nb_tries <<
" full convexities in Z" <<
dim << std::endl;
185 for (
auto n = 0; n < nb_tries; ++n )
188 std::vector< Point > V;
189 for (
auto i = 0; i < nb_vertices; i++ ) {
191 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
195 std::vector< Point > X;
196 bool force_fconvexity =
rand01() < fconvexity_probability;
197 if ( force_fconvexity )
201 auto P = dconv.
CvxH( V );
205 std::chrono::high_resolution_clock::time_point
206 t1 = std::chrono::high_resolution_clock::now();
208 std::chrono::high_resolution_clock::time_point
209 t2 = std::chrono::high_resolution_clock::now();
210 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
211 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_fconvex ) );
212 if ( force_fconvexity && ! is_fconvex )
213 trace.
warning() <<
"Invalid computation of either FC* or full convexity !" << std::endl;
218 template <Dimension dim>
221 ( std::vector< std::tuple< std::size_t, double, bool > >& results,
222 std::size_t nb_tries, std::size_t range )
230 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
232 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
233 std::cout <<
"Computing " << nb_tries <<
" P-convexities in Z" <<
dim << std::endl;
234 for (
auto n = 0; n < nb_tries; ++n )
236 double filling_probability = 0.1 + 0.9 * double( n ) / double( nb_tries );
239 std::size_t nb_vertices
240 = std::size_t( filling_probability * ceil( pow( range,
dim ) ) );
241 for (
auto i = 0; i < nb_vertices; i++ ) {
243 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
247 std::vector< Point > X( S.cbegin(), S.cend() );
249 std::chrono::high_resolution_clock::time_point
250 t1 = std::chrono::high_resolution_clock::now();
252 std::chrono::high_resolution_clock::time_point
253 t2 = std::chrono::high_resolution_clock::now();
254 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
255 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_pconvex ) );
259 template <Dimension dim>
262 ( std::vector< std::tuple< std::size_t, double, bool > >& results,
263 std::size_t nb_tries, std::size_t range )
271 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
273 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
274 std::cout <<
"Computing " << nb_tries <<
" full convexities in Z" <<
dim << std::endl;
275 for (
auto n = 0; n < nb_tries; ++n )
277 double filling_probability = 0.1 + 0.9 * double( n ) / double( nb_tries );
280 std::size_t nb_vertices
281 = std::size_t( filling_probability * ceil( pow( range,
dim ) ) );
282 for (
auto i = 0; i < nb_vertices; i++ ) {
284 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
288 std::vector< Point > X( S.cbegin(), S.cend() );
290 std::chrono::high_resolution_clock::time_point
291 t1 = std::chrono::high_resolution_clock::now();
293 std::chrono::high_resolution_clock::time_point
294 t2 = std::chrono::high_resolution_clock::now();
295 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
296 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_fconvex ) );
301 template <Dimension dim>
304 ( std::vector< std::tuple< std::size_t, double, bool > >& results,
305 std::size_t nb_tries, std::size_t range )
313 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
315 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
316 std::cout <<
"Computing " << nb_tries <<
" full convexities (fast) in Z" <<
dim << std::endl;
317 for (
auto n = 0; n < nb_tries; ++n )
319 double filling_probability = 0.1 + 0.9 * double( n ) / double( nb_tries );
322 std::size_t nb_vertices
323 = std::size_t( filling_probability * ceil( pow( range,
dim ) ) );
324 for (
auto i = 0; i < nb_vertices; i++ ) {
326 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
330 std::vector< Point > X( S.cbegin(), S.cend() );
332 std::chrono::high_resolution_clock::time_point
333 t1 = std::chrono::high_resolution_clock::now();
335 std::chrono::high_resolution_clock::time_point
336 t2 = std::chrono::high_resolution_clock::now();
337 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
338 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_fconvex ) );
345 const std::vector< std::tuple< std::size_t, double, bool > >& results,
346 const std::string& fname )
348 std::ofstream output( fname );
349 output <<
"# Results of " << results.size() <<
" P-convexity computations in Z"
351 <<
"# Card(X) time(ms) p-convex?" << std::endl;
352 for (
auto&& r : results )
353 output << std::get<0>( r ) <<
" " << std::get<1>( r ) <<
" " << std::get<2>( r )
392 int main(
int argc,
char* argv[] )
398 std::vector< std::tuple< std::size_t, double, bool > > R2;
399 timingsPConvexity<2>( R2, 50, 3, 100, 0.5 );
400 timingsPConvexity<2>( R2, 50, 4, 200, 0.5 );
401 timingsPConvexity<2>( R2, 50, 5, 400, 0.5 );
402 timingsPConvexity<2>( R2, 50, 5, 600, 0.5 );
403 timingsPConvexity<2>( R2, 50, 5, 800, 0.5 );
404 timingsPConvexity<2>( R2, 25, 5,1200, 0.5 );
405 timingsPConvexity<2>( R2, 25, 5,2000, 0.5 );
410 std::vector< std::tuple< std::size_t, double, bool > > R3;
411 timingsPConvexity<3>( R3, 50, 3, 10, 0.5 );
412 timingsPConvexity<3>( R3, 50, 4, 20, 0.5 );
413 timingsPConvexity<3>( R3, 50, 5, 40, 0.5 );
414 timingsPConvexity<3>( R3, 50, 5, 80, 0.5 );
415 timingsPConvexity<3>( R3, 25, 5, 160, 0.5 );
416 timingsPConvexity<3>( R3, 25, 5, 320, 0.5 );
421 std::vector< std::tuple< std::size_t, double, bool > > R4;
422 timingsPConvexity<4>( R4, 50, 5, 10, 0.5 );
423 timingsPConvexity<4>( R4, 50, 5, 15, 0.5 );
424 timingsPConvexity<4>( R4, 50, 5, 20, 0.5 );
425 timingsPConvexity<4>( R4, 50, 5, 30, 0.5 );
426 timingsPConvexity<4>( R4, 25, 5, 40, 0.5 );
427 timingsPConvexity<4>( R4, 25, 5, 60, 0.5 );
428 timingsPConvexity<4>( R4, 15, 6, 80, 0.5 );
429 timingsPConvexity<4>( R4, 15, 6, 100, 0.5 );
430 timingsPConvexity<4>( R4, 15, 6, 120, 0.5 );
438 std::vector< std::tuple< std::size_t, double, bool > > R2;
439 timingsFullConvexity<2>( R2, 50, 3, 100, 0.5 );
440 timingsFullConvexity<2>( R2, 50, 4, 200, 0.5 );
441 timingsFullConvexity<2>( R2, 50, 5, 400, 0.5 );
442 timingsFullConvexity<2>( R2, 50, 5, 600, 0.5 );
443 timingsFullConvexity<2>( R2, 50, 5, 800, 0.5 );
444 timingsFullConvexity<2>( R2, 25, 5,1200, 0.5 );
445 timingsFullConvexity<2>( R2, 25, 5,2000, 0.5 );
450 std::vector< std::tuple< std::size_t, double, bool > > R3;
451 timingsFullConvexity<3>( R3, 50, 3, 10, 0.5 );
452 timingsFullConvexity<3>( R3, 50, 4, 20, 0.5 );
453 timingsFullConvexity<3>( R3, 50, 5, 40, 0.5 );
454 timingsFullConvexity<3>( R3, 50, 5, 80, 0.5 );
455 timingsFullConvexity<3>( R3, 25, 5, 160, 0.5 );
456 timingsFullConvexity<3>( R3, 25, 5, 320, 0.5 );
461 std::vector< std::tuple< std::size_t, double, bool > > R4;
462 timingsFullConvexity<4>( R4, 50, 5, 10, 0.5 );
463 timingsFullConvexity<4>( R4, 50, 5, 15, 0.5 );
464 timingsFullConvexity<4>( R4, 50, 5, 20, 0.5 );
465 timingsFullConvexity<4>( R4, 50, 5, 30, 0.5 );
466 timingsFullConvexity<4>( R4, 25, 5, 40, 0.5 );
467 timingsFullConvexity<4>( R4, 25, 5, 60, 0.5 );
468 timingsFullConvexity<4>( R4, 15, 6, 80, 0.5 );
469 timingsFullConvexity<4>( R4, 10, 6, 100, 0.5 );
470 timingsFullConvexity<4>( R4, 5, 6, 120, 0.5 );
478 std::vector< std::tuple< std::size_t, double, bool > > R2;
479 timingsFullConvexityFast<2>( R2, 50, 3, 100, 0.5 );
480 timingsFullConvexityFast<2>( R2, 50, 4, 200, 0.5 );
481 timingsFullConvexityFast<2>( R2, 50, 5, 400, 0.5 );
482 timingsFullConvexityFast<2>( R2, 50, 5, 600, 0.5 );
483 timingsFullConvexityFast<2>( R2, 50, 5, 800, 0.5 );
484 timingsFullConvexityFast<2>( R2, 25, 5,1200, 0.5 );
485 timingsFullConvexityFast<2>( R2, 25, 5,2000, 0.5 );
490 std::vector< std::tuple< std::size_t, double, bool > > R3;
491 timingsFullConvexityFast<3>( R3, 50, 3, 10, 0.5 );
492 timingsFullConvexityFast<3>( R3, 50, 4, 20, 0.5 );
493 timingsFullConvexityFast<3>( R3, 50, 5, 40, 0.5 );
494 timingsFullConvexityFast<3>( R3, 50, 5, 80, 0.5 );
495 timingsFullConvexityFast<3>( R3, 25, 5, 160, 0.5 );
496 timingsFullConvexityFast<3>( R3, 25, 5, 320, 0.5 );
501 std::vector< std::tuple< std::size_t, double, bool > > R4;
502 timingsFullConvexityFast<4>( R4, 50, 5, 10, 0.5 );
503 timingsFullConvexityFast<4>( R4, 50, 5, 15, 0.5 );
504 timingsFullConvexityFast<4>( R4, 50, 5, 20, 0.5 );
505 timingsFullConvexityFast<4>( R4, 50, 5, 30, 0.5 );
506 timingsFullConvexityFast<4>( R4, 25, 5, 40, 0.5 );
507 timingsFullConvexityFast<4>( R4, 25, 5, 60, 0.5 );
508 timingsFullConvexityFast<4>( R4, 15, 6, 80, 0.5 );
509 timingsFullConvexityFast<4>( R4, 10, 6, 100, 0.5 );
510 timingsFullConvexityFast<4>( R4, 5, 6, 120, 0.5 );
518 std::vector< std::tuple< std::size_t, double, bool > > R2;
519 timingsPConvexityNonConvex<2>( R2, 50, 100 );
520 timingsPConvexityNonConvex<2>( R2, 50, 200 );
521 timingsPConvexityNonConvex<2>( R2, 50, 400 );
522 timingsPConvexityNonConvex<2>( R2, 50, 600 );
523 timingsPConvexityNonConvex<2>( R2, 50, 800 );
524 timingsPConvexityNonConvex<2>( R2, 50, 1200 );
525 timingsPConvexityNonConvex<2>( R2, 50, 2000 );
530 std::vector< std::tuple< std::size_t, double, bool > > R3;
531 timingsPConvexityNonConvex<3>( R3, 50, 20 );
532 timingsPConvexityNonConvex<3>( R3, 50, 40 );
533 timingsPConvexityNonConvex<3>( R3, 50, 80 );
534 timingsPConvexityNonConvex<3>( R3, 50, 160 );
535 timingsPConvexityNonConvex<3>( R3, 50, 320 );
540 std::vector< std::tuple< std::size_t, double, bool > > R4;
541 timingsPConvexityNonConvex<4>( R4, 50, 10 );
542 timingsPConvexityNonConvex<4>( R4, 50, 20 );
543 timingsPConvexityNonConvex<4>( R4, 50, 30 );
544 timingsPConvexityNonConvex<4>( R4, 40, 40 );
545 timingsPConvexityNonConvex<4>( R4, 20, 50 );
550 std::vector< std::tuple< std::size_t, double, bool > > R2;
551 timingsFullConvexityNonConvex<2>( R2, 50, 100 );
552 timingsFullConvexityNonConvex<2>( R2, 50, 200 );
553 timingsFullConvexityNonConvex<2>( R2, 50, 400 );
554 timingsFullConvexityNonConvex<2>( R2, 50, 600 );
555 timingsFullConvexityNonConvex<2>( R2, 50, 800 );
556 timingsFullConvexityNonConvex<2>( R2, 50, 1200 );
557 timingsFullConvexityNonConvex<2>( R2, 50, 2000 );
562 std::vector< std::tuple< std::size_t, double, bool > > R3;
563 timingsFullConvexityNonConvex<3>( R3, 50, 20 );
564 timingsFullConvexityNonConvex<3>( R3, 50, 40 );
565 timingsFullConvexityNonConvex<3>( R3, 50, 80 );
566 timingsFullConvexityNonConvex<3>( R3, 40, 160 );
567 timingsFullConvexityNonConvex<3>( R3, 25, 320 );
572 std::vector< std::tuple< std::size_t, double, bool > > R4;
573 timingsFullConvexityNonConvex<4>( R4, 50, 10 );
574 timingsFullConvexityNonConvex<4>( R4, 50, 20 );
575 timingsFullConvexityNonConvex<4>( R4, 50, 30 );
576 timingsFullConvexityNonConvex<4>( R4, 40, 40 );
577 timingsFullConvexityNonConvex<4>( R4, 20, 50 );
582 std::vector< std::tuple< std::size_t, double, bool > > R2;
583 timingsFullConvexityFastNonConvex<2>( R2, 50, 100 );
584 timingsFullConvexityFastNonConvex<2>( R2, 50, 200 );
585 timingsFullConvexityFastNonConvex<2>( R2, 50, 400 );
586 timingsFullConvexityFastNonConvex<2>( R2, 50, 600 );
587 timingsFullConvexityFastNonConvex<2>( R2, 50, 800 );
588 timingsFullConvexityFastNonConvex<2>( R2, 50, 1200 );
589 timingsFullConvexityFastNonConvex<2>( R2, 50, 2000 );
594 std::vector< std::tuple< std::size_t, double, bool > > R3;
595 timingsFullConvexityFastNonConvex<3>( R3, 50, 20 );
596 timingsFullConvexityFastNonConvex<3>( R3, 50, 40 );
597 timingsFullConvexityFastNonConvex<3>( R3, 50, 80 );
598 timingsFullConvexityFastNonConvex<3>( R3, 40, 160 );
599 timingsFullConvexityFastNonConvex<3>( R3, 25, 320 );
604 std::vector< std::tuple< std::size_t, double, bool > > R4;
605 timingsFullConvexityFastNonConvex<4>( R4, 50, 10 );
606 timingsFullConvexityFastNonConvex<4>( R4, 50, 20 );
607 timingsFullConvexityFastNonConvex<4>( R4, 50, 30 );
608 timingsFullConvexityFastNonConvex<4>( R4, 40, 40 );
609 timingsFullConvexityFastNonConvex<4>( R4, 20, 50 );
void getPoints(std::vector< Point > &pts) const
bool isFullyConvexFast(const PointRange &X) const
LatticePolytope CvxH(const PointRange &X) const
bool isFullyConvex(const PointRange &X, bool convex0=false) const
PointRange envelope(const PointRange &Z, EnvelopeAlgorithm algo=EnvelopeAlgorithm::DIRECT) const
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...
Aim: A class to check if digital sets are P-convex. The P-convexity is defined as follows: A digital ...
bool isPConvex(const std::vector< Point > &X) const
DGtal is the top-level namespace which contains all DGtal functions and types.
DGtal::uint32_t Dimension
int main(int argc, char *argv[])
void timingsFullConvexityNonConvex(std::vector< std::tuple< std::size_t, double, bool > > &results, std::size_t nb_tries, std::size_t range)
void timingsFullConvexity(std::vector< std::tuple< std::size_t, double, bool > > &results, std::size_t nb_tries, std::size_t nb_vertices, std::size_t range, double fconvexity_probability=0.5)
void outputResults(Dimension dim, const std::vector< std::tuple< std::size_t, double, bool > > &results, const std::string &fname)
void timingsPConvexityNonConvex(std::vector< std::tuple< std::size_t, double, bool > > &results, std::size_t nb_tries, std::size_t range)
void timingsFullConvexityFast(std::vector< std::tuple< std::size_t, double, bool > > &results, std::size_t nb_tries, std::size_t nb_vertices, std::size_t range, double fconvexity_probability=0.5)
void timingsPConvexity(std::vector< std::tuple< std::size_t, double, bool > > &results, std::size_t nb_tries, std::size_t nb_vertices, std::size_t range, double pconvexity_probability=0.5)
void timingsFullConvexityFastNonConvex(std::vector< std::tuple< std::size_t, double, bool > > &results, std::size_t nb_tries, std::size_t range)
HyperRectDomain< Space > Domain
unsigned int dim(const Vector &z)