#ifndef TOOL_ORDER_UTILS_HPP #define TOOL_ORDER_UTILS_HPP #include #include #include #include #include #include namespace Slic3r { using FlushMatrix = std::vector>; namespace MaxFlowGraph { const int INF = std::numeric_limits::max(); const int INVALID_ID = -1; } class MaxFlowSolver { private: struct Edge { int from, to, capacity, flow; Edge(int u, int v, int cap) :from(u), to(v), capacity(cap), flow(0) {} }; public: MaxFlowSolver(const std::vector& u_nodes, const std::vector& v_nodes, const std::unordered_map>& uv_link_limits = {}, const std::unordered_map>& uv_unlink_limits = {}, const std::vector& u_capacity = {}, const std::vector& v_capacity = {} ); std::vector solve(); private: void add_edge(int from, int to, int capacity); int total_nodes; int source_id; int sink_id; std::vectoredges; std::vectorl_nodes; std::vectorr_nodes; std::vector>adj; }; struct MinCostMaxFlow; class GeneralMinCostSolver { public: GeneralMinCostSolver(const std::vector>& matrix_, const std::vector& u_nodes, const std::vector& v_nodes); std::vector solve(); ~GeneralMinCostSolver(); private: std::unique_ptr m_solver; }; class MinFlushFlowSolver { public: MinFlushFlowSolver(const std::vector>& matrix_, const std::vector& u_nodes, const std::vector& v_nodes, const std::unordered_map>& uv_link_limits = {}, const std::unordered_map>& uv_unlink_limits = {}, const std::vector& u_capacity = {}, const std::vector& v_capacity = {} ); std::vector solve(); ~MinFlushFlowSolver(); private: std::unique_ptr m_solver; }; class MatchModeGroupSolver { public: MatchModeGroupSolver(const std::vector>& matrix_, const std::vector& u_nodes, const std::vector& v_nodes, const std::vector& v_capacity, const std::unordered_map>& uv_unlink_limits = {}); std::vector solve(); ~MatchModeGroupSolver(); private: std::unique_ptr m_solver; }; std::vector get_extruders_order(const std::vector> &wipe_volumes, const std::vector &curr_layer_extruders, const std::vector &next_layer_extruders, const std::optional &start_extruder_id, bool use_forcast = false, float *cost = nullptr); int reorder_filaments_for_minimum_flush_volume(const std::vector &filament_lists, const std::vector &filament_maps, const std::vector> &layer_filaments, const std::vector &flush_matrix, std::optional &)>> get_custom_seq, std::vector> *filament_sequences); } #endif // !TOOL_ORDER_UTILS_HPP