fix bug in rins

This commit is contained in:
Laurent Perron
2019-06-18 16:00:06 +02:00
parent 3a99c0ee1b
commit ff93cfbb97
3 changed files with 11 additions and 9 deletions

View File

@@ -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<SharedRINSNeighborhoodManager>();
std::vector<int> 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));

View File

@@ -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);
}
}

View File

@@ -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<SharedRINSNeighborhoodManager>()->AddNeighborhood(
rins_neighborhood);
const int64 neighborhood_size = rins_neighborhood.fixed_vars.size() +
rins_neighborhood.reduced_domain_vars.size();
if (neighborhood_size > 0) {
model->Mutable<SharedRINSNeighborhoodManager>()->AddNeighborhood(
rins_neighborhood);
}
}
} // namespace sat