bool contains(const table& tbl, int val) { // return true if tbl contains val int hash_val = hash(val) % tbl.size(); bucket::const_iterator first = tbl[hash_val].begin(); bucket::const_iterator last = tbl[hash_val].end(); return find(first, last, val) != last; }
/** * Adds the gradient of the expected log-likelihood of the specified * data point to the gradient table g. * * \param phead the distribution over a leading set of indices of f * \param tail a fixed assignment to the remaining indices of f * \param w the weight of the data point */ void add_gradient(const table<T>& phead, const uint_vector& tail, T w, table<T>& g) const { assert(phead.arity() + tail.size() == g.arity()); std::size_t index = g.offset().linear(tail, phead.arity()); for (std::size_t i = 0; i < phead.size(); ++i) { g[index + i] += phead[i] * w; } }
/** * Adds the diagonal of the Hessia of the expected log-likelihoood of * the specified data point to the Hessian diagonal h. */ void add_hessian_diag(const table<T>& phead, const uint_vector& tail, T w, table<T>& h) const { assert(phead.arity() + tail.size() == h.arity()); std::size_t index = h.offset().linear(tail, phead.arity()); for (std::size_t i = 0; i < phead.size(); ++i) { h[index + i] -= phead[i] * w / (f[index + i] * f[index + i]); } }
void show(const table& tbl) { // show contents of buckets in table for (int i = 0; i < tbl.size(); ++i) { // show contents of bucket i cout << "bucket " << setw(2) << i << ": "; copy(tbl[i].begin(), tbl[i].end(), ostream_iterator<int>(cout, " ")); cout << '\n'; } }
void insert(table& tbl, int val) { // insert val into table size_t hash_val = hash(val) % tbl.size(); tbl[hash_val].push_back(val); }
/** * Restricts the given table to an assignment to all the dimensions * >= n, where n is the arity of this table. The parameter x_start is * the linear index of the first element in the input table that should * be copied. This table must be preallocated, and its first n * dimensions must match the first n dimensions of the input table. */ void restrict(const table& x, std::size_t x_start) { assert(arity() <= x.arity()); assert(std::equal(shape_.begin(), shape_.end(), x.shape_.begin())); assert(x_start + size() <= x.size()); std::copy(x.data() + x_start, x.data() + x_start + size(), data()); }