# SCIP

Solving Constraint Integer Programs

presol_dualagg.c File Reference

## Detailed Description

aggregate variables by dual arguments

This presolver looks for variables which could not be handled by duality fixing because of one up-/downlock. If the constraint which delivers the up-/downlock has a specific structure, we can aggregate the corresponding variable.

In more detail (for a minimization problem and the case of only one uplock):

Given a variable $$x_i$$ with $$c_i \leq 0$$ and only one up lock (originating from a constraint c), we are looking for a binary variable $$x_j$$ such that:

1. if $$x_j = 0$$, constraint c can only be fulfilled for $$x_i = lb_i$$, and
2. if $$x_j = 1$$, constraint c becomes redundant and $$x_i$$ can be dual-fixed to its upper bound $$ub_i$$ (or vice versa). Then we can perform the following aggregation: $$x_i = lb_i + x_j (ub_i - lb_i)$$.

Similar arguments apply for the case of only one down lock and $$c_i \geq 0$$.

Definition in file presol_dualagg.c.

#include "blockmemshell/memory.h"
#include "scip/presol_dualagg.h"
#include "scip/pub_matrix.h"
#include "scip/pub_message.h"
#include "scip/pub_var.h"
#include "scip/scip_general.h"
#include "scip/scip_mem.h"
#include "scip/scip_message.h"
#include "scip/scip_nlp.h"
#include "scip/scip_numerics.h"
#include "scip/scip_presol.h"
#include "scip/scip_pricer.h"
#include "scip/scip_prob.h"
#include "scip/scip_probing.h"
#include "scip/scip_var.h"

Go to the source code of this file.

## Macros

#define PRESOL_NAME   "dualagg"

#define PRESOL_DESC   "aggregate variables by dual arguments"

#define PRESOL_PRIORITY   -12000

#define PRESOL_MAXROUNDS   0

#define PRESOL_TIMING   SCIP_PRESOLTIMING_EXHAUSTIVE /* timing of the presolver (fast, medium, or exhaustive) */

## Typedefs

typedef enum AggrType AGGRTYPE

## Enumerations

enum  AggrType {
BIN0UBOUND = -1,
NOAGG = 0,
BIN0LBOUND = 1
}

## Functions

static void getUplockRowIdx (SCIP_MATRIX *matrix, int aggvaridx, int *rowidx, SCIP_Real *coef)

static void getDownlockRowIdx (SCIP_MATRIX *matrix, int aggvaridx, int *rowidx, SCIP_Real *coef)

static void getBinVarIdxInUplockRow (SCIP *scip, SCIP_MATRIX *matrix, int aggvaridx, int *binvaridx, AGGRTYPE *aggtype)

static void getBinVarIdxInDownlockRow (SCIP *scip, SCIP_MATRIX *matrix, int aggvaridx, int *binvaridx, AGGRTYPE *aggtype)

static SCIP_RETCODE findUplockAggregations (SCIP *scip, SCIP_MATRIX *matrix, int *nvaragg, AGGRTYPE *aggtypes, SCIP_VAR **binvars)

static SCIP_RETCODE findDownlockAggregations (SCIP *scip, SCIP_MATRIX *matrix, int *nvaragg, AGGRTYPE *aggtypes, SCIP_VAR **binvars)

static SCIP_DECL_PRESOLEXEC (presolExecDualagg)

SCIP_RETCODE SCIPincludePresolDualagg (SCIP *scip)

## ◆ PRESOL_NAME

 #define PRESOL_NAME   "dualagg"

Definition at line 64 of file presol_dualagg.c.

Referenced by SCIPincludePresolDualagg().

## ◆ PRESOL_DESC

 #define PRESOL_DESC   "aggregate variables by dual arguments"

Definition at line 65 of file presol_dualagg.c.

Referenced by SCIPincludePresolDualagg().

## ◆ PRESOL_PRIORITY

 #define PRESOL_PRIORITY   -12000

priority of the presolver (>= 0: before, < 0: after constraint handlers)

Definition at line 66 of file presol_dualagg.c.

Referenced by SCIPincludePresolDualagg().

## ◆ PRESOL_MAXROUNDS

 #define PRESOL_MAXROUNDS   0

maximal number of presolving rounds the presolver participates in (-1: no limit)

Definition at line 67 of file presol_dualagg.c.

Referenced by SCIPincludePresolDualagg().

