#ifndef FILAMENT_GROUP_HPP #define FILAMENT_GROUP_HPP #include #include #include "GCode/ToolOrderUtils.hpp" namespace Slic3r { struct FlushTimeMachine { private: std::chrono::high_resolution_clock::time_point start; public: void time_machine_start() { start = std::chrono::high_resolution_clock::now(); } int time_machine_end() { auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast(end - start); return duration.count(); } }; enum FGStrategy { BestCost, BestFit }; class FilamentGroup { public: FilamentGroup(const std::vector& flush_matrix, const int total_filament_num, const std::vector& max_group_size) : m_flush_matrix{ flush_matrix }, m_total_filament_num{ total_filament_num }, m_max_group_size{ max_group_size } {} std::vector calc_filament_group(const std::vector>& layer_filaments, const FGStrategy& g_strategy = FGStrategy::BestFit, int* cost = nullptr); private: std::vector calc_filament_group_by_enum(const std::vector>& layer_filaments, const std::vector& used_filaments, const FGStrategy& g_strategy, int* cost = nullptr); std::vector calc_filament_group_by_pam(const std::vector>& layer_filaments, const std::vector& used_filaments, const FGStrategy& g_strategy, int* cost = nullptr, int timeout_ms = 300); private: std::vectorm_flush_matrix; std::vectorm_max_group_size; int m_total_filament_num; public: std::optional&)>> get_custom_seq; }; class KMediods { enum INIT_TYPE { Random = 0, Farthest }; public: KMediods(const std::vector>& distance_matrix, const int filament_num,const std::vector& max_group_size) : m_distance_matrix{ distance_matrix }, m_filament_num{ filament_num }, m_max_group_size{ max_group_size }{} void fit(const FGStrategy& g_strategy,int timeout_ms = 300); std::vectorget_filament_labels()const { return m_filament_labels; } private: std::vectorinitialize(INIT_TYPE type); std::vectorassign_label(const std::vector& medoids,const FGStrategy&g_strategy); int calc_cost(const std::vector& labels, const std::vector& medoids); private: std::vector>m_distance_matrix; int m_filament_num; std::vectorm_max_group_size; std::setm_medoids_set; const int k = 2; private: std::vectorm_filament_labels; }; } #endif // !FILAMENT_GROUP_HPP