Chris@16
|
1 // Copyright John Maddock 2006.
|
Chris@16
|
2 // Use, modification and distribution are subject to the
|
Chris@16
|
3 // Boost Software License, Version 1.0. (See accompanying file
|
Chris@16
|
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5
|
Chris@16
|
6 // distributions.hpp provides definitions of the concept of a distribution
|
Chris@16
|
7 // and non-member accessor functions that must be implemented by all distributions.
|
Chris@16
|
8 // This is used to verify that
|
Chris@16
|
9 // all the features of a distributions have been fully implemented.
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
|
Chris@16
|
12 #define BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/math/distributions/complement.hpp>
|
Chris@16
|
15 #include <boost/math/distributions/fwd.hpp>
|
Chris@16
|
16 #ifdef BOOST_MSVC
|
Chris@16
|
17 #pragma warning(push)
|
Chris@16
|
18 #pragma warning(disable: 4100)
|
Chris@16
|
19 #pragma warning(disable: 4510)
|
Chris@16
|
20 #pragma warning(disable: 4610)
|
Chris@16
|
21 #pragma warning(disable: 4189) // local variable is initialized but not referenced.
|
Chris@16
|
22 #endif
|
Chris@16
|
23 #include <boost/concept_check.hpp>
|
Chris@16
|
24 #ifdef BOOST_MSVC
|
Chris@16
|
25 #pragma warning(pop)
|
Chris@16
|
26 #endif
|
Chris@16
|
27 #include <utility>
|
Chris@16
|
28
|
Chris@16
|
29 namespace boost{
|
Chris@16
|
30 namespace math{
|
Chris@16
|
31
|
Chris@16
|
32 namespace concepts
|
Chris@16
|
33 {
|
Chris@16
|
34 // Begin by defining a concept archetype
|
Chris@16
|
35 // for a distribution class:
|
Chris@16
|
36 //
|
Chris@16
|
37 template <class RealType>
|
Chris@16
|
38 class distribution_archetype
|
Chris@16
|
39 {
|
Chris@16
|
40 public:
|
Chris@16
|
41 typedef RealType value_type;
|
Chris@16
|
42
|
Chris@16
|
43 distribution_archetype(const distribution_archetype&); // Copy constructible.
|
Chris@16
|
44 distribution_archetype& operator=(const distribution_archetype&); // Assignable.
|
Chris@16
|
45
|
Chris@16
|
46 // There is no default constructor,
|
Chris@16
|
47 // but we need a way to instantiate the archetype:
|
Chris@16
|
48 static distribution_archetype& get_object()
|
Chris@16
|
49 {
|
Chris@16
|
50 // will never get caled:
|
Chris@16
|
51 return *reinterpret_cast<distribution_archetype*>(0);
|
Chris@16
|
52 }
|
Chris@16
|
53 }; // template <class RealType>class distribution_archetype
|
Chris@16
|
54
|
Chris@16
|
55 // Non-member accessor functions:
|
Chris@16
|
56 // (This list defines the functions that must be implemented by all distributions).
|
Chris@16
|
57
|
Chris@16
|
58 template <class RealType>
|
Chris@16
|
59 RealType pdf(const distribution_archetype<RealType>& dist, const RealType& x);
|
Chris@16
|
60
|
Chris@16
|
61 template <class RealType>
|
Chris@16
|
62 RealType cdf(const distribution_archetype<RealType>& dist, const RealType& x);
|
Chris@16
|
63
|
Chris@16
|
64 template <class RealType>
|
Chris@16
|
65 RealType quantile(const distribution_archetype<RealType>& dist, const RealType& p);
|
Chris@16
|
66
|
Chris@16
|
67 template <class RealType>
|
Chris@16
|
68 RealType cdf(const complemented2_type<distribution_archetype<RealType>, RealType>& c);
|
Chris@16
|
69
|
Chris@16
|
70 template <class RealType>
|
Chris@16
|
71 RealType quantile(const complemented2_type<distribution_archetype<RealType>, RealType>& c);
|
Chris@16
|
72
|
Chris@16
|
73 template <class RealType>
|
Chris@16
|
74 RealType mean(const distribution_archetype<RealType>& dist);
|
Chris@16
|
75
|
Chris@16
|
76 template <class RealType>
|
Chris@16
|
77 RealType standard_deviation(const distribution_archetype<RealType>& dist);
|
Chris@16
|
78
|
Chris@16
|
79 template <class RealType>
|
Chris@16
|
80 RealType variance(const distribution_archetype<RealType>& dist);
|
Chris@16
|
81
|
Chris@16
|
82 template <class RealType>
|
Chris@16
|
83 RealType hazard(const distribution_archetype<RealType>& dist);
|
Chris@16
|
84
|
Chris@16
|
85 template <class RealType>
|
Chris@16
|
86 RealType chf(const distribution_archetype<RealType>& dist);
|
Chris@16
|
87 // http://en.wikipedia.org/wiki/Characteristic_function_%28probability_theory%29
|
Chris@16
|
88
|
Chris@16
|
89 template <class RealType>
|
Chris@16
|
90 RealType coefficient_of_variation(const distribution_archetype<RealType>& dist);
|
Chris@16
|
91
|
Chris@16
|
92 template <class RealType>
|
Chris@16
|
93 RealType mode(const distribution_archetype<RealType>& dist);
|
Chris@16
|
94
|
Chris@16
|
95 template <class RealType>
|
Chris@16
|
96 RealType skewness(const distribution_archetype<RealType>& dist);
|
Chris@16
|
97
|
Chris@16
|
98 template <class RealType>
|
Chris@16
|
99 RealType kurtosis_excess(const distribution_archetype<RealType>& dist);
|
Chris@16
|
100
|
Chris@16
|
101 template <class RealType>
|
Chris@16
|
102 RealType kurtosis(const distribution_archetype<RealType>& dist);
|
Chris@16
|
103
|
Chris@16
|
104 template <class RealType>
|
Chris@16
|
105 RealType median(const distribution_archetype<RealType>& dist);
|
Chris@16
|
106
|
Chris@16
|
107 template <class RealType>
|
Chris@16
|
108 std::pair<RealType, RealType> range(const distribution_archetype<RealType>& dist);
|
Chris@16
|
109
|
Chris@16
|
110 template <class RealType>
|
Chris@16
|
111 std::pair<RealType, RealType> support(const distribution_archetype<RealType>& dist);
|
Chris@16
|
112
|
Chris@16
|
113 //
|
Chris@16
|
114 // Next comes the concept checks for verifying that a class
|
Chris@16
|
115 // fullfils the requirements of a Distribution:
|
Chris@16
|
116 //
|
Chris@16
|
117 template <class Distribution>
|
Chris@16
|
118 struct DistributionConcept
|
Chris@16
|
119 {
|
Chris@16
|
120 typedef typename Distribution::value_type value_type;
|
Chris@16
|
121
|
Chris@16
|
122 void constraints()
|
Chris@16
|
123 {
|
Chris@16
|
124 function_requires<CopyConstructibleConcept<Distribution> >();
|
Chris@16
|
125 function_requires<AssignableConcept<Distribution> >();
|
Chris@16
|
126
|
Chris@16
|
127 const Distribution& dist = DistributionConcept<Distribution>::get_object();
|
Chris@16
|
128
|
Chris@16
|
129 value_type x = 0;
|
Chris@16
|
130 // The result values are ignored in all these checks.
|
Chris@16
|
131 value_type v = cdf(dist, x);
|
Chris@16
|
132 v = cdf(complement(dist, x));
|
Chris@16
|
133 suppress_unused_variable_warning(v);
|
Chris@16
|
134 v = pdf(dist, x);
|
Chris@16
|
135 suppress_unused_variable_warning(v);
|
Chris@16
|
136 v = quantile(dist, x);
|
Chris@16
|
137 suppress_unused_variable_warning(v);
|
Chris@16
|
138 v = quantile(complement(dist, x));
|
Chris@16
|
139 suppress_unused_variable_warning(v);
|
Chris@16
|
140 v = mean(dist);
|
Chris@16
|
141 suppress_unused_variable_warning(v);
|
Chris@16
|
142 v = mode(dist);
|
Chris@16
|
143 suppress_unused_variable_warning(v);
|
Chris@16
|
144 v = standard_deviation(dist);
|
Chris@16
|
145 suppress_unused_variable_warning(v);
|
Chris@16
|
146 v = variance(dist);
|
Chris@16
|
147 suppress_unused_variable_warning(v);
|
Chris@16
|
148 v = hazard(dist, x);
|
Chris@16
|
149 suppress_unused_variable_warning(v);
|
Chris@16
|
150 v = chf(dist, x);
|
Chris@16
|
151 suppress_unused_variable_warning(v);
|
Chris@16
|
152 v = coefficient_of_variation(dist);
|
Chris@16
|
153 suppress_unused_variable_warning(v);
|
Chris@16
|
154 v = skewness(dist);
|
Chris@16
|
155 suppress_unused_variable_warning(v);
|
Chris@16
|
156 v = kurtosis(dist);
|
Chris@16
|
157 suppress_unused_variable_warning(v);
|
Chris@16
|
158 v = kurtosis_excess(dist);
|
Chris@16
|
159 suppress_unused_variable_warning(v);
|
Chris@16
|
160 v = median(dist);
|
Chris@16
|
161 suppress_unused_variable_warning(v);
|
Chris@16
|
162 std::pair<value_type, value_type> pv;
|
Chris@16
|
163 pv = range(dist);
|
Chris@16
|
164 suppress_unused_variable_warning(pv);
|
Chris@16
|
165 pv = support(dist);
|
Chris@16
|
166 suppress_unused_variable_warning(pv);
|
Chris@16
|
167
|
Chris@16
|
168 float f = 1;
|
Chris@16
|
169 v = cdf(dist, f);
|
Chris@16
|
170 suppress_unused_variable_warning(v);
|
Chris@16
|
171 v = cdf(complement(dist, f));
|
Chris@16
|
172 suppress_unused_variable_warning(v);
|
Chris@16
|
173 v = pdf(dist, f);
|
Chris@16
|
174 suppress_unused_variable_warning(v);
|
Chris@16
|
175 v = quantile(dist, f);
|
Chris@16
|
176 suppress_unused_variable_warning(v);
|
Chris@16
|
177 v = quantile(complement(dist, f));
|
Chris@16
|
178 suppress_unused_variable_warning(v);
|
Chris@16
|
179 v = hazard(dist, f);
|
Chris@16
|
180 suppress_unused_variable_warning(v);
|
Chris@16
|
181 v = chf(dist, f);
|
Chris@16
|
182 suppress_unused_variable_warning(v);
|
Chris@16
|
183 double d = 1;
|
Chris@16
|
184 v = cdf(dist, d);
|
Chris@16
|
185 suppress_unused_variable_warning(v);
|
Chris@16
|
186 v = cdf(complement(dist, d));
|
Chris@16
|
187 suppress_unused_variable_warning(v);
|
Chris@16
|
188 v = pdf(dist, d);
|
Chris@16
|
189 suppress_unused_variable_warning(v);
|
Chris@16
|
190 v = quantile(dist, d);
|
Chris@16
|
191 suppress_unused_variable_warning(v);
|
Chris@16
|
192 v = quantile(complement(dist, d));
|
Chris@16
|
193 suppress_unused_variable_warning(v);
|
Chris@16
|
194 v = hazard(dist, d);
|
Chris@16
|
195 suppress_unused_variable_warning(v);
|
Chris@16
|
196 v = chf(dist, d);
|
Chris@16
|
197 suppress_unused_variable_warning(v);
|
Chris@16
|
198 #ifndef TEST_MPFR
|
Chris@16
|
199 long double ld = 1;
|
Chris@16
|
200 v = cdf(dist, ld);
|
Chris@16
|
201 suppress_unused_variable_warning(v);
|
Chris@16
|
202 v = cdf(complement(dist, ld));
|
Chris@16
|
203 suppress_unused_variable_warning(v);
|
Chris@16
|
204 v = pdf(dist, ld);
|
Chris@16
|
205 suppress_unused_variable_warning(v);
|
Chris@16
|
206 v = quantile(dist, ld);
|
Chris@16
|
207 suppress_unused_variable_warning(v);
|
Chris@16
|
208 v = quantile(complement(dist, ld));
|
Chris@16
|
209 suppress_unused_variable_warning(v);
|
Chris@16
|
210 v = hazard(dist, ld);
|
Chris@16
|
211 suppress_unused_variable_warning(v);
|
Chris@16
|
212 v = chf(dist, ld);
|
Chris@16
|
213 suppress_unused_variable_warning(v);
|
Chris@16
|
214 #endif
|
Chris@16
|
215 int i = 1;
|
Chris@16
|
216 v = cdf(dist, i);
|
Chris@16
|
217 suppress_unused_variable_warning(v);
|
Chris@16
|
218 v = cdf(complement(dist, i));
|
Chris@16
|
219 suppress_unused_variable_warning(v);
|
Chris@16
|
220 v = pdf(dist, i);
|
Chris@16
|
221 suppress_unused_variable_warning(v);
|
Chris@16
|
222 v = quantile(dist, i);
|
Chris@16
|
223 suppress_unused_variable_warning(v);
|
Chris@16
|
224 v = quantile(complement(dist, i));
|
Chris@16
|
225 suppress_unused_variable_warning(v);
|
Chris@16
|
226 v = hazard(dist, i);
|
Chris@16
|
227 suppress_unused_variable_warning(v);
|
Chris@16
|
228 v = chf(dist, i);
|
Chris@16
|
229 suppress_unused_variable_warning(v);
|
Chris@16
|
230 unsigned long li = 1;
|
Chris@16
|
231 v = cdf(dist, li);
|
Chris@16
|
232 suppress_unused_variable_warning(v);
|
Chris@16
|
233 v = cdf(complement(dist, li));
|
Chris@16
|
234 suppress_unused_variable_warning(v);
|
Chris@16
|
235 v = pdf(dist, li);
|
Chris@16
|
236 suppress_unused_variable_warning(v);
|
Chris@16
|
237 v = quantile(dist, li);
|
Chris@16
|
238 suppress_unused_variable_warning(v);
|
Chris@16
|
239 v = quantile(complement(dist, li));
|
Chris@16
|
240 suppress_unused_variable_warning(v);
|
Chris@16
|
241 v = hazard(dist, li);
|
Chris@16
|
242 suppress_unused_variable_warning(v);
|
Chris@16
|
243 v = chf(dist, li);
|
Chris@16
|
244 suppress_unused_variable_warning(v);
|
Chris@16
|
245 test_extra_members(dist);
|
Chris@16
|
246 }
|
Chris@16
|
247 template <class D>
|
Chris@16
|
248 static void test_extra_members(const D&)
|
Chris@16
|
249 {}
|
Chris@16
|
250 template <class R, class P>
|
Chris@16
|
251 static void test_extra_members(const boost::math::bernoulli_distribution<R, P>& d)
|
Chris@16
|
252 {
|
Chris@16
|
253 value_type r = d.success_fraction();
|
Chris@16
|
254 (void)r; // warning suppression
|
Chris@16
|
255 }
|
Chris@16
|
256 template <class R, class P>
|
Chris@16
|
257 static void test_extra_members(const boost::math::beta_distribution<R, P>& d)
|
Chris@16
|
258 {
|
Chris@16
|
259 value_type r1 = d.alpha();
|
Chris@16
|
260 value_type r2 = d.beta();
|
Chris@16
|
261 r1 = boost::math::beta_distribution<R, P>::find_alpha(r1, r2);
|
Chris@16
|
262 suppress_unused_variable_warning(r1);
|
Chris@16
|
263 r1 = boost::math::beta_distribution<R, P>::find_beta(r1, r2);
|
Chris@16
|
264 suppress_unused_variable_warning(r1);
|
Chris@16
|
265 r1 = boost::math::beta_distribution<R, P>::find_alpha(r1, r2, r1);
|
Chris@16
|
266 suppress_unused_variable_warning(r1);
|
Chris@16
|
267 r1 = boost::math::beta_distribution<R, P>::find_beta(r1, r2, r1);
|
Chris@16
|
268 suppress_unused_variable_warning(r1);
|
Chris@16
|
269 }
|
Chris@16
|
270 template <class R, class P>
|
Chris@16
|
271 static void test_extra_members(const boost::math::binomial_distribution<R, P>& d)
|
Chris@16
|
272 {
|
Chris@16
|
273 value_type r = d.success_fraction();
|
Chris@16
|
274 r = d.trials();
|
Chris@16
|
275 r = Distribution::find_lower_bound_on_p(r, r, r);
|
Chris@16
|
276 r = Distribution::find_lower_bound_on_p(r, r, r, Distribution::clopper_pearson_exact_interval);
|
Chris@16
|
277 r = Distribution::find_lower_bound_on_p(r, r, r, Distribution::jeffreys_prior_interval);
|
Chris@16
|
278 r = Distribution::find_upper_bound_on_p(r, r, r);
|
Chris@16
|
279 r = Distribution::find_upper_bound_on_p(r, r, r, Distribution::clopper_pearson_exact_interval);
|
Chris@16
|
280 r = Distribution::find_upper_bound_on_p(r, r, r, Distribution::jeffreys_prior_interval);
|
Chris@16
|
281 r = Distribution::find_minimum_number_of_trials(r, r, r);
|
Chris@16
|
282 r = Distribution::find_maximum_number_of_trials(r, r, r);
|
Chris@16
|
283 suppress_unused_variable_warning(r);
|
Chris@16
|
284 }
|
Chris@16
|
285 template <class R, class P>
|
Chris@16
|
286 static void test_extra_members(const boost::math::cauchy_distribution<R, P>& d)
|
Chris@16
|
287 {
|
Chris@16
|
288 value_type r = d.location();
|
Chris@16
|
289 r = d.scale();
|
Chris@16
|
290 suppress_unused_variable_warning(r);
|
Chris@16
|
291 }
|
Chris@16
|
292 template <class R, class P>
|
Chris@16
|
293 static void test_extra_members(const boost::math::chi_squared_distribution<R, P>& d)
|
Chris@16
|
294 {
|
Chris@16
|
295 value_type r = d.degrees_of_freedom();
|
Chris@16
|
296 r = Distribution::find_degrees_of_freedom(r, r, r, r);
|
Chris@16
|
297 r = Distribution::find_degrees_of_freedom(r, r, r, r, r);
|
Chris@16
|
298 suppress_unused_variable_warning(r);
|
Chris@16
|
299 }
|
Chris@16
|
300 template <class R, class P>
|
Chris@16
|
301 static void test_extra_members(const boost::math::exponential_distribution<R, P>& d)
|
Chris@16
|
302 {
|
Chris@16
|
303 value_type r = d.lambda();
|
Chris@16
|
304 suppress_unused_variable_warning(r);
|
Chris@16
|
305 }
|
Chris@16
|
306 template <class R, class P>
|
Chris@16
|
307 static void test_extra_members(const boost::math::extreme_value_distribution<R, P>& d)
|
Chris@16
|
308 {
|
Chris@16
|
309 value_type r = d.scale();
|
Chris@16
|
310 r = d.location();
|
Chris@16
|
311 suppress_unused_variable_warning(r);
|
Chris@16
|
312 }
|
Chris@16
|
313 template <class R, class P>
|
Chris@16
|
314 static void test_extra_members(const boost::math::fisher_f_distribution<R, P>& d)
|
Chris@16
|
315 {
|
Chris@16
|
316 value_type r = d.degrees_of_freedom1();
|
Chris@16
|
317 r = d.degrees_of_freedom2();
|
Chris@16
|
318 suppress_unused_variable_warning(r);
|
Chris@16
|
319 }
|
Chris@16
|
320 template <class R, class P>
|
Chris@16
|
321 static void test_extra_members(const boost::math::gamma_distribution<R, P>& d)
|
Chris@16
|
322 {
|
Chris@16
|
323 value_type r = d.scale();
|
Chris@16
|
324 r = d.shape();
|
Chris@16
|
325 suppress_unused_variable_warning(r);
|
Chris@16
|
326 }
|
Chris@16
|
327 template <class R, class P>
|
Chris@16
|
328 static void test_extra_members(const boost::math::inverse_chi_squared_distribution<R, P>& d)
|
Chris@16
|
329 {
|
Chris@16
|
330 value_type r = d.scale();
|
Chris@16
|
331 r = d.degrees_of_freedom();
|
Chris@16
|
332 suppress_unused_variable_warning(r);
|
Chris@16
|
333 }
|
Chris@16
|
334 template <class R, class P>
|
Chris@16
|
335 static void test_extra_members(const boost::math::inverse_gamma_distribution<R, P>& d)
|
Chris@16
|
336 {
|
Chris@16
|
337 value_type r = d.scale();
|
Chris@16
|
338 r = d.shape();
|
Chris@16
|
339 suppress_unused_variable_warning(r);
|
Chris@16
|
340 }
|
Chris@16
|
341 template <class R, class P>
|
Chris@16
|
342 static void test_extra_members(const boost::math::hypergeometric_distribution<R, P>& d)
|
Chris@16
|
343 {
|
Chris@16
|
344 unsigned u = d.defective();
|
Chris@16
|
345 u = d.sample_count();
|
Chris@16
|
346 u = d.total();
|
Chris@16
|
347 suppress_unused_variable_warning(u);
|
Chris@16
|
348 }
|
Chris@16
|
349 template <class R, class P>
|
Chris@16
|
350 static void test_extra_members(const boost::math::laplace_distribution<R, P>& d)
|
Chris@16
|
351 {
|
Chris@16
|
352 value_type r = d.scale();
|
Chris@16
|
353 r = d.location();
|
Chris@16
|
354 suppress_unused_variable_warning(r);
|
Chris@16
|
355 }
|
Chris@16
|
356 template <class R, class P>
|
Chris@16
|
357 static void test_extra_members(const boost::math::logistic_distribution<R, P>& d)
|
Chris@16
|
358 {
|
Chris@16
|
359 value_type r = d.scale();
|
Chris@16
|
360 r = d.location();
|
Chris@16
|
361 suppress_unused_variable_warning(r);
|
Chris@16
|
362 }
|
Chris@16
|
363 template <class R, class P>
|
Chris@16
|
364 static void test_extra_members(const boost::math::lognormal_distribution<R, P>& d)
|
Chris@16
|
365 {
|
Chris@16
|
366 value_type r = d.scale();
|
Chris@16
|
367 r = d.location();
|
Chris@16
|
368 suppress_unused_variable_warning(r);
|
Chris@16
|
369 }
|
Chris@16
|
370 template <class R, class P>
|
Chris@16
|
371 static void test_extra_members(const boost::math::negative_binomial_distribution<R, P>& d)
|
Chris@16
|
372 {
|
Chris@16
|
373 value_type r = d.success_fraction();
|
Chris@16
|
374 r = d.successes();
|
Chris@16
|
375 r = Distribution::find_lower_bound_on_p(r, r, r);
|
Chris@16
|
376 r = Distribution::find_upper_bound_on_p(r, r, r);
|
Chris@16
|
377 r = Distribution::find_minimum_number_of_trials(r, r, r);
|
Chris@16
|
378 r = Distribution::find_maximum_number_of_trials(r, r, r);
|
Chris@16
|
379 suppress_unused_variable_warning(r);
|
Chris@16
|
380 }
|
Chris@16
|
381 template <class R, class P>
|
Chris@16
|
382 static void test_extra_members(const boost::math::non_central_beta_distribution<R, P>& d)
|
Chris@16
|
383 {
|
Chris@16
|
384 value_type r1 = d.alpha();
|
Chris@16
|
385 value_type r2 = d.beta();
|
Chris@16
|
386 r1 = d.non_centrality();
|
Chris@16
|
387 (void)r1; // warning suppression
|
Chris@16
|
388 (void)r2; // warning suppression
|
Chris@16
|
389 }
|
Chris@16
|
390 template <class R, class P>
|
Chris@16
|
391 static void test_extra_members(const boost::math::non_central_chi_squared_distribution<R, P>& d)
|
Chris@16
|
392 {
|
Chris@16
|
393 value_type r = d.degrees_of_freedom();
|
Chris@16
|
394 r = d.non_centrality();
|
Chris@16
|
395 r = Distribution::find_degrees_of_freedom(r, r, r);
|
Chris@16
|
396 r = Distribution::find_degrees_of_freedom(boost::math::complement(r, r, r));
|
Chris@16
|
397 r = Distribution::find_non_centrality(r, r, r);
|
Chris@16
|
398 r = Distribution::find_non_centrality(boost::math::complement(r, r, r));
|
Chris@16
|
399 (void)r; // warning suppression
|
Chris@16
|
400 }
|
Chris@16
|
401 template <class R, class P>
|
Chris@16
|
402 static void test_extra_members(const boost::math::non_central_f_distribution<R, P>& d)
|
Chris@16
|
403 {
|
Chris@16
|
404 value_type r = d.degrees_of_freedom1();
|
Chris@16
|
405 r = d.degrees_of_freedom2();
|
Chris@16
|
406 r = d.non_centrality();
|
Chris@16
|
407 (void)r; // warning suppression
|
Chris@16
|
408 }
|
Chris@16
|
409 template <class R, class P>
|
Chris@16
|
410 static void test_extra_members(const boost::math::non_central_t_distribution<R, P>& d)
|
Chris@16
|
411 {
|
Chris@16
|
412 value_type r = d.degrees_of_freedom();
|
Chris@16
|
413 r = d.non_centrality();
|
Chris@16
|
414 (void)r; // warning suppression
|
Chris@16
|
415 }
|
Chris@16
|
416 template <class R, class P>
|
Chris@16
|
417 static void test_extra_members(const boost::math::normal_distribution<R, P>& d)
|
Chris@16
|
418 {
|
Chris@16
|
419 value_type r = d.scale();
|
Chris@16
|
420 r = d.location();
|
Chris@16
|
421 r = d.mean();
|
Chris@16
|
422 r = d.standard_deviation();
|
Chris@16
|
423 (void)r; // warning suppression
|
Chris@16
|
424 }
|
Chris@16
|
425 template <class R, class P>
|
Chris@16
|
426 static void test_extra_members(const boost::math::pareto_distribution<R, P>& d)
|
Chris@16
|
427 {
|
Chris@16
|
428 value_type r = d.scale();
|
Chris@16
|
429 r = d.shape();
|
Chris@16
|
430 (void)r; // warning suppression
|
Chris@16
|
431 }
|
Chris@16
|
432 template <class R, class P>
|
Chris@16
|
433 static void test_extra_members(const boost::math::poisson_distribution<R, P>& d)
|
Chris@16
|
434 {
|
Chris@16
|
435 value_type r = d.mean();
|
Chris@16
|
436 (void)r; // warning suppression
|
Chris@16
|
437 }
|
Chris@16
|
438 template <class R, class P>
|
Chris@16
|
439 static void test_extra_members(const boost::math::rayleigh_distribution<R, P>& d)
|
Chris@16
|
440 {
|
Chris@16
|
441 value_type r = d.sigma();
|
Chris@16
|
442 (void)r; // warning suppression
|
Chris@16
|
443 }
|
Chris@16
|
444 template <class R, class P>
|
Chris@16
|
445 static void test_extra_members(const boost::math::students_t_distribution<R, P>& d)
|
Chris@16
|
446 {
|
Chris@16
|
447 value_type r = d.degrees_of_freedom();
|
Chris@16
|
448 r = d.find_degrees_of_freedom(r, r, r, r);
|
Chris@16
|
449 r = d.find_degrees_of_freedom(r, r, r, r, r);
|
Chris@16
|
450 (void)r; // warning suppression
|
Chris@16
|
451 }
|
Chris@16
|
452 template <class R, class P>
|
Chris@16
|
453 static void test_extra_members(const boost::math::triangular_distribution<R, P>& d)
|
Chris@16
|
454 {
|
Chris@16
|
455 value_type r = d.lower();
|
Chris@16
|
456 r = d.mode();
|
Chris@16
|
457 r = d.upper();
|
Chris@16
|
458 (void)r; // warning suppression
|
Chris@16
|
459 }
|
Chris@16
|
460 template <class R, class P>
|
Chris@16
|
461 static void test_extra_members(const boost::math::weibull_distribution<R, P>& d)
|
Chris@16
|
462 {
|
Chris@16
|
463 value_type r = d.scale();
|
Chris@16
|
464 r = d.shape();
|
Chris@16
|
465 (void)r; // warning suppression
|
Chris@16
|
466 }
|
Chris@16
|
467 template <class R, class P>
|
Chris@16
|
468 static void test_extra_members(const boost::math::uniform_distribution<R, P>& d)
|
Chris@16
|
469 {
|
Chris@16
|
470 value_type r = d.lower();
|
Chris@16
|
471 r = d.upper();
|
Chris@16
|
472 (void)r; // warning suppression
|
Chris@16
|
473 }
|
Chris@16
|
474 private:
|
Chris@16
|
475 static Distribution* pd;
|
Chris@16
|
476 static Distribution& get_object()
|
Chris@16
|
477 {
|
Chris@16
|
478 // In reality this will never get called:
|
Chris@16
|
479 return *pd;
|
Chris@16
|
480 }
|
Chris@16
|
481 }; // struct DistributionConcept
|
Chris@16
|
482
|
Chris@16
|
483 template <class Distribution>
|
Chris@16
|
484 Distribution* DistributionConcept<Distribution>::pd = 0;
|
Chris@16
|
485
|
Chris@16
|
486 } // namespace concepts
|
Chris@16
|
487 } // namespace math
|
Chris@16
|
488 } // namespace boost
|
Chris@16
|
489
|
Chris@16
|
490 #endif // BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
|
Chris@16
|
491
|