## ◆ PRESOL_TIMING

 #define PRESOL_TIMING   SCIP_PRESOLTIMING_EXHAUSTIVE /* timing of the presolver (fast, medium, or exhaustive) */

Definition at line 68 of file presol_dualagg.c.

Referenced by SCIPincludePresolDualagg().

## ◆ AGGRTYPE

 typedef enum AggrType AGGRTYPE

Definition at line 77 of file presol_dualagg.c.

## ◆ AggrType

 enum AggrType

type of aggregation

Enumerator
BIN0UBOUND

x_j = u_j + (l_j-u_j)x_i with x_i binary and x_j aggregation variable

NOAGG

do not aggregate

BIN0LBOUND

x_j = l_j + (u_j-l_j)x_i with x_i binary and x_j aggregation variable

Definition at line 71 of file presol_dualagg.c.

## ◆ getUplockRowIdx()

 static void getUplockRowIdx ( SCIP_MATRIX * matrix, int aggvaridx, int * rowidx, SCIP_Real * coef )
static

find row which leads to the uplock of the given variable

Parameters
 matrix constraint matrix aggvaridx index of variable which should be aggregated rowidx pointer to store row index of uplock coef pointer to store coefficient of variable

Definition at line 85 of file presol_dualagg.c.

Referenced by getBinVarIdxInUplockRow().

## ◆ getDownlockRowIdx()

 static void getDownlockRowIdx ( SCIP_MATRIX * matrix, int aggvaridx, int * rowidx, SCIP_Real * coef )
static

find row which leads to the downlock of the given variable

Parameters
 matrix constraint matrix aggvaridx index of variable which should be aggregated rowidx pointer to store row index of downlock coef pointer to store coefficient of variable

Definition at line 133 of file presol_dualagg.c.

Referenced by getBinVarIdxInDownlockRow().

## ◆ getBinVarIdxInUplockRow()

 static void getBinVarIdxInUplockRow ( SCIP * scip, SCIP_MATRIX * matrix, int aggvaridx, int * binvaridx, AGGRTYPE * aggtype )
static

find fitting binary variable aggregation for uplock case

Parameters
 scip SCIP main data structure matrix constraint matrix aggvaridx index of variable which should be aggregated binvaridx pointer to store index of binary variable aggtype pointer to store type of aggregation

Definition at line 181 of file presol_dualagg.c.

Referenced by findUplockAggregations().

## ◆ getBinVarIdxInDownlockRow()

 static void getBinVarIdxInDownlockRow ( SCIP * scip, SCIP_MATRIX * matrix, int aggvaridx, int * binvaridx, AGGRTYPE * aggtype )
static

find fitting binary variable aggregation for downlock case

Parameters
 scip SCIP main data structure matrix constraint matrix aggvaridx index of variable which should be aggregated binvaridx pointer to store index of binary variable aggtype pointer to store type of aggregation

Definition at line 279 of file presol_dualagg.c.

Referenced by findDownlockAggregations().

## ◆ findUplockAggregations()

 static SCIP_RETCODE findUplockAggregations ( SCIP * scip, SCIP_MATRIX * matrix, int * nvaragg, AGGRTYPE * aggtypes, SCIP_VAR ** binvars )
static

find variable aggregations for uplock case

Parameters
 scip SCIP main data structure matrix constraint matrix nvaragg number of redundant variables aggtypes type of aggregations (in same order as variables in matrix) binvars pointers to the binary variables (in same order as variables in matrix)

Definition at line 379 of file presol_dualagg.c.

Referenced by SCIP_DECL_PRESOLEXEC().

## ◆ findDownlockAggregations()

 static SCIP_RETCODE findDownlockAggregations ( SCIP * scip, SCIP_MATRIX * matrix, int * nvaragg, AGGRTYPE * aggtypes, SCIP_VAR ** binvars )
static

find variable aggregations for downlock case

Parameters
 scip SCIP main data structure matrix constraint matrix nvaragg number of redundant variables aggtypes type of aggregations (in same order as variables in matrix) binvars pointers to the binary variables (in same order as variables in matrix)

Definition at line 435 of file presol_dualagg.c.

Referenced by SCIP_DECL_PRESOLEXEC().

## ◆ SCIP_DECL_PRESOLEXEC()

 static SCIP_DECL_PRESOLEXEC ( presolExecDualagg )
static

execution method of presolver

Definition at line 498 of file presol_dualagg.c.