Skip to content

Commit b03cbf5

Browse files
committed
Add execution policy concept
1 parent b802b7c commit b03cbf5

File tree

2 files changed

+64
-44
lines changed

2 files changed

+64
-44
lines changed

include/boost/math/concepts/concepts.hpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,10 +239,26 @@ concept random_access_container = is_container<T> &&
239239
#define BOOST_MATH_BIDIRECTIONAL_ITER std::bidirectional_iterator
240240
#define BOOST_MATH_RANDOM_ACCESS_ITER std::random_access_iterator
241241

242-
#endif
242+
#endif // Workaround for LIBCPP
243243

244-
#endif
245-
#endif
244+
#ifdef BOOST_MATH_EXEC_COMPATIBLE
245+
#include <execution>
246+
247+
namespace boost::math::concepts {
248+
249+
template <typename T>
250+
concept execution_policy = std::is_execution_policy_v<std::remove_cvref_t<T>>;
251+
252+
} // Namespace boost::math::concepts
253+
254+
#define BOOST_MATH_EXECUTION_POLICY boost::math::concepts::execution_policy
255+
256+
#endif // Has <execution>
257+
258+
#endif // Has <concepts>
259+
#endif // C++20
260+
261+
// If concepts are unavailable replace them with typename for compatibility
246262

247263
#ifndef BOOST_MATH_INTEGRAL
248264
# define BOOST_MATH_INTEGRAL typename
@@ -340,6 +356,10 @@ concept random_access_container = is_container<T> &&
340356
# define BOOST_MATH_RANDOM_ACCESS_CONTAINER typename
341357
#endif
342358

359+
#ifndef BOOST_MATH_EXECUTION_POLICY
360+
# define BOOST_MATH_EXECUTION_POLICY typename
361+
#endif
362+
343363
#ifndef BOOST_MATH_REQUIRES
344364
# define BOOST_MATH_REQUIRES(X, T)
345365
#endif

include/boost/math/statistics/univariate_statistics.hpp

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
namespace boost::math::statistics {
2828

29-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
29+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
3030
inline auto mean(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last)
3131
{
3232
using Real = typename std::iterator_traits<ForwardIterator>::value_type;
@@ -56,7 +56,7 @@ inline auto mean(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator
5656
}
5757
}
5858

59-
template<class ExecutionPolicy, BOOST_MATH_CONTAINER Container>
59+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_CONTAINER Container>
6060
inline auto mean(ExecutionPolicy&& exec, Container const & v)
6161
{
6262
return mean(exec, std::cbegin(v), std::cend(v));
@@ -74,7 +74,7 @@ inline auto mean(Container const & v)
7474
return mean(std::execution::seq, std::cbegin(v), std::cend(v));
7575
}
7676

77-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
77+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
7878
inline auto variance(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last)
7979
{
8080
using Real = typename std::iterator_traits<ForwardIterator>::value_type;
@@ -105,7 +105,7 @@ inline auto variance(ExecutionPolicy&& exec, ForwardIterator first, ForwardItera
105105
}
106106
}
107107

108-
template<class ExecutionPolicy, BOOST_MATH_CONTAINER Container>
108+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_CONTAINER Container>
109109
inline auto variance(ExecutionPolicy&& exec, Container const & v)
110110
{
111111
return variance(exec, std::cbegin(v), std::cend(v));
@@ -123,15 +123,15 @@ inline auto variance(Container const & v)
123123
return variance(std::execution::seq, std::cbegin(v), std::cend(v));
124124
}
125125

126-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
126+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
127127
inline auto sample_variance(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last)
128128
{
129129
const auto n = std::distance(first, last);
130130
BOOST_MATH_ASSERT_MSG(n > 1, "At least two samples are required to compute the sample variance.");
131131
return n*variance(exec, first, last)/(n-1);
132132
}
133133

134-
template<class ExecutionPolicy, BOOST_MATH_CONTAINER Container>
134+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_CONTAINER Container>
135135
inline auto sample_variance(ExecutionPolicy&& exec, Container const & v)
136136
{
137137
return sample_variance(exec, std::cbegin(v), std::cend(v));
@@ -149,7 +149,7 @@ inline auto sample_variance(Container const & v)
149149
return sample_variance(std::execution::seq, std::cbegin(v), std::cend(v));
150150
}
151151

152-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
152+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
153153
inline auto mean_and_sample_variance(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last)
154154
{
155155
using Real = typename std::iterator_traits<ForwardIterator>::value_type;
@@ -182,7 +182,7 @@ inline auto mean_and_sample_variance(ExecutionPolicy&& exec, ForwardIterator fir
182182
}
183183
}
184184

185-
template<class ExecutionPolicy, BOOST_MATH_CONTAINER Container>
185+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_CONTAINER Container>
186186
inline auto mean_and_sample_variance(ExecutionPolicy&& exec, Container const & v)
187187
{
188188
return mean_and_sample_variance(exec, std::cbegin(v), std::cend(v));
@@ -200,7 +200,7 @@ inline auto mean_and_sample_variance(Container const & v)
200200
return mean_and_sample_variance(std::execution::seq, std::cbegin(v), std::cend(v));
201201
}
202202

203-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
203+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
204204
inline auto first_four_moments(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last)
205205
{
206206
using Real = typename std::iterator_traits<ForwardIterator>::value_type;
@@ -237,7 +237,7 @@ inline auto first_four_moments(ExecutionPolicy&& exec, ForwardIterator first, Fo
237237
}
238238
}
239239

240-
template<class ExecutionPolicy, BOOST_MATH_CONTAINER Container>
240+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_CONTAINER Container>
241241
inline auto first_four_moments(ExecutionPolicy&& exec, Container const & v)
242242
{
243243
return first_four_moments(exec, std::cbegin(v), std::cend(v));
@@ -256,7 +256,7 @@ inline auto first_four_moments(Container const & v)
256256
}
257257

258258
// https://prod.sandia.gov/techlib-noauth/access-control.cgi/2008/086212.pdf
259-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
259+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
260260
inline auto skewness(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last)
261261
{
262262
using Real = typename std::iterator_traits<ForwardIterator>::value_type;
@@ -299,7 +299,7 @@ inline auto skewness(ExecutionPolicy&& exec, ForwardIterator first, ForwardItera
299299
}
300300
}
301301

302-
template<class ExecutionPolicy, BOOST_MATH_CONTAINER Container>
302+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_CONTAINER Container>
303303
inline auto skewness(ExecutionPolicy&& exec, Container & v)
304304
{
305305
return skewness(exec, std::cbegin(v), std::cend(v));
@@ -319,7 +319,7 @@ inline auto skewness(Container const & v)
319319

320320
// Follows equation 1.6 of:
321321
// https://prod.sandia.gov/techlib-noauth/access-control.cgi/2008/086212.pdf
322-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
322+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
323323
inline auto kurtosis(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last)
324324
{
325325
const auto [M1, M2, M3, M4] = first_four_moments(exec, first, last);
@@ -330,7 +330,7 @@ inline auto kurtosis(ExecutionPolicy&& exec, ForwardIterator first, ForwardItera
330330
return M4/(M2*M2);
331331
}
332332

333-
template<class ExecutionPolicy, BOOST_MATH_CONTAINER Container>
333+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_CONTAINER Container>
334334
inline auto kurtosis(ExecutionPolicy&& exec, Container const & v)
335335
{
336336
return kurtosis(exec, std::cbegin(v), std::cend(v));
@@ -348,13 +348,13 @@ inline auto kurtosis(Container const & v)
348348
return kurtosis(std::execution::seq, std::cbegin(v), std::cend(v));
349349
}
350350

351-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
351+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
352352
inline auto excess_kurtosis(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last)
353353
{
354354
return kurtosis(exec, first, last) - 3;
355355
}
356356

357-
template<class ExecutionPolicy, BOOST_MATH_CONTAINER Container>
357+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_CONTAINER Container>
358358
inline auto excess_kurtosis(ExecutionPolicy&& exec, Container const & v)
359359
{
360360
return excess_kurtosis(exec, std::cbegin(v), std::cend(v));
@@ -373,7 +373,7 @@ inline auto excess_kurtosis(Container const & v)
373373
}
374374

375375

376-
template<class ExecutionPolicy, class RandomAccessIterator>
376+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, class RandomAccessIterator>
377377
auto median(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIterator last)
378378
{
379379
const auto num_elems = std::distance(first, last);
@@ -394,7 +394,7 @@ auto median(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIter
394394
}
395395

396396

397-
template<class ExecutionPolicy, class RandomAccessContainer>
397+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer>
398398
inline auto median(ExecutionPolicy&& exec, RandomAccessContainer & v)
399399
{
400400
return median(exec, std::begin(v), std::end(v));
@@ -406,13 +406,13 @@ inline auto median(RandomAccessIterator first, RandomAccessIterator last)
406406
return median(std::execution::seq, first, last);
407407
}
408408

409-
template<class RandomAccessContainer>
409+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer>
410410
inline auto median(RandomAccessContainer & v)
411411
{
412412
return median(std::execution::seq, std::begin(v), std::end(v));
413413
}
414414

415-
template<class ExecutionPolicy, class RandomAccessIterator>
415+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, class RandomAccessIterator>
416416
inline auto gini_coefficient(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIterator last)
417417
{
418418
using Real = typename std::iterator_traits<RandomAccessIterator>::value_type;
@@ -445,7 +445,7 @@ inline auto gini_coefficient(ExecutionPolicy&& exec, RandomAccessIterator first,
445445
}
446446
}
447447

448-
template<class ExecutionPolicy, class RandomAccessContainer>
448+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer>
449449
inline auto gini_coefficient(ExecutionPolicy&& exec, RandomAccessContainer & v)
450450
{
451451
return gini_coefficient(exec, std::begin(v), std::end(v));
@@ -457,20 +457,20 @@ inline auto gini_coefficient(RandomAccessIterator first, RandomAccessIterator la
457457
return gini_coefficient(std::execution::seq, first, last);
458458
}
459459

460-
template<class RandomAccessContainer>
460+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer>
461461
inline auto gini_coefficient(RandomAccessContainer & v)
462462
{
463463
return gini_coefficient(std::execution::seq, std::begin(v), std::end(v));
464464
}
465465

466-
template<class ExecutionPolicy, class RandomAccessIterator>
466+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, class RandomAccessIterator>
467467
inline auto sample_gini_coefficient(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIterator last)
468468
{
469469
const auto n = std::distance(first, last);
470470
return n*gini_coefficient(exec, first, last)/(n-1);
471471
}
472472

473-
template<class ExecutionPolicy, class RandomAccessContainer>
473+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer>
474474
inline auto sample_gini_coefficient(ExecutionPolicy&& exec, RandomAccessContainer & v)
475475
{
476476
return sample_gini_coefficient(exec, std::begin(v), std::end(v));
@@ -482,13 +482,13 @@ inline auto sample_gini_coefficient(RandomAccessIterator first, RandomAccessIter
482482
return sample_gini_coefficient(std::execution::seq, first, last);
483483
}
484484

485-
template<class RandomAccessContainer>
485+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer>
486486
inline auto sample_gini_coefficient(RandomAccessContainer & v)
487487
{
488488
return sample_gini_coefficient(std::execution::seq, std::begin(v), std::end(v));
489489
}
490490

491-
template<class ExecutionPolicy, class RandomAccessIterator>
491+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, class RandomAccessIterator>
492492
auto median_absolute_deviation(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIterator last,
493493
typename std::iterator_traits<RandomAccessIterator>::value_type center=std::numeric_limits<typename std::iterator_traits<RandomAccessIterator>::value_type>::quiet_NaN())
494494
{
@@ -517,7 +517,7 @@ auto median_absolute_deviation(ExecutionPolicy&& exec, RandomAccessIterator firs
517517
}
518518
}
519519

520-
template<class ExecutionPolicy, class RandomAccessContainer>
520+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer>
521521
inline auto median_absolute_deviation(ExecutionPolicy&& exec, RandomAccessContainer & v,
522522
typename RandomAccessContainer::value_type center=std::numeric_limits<typename RandomAccessContainer::value_type>::quiet_NaN())
523523
{
@@ -531,14 +531,14 @@ inline auto median_absolute_deviation(RandomAccessIterator first, RandomAccessIt
531531
return median_absolute_deviation(std::execution::seq, first, last, center);
532532
}
533533

534-
template<class RandomAccessContainer>
534+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer>
535535
inline auto median_absolute_deviation(RandomAccessContainer & v,
536536
typename RandomAccessContainer::value_type center=std::numeric_limits<typename RandomAccessContainer::value_type>::quiet_NaN())
537537
{
538538
return median_absolute_deviation(std::execution::seq, std::begin(v), std::end(v), center);
539539
}
540540

541-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
541+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator>
542542
auto interquartile_range(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last)
543543
{
544544
using Real = typename std::iterator_traits<ForwardIterator>::value_type;
@@ -579,7 +579,7 @@ auto interquartile_range(ExecutionPolicy&& exec, ForwardIterator first, ForwardI
579579
}
580580
}
581581

582-
template<class ExecutionPolicy, class RandomAccessContainer>
582+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer>
583583
inline auto interquartile_range(ExecutionPolicy&& exec, RandomAccessContainer & v)
584584
{
585585
return interquartile_range(exec, std::begin(v), std::end(v));
@@ -591,13 +591,13 @@ inline auto interquartile_range(RandomAccessIterator first, RandomAccessIterator
591591
return interquartile_range(std::execution::seq, first, last);
592592
}
593593

594-
template<class RandomAccessContainer>
594+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer>
595595
inline auto interquartile_range(RandomAccessContainer & v)
596596
{
597597
return interquartile_range(std::execution::seq, std::begin(v), std::end(v));
598598
}
599599

600-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator, class OutputIterator>
600+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator, class OutputIterator>
601601
inline OutputIterator mode(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, OutputIterator output)
602602
{
603603
if(!std::is_sorted(exec, first, last))
@@ -615,7 +615,7 @@ inline OutputIterator mode(ExecutionPolicy&& exec, ForwardIterator first, Forwar
615615
return detail::mode_impl(first, last, output);
616616
}
617617

618-
template<class ExecutionPolicy, BOOST_MATH_CONTAINER Container, class OutputIterator>
618+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_CONTAINER Container, class OutputIterator>
619619
inline OutputIterator mode(ExecutionPolicy&& exec, Container & v, OutputIterator output)
620620
{
621621
return mode(exec, std::begin(v), std::end(v), output);
@@ -643,15 +643,15 @@ inline OutputIterator mode(Container & v, OutputIterator output)
643643

644644
// std::list is the return type for the proposed STL stats library
645645

646-
template<class ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator, class Real = typename std::iterator_traits<ForwardIterator>::value_type>
646+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_FORWARD_ITER ForwardIterator, class Real = typename std::iterator_traits<ForwardIterator>::value_type>
647647
inline auto mode(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last)
648648
{
649649
std::list<Real> modes;
650650
mode(exec, first, last, std::inserter(modes, modes.begin()));
651651
return modes;
652652
}
653653

654-
template<class ExecutionPolicy, BOOST_MATH_CONTAINER Container>
654+
template<BOOST_MATH_EXECUTION_POLICY ExecutionPolicy, BOOST_MATH_CONTAINER Container>
655655
inline auto mode(ExecutionPolicy&& exec, Container & v)
656656
{
657657
return mode(exec, std::begin(v), std::end(v));
@@ -953,7 +953,7 @@ Real median(RandomAccessIterator first, RandomAccessIterator last)
953953
}
954954
}
955955

956-
template<class RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type>
956+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type>
957957
inline Real median(RandomAccessContainer& c)
958958
{
959959
return median(std::begin(c), std::end(c));
@@ -971,7 +971,7 @@ inline double gini_coefficient(RandomAccessIterator first, RandomAccessIterator
971971
return detail::gini_coefficient_sequential_impl<double>(first, last);
972972
}
973973

974-
template<class RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type,
974+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type,
975975
enable_if_t<std::is_integral<Real>::value, bool> = true>
976976
inline double gini_coefficient(RandomAccessContainer& c)
977977
{
@@ -990,7 +990,7 @@ inline Real gini_coefficient(RandomAccessIterator first, RandomAccessIterator la
990990
return detail::gini_coefficient_sequential_impl<Real>(first, last);
991991
}
992992

993-
template<class RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type,
993+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type,
994994
enable_if_t<!std::is_integral<Real>::value, bool> = true>
995995
inline Real gini_coefficient(RandomAccessContainer& c)
996996
{
@@ -1005,7 +1005,7 @@ inline double sample_gini_coefficient(RandomAccessIterator first, RandomAccessIt
10051005
return n*gini_coefficient(first, last)/(n-1);
10061006
}
10071007

1008-
template<class RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type,
1008+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type,
10091009
enable_if_t<std::is_integral<Real>::value, bool> = true>
10101010
inline double sample_gini_coefficient(RandomAccessContainer& c)
10111011
{
@@ -1020,7 +1020,7 @@ inline Real sample_gini_coefficient(RandomAccessIterator first, RandomAccessIter
10201020
return n*gini_coefficient(first, last)/(n-1);
10211021
}
10221022

1023-
template<class RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type,
1023+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type,
10241024
enable_if_t<!std::is_integral<Real>::value, bool> = true>
10251025
inline Real sample_gini_coefficient(RandomAccessContainer& c)
10261026
{
@@ -1055,7 +1055,7 @@ Real median_absolute_deviation(RandomAccessIterator first, RandomAccessIterator
10551055
}
10561056
}
10571057

1058-
template<class RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type>
1058+
template<BOOST_MATH_RANDOM_ACCESS_CONTAINER RandomAccessContainer, typename Real = typename RandomAccessContainer::value_type>
10591059
inline Real median_absolute_deviation(RandomAccessContainer& c,
10601060
typename RandomAccessContainer::value_type center=std::numeric_limits<typename RandomAccessContainer::value_type>::quiet_NaN())
10611061
{

0 commit comments

Comments
 (0)