Geogram Version 1.9.2
A programming library of geometric algorithms
Loading...
Searching...
No Matches
PCK.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2000-2022 Inria
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * * Neither the name of the ALICE Project-Team nor the names of its
14 * contributors may be used to endorse or promote products derived from this
15 * software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Contact: Bruno Levy
30 *
31 * https://www.inria.fr/fr/bruno-levy
32 *
33 * Inria,
34 * Domaine de Voluceau,
35 * 78150 Le Chesnay - Rocquencourt
36 * FRANCE
37 *
38 */
39
40#ifndef GEOGRAM_NUMERICS_PCK
41#define GEOGRAM_NUMERICS_PCK
42
46#include <functional>
47#include <algorithm>
48#include <atomic>
49
55// Uncomment to get full reporting on predicate statistics
56// (but has a non-negligible impact on performance)
57// For instance, Early Universe Reconstruction with 2M points:
58// with PCK_STATS: 6'36 without PCK_STATS: 3'38
59
60//#define PCK_STATS
61
62namespace GEO {
63
64 namespace PCK {
65
98#ifdef PCK_STATS
99 class GEOGRAM_API PredicateStats {
100 public:
101 PredicateStats(const char* name);
102 void log_invoke() {
103 ++invoke_count_;
104 }
105 void log_exact() {
106 ++exact_count_;
107 }
108 void log_SOS() {
109 ++SOS_count_;
110 }
111 void show_stats();
112 static void show_all_stats();
113 private:
114 static PredicateStats* first_;
115 PredicateStats* next_;
116 const char* name_;
117 std::atomic<Numeric::int64> invoke_count_;
118 std::atomic<Numeric::int64> exact_count_;
119 std::atomic<Numeric::int64> SOS_count_;
120 };
121#else
123 public:
124 PredicateStats(const char* name) {
125 geo_argused(name);
126 }
127 void log_invoke() {
128 }
129 void log_exact() {
130 }
131 void log_SOS() {
132 }
133 static void show_all_stats() {
134 Logger::out("Stats") << "Compiled without PCK_STAT (no stats)"
135 << std::endl;
136 }
137 };
138#endif
139
140
145#define SOS_result(x) [&]()->Sign { return Sign(x); }
146
169 template <
170 class POINT, class COMPARE,
171 class FUNC1, class FUNC2, class FUNC3, class FUNC4
172 > inline Sign SOS(
173 COMPARE compare,
174 const POINT& p1, FUNC1 sos_p1,
175 const POINT& p2, FUNC2 sos_p2,
176 const POINT& p3, FUNC3 sos_p3,
177 const POINT& p4, FUNC4 sos_p4
178 ) {
179 static constexpr int N = 4;
180 Sign result = ZERO;
181 const POINT* p[N] = {&p1, &p2, &p3, &p4};
182 std::sort(
183 p, p+N,
184 [compare](const POINT* A, const POINT* B)->bool{
185 return compare(*A,*B);
186 }
187 );
188 for(int i=0; i<N; ++i) {
189 if(p[i] == &p1) {
190 result = sos_p1();
191 if(result != ZERO) {
192 return result;
193 }
194 }
195 if(p[i] == &p2) {
196 result = sos_p2();
197 if(result != ZERO) {
198 return result;
199 }
200 }
201 if(p[i] == &p3) {
202 result = sos_p3();
203 if(result != ZERO) {
204 return result;
205 }
206 }
207 if(p[i] == &p4) {
208 result = sos_p4();
209 if(result != ZERO) {
210 return result;
211 }
212 }
213 }
215 }
216
217 }
218}
219
220#endif
#define geo_assert_not_reached
Sets a non reachable point in the program.
Definition assert.h:177
Common include file, providing basic definitions. Should be included before anything else by all head...
Logs statistics for predicates. The statistics are displayed on exit if the command line flag "sys:st...
Definition PCK.h:122
Generic logging mechanism.
Sign SOS(COMPARE compare, const POINT &p1, FUNC1 sos_p1, const POINT &p2, FUNC2 sos_p2, const POINT &p3, FUNC3 sos_p3, const POINT &p4, FUNC4 sos_p4)
template for writing symbolic perturbation in predicates
Definition PCK.h:172
void show_stats()
Displays statistics about the current process.
Global Vorpaline namespace.
Definition algorithm.h:65
void geo_argused(const T &)
Suppresses compiler warnings about unused parameters.
Definition argused.h:60
Sign
Integer constants that represent the sign of a value.
Definition numeric.h:68
@ ZERO
Definition numeric.h:72
Types and functions for numbers manipulation.