OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::MinFlushFlowSolver Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/GCode/ToolOrderUtils.hpp>

Collaboration diagram for Slic3r::MinFlushFlowSolver:

Public Member Functions

 MinFlushFlowSolver (const std::vector< std::vector< float > > &matrix_, const std::vector< int > &u_nodes, const std::vector< int > &v_nodes, const std::unordered_map< int, std::vector< int > > &uv_link_limits={}, const std::unordered_map< int, std::vector< int > > &uv_unlink_limits={}, const std::vector< int > &u_capacity={}, const std::vector< int > &v_capacity={}, const std::vector< std::pair< std::set< int >, int > > &v_group_capacity={})
std::vector< int > solve ()
 ~MinFlushFlowSolver ()

Private Attributes

std::unique_ptr< MinCostMaxFlow > m_solver

Detailed Description

Constructor & Destructor Documentation

◆ MinFlushFlowSolver()

Slic3r::MinFlushFlowSolver::MinFlushFlowSolver ( const std::vector< std::vector< float > > & matrix_,
const std::vector< int > & u_nodes,
const std::vector< int > & v_nodes,
const std::unordered_map< int, std::vector< int > > & uv_link_limits = {},
const std::unordered_map< int, std::vector< int > > & uv_unlink_limits = {},
const std::vector< int > & u_capacity = {},
const std::vector< int > & v_capacity = {},
const std::vector< std::pair< std::set< int >, int > > & v_group_capacity = {} )
686 {
687 assert(u_capacity.empty() || u_capacity.size() == u_nodes.size());
688 assert(v_capacity.empty() || v_capacity.size() == v_nodes.size());
689 m_solver = std::make_unique<MinCostMaxFlow>();
690 m_solver->matrix = matrix_;;
691 m_solver->l_nodes = u_nodes;
692 m_solver->r_nodes = v_nodes;
693
694 m_solver->total_nodes = u_nodes.size() + v_nodes.size() + v_group_capacity.size() + 2;
695
696 m_solver->source_id =m_solver->total_nodes - 2;
697 m_solver->sink_id = m_solver->total_nodes - 1;
698
699 m_solver->adj.resize(m_solver->total_nodes);
700
701 std::vector<int> v_node_to(v_nodes.size(), m_solver->sink_id);
702 for (size_t gid = 0; gid < v_group_capacity.size(); ++gid) {
703 for (auto vid : v_group_capacity[gid].first)
704 v_node_to[vid] = m_solver->l_nodes.size() + m_solver->r_nodes.size() + gid;
705 }
706
707 // add edge from source to left nodes,cost to 0
708 for (int i = 0; i < m_solver->l_nodes.size(); ++i) {
709 int capacity = u_capacity.empty() ? 1 : u_capacity[i];
710 m_solver->add_edge(m_solver->source_id, i, capacity, 0);
711 }
712 // add edge from right nodes to sink,cost to 0
713 for (int i = 0; i < m_solver->r_nodes.size(); ++i) {
714 int capacity = v_capacity.empty() ? 1 : v_capacity[i];
715 m_solver->add_edge(m_solver->l_nodes.size() + i, v_node_to[i], capacity, 0);
716 }
717 // add edge from temp group node to sink node
718 for(int i=0;i<v_group_capacity.size();++i){
719 int capacity = v_group_capacity[i].second;
720 m_solver->add_edge(m_solver->l_nodes.size() + m_solver->r_nodes.size() + i, m_solver->sink_id, capacity, 0);
721 }
722 // add edge from left node to right nodes
723 for (int i = 0; i < m_solver->l_nodes.size(); ++i) {
724 int from_idx = i;
725 // process link limits, i can only link to link_limits
726 if (auto iter = uv_link_limits.find(i); iter != uv_link_limits.end()) {
727 for (auto r_id : iter->second)
728 m_solver->add_edge(from_idx, m_solver->l_nodes.size() + r_id, 1, m_solver->get_distance(i, r_id));
729 continue;
730 }
731
732 // process unlink limits, check whether i can link to j
733 std::optional<std::vector<int>> unlink_limits;
734 if (auto iter = uv_unlink_limits.find(i); iter != uv_unlink_limits.end())
735 unlink_limits = iter->second;
736 for (int j = 0; j < m_solver->r_nodes.size(); ++j) {
737 if (unlink_limits.has_value() && std::find(unlink_limits->begin(), unlink_limits->end(), j) != unlink_limits->end())
738 continue;
739 m_solver->add_edge(from_idx, m_solver->l_nodes.size() + j, 1, m_solver->get_distance(i, j));
740 }
741 }
742 }
std::unique_ptr< MinCostMaxFlow > m_solver
Definition ToolOrderUtils.hpp:169

References m_solver.

◆ ~MinFlushFlowSolver()

Slic3r::MinFlushFlowSolver::~MinFlushFlowSolver ( )
677 {
678 }

Member Function Documentation

◆ solve()

std::vector< int > Slic3r::MinFlushFlowSolver::solve ( )
744 {
745 return m_solver->solve();
746 }

References m_solver.

Referenced by Slic3r::KMediods::assign_cluster_label(), and Slic3r::refine_groups_by_Nozzle_State().

Here is the caller graph for this function:

Member Data Documentation

◆ m_solver

std::unique_ptr<MinCostMaxFlow> Slic3r::MinFlushFlowSolver::m_solver
private

Referenced by MinFlushFlowSolver(), and solve().


The documentation for this class was generated from the following files: