Google OR-Tools v9.11
a fast and portable software suite for combinatorial optimization
|
#include <cuts.h>
Public Member Functions | |
BoolRLTCutHelper (Model *model) | |
~BoolRLTCutHelper () | |
void | Initialize (const absl::flat_hash_map< IntegerVariable, glop::ColIndex > &lp_vars) |
bool | TrySimpleSeparation (const CutData &input_ct) |
Tries RLT separation of the input constraint. Returns true on success. | |
const CutData & | cut () const |
If successful, this contains the last generated cut. | |
std::string | Info () const |
Single line of text that we append to the cut log line. | |
Separate RLT cuts.
See for instance "Efficient Separation of RLT Cuts for Implicit and Explicit Bilinear Products", Ksenia Bestuzheva, Ambros Gleixner, Tobias Achterberg, https://arxiv.org/abs/2211.13545
|
inlineexplicit |
operations_research::sat::BoolRLTCutHelper::~BoolRLTCutHelper | ( | ) |
|
inline |
|
inline |
void operations_research::sat::BoolRLTCutHelper::Initialize | ( | const absl::flat_hash_map< IntegerVariable, glop::ColIndex > & | lp_vars | ) |
bool operations_research::sat::BoolRLTCutHelper::TrySimpleSeparation | ( | const CutData & | input_ct | ) |
Tries RLT separation of the input constraint. Returns true on success.
We will list the interesting "factor" to try to multiply + linearize the input constraint with.
We can look at the linearized factor * term and bound the activity delta rescaled by 1 / factor.
CASE linearized_term delta = term/factor - previous
DROP, 0 0 - X MC_CORMICK, factor * ub - (ub - X) (ub - X) * (1 - 1/factor) <= 0 SQUARE, factor=X 1 - X RLT, factor - P 1 - X - P/X <= 1 - X
The only options are DROP or MC_CORMICK, but the later will unlikely win.
Here the MC_CORMICK will not loose much. And SQUARE or RLT cannot win much, so we can assume there is no loss and just look for violated subconstraint.
Convert to var or -var (to mean 1 - var).
If we found a good factor, applies it to the non-filtered base constraint.