21 std::vector<float>
computeRatios(
const std::vector<RatioDefinition> &ratio_def,
22 const std::size_t categories,
23 const std::size_t sub_categories,
24 const std::vector< std::size_t> &counter)
26 std::vector<float> ratio;
27 if (counter.size() % (categories*sub_categories) ) {
28 std::stringstream
msg;
29 msg <<
"Category and sub category dimensions " << categories <<
" * " << sub_categories
30 <<
" not a common factor of the input counter vector "
32 throw std::logic_error(
msg.str());
34 std::size_t n_counter = counter.size() / (categories*sub_categories);
35 ratio.resize( categories * ratio_def.size() * sub_categories);
37 std::size_t input_counter_stride=categories;
38 std::size_t input_sub_category_stride = categories * n_counter;
39 std::size_t ratio_stride = categories;
40 std::size_t ratio_sub_category_stride = ratio_stride * ratio_def.size();
42 for (std::size_t sub_category_i=0; sub_category_i < sub_categories; ++sub_category_i) {
43 for (std::size_t ratio_i=0; ratio_i<ratio_def.size(); ++ratio_i) {
44 for (std::size_t category_i=0; category_i<categories; ++category_i) {
45 std::size_t ratio_dest_idx = sub_category_i * ratio_sub_category_stride + ratio_stride * ratio_i + category_i;
46 assert(ratio_dest_idx < ratio.size());
47 assert( sub_category_i * input_sub_category_stride < counter.size() );
48 assert( sub_category_i * input_sub_category_stride + n_counter * input_counter_stride <= counter.size() );
49 ratio[ratio_dest_idx] =
computeRatio( ratio_def.at(ratio_i),
50 sub_category_i * input_sub_category_stride,
std::size_t computeSum(const std::vector< SummandDefinition > &sum_def, std::size_t eta_offset, std::size_t row_stride, std::size_t seed_i, const std::vector< std::size_t > &stat)