1    	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2    	/*                                                                           */
3    	/*                  This file is part of the program and library             */
4    	/*         SCIP --- Solving Constraint Integer Programs                      */
5    	/*                                                                           */
6    	/*  Copyright (c) 2002-2023 Zuse Institute Berlin (ZIB)                      */
7    	/*                                                                           */
8    	/*  Licensed under the Apache License, Version 2.0 (the "License");          */
9    	/*  you may not use this file except in compliance with the License.         */
10   	/*  You may obtain a copy of the License at                                  */
11   	/*                                                                           */
12   	/*      http://www.apache.org/licenses/LICENSE-2.0                           */
13   	/*                                                                           */
14   	/*  Unless required by applicable law or agreed to in writing, software      */
15   	/*  distributed under the License is distributed on an "AS IS" BASIS,        */
16   	/*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17   	/*  See the License for the specific language governing permissions and      */
18   	/*  limitations under the License.                                           */
19   	/*                                                                           */
20   	/*  You should have received a copy of the Apache-2.0 license                */
21   	/*  along with SCIP; see the file LICENSE. If not visit scipopt.org.         */
22   	/*                                                                           */
23   	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24   	
25   	/**@file   type_sepa.h
26   	 * @ingroup TYPEDEFINITIONS
27   	 * @brief  type definitions for separators
28   	 * @author Tobias Achterberg
29   	 */
30   	
31   	/** @defgroup DEFPLUGINS_SEPA Default Separators
32   	 *  @ingroup DEFPLUGINS
33   	 *  @brief implementation files (.c files) of the default separators of SCIP
34   	 */
35   	
36   	/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
37   	
38   	#ifndef __SCIP_TYPE_SEPA_H__
39   	#define __SCIP_TYPE_SEPA_H__
40   	
41   	#include "scip/def.h"
42   	#include "scip/type_retcode.h"
43   	#include "scip/type_result.h"
44   	#include "scip/type_sol.h"
45   	#include "scip/type_scip.h"
46   	
47   	#ifdef __cplusplus
48   	extern "C" {
49   	#endif
50   	
51   	typedef struct SCIP_Sepa SCIP_SEPA;               /**< separator */
52   	typedef struct SCIP_SepaData SCIP_SEPADATA;       /**< locally defined separator data */
53   	
54   	
55   	/** copy method for separator plugins (called when SCIP copies plugins)
56   	 *
57   	 *  input:
58   	 *  - scip            : SCIP main data structure
59   	 *  - sepa            : the separator itself
60   	 */
61   	#define SCIP_DECL_SEPACOPY(x) SCIP_RETCODE x (SCIP* scip, SCIP_SEPA* sepa)
62   	
63   	/** destructor of separator to free user data (called when SCIP is exiting)
64   	 *
65   	 *  input:
66   	 *  - scip            : SCIP main data structure
67   	 *  - sepa            : the separator itself
68   	 */
69   	#define SCIP_DECL_SEPAFREE(x) SCIP_RETCODE x (SCIP* scip, SCIP_SEPA* sepa)
70   	
71   	/** initialization method of separator (called after problem was transformed)
72   	 *
73   	 *  input:
74   	 *  - scip            : SCIP main data structure
75   	 *  - sepa            : the separator itself
76   	 */
77   	#define SCIP_DECL_SEPAINIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_SEPA* sepa)
78   	
79   	/** deinitialization method of separator (called before transformed problem is freed)
80   	 *
81   	 *  input:
82   	 *  - scip            : SCIP main data structure
83   	 *  - sepa            : the separator itself
84   	 */
85   	#define SCIP_DECL_SEPAEXIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_SEPA* sepa)
86   	
87   	/** solving process initialization method of separator (called when branch and bound process is about to begin)
88   	 *
89   	 *  This method is called when the presolving was finished and the branch and bound process is about to begin.
90   	 *  The separator may use this call to initialize its branch and bound specific data.
91   	 *
92   	 *  input:
93   	 *  - scip            : SCIP main data structure
94   	 *  - sepa            : the separator itself
95   	 */
96   	#define SCIP_DECL_SEPAINITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_SEPA* sepa)
97   	
98   	/** solving process deinitialization method of separator (called before branch and bound process data is freed)
99   	 *
100  	 *  This method is called before the branch and bound process is freed.
101  	 *  The separator should use this call to clean up its branch and bound data.
102  	 *
103  	 *  input:
104  	 *  - scip            : SCIP main data structure
105  	 *  - sepa            : the separator itself
106  	 */
107  	#define SCIP_DECL_SEPAEXITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_SEPA* sepa)
108  	
109  	/** LP solution separation method of separator
110  	 *
111  	 *  Searches for cutting planes that separate the current LP solution. The method is called in the LP solving loop,
112  	 *  which means that a valid LP solution exists.
113  	 *
114  	 *  input:
115  	 *  - scip            : SCIP main data structure
116  	 *  - sepa            : the separator itself
117  	 *  - result          : pointer to store the result of the separation call
118  	 *  - allowlocal      : should the separator allow local cuts?
119  	 *  - depth           : preteneded depth of current node
120  	 *
121  	 *  @note The depth argument shouldn't be use to determine whether the cut is globally valid or not.  The value of depth
122  	 *  could be 0 even though we are not in the root node! The purpose of depth is to control the behavior of the
123  	 *  separator. Usually separators will have different limits on the number of cuts to be applied in the root node, etc.
124  	 *  These limits should be checked against depth and not against the actual depth of the current node.
125  	 *
126  	 *  possible return values for *result (if more than one applies, the first in the list should be used):
127  	 *  - SCIP_CUTOFF     : the node is infeasible in the variable's bounds and can be cut off
128  	 *  - SCIP_CONSADDED  : an additional constraint was generated
129  	 *  - SCIP_REDUCEDDOM : a variable's domain was reduced
130  	 *  - SCIP_SEPARATED  : a cutting plane was generated
131  	 *  - SCIP_NEWROUND   : a cutting plane was generated and a new separation round should immediately start
132  	 *  - SCIP_DIDNOTFIND : the separator searched, but did not find domain reductions, cutting planes, or cut constraints
133  	 *  - SCIP_DIDNOTRUN  : the separator was skipped
134  	 *  - SCIP_DELAYED    : the separator was skipped, but should be called again
135  	 */
136  	#define SCIP_DECL_SEPAEXECLP(x) SCIP_RETCODE x (SCIP* scip, SCIP_SEPA* sepa, SCIP_RESULT* result, SCIP_Bool allowlocal, int depth)
137  	
138  	/** arbitrary primal solution separation method of separator
139  	 *
140  	 *  Searches for cutting planes that separate the given primal solution. The method is called outside the LP solution
141  	 *  loop (e.g., by a relaxator or a primal heuristic), which means that there is no valid LP solution.
142  	 *
143  	 *  input:
144  	 *  - scip            : SCIP main data structure
145  	 *  - sepa            : the separator itself
146  	 *  - sol             : primal solution that should be separated
147  	 *  - result          : pointer to store the result of the separation call
148  	 *  - allowlocal      : should the separator allow local cuts?
149  	 *  - depth           : preteneded depth of current node
150  	 *
151  	 *  @note The depth argument shouldn't be use to determine whether the cut is globally valid or not.  The value of depth
152  	 *  could be 0 even though we are not in the root node! The purpose of depth is to control the behavior of the
153  	 *  separator. Usually separators will have different limits on the number of cuts to be applied in the root node, etc.
154  	 *  These limits should be checked against depth and not against the actual depth of the current node.
155  	 *
156  	 *  possible return values for *result (if more than one applies, the first in the list should be used):
157  	 *  - SCIP_CUTOFF     : the node is infeasible in the variable's bounds and can be cut off
158  	 *  - SCIP_CONSADDED  : an additional constraint was generated
159  	 *  - SCIP_REDUCEDDOM : a variable's domain was reduced
160  	 *  - SCIP_SEPARATED  : a cutting plane was generated
161  	 *  - SCIP_NEWROUND   : a cutting plane was generated and a new separation round should immediately start
162  	 *  - SCIP_DIDNOTFIND : the separator searched, but did not find domain reductions, cutting planes, or cut constraints
163  	 *  - SCIP_DIDNOTRUN  : the separator was skipped
164  	 *  - SCIP_DELAYED    : the separator was skipped, but should be called again
165  	 */
166  	#define SCIP_DECL_SEPAEXECSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_SEPA* sepa, SCIP_SOL* sol, SCIP_RESULT* result, SCIP_Bool allowlocal, int depth)
167  	
168  	#ifdef __cplusplus
169  	}
170  	#endif
171  	
172  	#endif
173