27 #ifndef LSAPE_SOLVER_IPP 28 #define LSAPE_SOLVER_IPP 1 34 cost_matrix_{cost_matrix},
36 greedy_method_{
BASIC},
37 solve_optimally_{
true},
39 row_to_col_assignments_(),
40 col_to_row_assignments_(),
46 cost_matrix_{
nullptr},
48 greedy_method_{
BASIC},
49 solve_optimally_{
true},
51 row_to_col_assignments_(),
52 col_to_row_assignments_() {}
64 row_to_col_assignments_.clear();
65 col_to_row_assignments_.clear();
66 row_to_col_assignments_.push_back(std::vector<std::size_t>(
num_rows()));
67 col_to_row_assignments_.push_back(std::vector<std::size_t>(
num_cols()));
75 solve_optimally_ =
true;
82 solve_optimally_ =
false;
83 greedy_method_ = greedy_method;
90 if (solve_optimally_) {
92 dual_var_rows_.data(), dual_var_cols_.data(),
static_cast<lsape::LSAPE_MODEL
>(model_));
93 compute_cost_from_assignments_();
94 if (num_solutions > 1) {
95 std::list<std::size_t *> further_row_to_col_assignments;
97 dual_var_rows_.data(), dual_var_cols_.data(), further_row_to_col_assignments);
98 row_to_col_assignments_.clear();
99 col_to_row_assignments_.clear();
102 col_to_row_assignments_.push_back(construct_col_to_row_asignment_(row_to_col_assignments_.back()));
110 minimal_cost_ = lsape::lsapeGreedy(cost_matrix_->
data(),
num_rows(),
num_cols(), row_to_col_assignments_.at(0).data(), col_to_row_assignments_.at(0).data(),
111 static_cast<lsape::GREEDY_METHOD
>(greedy_method_));
118 return minimal_cost_;
124 return row_to_col_assignments_.at(solution_id).at(row);
130 return col_to_row_assignments_.at(solution_id).at(col);
133 const std::vector<std::size_t> &
136 return row_to_col_assignments_.at(solution_id);
139 const std::vector<std::size_t> &
142 return col_to_row_assignments_.at(solution_id);
148 return cost_matrix_->operator()(row, col) - (dual_var_rows_.at(row) + dual_var_cols_.at(col));
154 return dual_var_rows_.at(row);
160 return dual_var_cols_.at(col);
172 return cost_matrix_->
num_rows() - 1;
178 return cost_matrix_->
num_cols() - 1;
196 return row_to_col_assignments_.size();
199 std::vector<std::size_t>
203 for (std::size_t row{}; row <
num_rows(); row++) {
204 if (row_to_col_assignment.at(row) <
num_cols()) {
205 col_to_row_assignment[row_to_col_assignment.at(row)] = row;
213 compute_cost_from_assignments_() {
215 for (std::size_t row{}; row <
num_rows(); row++) {
216 minimal_cost_ += cost_matrix_->operator()(row, row_to_col_assignments_.at(0).at(row));
218 for (std::size_t col{}; col <
num_cols(); col++) {
219 if (col_to_row_assignments_.at(0).at(col) ==
num_rows()) {
220 minimal_cost_ += cost_matrix_->operator()(
num_rows(), col);
227 compute_cost_from_dual_vars_() {
229 for (
auto dual_var = dual_var_rows_.begin(); dual_var != dual_var_rows_.end(); dual_var++) {
230 minimal_cost_ += *dual_var;
232 for (
auto dual_var = dual_var_cols_.begin(); dual_var != dual_var_cols_.end(); dual_var++) {
233 minimal_cost_ += *dual_var;
void set_model(const Model &model)
Makes the solver use a specific model for optimal solving.
double get_dual_var_col(std::size_t col) const
Returns the dual variable of a column.
std::size_t total_num_rows() const
Returns the total number of rows of the LSAPE problem instance.
std::size_t num_cols() const
Returns the number of real columns of the LSAPE problem instance, i.e, the number of columns of the i...
LSAPESolver()
Constructs empty solver.
GreedyMethod
Selects a greedy method.
void solve(int num_solutions=1)
Solves the LSAPE problem instance.
std::size_t num_cols() const
Returns the number of columns.
std::size_t LabelID
Internally used type of node and edge labels.
double get_dual_var_row(std::size_t row) const
Returns the dual variable of a row.
double get_slack(std::size_t row, std::size_t col) const
Returns the slack of a cell.
void clear_solution()
Clears a previously computed solution.
const DMatrix * cost_matrix() const
Returns the LSAPE problem instance.
Adaption of Hungarian Algorithm to LSAPE.
const std::vector< std::size_t > & col_to_row_assignment(std::size_t solution_id=0) const
Returns the assignment from columns to rows.
double minimal_cost() const
Returns the cost of the computed solutions.
std::size_t get_assigned_row(std::size_t col, std::size_t solution_id=0) const
Returns the assigned row.
std::size_t total_num_cols() const
Returns the total number of columns of the LSAPE problem instance.
const std::vector< std::size_t > & row_to_col_assignment(std::size_t solution_id=0) const
Returns the assignment from rows to columns.
std::size_t num_rows() const
Returns the number of real rows of the LSAPE problem instance, i.e, the number of rows of the interna...
std::size_t get_assigned_col(std::size_t row, std::size_t solution_id=0) const
Returns the assigned column.
Global namespace for GEDLIB.
ScalarT * data()
Provides access to internal data.
void set_problem(const DMatrix *cost_matrix)
Sets the LSAPE problem instance.
std::size_t num_solutions() const
Returns the number of solutions.
Model
Selects a model for solving LSAPE with the Hungarian algorithm.
See https://doi.org/10.1007/978-3-319-18224-7_1.
void set_greedy_method(const GreedyMethod &greedy_method)
Makes the solver use a greedy method.
std::size_t num_rows() const
Returns the number of rows.