The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.
The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.
The ResGraphAdaptor is based on this composition.
3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
19 #ifndef LEMON_TOLERANCE_H
20 #define LEMON_TOLERANCE_H
24 ///\brief A basic tool to handle the anomalies of calculation with
25 ///floating point numbers.
27 ///\todo It should be in a module like "Basic tools"
35 ///\brief A class to provide a basic way to
36 ///handle the comparison of numbers that are obtained
37 ///as a result of a probably inexact computation.
39 ///Tolerance is a class to provide a basic way to
40 ///handle the comparison of numbers that are obtained
41 ///as a result of a probably inexact computation.
43 ///This is an abstract class, it should be specialized for all numerical
44 ///data types. These specialized classes like \ref Tolerance\<double\>
45 ///may offer additional tuning parameters.
47 ///\sa Tolerance<float>
48 ///\sa Tolerance<double>
49 ///\sa Tolerance<long double>
51 ///\sa Tolerance<long long int>
60 ///The concept is that these bool functions return with \c true only if
61 ///the related comparisons hold even if some numerical error appeared
62 ///during the computations.
66 ///Returns \c true if \c a is \e surely strictly less than \c b
67 static bool less(Value a,Value b) {return false;}
68 ///Returns \c true if \c a is \e surely different from \c b
69 static bool different(Value a,Value b) {return false;}
70 ///Returns \c true if \c a is \e surely positive
71 static bool positive(Value a) {return false;}
72 ///Returns \c true if \c a is \e surely negative
73 static bool negative(Value a) {return false;}
74 ///Returns \c true if \c a is \e surely non-zero
75 static bool nonZero(Value a) {return false;}
79 ///Returns the zero value.
80 static Value zero() {return T();}
82 // static bool finite(Value a) {}
83 // static Value big() {}
84 // static Value negativeBig() {}
88 ///Float specialization of \ref Tolerance.
90 ///Float specialization of \ref Tolerance.
94 class Tolerance<float>
96 static float def_epsilon;
102 ///Constructor setting the epsilon tolerance to the default value.
103 Tolerance() : _epsilon(def_epsilon) {}
104 ///Constructor setting the epsilon tolerance.
105 Tolerance(float e) : _epsilon(e) {}
107 ///Return the epsilon value.
108 Value epsilon() {return _epsilon;}
109 ///Set the epsilon value.
110 void epsilon(Value e) {_epsilon=e;}
112 ///Return the default epsilon value.
113 static Value defaultEpsilon() {return def_epsilon;}
114 ///Set the default epsilon value.
115 static void defaultEpsilon(Value e) {def_epsilon=e;}
118 ///See class Tolerance for more details.
122 ///Returns \c true if \c a is \e surely strictly less than \c b
123 bool less(Value a,Value b) {return a+_epsilon<b;}
124 ///Returns \c true if \c a is \e surely different from \c b
125 bool different(Value a,Value b) { return less(a,b)||less(b,a); }
126 ///Returns \c true if \c a is \e surely positive
127 bool positive(Value a) { return _epsilon<a; }
128 ///Returns \c true if \c a is \e surely negative
129 bool negative(Value a) { return -_epsilon>a; }
130 ///Returns \c true if \c a is \e surely non-zero
131 Value nonZero(Value a) { return positive(a)||negative(a); };
136 static Value zero() {return 0;}
139 ///Double specialization of \ref Tolerance.
141 ///Double specialization of \ref Tolerance.
143 ///\relates Tolerance
145 class Tolerance<double>
147 static double def_epsilon;
151 typedef double Value;
153 ///Constructor setting the epsilon tolerance to the default value.
154 Tolerance() : _epsilon(def_epsilon) {}
155 ///Constructor setting the epsilon tolerance.
156 Tolerance(double e) : _epsilon(e) {}
158 ///Return the epsilon value.
159 Value epsilon() {return _epsilon;}
160 ///Set the epsilon value.
161 void epsilon(Value e) {_epsilon=e;}
163 ///Return the default epsilon value.
164 static Value defaultEpsilon() {return def_epsilon;}
165 ///Set the default epsilon value.
166 static void defaultEpsilon(Value e) {def_epsilon=e;}
169 ///See class Tolerance for more details.
173 ///Returns \c true if \c a is \e surely strictly less than \c b
174 bool less(Value a,Value b) {return a+_epsilon<b;}
175 ///Returns \c true if \c a is \e surely different from \c b
176 bool different(Value a,Value b) { return less(a,b)||less(b,a); }
177 ///Returns \c true if \c a is \e surely positive
178 bool positive(Value a) { return _epsilon<a; }
179 ///Returns \c true if \c a is \e surely negative
180 bool negative(Value a) { return -_epsilon>a; }
181 ///Returns \c true if \c a is \e surely non-zero
182 Value nonZero(Value a) { return positive(a)||negative(a); };
187 static Value zero() {return 0;}
190 ///Long double specialization of \ref Tolerance.
192 ///Long double specialization of \ref Tolerance.
194 ///\relates Tolerance
196 class Tolerance<long double>
198 static long double def_epsilon;
199 long double _epsilon;
202 typedef long double Value;
204 ///Constructor setting the epsilon tolerance to the default value.
205 Tolerance() : _epsilon(def_epsilon) {}
206 ///Constructor setting the epsilon tolerance.
207 Tolerance(long double e) : _epsilon(e) {}
209 ///Return the epsilon value.
210 Value epsilon() {return _epsilon;}
211 ///Set the epsilon value.
212 void epsilon(Value e) {_epsilon=e;}
214 ///Return the default epsilon value.
215 static Value defaultEpsilon() {return def_epsilon;}
216 ///Set the default epsilon value.
217 static void defaultEpsilon(Value e) {def_epsilon=e;}
220 ///See class Tolerance for more details.
224 ///Returns \c true if \c a is \e surely strictly less than \c b
225 bool less(Value a,Value b) {return a+_epsilon<b;}
226 ///Returns \c true if \c a is \e surely different from \c b
227 bool different(Value a,Value b) { return less(a,b)||less(b,a); }
228 ///Returns \c true if \c a is \e surely positive
229 bool positive(Value a) { return _epsilon<a; }
230 ///Returns \c true if \c a is \e surely negative
231 bool negative(Value a) { return -_epsilon>a; }
232 ///Returns \c true if \c a is \e surely non-zero
233 Value nonZero(Value a) { return positive(a)||negative(a); };
238 static Value zero() {return 0;}
241 ///Integer specialization of \ref Tolerance.
243 ///Integer specialization of \ref Tolerance.
253 ///See \ref Tolerance for more details.
257 ///Returns \c true if \c a is \e surely strictly less than \c b
258 static bool less(Value a,Value b) { return a<b;}
259 ///Returns \c true if \c a is \e surely different from \c b
260 static bool different(Value a,Value b) { return a!=b; }
261 ///Returns \c true if \c a is \e surely positive
262 static bool positive(Value a) { return 0<a; }
263 ///Returns \c true if \c a is \e surely negative
264 static bool negative(Value a) { return 0>a; }
265 ///Returns \c true if \c a is \e surely non-zero
266 static Value nonZero(Value a) { return a!=0;};
271 static Value zero() {return 0;}
274 #ifndef __STRICT_ANSI__
276 ///Long long integer specialization of \ref Tolerance.
278 ///Long long integer specialization of \ref Tolerance.
279 ///\warning This class is not ansi compatible.
282 class Tolerance<long long int>
286 typedef long long int Value;
289 ///See \ref Tolerance for more details.
293 ///Returns \c true if \c a is \e surely strictly less than \c b
294 static bool less(Value a,Value b) { return a<b;}
295 ///Returns \c true if \c a is \e surely different from \c b
296 static bool different(Value a,Value b) { return a!=b; }
297 ///Returns \c true if \c a is \e surely positive
298 static bool positive(Value a) { return 0<a; }
299 ///Returns \c true if \c a is \e surely negative
300 static bool negative(Value a) { return 0>a; }
301 ///Returns \c true if \c a is \e surely non-zero
302 static Value nonZero(Value a) { return a!=0;};
307 static Value zero() {return 0;}
316 #endif //LEMON_TOLERANCE_H