From 5083bedd277a87f7f36b262a8f0e6b0e9588691b Mon Sep 17 00:00:00 2001 From: KunoiSayami Date: Mon, 25 Jul 2022 19:03:36 +0800 Subject: feat: Implement expt_0722 Signed-off-by: KunoiSayami --- expt_0722.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 3 deletions(-) (limited to 'expt_0722.cpp') diff --git a/expt_0722.cpp b/expt_0722.cpp index 041977a..5e881b0 100644 --- a/expt_0722.cpp +++ b/expt_0722.cpp @@ -1,3 +1,85 @@ -// -// Created by user on 22/07/22. -// +#include +#include +#include +#include +#include +#include + +constexpr size_t length = 1048576; +std::vector population_vector, sample_vector, + original_vector; +// std::vector> result_storage; +std::vector result_storage; + +long double sample_cdf(long double x) { + auto it = lower_bound(sample_vector.begin(), sample_vector.end(), x); + if (it == sample_vector.end()) { + return 1; + } + if (it == sample_vector.begin()) { + return 0; + } + auto it_prev = it - 1; + return ((long double)(it_prev - sample_vector.begin()) + + (long double)(x - *it_prev) / (*it - *it_prev)) / + (long double)(sample_vector.size() - 1); +} + +inline long double safe_ceil(long double value) { + auto c = std::ceil(value); + return c == 0 ? 1 : c; +} + +unsigned long long max_value = 0, min_value = 0xfffffffff; + +inline void store_into_vector(unsigned long long value) { + if (max_value < value) { + max_value = value; + } + if (min_value > value) { + min_value = value; + } + population_vector.push_back(value); +} + +constexpr long scale_size = 10000; +constexpr long sample_length = 1024, split_size = 1024 * scale_size; +constexpr long test_size = 2048; + +int main(int argc, char const *argv[]) { + assert((length & 1) == 0); + assert(length > 1024); + + FILE *file = fopen("normal_distribution.txt", "r"); + assert(file); + for (long long i; fscanf(file, "%lld ", &i) != EOF; store_into_vector(i)) + ; + fclose(file); + + assert(population_vector.size() == length); + + original_vector = population_vector; + + sample_vector = std::vector( + original_vector.begin(), original_vector.begin() + sample_length); + result_storage.resize(split_size, false); + + sample_vector.push_back(min_value); + sample_vector.push_back(max_value); + + std::sort(sample_vector.begin(), sample_vector.end()); + const auto slice_size = 1.0 / (long double)(split_size); + + for (long i = 0; i < test_size; i++) { + auto index = + safe_ceil(sample_cdf(original_vector[i + sample_length]) / slice_size) - + 1; + printf("%Lf\n", index); + auto &&item = result_storage[(int)index]; + if (item) { + printf("process: %ld Fail at: %lld\n", i, original_vector[i]); + break; + } + item = true; + } +} \ No newline at end of file -- cgit v1.3.1