[GLOP] use absl::BigGenRef instead of random_engine

This commit is contained in:
Laurent Perron
2021-04-13 14:31:06 +02:00
parent 7cd11d51f8
commit d1d53f014e
7 changed files with 32 additions and 21 deletions

View File

@@ -15,11 +15,11 @@ cc_library(
hdrs = ["pricing.h"],
deps = [
"//ortools/base",
"@com_google_absl//absl/random",
"@com_google_absl//absl/random:bit_gen_ref",
"//ortools/lp_data:base",
"//ortools/util:bitset",
"//ortools/util:stats",
"@com_google_absl//absl/random",
"@com_google_absl//absl/random:bit_gen_ref",
],
)
@@ -262,6 +262,7 @@ cc_library(
"//ortools/lp_data:scattered_vector",
"//ortools/util:random_engine",
"//ortools/util:stats",
"@com_google_absl//absl/random:bit_gen_ref",
],
)
@@ -308,6 +309,7 @@ cc_library(
"//ortools/util:bitset",
"//ortools/util:random_engine",
"//ortools/util:stats",
"@com_google_absl//absl/random:bit_gen_ref",
],
)

View File

@@ -23,7 +23,7 @@ namespace operations_research {
namespace glop {
EnteringVariable::EnteringVariable(const VariablesInfo& variables_info,
random_engine_t* random,
absl::BitGenRef random,
ReducedCosts* reduced_costs,
PrimalEdgeNorms* primal_edge_norms)
: variables_info_(variables_info),
@@ -256,7 +256,7 @@ Status EnteringVariable::DualChooseEnteringColumn(
equivalent_entering_choices_.push_back(*entering_col);
*entering_col =
equivalent_entering_choices_[std::uniform_int_distribution<int>(
0, equivalent_entering_choices_.size() - 1)(*random_)];
0, equivalent_entering_choices_.size() - 1)(random_)];
IF_STATS_ENABLED(
stats_.num_perfect_ties.Add(equivalent_entering_choices_.size()));
}
@@ -502,7 +502,7 @@ void EnteringVariable::NormalizedChooseEnteringColumn(ColIndex* entering_col) {
equivalent_entering_choices_.push_back(*entering_col);
*entering_col =
equivalent_entering_choices_[std::uniform_int_distribution<int>(
0, equivalent_entering_choices_.size() - 1)(*random_)];
0, equivalent_entering_choices_.size() - 1)(random_)];
IF_STATS_ENABLED(
stats_.num_perfect_ties.Add(equivalent_entering_choices_.size()));
}

View File

