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

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

Collaboration diagram for Slic3r::MatchModeGroupSolver:

Public Member Functions

 MatchModeGroupSolver (const std::vector< std::vector< float > > &matrix_, const std::vector< int > &u_nodes, const std::vector< int > &v_nodes, const std::vector< int > &v_capacity, const std::unordered_map< int, std::vector< int > > &uv_unlink_limits={})
std::vector< int > solve ()
 ~MatchModeGroupSolver ()

Private Attributes

std::unique_ptr< MinCostMaxFlow > m_solver

Detailed Description

Constructor & Destructor Documentation

◆ MatchModeGroupSolver()

Slic3r::MatchModeGroupSolver::MatchModeGroupSolver ( const std::vector< std::vector< float > > & matrix_,
const std::vector< int > & u_nodes,
const std::vector< int > & v_nodes,
const std::vector< int > & v_capacity,
const std::unordered_map< int, std::vector< int > > & uv_unlink_limits = {} )
753 {
754 assert(v_nodes.size() == v_capacity.size());
755 m_solver = std::make_unique<MinCostMaxFlow>();
756 m_solver->matrix = matrix_;;
757 m_solver->l_nodes = u_nodes;
758 m_solver->r_nodes = v_nodes;
759
760 m_solver->total_nodes = u_nodes.size() + v_nodes.size() + 2;
761
762 m_solver->source_id = m_solver->total_nodes - 2;
763 m_solver->sink_id = m_solver->total_nodes - 1;
764
765 m_solver->adj.resize(m_solver->total_nodes);
766
767
768 // add edge from source to left nodes,cost to 0
769 for (int i = 0; i < m_solver->l_nodes.size(); ++i)
770 m_solver->add_edge(m_solver->source_id, i, 1, 0);
771
772 // add edge from right nodes to sink,cost to 0
773 for (int i = 0; i < m_solver->r_nodes.size(); ++i)
774 m_solver->add_edge(m_solver->l_nodes.size() + i, m_solver->sink_id, v_capacity[i], 0);
775
776 // add edge from left node to right nodes
777 for (int i = 0; i < m_solver->l_nodes.size(); ++i) {
778 int from_idx = i;
779
780 // process unlink limits, check whether i can link to j
781 std::optional<std::vector<int>> unlink_limits;
782 if (auto iter = uv_unlink_limits.find(i); iter != uv_unlink_limits.end())
783 unlink_limits = iter->second;
784 for (int j = 0; j < m_solver->r_nodes.size(); ++j) {
785 if (unlink_limits.has_value() && std::find(unlink_limits->begin(), unlink_limits->end(), j) != unlink_limits->end())
786 continue;
787 m_solver->add_edge(from_idx, m_solver->l_nodes.size() + j, 1, m_solver->get_distance(i, j));
788 }
789 }
790 }
std::unique_ptr< MinCostMaxFlow > m_solver
Definition ToolOrderUtils.hpp:185

References m_solver.

◆ ~MatchModeGroupSolver()

Slic3r::MatchModeGroupSolver::~MatchModeGroupSolver ( )
749 {
750 }

Member Function Documentation

◆ solve()

std::vector< int > Slic3r::MatchModeGroupSolver::solve ( )
792 {
793 return m_solver->solve();
794 }

References m_solver.

Referenced by Slic3r::FilamentGroup::calc_filament_group_for_match(), Slic3r::FilamentGroup::calc_filament_group_for_tpu(), and Slic3r::select_best_group_for_ams().

Here is the caller graph for this function:

Member Data Documentation

◆ m_solver

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

Referenced by MatchModeGroupSolver(), and solve().


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