10 #ifndef AR_SUPPRESS_DOXYGEN_MAINPAGE
85 #define AR_GCC_VERSION \
86 (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
89 #define AR_STRINGIFY_HELPER(x) #x
92 #define AR_STRINGIFY(x) AR_STRINGIFY_HELPER(x)
102 #define AR_ENSURE_MSGEXCEPT(expr, msg, except) \
103 if (!(expr)) throw except(msg)
113 #define AR_ENSURE_MSG(expr, msg) \
114 AR_ENSURE_MSGEXCEPT(expr, msg, std::logic_error)
123 #define AR_ENSURE(expr) \
124 AR_ENSURE_MSG(expr, AR_STRINGIFY(expr)" false")
134 #define AR_ENSURE_ARG(expr) \
135 AR_ENSURE_MSGEXCEPT(expr, AR_STRINGIFY(expr)" false", std::invalid_argument)
144 #define AR_ENSURE_EXCEPT(expr, except) \
145 AR_ENSURE_MSGEXCEPT(expr, AR_STRINGIFY(expr)" false", except)
175 template <
typename InputIterator,
176 typename OutputType1,
177 typename OutputType2>
183 using std::iterator_traits;
185 typedef typename iterator_traits<InputIterator>::value_type value;
191 while (first != last)
214 template <
typename InputIterator,
215 typename OutputType1,
216 typename OutputType2>
238 template <
typename InputIterator,
239 typename OutputType1,
240 typename OutputType2>
266 template <
typename InputIterator1,
267 typename InputIterator2,
268 typename OutputType1,
269 typename OutputType2,
270 typename OutputType3>
272 InputIterator1 last1,
273 InputIterator2 first2,
278 using std::iterator_traits;
280 typedef typename iterator_traits<InputIterator1>::value_type value1;
281 typedef typename iterator_traits<InputIterator2>::value_type value2;
288 while (first1 != last1)
290 value1 x1 = *first1++;
294 value2 x2 = *first2++;
321 template <
typename InputIterator1,
322 typename InputIterator2,
323 typename OutputType1,
324 typename OutputType2,
325 typename OutputType3>
327 InputIterator1 last1,
328 InputIterator2 first2,
351 template <
typename InputIterator1,
352 typename InputIterator2,
353 typename OutputType1,
354 typename OutputType2,
355 typename OutputType3>
357 InputIterator1 last1,
358 InputIterator2 first2,
381 template <
typename InputIterator,
387 typename std::iterator_traits<InputIterator>::value_type mean;
390 return init + (nvar + N*(mean*mean));
408 template <
typename InputIterator1,
409 typename InputIterator2,
412 InputIterator1 last1,
413 InputIterator2 first2,
416 typename std::iterator_traits<InputIterator1>::value_type mean1;
417 typename std::iterator_traits<InputIterator2>::value_type mean2;
420 first1, last1, first2, mean1, mean2, ncovar);
421 return init + (ncovar + N*(mean1*mean2));
439 # pragma float_control(push)
440 # pragma float_control(precise, on)
463 template <
typename ValueType,
464 typename InputIterator1,
465 typename InputIterator2>
467 #if (AR_GCC_VERSION > 40305)
468 __attribute__((__optimize__(
"no-associative-math")))
471 InputIterator1 a_last,
472 InputIterator2 b_first)
473 #if (AR_GCC_VERSION > 40305) || (_MSC_VER > 1400)
475 ValueType ns = 0, nt, nc = 0, ny;
476 ValueType ds = 0, dt, dc = 0, dy;
478 while (a_first != a_last)
480 ValueType xa = *a_first++;
486 ValueType xb = *b_first++;
500 : (ns + nc) / (ds + dc);
503 #warning Using Non-Kahan version of ar::negative_half_reflection_coefficient.
508 while (a_first != a_last)
510 ValueType xa = *a_first++;
511 ValueType xb = *b_first++;
513 ds += xa * xa + xb * xb;
523 # pragma float_control(pop)
535 template <
class InputIterator,
537 class OutputIterator1,
538 class OutputIterator2,
539 class OutputIterator3,
540 class OutputIterator4,
543 InputIterator data_last,
545 std::size_t& maxorder,
546 OutputIterator1 params_first,
547 OutputIterator2 sigma2e_first,
548 OutputIterator3 gain_first,
549 OutputIterator4 autocor_first,
550 const bool subtract_mean,
551 const bool hierarchy,
561 using std::inner_product;
567 f.assign(data_first, data_last);
568 const size_t N = f.size();
579 for (
typename Vector::iterator it = f.begin(); it != f.end(); ++it) {
585 sigma2e += mean*mean;
589 maxorder = (N == 0) ? 0 : min(
static_cast<size_t>(maxorder), N-1);
593 if (hierarchy || maxorder == 0)
595 *sigma2e_first++ = sigma2e;
596 *gain_first++ = gain;
601 Ak.assign(maxorder + 1, Value(0));
604 ac.reserve(maxorder);
605 for (
size_t kp1 = 1; kp1 <= maxorder; ++kp1)
611 Value mu = -2 * negative_half_reflection_coefficient<Value>(
612 f.begin() + kp1, f.end(), b.begin());
614 sigma2e *= (1 - mu*mu);
615 for (
size_t n = 0; n <= kp1/2; ++n)
617 Value t1 = Ak[n] + mu*Ak[kp1 - n];
618 Value t2 = Ak[kp1 - n] + mu*Ak[n];
624 gain *= 1 / (1 - Ak[kp1]*Ak[kp1]);
628 ac.push_back(-inner_product(ac.rbegin(), ac.rend(),
629 Ak.begin() + 1, Ak[kp1]));
632 if (hierarchy || kp1 == maxorder)
634 params_first = copy(Ak.begin() + 1, Ak.begin() + kp1 + 1,
636 *sigma2e_first++ = sigma2e;
637 *gain_first++ = gain;
643 for (
size_t n = 0; n < N - kp1; ++n)
645 Value t1 = f[n + kp1] + mu*b[n];
646 Value t2 = b[n] + mu*f[n + kp1];
654 *autocor_first++ = 1;
655 copy(ac.begin(), ac.end(), autocor_first);
746 template <
class InputIterator,
748 class OutputIterator1,
749 class OutputIterator2,
750 class OutputIterator3,
751 class OutputIterator4>
753 InputIterator data_last,
755 std::size_t& maxorder,
756 OutputIterator1 params_first,
757 OutputIterator2 sigma2e_first,
758 OutputIterator3 gain_first,
759 OutputIterator4 autocor_first,
760 const bool subtract_mean =
false,
761 const bool hierarchy =
false)
764 vector<Value> f, b, Ak, ac;
766 return burg_method(data_first, data_last, mean, maxorder,
767 params_first, sigma2e_first, gain_first,
768 autocor_first, subtract_mean, hierarchy,
779 template <
typename Value>
782 virtual ~nullary() {}
783 virtual Value operator()() = 0;
784 virtual nullary* clone() = 0;
788 template<
typename Value>
789 struct nullary_impl0 :
public nullary<Value>
795 nullary_impl0* clone()
797 return new nullary_impl0();
802 template<
typename Value,
class T>
803 struct nullary_impl1 :
public nullary<Value>
805 nullary_impl1(T t) : t(t) {}
810 nullary_impl1* clone()
812 return new nullary_impl1(t);
822 template <
typename Value,
typename Index = std::
size_t>
826 typedef std::input_iterator_tag iterator_category;
827 typedef Value value_type;
828 typedef std::ptrdiff_t difference_type;
829 typedef const Value* pointer;
830 typedef const Value& reference;
836 using std::numeric_limits;
837 if (numeric_limits<Value>::has_quiet_NaN)
838 xn = numeric_limits<Value>::quiet_NaN();
853 template <
class RandomAccessIterator>
855 RandomAccessIterator params_last)
857 d(2*std::distance(params_first, params_last), 0),
858 g(new nullary_impl0<Value>()),
863 typename vector<Value>::size_type i = d.size() / 2;
864 while (i --> 0) d[i] = *params_first++;
883 template <
class RandomAccessIterator,
884 class NoiseGenerator>
886 RandomAccessIterator params_last,
887 NoiseGenerator generator)
889 d(2*std::distance(params_first, params_last), 0),
890 g(new nullary_impl1<Value,NoiseGenerator>(generator)),
895 typename vector<Value>::size_type i = d.size() / 2;
896 while (i --> 0) d[i] = *params_first++;
905 g(other.g ? other.g->clone() : 0),
914 nullary<Value> *tmp = 0;
917 tmp = other.g ? other.g->clone() : 0;
950 template <
class InputIterator>
952 const Value x0adjust = 0)
959 typename vector<Value>::size_type i = d.size();
960 typename vector<Value>::size_type p = i / 2;
961 while (i --> p) d[i] = *initial_first++;
965 using std::inner_product;
967 xn = -inner_product(d.begin(), d.begin() + p, d.begin() + p, -xn);
978 using std::inner_product;
983 typename vector<Value>::size_type p = d.size() / 2;
989 typename vector<Value>::iterator ab = d.begin();
990 typename vector<Value>::iterator xb = ab + p;
991 typename vector<Value>::iterator c = xb + n % p;
992 typename vector<Value>::iterator xe = d.end();
994 xn = inner_product(c, xe, ab, -(*g)());
995 xn = -inner_product(xb, c, ab + distance(c, xe), xn );
1005 using std::numeric_limits;
1006 if (numeric_limits<Value>::has_quiet_NaN)
1007 xn = numeric_limits<Value>::quiet_NaN();
1035 return n == other.n;
1041 return !(*
this == other);
1056 typename std::vector<Value> d;
1083 template <
class RandomAccessIterator,
1084 class InputIterator,
1086 predictor<typename std::iterator_traits<RandomAccessIterator>::value_type>
1088 RandomAccessIterator params_last,
1090 InputIterator autocor_first)
1092 predictor<
typename std::iterator_traits<
1093 RandomAccessIterator
1094 >::value_type> p(params_first, params_last);
1095 p.initial_conditions(++autocor_first, 1 / gain);
1124 template <
class Value>
1127 const bool abs_rho =
false)
1134 const Value twoinvN = Value(2) / N;
1136 for (
size_t i = 1; i <= N; ++i, ++rho)
1137 T0 += (2 - i*twoinvN) * abs(*rho);
1139 for (
size_t i = 1; i <= N; ++i, ++rho)
1140 T0 += (2 - i*twoinvN) * (*rho);
1175 template <
class Value>
1179 const bool abs_rho =
false)
1188 const Value twoinvN = Value(2) / N;
1190 for (
size_t i = 1; i <= N; ++i, ++rho1, ++rho2)
1191 T0 += (2 - i*twoinvN) * abs((*rho1) * (*rho2));
1193 for (
size_t i = 1; i <= N; ++i, ++rho1, ++rho2)
1194 T0 += (2 - i*twoinvN) * ((*rho1) * (*rho2));
1238 template<
class RandomAccessIterator,
1239 class InputIterator,
1240 class OutputIterator>
1242 RandomAccessIterator a_last,
1243 RandomAccessIterator r_first,
1244 InputIterator d_first,
1245 OutputIterator s_first)
1248 using std::distance;
1249 using std::inner_product;
1250 using std::invalid_argument;
1251 using std::iterator_traits;
1252 using std::reverse_iterator;
1258 typedef typename iterator_traits<InputIterator>::value_type value_type;
1259 typedef vector<value_type> vector_type;
1260 typedef typename vector_type::size_type size_type;
1263 typename iterator_traits<RandomAccessIterator>::difference_type dist
1264 = distance(a_first, a_last);
1265 if (dist < 1)
throw invalid_argument(
"distance(a_first, a_last) < 1");
1266 const size_type n =
static_cast<size_type
>(dist);
1269 vector_type s; s .reserve(n+1); s .push_back( *d_first);
1270 vector_type ehat; ehat.reserve(n ); ehat.push_back(-a_first[0]);
1271 vector_type g; g .reserve(n ); g .push_back(-r_first[0]);
1272 value_type lambda = 1 - a_first[0]*r_first[0];
1280 vector_type next_ehat; next_ehat.reserve(n);
1283 for (size_type i = 1; i < n; ++i)
1286 reverse_iterator<RandomAccessIterator> rhat_first(r_first + i);
1289 const value_type neg_theta = inner_product(
1290 s.begin(), s.end(), rhat_first, value_type(-(*++d_first)));
1293 const value_type neg_eta = inner_product(
1294 ehat.begin(), ehat.end(), a_first, value_type(a_first[i]));
1297 const value_type neg_gamma = inner_product(
1298 g.begin(), g.end(), rhat_first, value_type(r_first[i]));
1316 const value_type theta_by_lambda = -neg_theta/lambda;
1317 const value_type eta_by_lambda = -neg_eta /lambda;
1318 const value_type gamma_by_lambda = -neg_gamma/lambda;
1320 next_ehat.push_back(eta_by_lambda);
1321 for (size_type j = 0; j < i; ++j)
1323 s[j] += theta_by_lambda*ehat[j];
1324 next_ehat.push_back(ehat[j] + eta_by_lambda*g[j]);
1325 g[j] += gamma_by_lambda*ehat[j];
1327 s.push_back(theta_by_lambda);
1328 g.push_back(gamma_by_lambda);
1329 ehat.swap(next_ehat);
1332 lambda -= neg_eta*neg_gamma/lambda;
1338 reverse_iterator<RandomAccessIterator> rhat_first(r_first + n);
1341 const value_type neg_theta = inner_product(
1342 s.begin(), s.end(), rhat_first, value_type(-(*++d_first)));
1350 const value_type theta_by_lambda = -neg_theta/lambda;
1351 for (size_type j = 0; j < n; ++j)
1353 s[j] += theta_by_lambda*ehat[j];
1355 s.push_back(theta_by_lambda);
1359 copy(s.begin(), s.end(), s_first);
1387 template<
class RandomAccessIterator,
1388 class ForwardIterator>
1390 RandomAccessIterator a_last,
1391 RandomAccessIterator r_first,
1392 ForwardIterator d_first)
1420 template<
class RandomAccessIterator,
1421 class ForwardIterator>
1423 RandomAccessIterator a_last,
1424 ForwardIterator d_first)
1463 template <
typename Result,
typename Integer>
1477 template <
typename Result,
typename Integer>
1488 template <
typename T,
bool>
struct is_nonnegative_helper;
1490 template <
typename T>
struct is_nonnegative_helper<T, true>
1492 static bool check(
const T& t) {
return t >= 0; }
1495 template <
typename T>
struct is_nonnegative_helper<T, false>
1497 static bool check(
const T&) {
return true; }
1500 template <
typename T>
bool is_nonnegative(
const T& t)
1502 using std::numeric_limits;
1503 return is_nonnegative_helper<T,numeric_limits<T>::is_signed>::check(t);
1521 template <
class MeanHandling>
1531 template <
typename Result,
typename Integer1,
typename Integer2>
1535 assert(is_nonnegative(i));
1536 assert(
static_cast<Integer1
>(i) <= N);
1539 return MeanHandling::template empirical_variance_zero<Result>(N);
1541 Result num = N - i, den = N*(N + 2);
1547 template <
class MeanHandling>
1557 template <
typename Result,
typename Integer1,
typename Integer2>
1561 assert(is_nonnegative(i));
1562 assert(
static_cast<Integer1
>(i) <= N);
1565 return MeanHandling::template empirical_variance_zero<Result>(N);
1567 Result den = N + 1 - i;
1573 template <
class MeanHandling>
1583 template <
typename Result,
typename Integer1,
typename Integer2>
1587 assert(is_nonnegative(i));
1588 assert(
static_cast<Integer1
>(i) <= N);
1591 return MeanHandling::template empirical_variance_zero<Result>(N);
1594 Result den = N + Result(3)/2 - Result(3)/2 * i;
1600 template <
class MeanHandling>
1610 template <
typename Result,
typename Integer1,
typename Integer2>
1614 assert(is_nonnegative(i));
1615 assert(
static_cast<Integer1
>(i) <= N);
1618 return MeanHandling::template empirical_variance_zero<Result>(N);
1621 Result den = N + 2 - 2*i;
1627 template <
class EstimationMethod,
1629 typename Integer1 = std::size_t,
1630 typename Integer2 = Integer1>
1633 typedef Integer1 first_argument_type;
1634 typedef Integer2 second_argument_type;
1635 typedef Result result_type;
1637 Result operator() (Integer1 N, Integer2 i)
const
1639 return EstimationMethod::template empirical_variance<Result>(N, i);
1650 template <
class EstimationMethod,
1652 typename Integer1 = std::size_t,
1653 typename Integer2 = Integer1>
1663 typedef Result result_type;
1667 Result operator() ()
1669 return EstimationMethod::template empirical_variance<Result>(N, i++);
1684 template <
class EstimationMethod,
1686 typename Integer1 = std::size_t,
1687 typename Integer2 = Integer1>
1695 typedef std::random_access_iterator_tag iterator_category;
1696 typedef Result value_type;
1697 typedef std::ptrdiff_t difference_type;
1698 typedef const Result* pointer;
1699 typedef const Result& reference;
1714 { assert(N >= 1); ++i;
return *
this; }
1723 { assert(N >= 1); i += k;
return *
this; }
1728 { assert(N >= 1); --i;
return *
this; }
1737 { assert(N >= 1); i -= k;
return *
this; }
1744 return 1 + other.N - other.i;
1745 }
else if (!other.N) {
1746 return -
static_cast<difference_type
>(1 + this->N - this->i);
1748 assert(this->N == other.N);
1749 return this->i - other.i;
1758 return other.i >=
static_cast<Integer2
>(other.N + 1);
1759 }
else if (!other.N) {
1760 return this->i >=
static_cast<Integer2
>(this->N + 1);
1762 return this->N == other.N && this->i == other.i;
1767 {
return !(*
this == other); }
1772 {
return (*
this - other) < 0; }
1775 {
return (*
this - other) <= 0; }
1778 {
return (*
this - other) > 0; }
1781 {
return (*
this - other) >= 0; }
1785 const value_type operator*()
const
1787 assert(is_nonnegative(i));
1788 assert(i <=
static_cast<Integer2
>(N));
1790 return EstimationMethod::template empirical_variance<Result>(N, i);
1793 const value_type operator[](
const difference_type &k)
const
1795 assert(is_nonnegative(i + k));
1796 assert(i + k <=
static_cast<Integer2
>(N));
1798 return EstimationMethod::template empirical_variance<Result>(N, i + k);
1833 template <
typename Result,
typename Input>
1837 return log(Result(sigma2e));
1850 template <
class Criterion,
1854 Result
evaluate(Result sigma2e, Integer1 N, Integer2 p)
1856 Result underfit = Criterion::template underfit_penalty<Result>(sigma2e);
1857 Result overfit = Criterion::template overfit_penalty<Result>(N, p);
1858 return underfit + overfit;
1865 template <
int AlphaNumerator = 3,
int AlphaDenominator = 1>
1869 template <
typename Result,
typename Integer1,
typename Integer2>
1872 return Result(AlphaNumerator) * p / (N * AlphaDenominator);
1883 template <
typename Result,
typename Integer1,
typename Integer2>
1887 return log(Result(N)) * p / N;
1895 template <
typename Result,
typename Integer1,
typename Integer2>
1899 return 2*log(log(Result(N))) * p / N;
1909 template <
typename Result,
typename Integer1,
typename Integer2>
1912 return 2 * Result(p) / (N - p - 1);
1921 template <
class EstimationMethod,
1922 int AlphaNumerator = 3,
1923 int AlphaDenominator = 1 >
1927 template <
typename Result,
typename Integer1,
typename Integer2>
1931 using std::accumulate;
1933 EstimationMethod, Result, Integer1, Integer2
1935 Result sum = accumulate(evi_type(N), evi_type(N) + p, Result(0));
1937 return AlphaNumerator * sum / AlphaDenominator;
1946 template <
class MeanHandling,
1948 int AlphaDenominator>
1953 template <
typename Result,
typename Integer1,
typename Integer2>
1957 ::template empirical_variance<Result>(N, Integer2(0));
1959 Result num = (2*N - p - 1)*p;
1960 Result den = 2*N*(N + 2);
1962 return AlphaNumerator * (v0 + num/den) / AlphaDenominator;
1974 template <
class MeanHandling,
1976 int AlphaDenominator>
1977 struct FIC<Burg<MeanHandling>, AlphaNumerator, AlphaDenominator>
1981 template <
typename Result,
typename Integer1,
typename Integer2>
1984 Result t = Burg<MeanHandling>
1985 ::template empirical_variance<Result>(N, Integer2(0));
1986 t -= AR_DIGAMMA(N + 1);
1987 t += AR_DIGAMMA(N + 1 - p);
1988 return AlphaNumerator * t / AlphaDenominator;
1997 template <
class MeanHandling,
1999 int AlphaDenominator>
2000 struct FIC<LSFB<MeanHandling>, AlphaNumerator, AlphaDenominator>
2004 template <
typename Result,
typename Integer1,
typename Integer2>
2007 Result t = LSFB<MeanHandling>
2008 ::template empirical_variance<Result>(N, Integer2(0));
2009 Result a = AR_DIGAMMA((3 + 2*N) / Result(3) );
2010 Result b = AR_DIGAMMA((3 + 2*N) / Result(3) - p);
2011 return AlphaNumerator * (t - 2*(a - b)/3) / AlphaDenominator;
2020 template <
class MeanHandling,
2022 int AlphaDenominator>
2023 struct FIC<LSF<MeanHandling>, AlphaNumerator, AlphaDenominator>
2027 template <
typename Result,
typename Integer1,
typename Integer2>
2030 Result t = LSF<MeanHandling>
2031 ::template empirical_variance<Result>(N, Integer2(0));
2032 Result a = AR_DIGAMMA((2 + N) / Result(2) );
2033 Result b = AR_DIGAMMA((2 + N) / Result(2) - p);
2034 return AlphaNumerator * (t - (a - b)/2) / AlphaDenominator;
2044 template <
class EstimationMethod>
2051 template <
typename Result,
typename Integer1,
typename Integer2>
2052 class product_iterator
2054 EstimationMethod, Result, Integer1, Integer2
2059 EstimationMethod, Result, Integer1, Integer2
2063 typedef typename base::difference_type difference_type;
2064 typedef typename base::iterator_category iterator_category;
2065 typedef typename base::pointer pointer;
2066 typedef typename base::reference reference;
2067 typedef typename base::value_type value_type;
2069 product_iterator(Integer1 N) : base(N) {}
2071 value_type operator*()
const
2073 const value_type v = this->base::operator*();
2074 return (1 + v) / (1 - v);
2077 value_type operator[](
const difference_type &k)
const
2079 const value_type v = this->base::operator[](k);
2080 return (1 + v) / (1 - v);
2088 template <
typename Result,
typename Integer1,
typename Integer2>
2092 using std::multiplies;
2093 using std::accumulate;
2094 product_iterator<Result, Integer1, Integer2> first(N), last(N);
2097 return accumulate(first, last, Result(1), multiplies<Result>()) - 1;
2102 #ifdef AR_POCHHAMMER
2108 template <
class MeanHandling>
2109 struct FSIC<YuleWalker<MeanHandling> > :
public criterion
2112 template <
typename Result,
typename Integer1,
typename Integer2>
2115 Result v0 = YuleWalker<MeanHandling>
2116 ::template empirical_variance<Result>(N, Integer2(0));
2117 Result a = AR_POCHHAMMER(N*(N+3) - p, p);
2118 Result b = AR_POCHHAMMER(Result(1 + N) - N*N, p);
2120 return (1 + v0) / (1 - v0) * (a / b) - 1;
2128 template <
class MeanHandling>
2129 struct FSIC<Burg<MeanHandling> > :
public criterion
2132 template <
typename Result,
typename Integer1,
typename Integer2>
2135 Result v0 = Burg<MeanHandling>
2136 ::template empirical_variance<Result>(N, Integer2(0));
2137 Result a = AR_POCHHAMMER(-Result(1) - N, p);
2138 Result b = AR_POCHHAMMER( Result(1) - N, p);
2140 return (1 + v0) / (1 - v0) * (a / b) - 1;
2148 template <
class MeanHandling>
2149 struct FSIC<LSFB<MeanHandling> > :
public criterion
2152 template <
typename Result,
typename Integer1,
typename Integer2>
2155 Result v0 = LSFB<MeanHandling>
2156 ::template empirical_variance<Result>(N, Integer2(0));
2157 Result a = AR_POCHHAMMER((-Result(2)-2*N)/3, p);
2158 Result b = AR_POCHHAMMER(( Result(2)-2*N)/3, p);
2160 return (1 + v0) / (1 - v0) * (a / b) - 1;
2168 template <
class MeanHandling>
2169 struct FSIC<LSF<MeanHandling> > :
public criterion
2172 template <
typename Result,
typename Integer1,
typename Integer2>
2175 Result v0 = LSF<MeanHandling>
2176 ::template empirical_variance<Result>(N, Integer2(0));
2177 Result a = AR_POCHHAMMER((-Result(1)-N)/2, p);
2178 Result b = AR_POCHHAMMER(( Result(1)-N)/2, p);
2180 return (1 + v0) / (1 - v0) * (a / b) - 1;
2191 template <
class EstimationMethod>
2195 template <
typename Result,
typename Integer1,
typename Integer2>
2237 template <
class Criterion,
2240 class InputIterator,
2241 class OutputIterator>
2242 typename std::iterator_traits<InputIterator>::difference_type
2245 InputIterator first,
2247 OutputIterator crit)
2249 using std::iterator_traits;
2250 using std::numeric_limits;
2252 typedef InputIterator iterator;
2253 typedef typename iterator_traits<iterator>::difference_type difference_type;
2254 typedef typename iterator_traits<iterator>::value_type value_type;
2258 return numeric_limits<difference_type>::min();
2261 value_type best_val = evaluate<Criterion>(*first++, N, ordfirst);
2262 difference_type best_pos = 0, dist = 0;
2265 while (first != last &&
static_cast<Integer1
>(++dist) < N)
2267 value_type candidate = evaluate<Criterion>(*first++, N, dist+ordfirst);
2268 *crit++ = candidate;
2270 if (candidate < best_val) {
2271 best_val = candidate;
2301 template <
class Criterion,
2308 class OutputIterator>
2309 typename Sequence1::difference_type
2316 OutputIterator crit)
2319 using std::copy_backward;
2320 using std::invalid_argument;
2326 const size_t maxorder = sigma2e.size() - 1;
2329 AR_ENSURE_ARG(params .size() == (sigma2e.size()-1)*sigma2e.size()/2);
2334 typename Sequence1::difference_type best = minorder;
2336 typename Sequence2::iterator iter = sigma2e.begin();
2337 advance(iter, minorder);
2338 best += evaluate_models<Criterion>(N, minorder, iter,
2339 sigma2e.end(), crit);
2348 typename Sequence1::iterator first = params.begin();
2349 typename Sequence1::iterator last = params.begin();
2350 typename Sequence1::iterator result = params.begin();
2351 advance(first, ((best-1)*best)/2 );
2352 advance(last, ((best-1)*best)/2 + best);
2353 advance(result, best);
2354 copy_backward(first, last, result);
2355 params.resize(best);
2360 typename Sequence2::iterator cursor = sigma2e.begin();
2361 advance(cursor, best);
2362 *sigma2e.begin() = *cursor;
2368 typename Sequence2::iterator cursor = gain.begin();
2369 advance(cursor, best);
2370 *gain.begin() = *cursor;
2375 autocor.resize(best + 1);
2387 typedef std::output_iterator_tag iterator_category;
2388 typedef void value_type;
2389 typedef void difference_type;
2390 typedef void pointer;
2391 typedef void reference;
2393 template <
typename T>
void operator=(
const T&) {}
2395 null_output& operator++()
2398 null_output operator++(
int)
2399 { null_output it(*
this); ++*
this;
return it; }
2401 null_output& operator*()
2422 template <
class Criterion,
2425 class InputIterator>
2426 typename std::iterator_traits<InputIterator>::difference_type
2429 InputIterator first,
2432 return evaluate_models<Criterion>(N, ordfirst, first, last, null_output());
2458 template <
class Criterion,
2465 typename Sequence1::difference_type
2473 return best_model<Criterion>(N, minorder, params, sigma2e, gain,
2474 autocor, null_output());
2508 template <
template <
class>
class EstimationMethod,
2512 class Sequence2 = Sequence1,
2513 class Sequence3 = Sequence2,
2514 class Sequence4 = Sequence3>
2518 typedef typename Sequence1::difference_type (*
type)(Integer1 N,
2523 Sequence4& autocor);
2542 template <
class CharT,
class Traits,
class Allocator>
2543 static type lookup(std::basic_string<CharT,Traits,Allocator> abbreviation,
2544 const bool subtract_mean);
2559 static type lookup(
const char *abbreviation,
const bool subtract_mean)
2561 std::string s(abbreviation);
2562 return lookup(s, subtract_mean);
2566 template <
template <
class>
class EstimationMethod,
2573 template <
class CharT,
class Traits,
class Allocator>
2574 typename best_model_function<
2575 EstimationMethod,Integer1,Integer2,Sequence1,Sequence2,Sequence3,Sequence4
2577 best_model_function<
2578 EstimationMethod,Integer1,Integer2,Sequence1,Sequence2,Sequence3,Sequence4
2579 >::lookup(std::basic_string<CharT,Traits,Allocator> abbrev,
2580 const bool subtract_mean)
2582 using std::basic_string;
2587 typedef basic_string<CharT,Traits,Allocator> string_type;
2588 for (
typename string_type::iterator p = abbrev.begin();
2589 abbrev.end() != p; ++p)
2593 abbrev.erase(0, abbrev.find_first_not_of(
" \n\r\t"));
2594 abbrev.erase(1 + abbrev.find_last_not_of(
" \n\r\t"));
2600 if (abbrev.empty() || 0 == abbrev.compare(
"CIC" ))
2603 retval = best_model<CIC<EstimationMethod<mean_subtracted> > >;
2605 retval = best_model<CIC<EstimationMethod<mean_retained > > >;
2607 else if (0 == abbrev.compare(
"AIC" ))
2609 retval = best_model<AIC>;
2611 else if (0 == abbrev.compare(
"AICC"))
2613 retval = best_model<AICC>;
2615 else if (0 == abbrev.compare(
"BIC" ))
2617 retval = best_model<BIC>;
2619 else if (0 == abbrev.compare(
"FIC" ))
2622 retval = best_model<FIC<EstimationMethod<mean_subtracted> > >;
2624 retval = best_model<FIC<EstimationMethod<mean_retained > > >;
2626 else if (0 == abbrev.compare(
"FSIC"))
2629 retval = best_model<FSIC<EstimationMethod<mean_subtracted> > >;
2631 retval = best_model<FSIC<EstimationMethod<mean_retained > > >;
2633 else if (0 == abbrev.compare(
"GIC" ))
2635 retval = best_model<GIC<> >;
2637 else if (0 == abbrev.compare(
"MCC" ))
2639 retval = best_model<MCC>;
2654 template<
class Iterator>
2658 typedef typename std::iterator_traits<Iterator>::iterator_category iterator_category;
2659 typedef typename std::iterator_traits<Iterator>::value_type value_type;
2660 typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
2661 typedef typename std::iterator_traits<Iterator>::pointer pointer;
2662 typedef typename std::iterator_traits<Iterator>::reference reference;
2710 advance(i, -x*step);
2714 reference operator[](difference_type n)
2719 reference operator*()
2741 return (i - o.i) / step;
2753 difference_type step;