1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* This file is part of the program and library */
/* SCIP --- Solving Constraint Integer Programs */
/* */
/* Copyright 2002-2022 Zuse Institute Berlin */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
/* See the License for the specific language governing permissions and */
/* limitations under the License. */
/* */
/* You should have received a copy of the Apache-2.0 license */
/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**@file sepastore.h
* @ingroup INTERNALAPI
* @brief internal methods for storing separated cuts
* @author Tobias Achterberg
* @author Leona Gottwald
*/
/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
#ifndef __SCIP_SEPASTORE_H__
#define __SCIP_SEPASTORE_H__
#include "scip/def.h"
#include "blockmemshell/memory.h"
#include "scip/type_implics.h"
#include "scip/type_retcode.h"
#include "scip/type_set.h"
#include "scip/type_stat.h"
#include "scip/type_event.h"
#include "scip/type_lp.h"
#include "scip/type_prob.h"
#include "scip/type_tree.h"
#include "scip/type_reopt.h"
#include "scip/type_sepastore.h"
#include "scip/type_branch.h"
#ifdef __cplusplus
extern "C" {
#endif
/** creates separation storage */
SCIP_RETCODE SCIPsepastoreCreate(
SCIP_SEPASTORE** sepastore, /**< pointer to store separation storage */
BMS_BLKMEM* blkmem, /**< block memory */
SCIP_SET* set /**< global SCIP settings */
);
/** frees separation storage */
SCIP_RETCODE SCIPsepastoreFree(
SCIP_SEPASTORE** sepastore, /**< pointer to store separation storage */
BMS_BLKMEM* blkmem /**< block memory */
);
/** informs separation storage that the setup of the initial LP starts now */
void SCIPsepastoreStartInitialLP(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
/** informs separation storage that the setup of the initial LP is now finished */
void SCIPsepastoreEndInitialLP(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
/** informs separation storage that the following cuts should be used in any case */
void SCIPsepastoreStartForceCuts(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
/** informs separation storage that the following cuts should no longer be used in any case */
void SCIPsepastoreEndForceCuts(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
/** adds cut to separation storage and captures it */
SCIP_RETCODE SCIPsepastoreAddCut(
SCIP_SEPASTORE* sepastore, /**< separation storage */
BMS_BLKMEM* blkmem, /**< block memory */
SCIP_SET* set, /**< global SCIP settings */
SCIP_STAT* stat, /**< problem statistics data */
SCIP_EVENTQUEUE* eventqueue, /**< event queue */
SCIP_EVENTFILTER* eventfilter, /**< event filter for global events */
SCIP_LP* lp, /**< LP data */
SCIP_ROW* cut, /**< separated cut */
SCIP_Bool forcecut, /**< should the cut be forced to enter the LP? */
SCIP_Bool root, /**< are we at the root node? */
SCIP_Bool* infeasible /**< pointer to store whether the cut is infeasible */
);
/** adds cuts to the LP and clears separation storage */
SCIP_RETCODE SCIPsepastoreApplyCuts(
SCIP_SEPASTORE* sepastore, /**< separation storage */
BMS_BLKMEM* blkmem, /**< block memory */
SCIP_SET* set, /**< global SCIP settings */
SCIP_STAT* stat, /**< problem statistics */
SCIP_PROB* transprob, /**< transformed problem */
SCIP_PROB* origprob, /**< original problem */
SCIP_TREE* tree, /**< branch and bound tree */
SCIP_REOPT* reopt, /**< reoptimization data structure */
SCIP_LP* lp, /**< LP data */
SCIP_BRANCHCAND* branchcand, /**< branching candidate storage */
SCIP_EVENTQUEUE* eventqueue, /**< event queue */
SCIP_EVENTFILTER* eventfilter, /**< global event filter */
SCIP_CLIQUETABLE* cliquetable, /**< clique table data structure */
SCIP_Bool root, /**< are we at the root node? */
SCIP_EFFICIACYCHOICE efficiacychoice, /**< type of solution to base efficiacy computation on */
SCIP_Bool* cutoff /**< pointer to store whether an empty domain was created */
);
/** clears the separation storage without adding the cuts to the LP */
SCIP_RETCODE SCIPsepastoreClearCuts(
SCIP_SEPASTORE* sepastore, /**< separation storage */
BMS_BLKMEM* blkmem, /**< block memory */
SCIP_SET* set, /**< global SCIP settings */
SCIP_EVENTQUEUE* eventqueue, /**< event queue */
SCIP_EVENTFILTER* eventfilter, /**< event filter for global events */
SCIP_LP* lp /**< LP data */
);
/** removes cuts that are inefficacious w.r.t. the current LP solution from separation storage without adding the cuts to the LP */
SCIP_RETCODE SCIPsepastoreRemoveInefficaciousCuts(
SCIP_SEPASTORE* sepastore, /**< separation storage */
BMS_BLKMEM* blkmem, /**< block memory */
SCIP_SET* set, /**< global SCIP settings */
SCIP_STAT* stat, /**< problem statistics data */
SCIP_EVENTQUEUE* eventqueue, /**< event queue */
SCIP_EVENTFILTER* eventfilter, /**< event filter for global events */
SCIP_LP* lp, /**< LP data */
SCIP_Bool root, /**< are we at the root node? */
SCIP_EFFICIACYCHOICE efficiacychoice /**< type of solution to base efficiacy computation on */
);
/** indicates whether a cut is applicable
*
* A cut is applicable if it is modifiable, not a bound change, or a bound change that changes bounds by at least epsilon.
*/
SCIP_Bool SCIPsepastoreIsCutApplicable(
SCIP_SET* set, /**< global SCIP settings */
SCIP_ROW* cut /**< cut to check */
);
/** get cuts in the separation storage */
SCIP_ROW** SCIPsepastoreGetCuts(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
/** get number of cuts in the separation storage */
int SCIPsepastoreGetNCuts(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
/** gets the total number of cutting planes added to the separation storage;
* this is equal to the sum of added cuts directly and via the pool. */
int SCIPsepastoreGetNCutsAdded(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
/** gets the number of cutting planes added to the separation storage from the cut pool */
int SCIPsepastoreGetNCutsAddedViaPool(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
/** gets the number of cutting planes added to the separation storage directly */
int SCIPsepastoreGetNCutsAddedDirect(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
/** get number of cuts found so far in current separation round */
int SCIPsepastoreGetNCutsFoundRound(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
/** gets the total number of cutting planes applied to the LP */
int SCIPsepastoreGetNCutsApplied(
SCIP_SEPASTORE* sepastore /**< separation storage */
);
#ifdef __cplusplus
}
#endif
#endif