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"
68 using namespace DGtal;
70 double rand01() {
return double( rand() ) / double( RAND_MAX ); }
72 template <Dimension dim>
75 std::size_t nb_tries, std::size_t nb_vertices, std::size_t range,
76 double pconvexity_probability = 0.5 )
84 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
86 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
87 std::cout <<
"Computing " << nb_tries <<
" P-convexities in Z" <<
dim << std::endl;
88 for (
auto n = 0; n < nb_tries; ++n )
91 std::vector< Point > V;
92 for (
auto i = 0; i < nb_vertices; i++ ) {
94 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
98 std::vector< Point > X;
99 bool force_pconvexity =
rand01() < pconvexity_probability;
100 if ( force_pconvexity )
104 auto P = dconv.
CvxH( V );
108 std::chrono::high_resolution_clock::time_point
109 t1 = std::chrono::high_resolution_clock::now();
111 std::chrono::high_resolution_clock::time_point
112 t2 = std::chrono::high_resolution_clock::now();
113 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
114 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_pconvex ) );
115 if ( force_pconvexity && ! is_pconvex )
116 trace.
warning() <<
"Invalid computation of either FC* or P-convexity !" << std::endl;
120 template <Dimension dim>
123 std::size_t nb_tries, std::size_t nb_vertices, std::size_t range,
124 double fconvexity_probability = 0.5 )
132 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
134 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
135 std::cout <<
"Computing " << nb_tries <<
" full convexities in Z" <<
dim << std::endl;
136 for (
auto n = 0; n < nb_tries; ++n )
139 std::vector< Point > V;
140 for (
auto i = 0; i < nb_vertices; i++ ) {
142 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
146 std::vector< Point > X;
147 bool force_fconvexity =
rand01() < fconvexity_probability;
148 if ( force_fconvexity )
152 auto P = dconv.
CvxH( V );
156 std::chrono::high_resolution_clock::time_point
157 t1 = std::chrono::high_resolution_clock::now();
159 std::chrono::high_resolution_clock::time_point
160 t2 = std::chrono::high_resolution_clock::now();
161 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
162 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_fconvex ) );
163 if ( force_fconvexity && ! is_fconvex )
164 trace.
warning() <<
"Invalid computation of either FC* or full convexity !" << std::endl;
168 template <Dimension dim>
171 std::size_t nb_tries, std::size_t nb_vertices, std::size_t range,
172 double fconvexity_probability = 0.5 )
180 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
182 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
183 std::cout <<
"Computing " << nb_tries <<
" full convexities in Z" <<
dim << std::endl;
184 for (
auto n = 0; n < nb_tries; ++n )
187 std::vector< Point > V;
188 for (
auto i = 0; i < nb_vertices; i++ ) {
190 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
194 std::vector< Point > X;
195 bool force_fconvexity =
rand01() < fconvexity_probability;
196 if ( force_fconvexity )
200 auto P = dconv.
CvxH( V );
204 std::chrono::high_resolution_clock::time_point
205 t1 = std::chrono::high_resolution_clock::now();
207 std::chrono::high_resolution_clock::time_point
208 t2 = std::chrono::high_resolution_clock::now();
209 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
210 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_fconvex ) );
211 if ( force_fconvexity && ! is_fconvex )
212 trace.
warning() <<
"Invalid computation of either FC* or full convexity !" << std::endl;
217 template <Dimension dim>
220 ( std::vector< std::tuple< std::size_t, double, bool > >& results,
221 std::size_t nb_tries, std::size_t range )
229 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
231 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
232 std::cout <<
"Computing " << nb_tries <<
" P-convexities in Z" <<
dim << std::endl;
233 for (
auto n = 0; n < nb_tries; ++n )
235 double filling_probability = 0.1 + 0.9 * double( n ) / double( nb_tries );
238 std::size_t nb_vertices
239 = std::size_t( filling_probability * ceil( pow( range,
dim ) ) );
240 for (
auto i = 0; i < nb_vertices; i++ ) {
242 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
246 std::vector< Point > X( S.cbegin(), S.cend() );
248 std::chrono::high_resolution_clock::time_point
249 t1 = std::chrono::high_resolution_clock::now();
251 std::chrono::high_resolution_clock::time_point
252 t2 = std::chrono::high_resolution_clock::now();
253 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
254 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_pconvex ) );
258 template <Dimension dim>
261 ( std::vector< std::tuple< std::size_t, double, bool > >& results,
262 std::size_t nb_tries, std::size_t range )
270 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
272 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
273 std::cout <<
"Computing " << nb_tries <<
" full convexities in Z" <<
dim << std::endl;
274 for (
auto n = 0; n < nb_tries; ++n )
276 double filling_probability = 0.1 + 0.9 * double( n ) / double( nb_tries );
279 std::size_t nb_vertices
280 = std::size_t( filling_probability * ceil( pow( range,
dim ) ) );
281 for (
auto i = 0; i < nb_vertices; i++ ) {
283 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
287 std::vector< Point > X( S.cbegin(), S.cend() );
289 std::chrono::high_resolution_clock::time_point
290 t1 = std::chrono::high_resolution_clock::now();
292 std::chrono::high_resolution_clock::time_point
293 t2 = std::chrono::high_resolution_clock::now();
294 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
295 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_fconvex ) );
300 template <Dimension dim>
303 ( std::vector< std::tuple< std::size_t, double, bool > >& results,
304 std::size_t nb_tries, std::size_t range )
312 DConvexity dconv( Point::diagonal( -1 ), Point::diagonal( range ) );
314 Domain domain( Point::diagonal( 0 ), Point::diagonal( range ) );
315 std::cout <<
"Computing " << nb_tries <<
" full convexities (fast) in Z" <<
dim << std::endl;
316 for (
auto n = 0; n < nb_tries; ++n )
318 double filling_probability = 0.1 + 0.9 * double( n ) / double( nb_tries );
321 std::size_t nb_vertices
322 = std::size_t( filling_probability * ceil( pow( range,
dim ) ) );
323 for (
auto i = 0; i < nb_vertices; i++ ) {
325 for (
auto j = 0; j <
dim; j++ ) p[ j ] = rand() % range;
329 std::vector< Point > X( S.cbegin(), S.cend() );
331 std::chrono::high_resolution_clock::time_point
332 t1 = std::chrono::high_resolution_clock::now();
334 std::chrono::high_resolution_clock::time_point
335 t2 = std::chrono::high_resolution_clock::now();
336 double dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
337 results.push_back( std::make_tuple( X.size(),
dt/1e6, is_fconvex ) );
344 const std::vector< std::tuple< std::size_t, double, bool > >& results,
345 const std::string& fname )
347 std::ofstream output( fname );
348 output <<
"# Results of " << results.size() <<
" P-convexity computations in Z"
350 <<
"# Card(X) time(ms) p-convex?" << std::endl;
351 for (
auto&& r : results )
352 output << std::get<0>( r ) <<
" " << std::get<1>( r ) <<
" " << std::get<2>( r )
391 int main(
int argc,
char* argv[] )
397 std::vector< std::tuple< std::size_t, double, bool > > R2;
398 timingsPConvexity<2>( R2, 50, 3, 100, 0.5 );
399 timingsPConvexity<2>( R2, 50, 4, 200, 0.5 );
400 timingsPConvexity<2>( R2, 50, 5, 400, 0.5 );
401 timingsPConvexity<2>( R2, 50, 5, 600, 0.5 );
402 timingsPConvexity<2>( R2, 50, 5, 800, 0.5 );
403 timingsPConvexity<2>( R2, 25, 5,1200, 0.5 );
404 timingsPConvexity<2>( R2, 25, 5,2000, 0.5 );
409 std::vector< std::tuple< std::size_t, double, bool > > R3;
410 timingsPConvexity<3>( R3, 50, 3, 10, 0.5 );
411 timingsPConvexity<3>( R3, 50, 4, 20, 0.5 );
412 timingsPConvexity<3>( R3, 50, 5, 40, 0.5 );
413 timingsPConvexity<3>( R3, 50, 5, 80, 0.5 );
414 timingsPConvexity<3>( R3, 25, 5, 160, 0.5 );
415 timingsPConvexity<3>( R3, 25, 5, 320, 0.5 );
420 std::vector< std::tuple< std::size_t, double, bool > > R4;
421 timingsPConvexity<4>( R4, 50, 5, 10, 0.5 );
422 timingsPConvexity<4>( R4, 50, 5, 15, 0.5 );
423 timingsPConvexity<4>( R4, 50, 5, 20, 0.5 );
424 timingsPConvexity<4>( R4, 50, 5, 30, 0.5 );
425 timingsPConvexity<4>( R4, 25, 5, 40, 0.5 );
426 timingsPConvexity<4>( R4, 25, 5, 60, 0.5 );
427 timingsPConvexity<4>( R4, 15, 6, 80, 0.5 );
428 timingsPConvexity<4>( R4, 15, 6, 100, 0.5 );
429 timingsPConvexity<4>( R4, 15, 6, 120, 0.5 );
437 std::vector< std::tuple< std::size_t, double, bool > > R2;
438 timingsFullConvexity<2>( R2, 50, 3, 100, 0.5 );
439 timingsFullConvexity<2>( R2, 50, 4, 200, 0.5 );
440 timingsFullConvexity<2>( R2, 50, 5, 400, 0.5 );
441 timingsFullConvexity<2>( R2, 50, 5, 600, 0.5 );
442 timingsFullConvexity<2>( R2, 50, 5, 800, 0.5 );
443 timingsFullConvexity<2>( R2, 25, 5,1200, 0.5 );
444 timingsFullConvexity<2>( R2, 25, 5,2000, 0.5 );
449 std::vector< std::tuple< std::size_t, double, bool > > R3;
450 timingsFullConvexity<3>( R3, 50, 3, 10, 0.5 );
451 timingsFullConvexity<3>( R3, 50, 4, 20, 0.5 );
452 timingsFullConvexity<3>( R3, 50, 5, 40, 0.5 );
453 timingsFullConvexity<3>( R3, 50, 5, 80, 0.5 );
454 timingsFullConvexity<3>( R3, 25, 5, 160, 0.5 );
455 timingsFullConvexity<3>( R3, 25, 5, 320, 0.5 );
460 std::vector< std::tuple< std::size_t, double, bool > > R4;
461 timingsFullConvexity<4>( R4, 50, 5, 10, 0.5 );
462 timingsFullConvexity<4>( R4, 50, 5, 15, 0.5 );
463 timingsFullConvexity<4>( R4, 50, 5, 20, 0.5 );
464 timingsFullConvexity<4>( R4, 50, 5, 30, 0.5 );
465 timingsFullConvexity<4>( R4, 25, 5, 40, 0.5 );
466 timingsFullConvexity<4>( R4, 25, 5, 60, 0.5 );
467 timingsFullConvexity<4>( R4, 15, 6, 80, 0.5 );
468 timingsFullConvexity<4>( R4, 10, 6, 100, 0.5 );
469 timingsFullConvexity<4>( R4, 5, 6, 120, 0.5 );
477 std::vector< std::tuple< std::size_t, double, bool > > R2;
478 timingsFullConvexityFast<2>( R2, 50, 3, 100, 0.5 );
479 timingsFullConvexityFast<2>( R2, 50, 4, 200, 0.5 );
480 timingsFullConvexityFast<2>( R2, 50, 5, 400, 0.5 );
481 timingsFullConvexityFast<2>( R2, 50, 5, 600, 0.5 );
482 timingsFullConvexityFast<2>( R2, 50, 5, 800, 0.5 );
483 timingsFullConvexityFast<2>( R2, 25, 5,1200, 0.5 );
484 timingsFullConvexityFast<2>( R2, 25, 5,2000, 0.5 );
489 std::vector< std::tuple< std::size_t, double, bool > > R3;
490 timingsFullConvexityFast<3>( R3, 50, 3, 10, 0.5 );
491 timingsFullConvexityFast<3>( R3, 50, 4, 20, 0.5 );
492 timingsFullConvexityFast<3>( R3, 50, 5, 40, 0.5 );
493 timingsFullConvexityFast<3>( R3, 50, 5, 80, 0.5 );
494 timingsFullConvexityFast<3>( R3, 25, 5, 160, 0.5 );
495 timingsFullConvexityFast<3>( R3, 25, 5, 320, 0.5 );
500 std::vector< std::tuple< std::size_t, double, bool > > R4;
501 timingsFullConvexityFast<4>( R4, 50, 5, 10, 0.5 );
502 timingsFullConvexityFast<4>( R4, 50, 5, 15, 0.5 );
503 timingsFullConvexityFast<4>( R4, 50, 5, 20, 0.5 );
504 timingsFullConvexityFast<4>( R4, 50, 5, 30, 0.5 );
505 timingsFullConvexityFast<4>( R4, 25, 5, 40, 0.5 );
506 timingsFullConvexityFast<4>( R4, 25, 5, 60, 0.5 );
507 timingsFullConvexityFast<4>( R4, 15, 6, 80, 0.5 );
508 timingsFullConvexityFast<4>( R4, 10, 6, 100, 0.5 );
509 timingsFullConvexityFast<4>( R4, 5, 6, 120, 0.5 );
517 std::vector< std::tuple< std::size_t, double, bool > > R2;
518 timingsPConvexityNonConvex<2>( R2, 50, 100 );
519 timingsPConvexityNonConvex<2>( R2, 50, 200 );
520 timingsPConvexityNonConvex<2>( R2, 50, 400 );
521 timingsPConvexityNonConvex<2>( R2, 50, 600 );
522 timingsPConvexityNonConvex<2>( R2, 50, 800 );
523 timingsPConvexityNonConvex<2>( R2, 50, 1200 );
524 timingsPConvexityNonConvex<2>( R2, 50, 2000 );
529 std::vector< std::tuple< std::size_t, double, bool > > R3;
530 timingsPConvexityNonConvex<3>( R3, 50, 20 );
531 timingsPConvexityNonConvex<3>( R3, 50, 40 );
532 timingsPConvexityNonConvex<3>( R3, 50, 80 );
533 timingsPConvexityNonConvex<3>( R3, 50, 160 );
534 timingsPConvexityNonConvex<3>( R3, 50, 320 );
539 std::vector< std::tuple< std::size_t, double, bool > > R4;
540 timingsPConvexityNonConvex<4>( R4, 50, 10 );
541 timingsPConvexityNonConvex<4>( R4, 50, 20 );
542 timingsPConvexityNonConvex<4>( R4, 50, 30 );
543 timingsPConvexityNonConvex<4>( R4, 40, 40 );
544 timingsPConvexityNonConvex<4>( R4, 20, 50 );
549 std::vector< std::tuple< std::size_t, double, bool > > R2;
550 timingsFullConvexityNonConvex<2>( R2, 50, 100 );
551 timingsFullConvexityNonConvex<2>( R2, 50, 200 );
552 timingsFullConvexityNonConvex<2>( R2, 50, 400 );
553 timingsFullConvexityNonConvex<2>( R2, 50, 600 );
554 timingsFullConvexityNonConvex<2>( R2, 50, 800 );
555 timingsFullConvexityNonConvex<2>( R2, 50, 1200 );
556 timingsFullConvexityNonConvex<2>( R2, 50, 2000 );
561 std::vector< std::tuple< std::size_t, double, bool > > R3;
562 timingsFullConvexityNonConvex<3>( R3, 50, 20 );
563 timingsFullConvexityNonConvex<3>( R3, 50, 40 );
564 timingsFullConvexityNonConvex<3>( R3, 50, 80 );
565 timingsFullConvexityNonConvex<3>( R3, 40, 160 );
566 timingsFullConvexityNonConvex<3>( R3, 25, 320 );
571 std::vector< std::tuple< std::size_t, double, bool > > R4;
572 timingsFullConvexityNonConvex<4>( R4, 50, 10 );
573 timingsFullConvexityNonConvex<4>( R4, 50, 20 );
574 timingsFullConvexityNonConvex<4>( R4, 50, 30 );
575 timingsFullConvexityNonConvex<4>( R4, 40, 40 );
576 timingsFullConvexityNonConvex<4>( R4, 20, 50 );
581 std::vector< std::tuple< std::size_t, double, bool > > R2;
582 timingsFullConvexityFastNonConvex<2>( R2, 50, 100 );
583 timingsFullConvexityFastNonConvex<2>( R2, 50, 200 );
584 timingsFullConvexityFastNonConvex<2>( R2, 50, 400 );
585 timingsFullConvexityFastNonConvex<2>( R2, 50, 600 );
586 timingsFullConvexityFastNonConvex<2>( R2, 50, 800 );
587 timingsFullConvexityFastNonConvex<2>( R2, 50, 1200 );
588 timingsFullConvexityFastNonConvex<2>( R2, 50, 2000 );
593 std::vector< std::tuple< std::size_t, double, bool > > R3;
594 timingsFullConvexityFastNonConvex<3>( R3, 50, 20 );
595 timingsFullConvexityFastNonConvex<3>( R3, 50, 40 );
596 timingsFullConvexityFastNonConvex<3>( R3, 50, 80 );
597 timingsFullConvexityFastNonConvex<3>( R3, 40, 160 );
598 timingsFullConvexityFastNonConvex<3>( R3, 25, 320 );
603 std::vector< std::tuple< std::size_t, double, bool > > R4;
604 timingsFullConvexityFastNonConvex<4>( R4, 50, 10 );
605 timingsFullConvexityFastNonConvex<4>( R4, 50, 20 );
606 timingsFullConvexityFastNonConvex<4>( R4, 50, 30 );
607 timingsFullConvexityFastNonConvex<4>( R4, 40, 40 );
608 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)