5#ifndef LINE_API_RETRIEVAL_RETRIEVAL_NC_H
6#define LINE_API_RETRIEVAL_RETRIEVAL_NC_H
51T retrieval_nc_aux(std::vector<int>& v, std::vector<int>& m,
const std::vector<T>& lambda,
52 const Matrix<T>& eta,
const Matrix<T>& gamma,
int k) {
53 const std::size_t r = v.size();
54 const std::size_t h = m.size();
60 if (first || x < mmin) mmin = x;
63 if (msum > k || mmin < 0)
return num_traits<T>::from_int(0);
64 if (k == 0)
return num_traits<T>::from_int(1);
66 const std::size_t ki =
static_cast<std::size_t
>(k - 1);
69 T E = (num_traits<T>::from_int(1) + lambda[ki] * eta(ki, 0)) *
70 retrieval_nc_aux(v, m, lambda, eta, gamma, k - 1);
73 for (std::size_t s = 0; s < r; ++s) {
76 const T sub = retrieval_nc_aux(v, m, lambda, eta, gamma, k - 1);
78 E += lambda[ki] * eta(ki, s + 1) * num_traits<T>::from_int(
static_cast<long>(vs) + 1) * sub;
82 for (std::size_t j = 0; j < h; ++j) {
86 const T sub = retrieval_nc_aux(v, m, lambda, eta, gamma, k - 1);
88 E += gamma(ki, j) * num_traits<T>::from_int(
static_cast<long>(mj)) * sub;
108T
retrieval_nc(
const std::vector<int>& v,
const std::vector<int>& m,
const std::vector<T>& lambda,
110 const std::size_t n = lambda.size();
111 if (eta.
rows() != n)
throw InputError(
"retrieval_nc: eta and lambda disagree on the item count");
112 if (gamma.
rows() != n)
113 throw InputError(
"retrieval_nc: gamma and lambda disagree on the item count");
114 if (eta.
cols() != v.size() + 1)
115 throw InputError(
"retrieval_nc: eta and v disagree on the number of PS stations");
116 if (gamma.
cols() != m.size())
117 throw InputError(
"retrieval_nc: gamma and m disagree on the number of lists");
118 std::vector<int> vv = v;
119 std::vector<int> mm = m;
120 return detail::retrieval_nc_aux(vv, mm, lambda, eta, gamma,
static_cast<int>(n));
The exception types the port throws.
Dense matrix and non-owning view.
T retrieval_nc(const std::vector< int > &v, const std::vector< int > &m, const std::vector< T > &lambda, const Matrix< T > &eta, const Matrix< T > &gamma)
Exact normalizing constant E(v,m) of a delayed-hit (list-based) cache.
Number-type abstraction for the templated API port.