From ff93cfbb9781b9ae31ef9b511f450aee3d1d27cc Mon Sep 17 00:00:00 2001 From: Laurent Perron Date: Tue, 18 Jun 2019 16:00:06 +0200 Subject: [PATCH] fix bug in rins --- ortools/sat/cp_model_lns.cc | 7 ++----- ortools/sat/cp_model_solver.cc | 2 +- ortools/sat/rins.cc | 11 ++++++++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ortools/sat/cp_model_lns.cc b/ortools/sat/cp_model_lns.cc index 8da4699251..408673e0b9 100644 --- a/ortools/sat/cp_model_lns.cc +++ b/ortools/sat/cp_model_lns.cc @@ -459,13 +459,8 @@ Neighborhood RelaxationInducedNeighborhoodGenerator::Generate( neighborhood.cp_model = helper_.ModelProto(); neighborhood.is_generated = false; - const int num_model_vars = helper_.ModelProto().variables_size(); SharedRINSNeighborhoodManager* rins_manager = model_->Mutable(); - std::vector all_vars; - for (int i = 0; i < num_model_vars; ++i) { - all_vars.push_back(i); - } if (rins_manager == nullptr) { return neighborhood; } @@ -481,6 +476,7 @@ Neighborhood RelaxationInducedNeighborhoodGenerator::Generate( rins_neighborhood_opt.value().fixed_vars) { int var = fixed_var.first.model_var; int64 value = fixed_var.second; + if (var >= neighborhood.cp_model.variables_size()) continue; if (!helper_.IsActive(var)) continue; neighborhood.cp_model.mutable_variables(var)->clear_domain(); neighborhood.cp_model.mutable_variables(var)->add_domain(value); @@ -493,6 +489,7 @@ Neighborhood RelaxationInducedNeighborhoodGenerator::Generate( int var = reduced_var.first.model_var; int64 lb = reduced_var.second.first; int64 ub = reduced_var.second.second; + if (var >= neighborhood.cp_model.variables_size()) continue; if (!helper_.IsActive(var)) continue; Domain domain = ReadDomainFromProto(neighborhood.cp_model.variables(var)); domain = domain.IntersectionWith(Domain(lb, ub)); diff --git a/ortools/sat/cp_model_solver.cc b/ortools/sat/cp_model_solver.cc index a306848091..690a605ebb 100644 --- a/ortools/sat/cp_model_solver.cc +++ b/ortools/sat/cp_model_solver.cc @@ -1302,7 +1302,7 @@ void SolveLoadedCpModel(const CpModelProto& model_proto, mapping->GetProtoVariableFromIntegerVariable(positive_var); rins_var.lp = gtl::FindWithDefault(*lp_dispatcher, positive_var, nullptr); - if (rins_var.lp != nullptr) { + if (rins_var.lp != nullptr && rins_var.model_var >= 0) { rins_vars->vars.push_back(rins_var); } } diff --git a/ortools/sat/rins.cc b/ortools/sat/rins.cc index 4b4920a53c..e0e7e69fe2 100644 --- a/ortools/sat/rins.cc +++ b/ortools/sat/rins.cc @@ -48,8 +48,9 @@ SharedRINSNeighborhoodManager::GetUnexploredNeighborhood() { // return the last added neighborhood and remove it. const RINSNeighborhood neighborhood = std::move(neighborhoods_.back()); neighborhoods_.pop_back(); - total_stored_vars_ -= + const int64 neighborhood_size = neighborhood.fixed_vars.size() + neighborhood.reduced_domain_vars.size(); + total_stored_vars_ -= neighborhood_size; VLOG(1) << "total stored vars: " << total_stored_vars_; return neighborhood; } @@ -113,8 +114,12 @@ void AddRINSNeighborhood(Model* model) { } } - model->Mutable()->AddNeighborhood( - rins_neighborhood); + const int64 neighborhood_size = rins_neighborhood.fixed_vars.size() + + rins_neighborhood.reduced_domain_vars.size(); + if (neighborhood_size > 0) { + model->Mutable()->AddNeighborhood( + rins_neighborhood); + } } } // namespace sat