| 13 | |
| 14 | template <class T> |
| 15 | inline size_t first_level_sample(const T* data, const size_t data_offset, const size_t data_size, T* data_sample) { |
| 16 | const size_t left_in_data = data_size - data_offset; |
| 17 | const size_t portion_to_sample = std::min(config::ROWGROUP_SIZE, left_in_data); |
| 18 | const size_t available_alp_vectors = std::ceil(static_cast<double>(portion_to_sample) / config::VECTOR_SIZE); |
| 19 | size_t sample_idx = 0; |
| 20 | size_t data_idx = data_offset; |
| 21 | |
| 22 | for (size_t vector_idx = 0; vector_idx < available_alp_vectors; vector_idx++) { |
| 23 | const size_t current_vector_n_values = std::min(data_size - data_idx, config::VECTOR_SIZE); |
| 24 | |
| 25 | //! We sample equidistant vectors; to do this we skip a fixed values of vectors |
| 26 | //! If we are not in the correct jump, we do not take sample from this vector |
| 27 | if (const bool must_select_rowgroup_sample = (vector_idx % config::ROWGROUP_SAMPLES_JUMP) == 0; |
| 28 | !must_select_rowgroup_sample) { |
| 29 | data_idx += current_vector_n_values; |
| 30 | continue; |
| 31 | } |
| 32 | |
| 33 | const size_t n_sampled_increments = std::max( |
| 34 | 1, |
| 35 | static_cast<int32_t>(std::ceil(static_cast<double>(current_vector_n_values) / config::SAMPLES_PER_VECTOR))); |
| 36 | |
| 37 | //! We do not take samples of non-complete duckdb vectors (usually the last one) |
| 38 | //! Except in the case of too little data |
| 39 | if (current_vector_n_values < config::SAMPLES_PER_VECTOR && sample_idx != 0) { |
| 40 | data_idx += current_vector_n_values; |
| 41 | continue; |
| 42 | } |
| 43 | |
| 44 | // Storing the sample of that vector |
| 45 | for (size_t i = 0; i < current_vector_n_values; i += n_sampled_increments) { |
| 46 | data_sample[sample_idx] = data[data_idx + i]; |
| 47 | sample_idx++; |
| 48 | } |
| 49 | data_idx += current_vector_n_values; |
| 50 | } |
| 51 | return sample_idx; |
| 52 | } |
| 53 | |
| 54 | } // namespace alp::sampler |
| 55 |
nothing calls this directly
no outgoing calls
no test coverage detected