/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* This file is part of the program and library */
/* PaPILO --- Parallel Presolve for Integer and Linear Optimization */
/* */
/* Copyright (C) 2020-2022 Konrad-Zuse-Zentrum */
/* fuer Informationstechnik Berlin */
/* */
/* This program is free software: you can redistribute it and/or modify */
/* it under the terms of the GNU Lesser General Public License as published */
/* by the Free Software Foundation, either version 3 of the License, or */
/* (at your option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU Lesser General Public License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with this program. If not, see . */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef _PAPILO_CORE_PRESOLVE_OPTIONS_HPP_
#define _PAPILO_CORE_PRESOLVE_OPTIONS_HPP_
#include "papilo/misc/ParameterSet.hpp"
#include
namespace papilo
{
struct PresolveOptions
{
// add the parameters with their default values
int maxfillinpersubstitution = 10;
double markowitz_tolerance = 0.01;
int maxshiftperrow = 10;
bool substitutebinarieswithints = true;
int dualreds = 2;
double abortfac = 8e-4;
double lpabortfac = 1e-2;
bool boundrelax = false;
int componentsmaxint = 0;
double compressfac = 0.85;
double tlim = std::numeric_limits::max();
double minabscoeff = 1e-10;
double feastol = 1e-6;
double epsilon = 1e-9;
double hugeval = 1e8;
bool removeslackvars = true;
int weakenlpvarbounds = 0;
int detectlindep = 1;
int threads = 0;
unsigned int randomseed = 0;
bool apply_results_immediately_if_run_sequentially = true;
bool dual_fix_parallel = false;
bool simple_probing_parallel = false;
bool implied_integer_parallel = false;
bool simple_substitution_parallel = false;
bool constraint_propagation_parallel = true;
bool coefficient_strengthening_parallel = true;
bool simplify_inequalities_parallel = true;
bool calculate_basis_for_dual = true;
double bound_tightening_offset = 0.0001;
bool validation_after_every_postsolving_step = false;
void
addParameters( ParameterSet& paramSet )
{
paramSet.addParameter(
"presolve.dualreds",
"0: disable dual reductions, 1: allow dual reductions that never cut "
"off optimal solutions, 2: allow all dual reductions",
dualreds, 0, 2 );
paramSet.addParameter(
"substitution.markowitz_tolerance",
"markowitz tolerance value for allowing a substitution",
markowitz_tolerance, 0.0, 1.0 );
paramSet.addParameter(
"presolve.abortfac",
"abort factor of weighted number of reductions for presolving",
abortfac, 0.0, 1.0 );
paramSet.addParameter(
"presolve.lpabortfac",
"abort factor of weighted number of reductions for presolving LPs",
lpabortfac, 0.0, 1.0 );
paramSet.addParameter(
"substitution.maxfillin",
"maximum estimated fillin for variable substitutions",
maxfillinpersubstitution, 0 );
paramSet.addParameter( "presolve.randomseed", "random seed value",
randomseed );
paramSet.addParameter( "substitution.maxshiftperrow",
"maximum amount of nonzeros being moved to make "
"space for fillin from substitutions within a row",
maxshiftperrow, 0 );
paramSet.addParameter( "substitution.binarieswithints",
"should substitution of binary variables with "
"general integers be allowed",
substitutebinarieswithints );
paramSet.addParameter(
"presolve.boundrelax",
"relax bounds of implied free variables after presolving",
boundrelax );
paramSet.addParameter( "presolve.removeslackvars",
"remove slack variables in equations",
removeslackvars );
paramSet.addParameter(
"presolve.componentsmaxint",
"maximum number of integral variables for trying to solve "
"disconnected components of the problem in presolving (-1: disabled)",
componentsmaxint, -1 );
paramSet.addParameter( "presolve.compressfac",
"compress the problem if fewer than compressfac "
"times the number of rows or columns are active",
compressfac, 0.0, 1.0 );
paramSet.addParameter( "presolve.tlim", "time limit for presolve", tlim,
0.0 );
paramSet.addParameter( "presolve.minabscoeff",
"minimum absolute coefficient value allowed in "
"matrix, before it is set to zero",
minabscoeff, 0.0, 1e-1 );
paramSet.addParameter( "numerics.feastol", "the feasibility tolerance",
feastol, 0.0, 1e-1 );
paramSet.addParameter( "numerics.epsilon",
"epsilon tolerance to consider two values equal",
epsilon, 0.0, 1e-1 );
paramSet.addParameter( "numerics.hugeval",
"absolute bound value that is considered too huge "
"for activitity based calculations",
hugeval, 0.0 );
paramSet.addParameter(
"presolve.weakenlpvarbounds",
"weaken bounds obtained by constraint propagation by this factor of "
"the feasibility tolerance if the problem is an LP",
weakenlpvarbounds );
paramSet.addParameter( "presolve.detectlindep",
"detect and remove linearly dependent equations "
"and free columns (0: off, 1: for LPs, 2: always)",
detectlindep, 0, 2 );
paramSet.addParameter( "presolve.threads",
"maximal number of threads to use (0: automatic)",
threads, 0 );
paramSet.addParameter(
"presolve.apply_results_immediately_if_run_sequentially",
"# if only one thread (presolve.threads = 1) is used, apply the "
"reductions immediately afterwards",
apply_results_immediately_if_run_sequentially );
paramSet.addParameter(
"propagation.parallel",
"#execute loop over rows in constraintpropagation in parallel",
constraint_propagation_parallel );
paramSet.addParameter(
"coefftightening.parallel",
"#execute loop over rows in coefficientstrengthening in parallel",
coefficient_strengthening_parallel );
paramSet.addParameter(
"dualfix.parallel",
"#execute loop over columns in dualfix in parallel",
dual_fix_parallel );
paramSet.addParameter(
"implint.parallel",
"#execute loop over rows in impliedint in parallel",
implied_integer_parallel );
paramSet.addParameter(
"simpleprobing.parallel",
"#execute loop over rows in simpleprobing in parallel",
simple_probing_parallel );
paramSet.addParameter(
"doubletoneq.parallel",
"#execute loop over rows in simplesubstitution in parallel",
simple_substitution_parallel );
paramSet.addParameter(
"simplifyineq.parallel",
"#execute loop over rows in simplifyineq in parallel",
simplify_inequalities_parallel );
paramSet.addParameter(
"calculate_basis_for_dual",
"#if basis for LP should be calculated presolving steps tightening the variable bounds can not be applied.",
calculate_basis_for_dual );
paramSet.addParameter(
"validation_after_every_postsolving_step",
"# should the primal/dual solution be validated during after every postsolving step? ",
validation_after_every_postsolving_step );
paramSet.addParameter(
"bound_tightening_offset",
"# defines the offset for bound tightening ",
bound_tightening_offset );
}
bool
runs_sequential() const
{
return threads == 1;
}
double
get_variable_bound_tightening_offset() const
{
if( bound_tightening_offset > feastol )
return bound_tightening_offset;
return feastol * 10;
};
};
} // namespace papilo
#endif