Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions cpp/src/dual_simplex/crossover.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,18 @@ i_t dual_push(const lp_problem_t<i_t, f_t>& lp,
std::vector<i_t> q(m);
std::vector<i_t> deficient;
std::vector<i_t> slacks_needed;
factorize_basis(lp.A, settings, basic_list, L, U, p, pinv, q, deficient, slacks_needed);
i_t rank = factorize_basis(lp.A, settings, basic_list, L, U, p, pinv, q, deficient, slacks_needed);
if (rank != m) {
settings.log.printf("Failed to factorize basis. rank %d m %d\n", rank, m);
basis_repair(lp.A, settings, deficient, slacks_needed, basic_list, nonbasic_list, vstatus);
if (factorize_basis(lp.A, settings, basic_list, L, U, p, pinv, q, deficient, slacks_needed) ==
-1) {
settings.log.printf("Failed to factorize basis after repair. rank %d m %d\n", rank, m);
return -1;
} else {
settings.log.printf("Basis repaired\n");
}
}
reorder_basic_list(q, basic_list);
// Reordering the basic list causes us to mess up the superbasic list index
// so we need to update it
Expand Down Expand Up @@ -1203,8 +1214,8 @@ crossover_status_t crossover(const lp_problem_t<i_t, f_t>& lp,
i_t primal_push_status = primal_push(
lp, settings, start_time, solution, ft, basic_list, nonbasic_list, superbasic_list, vstatus);
if (primal_push_status < 0) { return return_to_status(primal_push_status); }
print_crossover_info(lp, settings, vstatus, solution, "Primal push complete");
compute_dual_solution_from_basis(lp, ft, basic_list, nonbasic_list, solution.y, solution.z);
print_crossover_info(lp, settings, vstatus, solution, "Primal push complete");
} else {
settings.log.printf("No primal push needed. No superbasic variables\n");
}
Expand Down Expand Up @@ -1353,7 +1364,8 @@ crossover_status_t crossover(const lp_problem_t<i_t, f_t>& lp,
}
}
settings.log.debug("Num flips %d\n", num_flips);
solution = phase1_solution;
solution.y = phase1_solution.y;
solution.z = phase1_solution.z;
print_crossover_info(lp, settings, vstatus, solution, "Dual phase 1 complete");
std::vector<f_t> edge_norms;
dual::status_t status = dual_phase2(
Expand Down