@@ -14,6 +14,7 @@
#ifndef OR_TOOLS_GLOP_ENTERING_VARIABLE_H_
#define OR_TOOLS_GLOP_ENTERING_VARIABLE_H_
#include "absl/random/bit_gen_ref.h"
#include "ortools/glop/basis_representation.h"
#include "ortools/glop/parameters.pb.h"
#include "ortools/glop/primal_edge_norms.h"
@@ -24,7 +25,6 @@
#include "ortools/lp_data/lp_data.h"
#include "ortools/lp_data/lp_types.h"
#include "ortools/util/bitset.h"
#include "ortools/util/random_engine.h"
#include "ortools/util/stats.h"
#if !SWIG
@@ -53,7 +53,7 @@ namespace glop {
class EnteringVariable {
public:
// Takes references to the linear program data we need.
EnteringVariable(const VariablesInfo& variables_info, random_engine_t* random,
EnteringVariable(const VariablesInfo& variables_info, absl::BitGenRef random,
ReducedCosts* reduced_costs,
PrimalEdgeNorms* primal_edge_norms);
@@ -118,7 +118,7 @@ class EnteringVariable {
// Problem data that should be updated from outside.
const VariablesInfo& variables_info_;
random_engine_t* random_;
absl::BitGenRef random_;
ReducedCosts* reduced_costs_;
PrimalEdgeNorms* primal_edge_norms_;

View File

@@ -29,7 +29,7 @@ ReducedCosts::ReducedCosts(const CompactSparseMatrix& matrix,
const RowToColMapping& basis,
const VariablesInfo& variables_info,
const BasisFactorization& basis_factorization,
random_engine_t* random)
absl::BitGenRef random)
: matrix_(matrix),
objective_(objective),
basis_(basis),
@@ -272,7 +272,7 @@ void ReducedCosts::PerturbCosts() {
for (ColIndex col(0); col < structural_size; ++col) {
const Fractional objective = objective_[col];
const Fractional magnitude =
(1.0 + std::uniform_real_distribution<double>()(*random_)) *
(1.0 + std::uniform_real_distribution<double>()(random_)) *
(parameters_.relative_cost_perturbation() * std::abs(objective) +
parameters_.relative_max_cost_perturbation() * max_cost_magnitude);
DCHECK_GE(magnitude, 0.0);

View File

@@ -14,6 +14,7 @@
#ifndef OR_TOOLS_GLOP_REDUCED_COSTS_H_
#define OR_TOOLS_GLOP_REDUCED_COSTS_H_
#include "absl/random/bit_gen_ref.h"
#include "ortools/glop/basis_representation.h"
#include "ortools/glop/parameters.pb.h"
#include "ortools/glop/primal_edge_norms.h"
@@ -23,7 +24,6 @@
#include "ortools/lp_data/lp_data.h"
#include "ortools/lp_data/lp_types.h"
#include "ortools/lp_data/scattered_vector.h"
#include "ortools/util/random_engine.h"
#include "ortools/util/stats.h"
namespace operations_research {
@@ -52,7 +52,7 @@ class ReducedCosts {
const RowToColMapping& basis,
const VariablesInfo& variables_info,
const BasisFactorization& basis_factorization,
random_engine_t* random);
absl::BitGenRef random);
// If this is true, then the caller must re-factorize the basis before the
// next call to GetReducedCosts().
@@ -255,7 +255,7 @@ class ReducedCosts {
const RowToColMapping& basis_;
const VariablesInfo& variables_info_;
const BasisFactorization& basis_factorization_;
random_engine_t* random_;
absl::BitGenRef random_;
// Internal data.
GlopParameters parameters_;

View File

@@ -86,6 +86,8 @@ RevisedSimplex::RevisedSimplex()
variable_name_(),
direction_(),
error_(),
deterministic_random_(kDeterministicSeed),
random_(deterministic_random_),
basis_factorization_(&compact_matrix_, &basis_),
variables_info_(compact_matrix_),
dual_edge_norms_(basis_factorization_),
@@ -97,8 +99,8 @@ RevisedSimplex::RevisedSimplex()
update_row_(compact_matrix_, transposed_matrix_, variables_info_, basis_,
basis_factorization_),
reduced_costs_(compact_matrix_, objective_, basis_, variables_info_,
basis_factorization_, &random_),
entering_variable_(variables_info_, &random_, &reduced_costs_,
basis_factorization_, random_),
entering_variable_(variables_info_, random_, &reduced_costs_,
&primal_edge_norms_),
num_iterations_(0),
num_feasibility_iterations_(0),
@@ -112,8 +114,7 @@ RevisedSimplex::RevisedSimplex()
function_stats_("SimplexFunctionStats"),
parameters_(),
test_lu_(),
feasibility_phase_(true),
random_(kDeterministicSeed) {
feasibility_phase_(true) {
SetParameters(parameters_);
}
@@ -3075,7 +3076,8 @@ Fractional RevisedSimplex::ComputeInitialProblemObjectiveValue() const {
void RevisedSimplex::SetParameters(const GlopParameters& parameters) {
SCOPED_TIME_STAT(&function_stats_);
random_.seed(parameters.random_seed());
deterministic_random_.seed(parameters.random_seed());
initial_parameters_ = parameters;
parameters_ = parameters;
PropagateParameters();

View File

@@ -95,6 +95,7 @@
#include <string>
#include <vector>
#include "absl/random/bit_gen_ref.h"
#include "ortools/base/integral_types.h"
#include "ortools/base/macros.h"
#include "ortools/glop/basis_representation.h"
@@ -636,6 +637,15 @@ class RevisedSimplex {
// Used to compute the error 'b - A.x' or 'a - B.d'.
DenseColumn error_;
// A random number generator. In test we use absl_random_ to have a
// non-deterministic behavior and avoid client depending on a golden optimal
// solution which prevent us from easily changing the solver.
random_engine_t deterministic_random_;
#ifndef NDEBUG
absl::BitGen absl_random_;
#endif
absl::BitGenRef random_;
// Representation of matrix B using eta matrices and LU decomposition.
BasisFactorization basis_factorization_;
@@ -760,9 +770,6 @@ class RevisedSimplex {
// anyway.
std::vector<RowIndex> equivalent_leaving_choices_;
// A random number generator.
random_engine_t random_;
// This is used by Polish().
DenseRow integrality_scale_;