// Copyright (c) 2014-2023 Zano Project // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #pragma once #include #include #include #include #include #include #include #include #include #include "include_base_utils.h" #include "profile_tools.h" #include "sync_locked_object.h" class scaler { public: //See the graph on https://www.desmos.com/calculator/zfx4bolfqx bool config_scale(uint64_t original, uint64_t scale_to); uint64_t scale(uint64_t h); private: uint64_t m_x_m; uint64_t m_y_m; }; class decoy_selection_generator { public: struct distribution_entry { uint64_t h; double v; }; void init(uint64_t max_h); bool load_distribution_from_file(const char* path); std::vector generate_distribution(uint64_t count); std::vector generate_unique_reversed_distribution(uint64_t count, uint64_t preincluded_item); std::vector generate_unique_reversed_distribution(uint64_t count); void generate_unique_reversed_distribution(uint64_t count, std::set& set_to_extend); bool is_initialized() { return m_is_initialized; } private: bool load_distribution(const std::vector& entries, uint64_t max_h); bool m_is_initialized = false; uint64_t m_max = 0; std::map m_distribution_mapping; };