switch flags setters and getters to the absl format
This commit is contained in:
@@ -34,20 +34,15 @@ namespace operations_research {
|
||||
|
||||
// Takes a filename and a buffer and fills the lines buffer
|
||||
// with the lines of the file corresponding to the filename.
|
||||
void ParseFileByLines(const std::string& filename,
|
||||
std::vector<std::string>* lines);
|
||||
void ParseFileByLines(const std::string &filename,
|
||||
std::vector<std::string> *lines);
|
||||
|
||||
// The FapVariable struct represents a radio link of the
|
||||
// frequency assignment problem.
|
||||
struct FapVariable {
|
||||
FapVariable()
|
||||
: domain_index(-1),
|
||||
domain_size(0),
|
||||
domain(),
|
||||
degree(0),
|
||||
initial_position(-1),
|
||||
mobility_index(-1),
|
||||
mobility_cost(-1),
|
||||
: domain_index(-1), domain_size(0), domain(), degree(0),
|
||||
initial_position(-1), mobility_index(-1), mobility_cost(-1),
|
||||
hard(false) {}
|
||||
|
||||
~FapVariable() {}
|
||||
@@ -84,15 +79,8 @@ struct FapVariable {
|
||||
// radio links of the frequency assignment problem.
|
||||
struct FapConstraint {
|
||||
FapConstraint()
|
||||
: variable1(-1),
|
||||
variable2(-1),
|
||||
impact(0),
|
||||
type(""),
|
||||
operation(""),
|
||||
value(-1),
|
||||
weight_index(-1),
|
||||
weight_cost(-1),
|
||||
hard(false) {}
|
||||
: variable1(-1), variable2(-1), impact(0), type(""), operation(""),
|
||||
value(-1), weight_index(-1), weight_cost(-1), hard(false) {}
|
||||
~FapConstraint() {}
|
||||
|
||||
// Fields:
|
||||
@@ -147,15 +135,15 @@ struct FapComponent {
|
||||
// This file describes all the variables in the instance.
|
||||
// Each line corresponds to one variable.
|
||||
class VariableParser {
|
||||
public:
|
||||
explicit VariableParser(const std::string& data_directory);
|
||||
public:
|
||||
explicit VariableParser(const std::string &data_directory);
|
||||
~VariableParser();
|
||||
|
||||
const std::map<int, FapVariable>& variables() const { return variables_; }
|
||||
const std::map<int, FapVariable> &variables() const { return variables_; }
|
||||
|
||||
void Parse();
|
||||
|
||||
private:
|
||||
private:
|
||||
const std::string filename_;
|
||||
// A map is used because in the model, the variables have ids which may not
|
||||
// be consecutive, may be very sparse and don't have a specific upper-bound.
|
||||
@@ -169,15 +157,15 @@ class VariableParser {
|
||||
// This file describes the domains used by the variables of the problem.
|
||||
// Each line describes one domain.
|
||||
class DomainParser {
|
||||
public:
|
||||
explicit DomainParser(const std::string& data_directory);
|
||||
public:
|
||||
explicit DomainParser(const std::string &data_directory);
|
||||
~DomainParser();
|
||||
|
||||
const std::map<int, std::vector<int> >& domains() const { return domains_; }
|
||||
const std::map<int, std::vector<int> > &domains() const { return domains_; }
|
||||
|
||||
void Parse();
|
||||
|
||||
private:
|
||||
private:
|
||||
const std::string filename_;
|
||||
// A map is used because in the model, the ids of the different available
|
||||
// domains may be random values, since they are used as names. The key of the
|
||||
@@ -191,15 +179,15 @@ class DomainParser {
|
||||
// This file describes the constraints of the instance.
|
||||
// Each line defines a binary constraint.
|
||||
class ConstraintParser {
|
||||
public:
|
||||
explicit ConstraintParser(const std::string& data_directory);
|
||||
public:
|
||||
explicit ConstraintParser(const std::string &data_directory);
|
||||
~ConstraintParser();
|
||||
|
||||
const std::vector<FapConstraint>& constraints() const { return constraints_; }
|
||||
const std::vector<FapConstraint> &constraints() const { return constraints_; }
|
||||
|
||||
void Parse();
|
||||
|
||||
private:
|
||||
private:
|
||||
const std::string filename_;
|
||||
std::vector<FapConstraint> constraints_;
|
||||
|
||||
@@ -211,19 +199,19 @@ class ConstraintParser {
|
||||
// It may also contain 8 coefficients: 4 for different constraint violation
|
||||
// costs and 4 for different variable mobility costs.
|
||||
class ParametersParser {
|
||||
public:
|
||||
explicit ParametersParser(const std::string& data_directory);
|
||||
public:
|
||||
explicit ParametersParser(const std::string &data_directory);
|
||||
~ParametersParser();
|
||||
|
||||
std::string objective() const { return objective_; }
|
||||
const std::vector<int>& constraint_weights() const {
|
||||
const std::vector<int> &constraint_weights() const {
|
||||
return constraint_weights_;
|
||||
}
|
||||
const std::vector<int>& variable_weights() const { return variable_weights_; }
|
||||
const std::vector<int> &variable_weights() const { return variable_weights_; }
|
||||
|
||||
void Parse();
|
||||
|
||||
private:
|
||||
private:
|
||||
const std::string filename_;
|
||||
static const int constraint_coefficient_no_ = 4;
|
||||
static const int variable_coefficient_no_ = 4;
|
||||
@@ -234,33 +222,33 @@ class ParametersParser {
|
||||
};
|
||||
|
||||
namespace {
|
||||
int strtoint32(const std::string& word) {
|
||||
int strtoint32(const std::string &word) {
|
||||
int result;
|
||||
CHECK(absl::SimpleAtoi(word, &result));
|
||||
return result;
|
||||
}
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
// Function that finds the disjoint sub-graphs of the graph of the instance.
|
||||
void FindComponents(const std::vector<FapConstraint>& constraints,
|
||||
const std::map<int, FapVariable>& variables,
|
||||
void FindComponents(const std::vector<FapConstraint> &constraints,
|
||||
const std::map<int, FapVariable> &variables,
|
||||
const int maximum_variable_id,
|
||||
absl::flat_hash_map<int, FapComponent>* components);
|
||||
absl::flat_hash_map<int, FapComponent> *components);
|
||||
|
||||
// Function that computes the impact of a constraint.
|
||||
int EvaluateConstraintImpact(const std::map<int, FapVariable>& variables,
|
||||
int EvaluateConstraintImpact(const std::map<int, FapVariable> &variables,
|
||||
const int max_weight_cost,
|
||||
const FapConstraint constraint);
|
||||
|
||||
// Function that parses an instance of frequency assignment problem.
|
||||
void ParseInstance(const std::string& data_directory, bool find_components,
|
||||
std::map<int, FapVariable>* variables,
|
||||
std::vector<FapConstraint>* constraints,
|
||||
std::string* objective, std::vector<int>* frequencies,
|
||||
absl::flat_hash_map<int, FapComponent>* components);
|
||||
void ParseInstance(const std::string &data_directory, bool find_components,
|
||||
std::map<int, FapVariable> *variables,
|
||||
std::vector<FapConstraint> *constraints,
|
||||
std::string *objective, std::vector<int> *frequencies,
|
||||
absl::flat_hash_map<int, FapComponent> *components);
|
||||
|
||||
void ParseFileByLines(const std::string& filename,
|
||||
std::vector<std::string>* lines) {
|
||||
void ParseFileByLines(const std::string &filename,
|
||||
std::vector<std::string> *lines) {
|
||||
CHECK(lines != nullptr);
|
||||
std::string result;
|
||||
CHECK_OK(file::GetContents(filename, &result, file::Defaults()));
|
||||
@@ -268,7 +256,7 @@ void ParseFileByLines(const std::string& filename,
|
||||
}
|
||||
|
||||
// VariableParser Implementation
|
||||
VariableParser::VariableParser(const std::string& data_directory)
|
||||
VariableParser::VariableParser(const std::string &data_directory)
|
||||
: filename_(data_directory + "/var.txt") {}
|
||||
|
||||
VariableParser::~VariableParser() {}
|
||||
@@ -276,7 +264,7 @@ VariableParser::~VariableParser() {}
|
||||
void VariableParser::Parse() {
|
||||
std::vector<std::string> lines;
|
||||
ParseFileByLines(filename_, &lines);
|
||||
for (const std::string& line : lines) {
|
||||
for (const std::string &line : lines) {
|
||||
std::vector<std::string> tokens =
|
||||
absl::StrSplit(line, ' ', absl::SkipEmpty());
|
||||
if (tokens.empty()) {
|
||||
@@ -295,7 +283,7 @@ void VariableParser::Parse() {
|
||||
}
|
||||
|
||||
// DomainParser Implementation
|
||||
DomainParser::DomainParser(const std::string& data_directory)
|
||||
DomainParser::DomainParser(const std::string &data_directory)
|
||||
: filename_(data_directory + "/dom.txt") {}
|
||||
|
||||
DomainParser::~DomainParser() {}
|
||||
@@ -303,7 +291,7 @@ DomainParser::~DomainParser() {}
|
||||
void DomainParser::Parse() {
|
||||
std::vector<std::string> lines;
|
||||
ParseFileByLines(filename_, &lines);
|
||||
for (const std::string& line : lines) {
|
||||
for (const std::string &line : lines) {
|
||||
std::vector<std::string> tokens =
|
||||
absl::StrSplit(line, ' ', absl::SkipEmpty());
|
||||
if (tokens.empty()) {
|
||||
@@ -326,7 +314,7 @@ void DomainParser::Parse() {
|
||||
}
|
||||
|
||||
// ConstraintParser Implementation
|
||||
ConstraintParser::ConstraintParser(const std::string& data_directory)
|
||||
ConstraintParser::ConstraintParser(const std::string &data_directory)
|
||||
: filename_(data_directory + "/ctr.txt") {}
|
||||
|
||||
ConstraintParser::~ConstraintParser() {}
|
||||
@@ -334,7 +322,7 @@ ConstraintParser::~ConstraintParser() {}
|
||||
void ConstraintParser::Parse() {
|
||||
std::vector<std::string> lines;
|
||||
ParseFileByLines(filename_, &lines);
|
||||
for (const std::string& line : lines) {
|
||||
for (const std::string &line : lines) {
|
||||
std::vector<std::string> tokens =
|
||||
absl::StrSplit(line, ' ', absl::SkipEmpty());
|
||||
if (tokens.empty()) {
|
||||
@@ -361,9 +349,8 @@ const int ParametersParser::constraint_coefficient_no_;
|
||||
const int ParametersParser::variable_coefficient_no_;
|
||||
const int ParametersParser::coefficient_no_;
|
||||
|
||||
ParametersParser::ParametersParser(const std::string& data_directory)
|
||||
: filename_(data_directory + "/cst.txt"),
|
||||
objective_(""),
|
||||
ParametersParser::ParametersParser(const std::string &data_directory)
|
||||
: filename_(data_directory + "/cst.txt"), objective_(""),
|
||||
constraint_weights_(constraint_coefficient_no_, 0),
|
||||
variable_weights_(variable_coefficient_no_, 0) {}
|
||||
|
||||
@@ -380,7 +367,7 @@ void ParametersParser::Parse() {
|
||||
std::vector<std::string> lines;
|
||||
|
||||
ParseFileByLines(filename_, &lines);
|
||||
for (const std::string& line : lines) {
|
||||
for (const std::string &line : lines) {
|
||||
if (objective) {
|
||||
largest_token =
|
||||
largest_token || (line.find("largest") != std::string::npos);
|
||||
@@ -426,17 +413,17 @@ void ParametersParser::Parse() {
|
||||
}
|
||||
|
||||
// TODO(user): Make FindComponents linear instead of quadratic.
|
||||
void FindComponents(const std::vector<FapConstraint>& constraints,
|
||||
const std::map<int, FapVariable>& variables,
|
||||
void FindComponents(const std::vector<FapConstraint> &constraints,
|
||||
const std::map<int, FapVariable> &variables,
|
||||
const int maximum_variable_id,
|
||||
absl::flat_hash_map<int, FapComponent>* components) {
|
||||
absl::flat_hash_map<int, FapComponent> *components) {
|
||||
std::vector<int> in_component(maximum_variable_id + 1, -1);
|
||||
int constraint_index = 0;
|
||||
for (const FapConstraint& constraint : constraints) {
|
||||
for (const FapConstraint &constraint : constraints) {
|
||||
const int variable_id1 = constraint.variable1;
|
||||
const int variable_id2 = constraint.variable2;
|
||||
const FapVariable& variable1 = gtl::FindOrDie(variables, variable_id1);
|
||||
const FapVariable& variable2 = gtl::FindOrDie(variables, variable_id2);
|
||||
const FapVariable &variable1 = gtl::FindOrDie(variables, variable_id1);
|
||||
const FapVariable &variable2 = gtl::FindOrDie(variables, variable_id2);
|
||||
CHECK_LT(variable_id1, in_component.size());
|
||||
CHECK_LT(variable_id2, in_component.size());
|
||||
if (in_component[variable_id1] < 0 && in_component[variable_id2] < 0) {
|
||||
@@ -482,24 +469,22 @@ void FindComponents(const std::vector<FapConstraint>& constraints,
|
||||
CHECK(gtl::ContainsKey(*components, max_component_index));
|
||||
if (min_component_index != max_component_index) {
|
||||
// Update the component_index of maximum indexed component's variables.
|
||||
for (const auto& variable :
|
||||
for (const auto &variable :
|
||||
(*components)[max_component_index].variables) {
|
||||
int variable_id = variable.first;
|
||||
in_component[variable_id] = min_component_index;
|
||||
}
|
||||
// Insert all the variables of the maximum indexed component to the
|
||||
// variables of the minimum indexed component.
|
||||
((*components)[min_component_index])
|
||||
.variables.insert(
|
||||
((*components)[max_component_index]).variables.begin(),
|
||||
((*components)[max_component_index]).variables.end());
|
||||
((*components)[min_component_index]).variables
|
||||
.insert(((*components)[max_component_index]).variables.begin(),
|
||||
((*components)[max_component_index]).variables.end());
|
||||
// Insert all the constraints of the maximum indexed component to the
|
||||
// constraints of the minimum indexed component.
|
||||
((*components)[min_component_index])
|
||||
.constraints.insert(
|
||||
((*components)[min_component_index]).constraints.end(),
|
||||
((*components)[max_component_index]).constraints.begin(),
|
||||
((*components)[max_component_index]).constraints.end());
|
||||
((*components)[min_component_index]).constraints
|
||||
.insert(((*components)[min_component_index]).constraints.end(),
|
||||
((*components)[max_component_index]).constraints.begin(),
|
||||
((*components)[max_component_index]).constraints.end());
|
||||
(*components)[min_component_index].constraints.push_back(constraint);
|
||||
// Delete the maximum indexed component from the components set.
|
||||
components->erase(max_component_index);
|
||||
@@ -512,12 +497,12 @@ void FindComponents(const std::vector<FapConstraint>& constraints,
|
||||
}
|
||||
}
|
||||
|
||||
int EvaluateConstraintImpact(const std::map<int, FapVariable>& variables,
|
||||
int EvaluateConstraintImpact(const std::map<int, FapVariable> &variables,
|
||||
const int max_weight_cost,
|
||||
const FapConstraint constraint) {
|
||||
const FapVariable& variable1 =
|
||||
const FapVariable &variable1 =
|
||||
gtl::FindOrDie(variables, constraint.variable1);
|
||||
const FapVariable& variable2 =
|
||||
const FapVariable &variable2 =
|
||||
gtl::FindOrDie(variables, constraint.variable2);
|
||||
const int degree1 = variable1.degree;
|
||||
const int degree2 = variable2.degree;
|
||||
@@ -535,11 +520,11 @@ int EvaluateConstraintImpact(const std::map<int, FapVariable>& variables,
|
||||
return max_degree + min_degree + operator_impact + hardness_impact;
|
||||
}
|
||||
|
||||
void ParseInstance(const std::string& data_directory, bool find_components,
|
||||
std::map<int, FapVariable>* variables,
|
||||
std::vector<FapConstraint>* constraints,
|
||||
std::string* objective, std::vector<int>* frequencies,
|
||||
absl::flat_hash_map<int, FapComponent>* components) {
|
||||
void ParseInstance(const std::string &data_directory, bool find_components,
|
||||
std::map<int, FapVariable> *variables,
|
||||
std::vector<FapConstraint> *constraints,
|
||||
std::string *objective, std::vector<int> *frequencies,
|
||||
absl::flat_hash_map<int, FapComponent> *components) {
|
||||
CHECK(variables != nullptr);
|
||||
CHECK(constraints != nullptr);
|
||||
CHECK(objective != nullptr);
|
||||
@@ -564,7 +549,7 @@ void ParseInstance(const std::string& data_directory, bool find_components,
|
||||
(cst.constraint_weights()).begin(), (cst.constraint_weights()).end());
|
||||
|
||||
// Make the variables of the instance.
|
||||
for (auto& it : *variables) {
|
||||
for (auto &it : *variables) {
|
||||
it.second.domain = gtl::FindOrDie(dom.domains(), it.second.domain_index);
|
||||
it.second.domain_size = it.second.domain.size();
|
||||
|
||||
@@ -579,7 +564,7 @@ void ParseInstance(const std::string& data_directory, bool find_components,
|
||||
}
|
||||
}
|
||||
// Make the constraints of the instance.
|
||||
for (FapConstraint& ct : *constraints) {
|
||||
for (FapConstraint &ct : *constraints) {
|
||||
if ((ct.weight_index == -1) || (ct.weight_index == 0)) {
|
||||
ct.weight_cost = -1;
|
||||
ct.hard = true;
|
||||
@@ -599,18 +584,18 @@ void ParseInstance(const std::string& data_directory, bool find_components,
|
||||
CHECK(components != nullptr);
|
||||
FindComponents(*constraints, *variables, maximum_variable_id, components);
|
||||
// Evaluate each components's constraints impacts.
|
||||
for (auto& component : *components) {
|
||||
for (auto& constraint : component.second.constraints) {
|
||||
for (auto &component : *components) {
|
||||
for (auto &constraint : component.second.constraints) {
|
||||
constraint.impact = EvaluateConstraintImpact(
|
||||
*variables, maximum_weight_cost, constraint);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (FapConstraint& constraint : *constraints) {
|
||||
for (FapConstraint &constraint : *constraints) {
|
||||
constraint.impact =
|
||||
EvaluateConstraintImpact(*variables, maximum_weight_cost, constraint);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace operations_research
|
||||
#endif // OR_TOOLS_EXAMPLES_FAP_PARSER_H_
|
||||
} // namespace operations_research
|
||||
#endif // OR_TOOLS_EXAMPLES_FAP_PARSER_H_
|
||||
|
||||
Reference in New Issue
Block a user