Scippy

SCIP

Solving Constraint Integer Programs

tclique.h
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the program */
4/* TCLIQUE --- Algorithm for Maximum Cliques */
5/* */
6/* Copyright (c) 1996-2024 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 TCLIQUE; see the file LICENSE. */
22/* */
23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24
25/**@file tclique.h
26 * @brief tclique user interface
27 * @author Tobias Achterberg
28 * @author Ralf Borndoerfer
29 * @author Zoltan Kormos
30 * @author Kati Wolter
31 */
32
33/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
34
35#ifndef __TCLIQUE_H__
36#define __TCLIQUE_H__
37
38#ifdef __cplusplus
39extern "C" {
40#endif
41
42#include "tclique/tclique_def.h"
43
44/*
45 * Data Types and Structures
46 */
47
48typedef int TCLIQUE_WEIGHT; /**< type used for node weights in the graph */
49typedef struct TCLIQUE_Graph TCLIQUE_GRAPH; /**< user defined structure for storing the graph, passed to graph callbacks */
50typedef struct TCLIQUE_Data TCLIQUE_DATA; /**< user defined data to pass to new solution callback method */
51
52#ifndef TCLIQUE_Bool
53#define TCLIQUE_Bool unsigned int /**< type used for boolean values */
54#endif
55#ifndef TRUE
56#define TRUE 1 /**< boolean value TRUE */
57#define FALSE 0 /**< boolean value FALSE */
58#endif
59
60/** return status of the TCLIQUE algorithm */
62{
63 TCLIQUE_ERROR = 0, /**< an error occurred */
64 TCLIQUE_NODELIMIT = 1, /**< the node limit was reached */
65 TCLIQUE_USERABORT = 2, /**< the user call back function aborted the solving process */
66 TCLIQUE_OPTIMAL = 3 /**< the optimal solution was found */
67};
69
70
71
72
73/*
74 * User Callback Methods
75 */
76
77/** user callback method which is called whenever a feasible clique was found
78 * input:
79 * - tcliquedata : user data given to tcliqueMaxClique()
80 * - cliquenodes : array with nodes of the clique
81 * - ncliquenodes : number of nodes in the clique
82 * - cliqueweight : weight of the clique
83 * output:
84 * - minweight : new minimal weight for feasible cliques
85 * - acceptsol : setting TRUE makes clique the new best clique, and updates minweight
86 * - stopsolving : setting TRUE aborts the search for cliques
87 */
88#define TCLIQUE_NEWSOL(x) void x (TCLIQUE_DATA* tcliquedata, int* cliquenodes, int ncliquenodes, \
89 TCLIQUE_WEIGHT cliqueweight, TCLIQUE_WEIGHT* minweight, TCLIQUE_Bool* acceptsol, TCLIQUE_Bool* stopsolving)
90
91/** user callback method to get number of nodes in the graph
92 * input:
93 * - tcliquegraph : user defined graph data structure given to tcliqueMaxClique()
94 * returns:
95 * number of nodes in the graph
96 */
97#define TCLIQUE_GETNNODES(x) int x (TCLIQUE_GRAPH* tcliquegraph)
98
99/** user callback method to get weights of nodes in the graph
100 * input:
101 * - tcliquegraph : user defined graph data structure given to tcliqueMaxClique()
102 * returns:
103 * array of node weights (of length at least equal to the number of nodes in the graph)
104 */
105#define TCLIQUE_GETWEIGHTS(x) const TCLIQUE_WEIGHT* x (TCLIQUE_GRAPH* tcliquegraph)
106
107/** user callback method to return whether the edge (node1, node2) is in the graph
108 * input:
109 * - tcliquegraph : user defined graph data structure given to tcliqueMaxClique()
110 * - node1 : start node of edge (tail)
111 * - node2 : end node of edge (head)
112 * returns:
113 * TRUE if edge is in the graph, FALSE otherwise
114 */
115#define TCLIQUE_ISEDGE(x) TCLIQUE_Bool x (TCLIQUE_GRAPH* tcliquegraph, int node1, int node2)
116
117/** user callback method to select all nodes from a given set of nodes which are adjacent to a given node
118 * input:
119 * - tcliquegraph : user defined graph data structure given to tcliqueMaxClique()
120 * - node : node to select adjacent nodes from
121 * - nodes : array of nodes to select nodes from
122 * - nnodes : number of nodes in 'nodes' array
123 * - adjnodes : pointer to memory to store the resulting nodes
124 * 'adjnodes' and 'nodes' may point to the same memory location
125 * output:
126 * - adjnodes : array of nodes that are contained in 'nodes' and that are adjacent to 'node'
127 * returns:
128 * number of nodes in 'adjnodes'
129 */
130#define TCLIQUE_SELECTADJNODES(x) int x (TCLIQUE_GRAPH* tcliquegraph, int node, int* nodes, int nnodes, int* adjnodes)
131
132
133
134
135/*
136 * Default Graph Implementation: Interface Methods used by the TClique algorithm
137 */
138
139/** gets number of nodes in the graph */
140SCIP_EXPORT
141TCLIQUE_GETNNODES(tcliqueGetNNodes);
142
143/** gets weight of nodes in the graph */
144SCIP_EXPORT
145TCLIQUE_GETWEIGHTS(tcliqueGetWeights);
146
147/** returns, whether the edge (node1, node2) is in the graph */
148SCIP_EXPORT
149TCLIQUE_ISEDGE(tcliqueIsEdge);
150
151/** selects all nodes from a given set of nodes which are adjacent to a given node
152 * and returns the number of selected nodes */
153SCIP_EXPORT
154TCLIQUE_SELECTADJNODES(tcliqueSelectAdjnodes);
155
156
157
158
159/*
160 * Default Graph Implementation: External Interface Methods to access the graph
161 */
162
163/** creates graph data structure */
164SCIP_EXPORT
166 TCLIQUE_GRAPH** tcliquegraph /**< pointer to store graph data structure */
167 );
168
169/** frees graph data structure */
170SCIP_EXPORT
171void tcliqueFree(
172 TCLIQUE_GRAPH** tcliquegraph /**< pointer to graph data structure */
173 );
174
175/** adds nodes up to the given node number to graph data structure (intermediate nodes have weight 0) */
176SCIP_EXPORT
178 TCLIQUE_GRAPH* tcliquegraph, /**< graph data structure */
179 int node, /**< node number to add */
180 TCLIQUE_WEIGHT weight /**< weight of node to add */
181 );
182
183/** changes weight of node in graph data structure */
184SCIP_EXPORT
186 TCLIQUE_GRAPH* tcliquegraph, /**< graph data structure */
187 int node, /**< node to set new weight */
188 TCLIQUE_WEIGHT weight /**< new weight of node (allready scaled) */
189 );
190
191/** adds edge (node1, node2) to graph data structure (node1 and node2 have to be contained in
192 * graph data structure)
193 *
194 * New edges are cached, s.t. the graph data structures are not correct until a call to tcliqueFlush();
195 * you have to make sure, that no double edges are inserted.
196 */
197SCIP_EXPORT
199 TCLIQUE_GRAPH* tcliquegraph, /**< graph data structure */
200 int node1, /**< start node of edge to add */
201 int node2 /**< end node of edge to add */
202 );
203
204/** inserts all cached edges into the data structures */
205SCIP_EXPORT
207 TCLIQUE_GRAPH* tcliquegraph /**< graph data structure */
208 );
209
210/** loads graph data structure from file */
211SCIP_EXPORT
213 TCLIQUE_GRAPH** tcliquegraph, /**< pointer to store graph data structure */
214 const char* filename, /**< name of file with graph data */
215 double scaleval, /**< value to scale weights (only integral part of scaled weights is considered) */
216 char* probname, /**< buffer to store the name of the problem */
217 int sizeofprobname /**< size of buffer to store the name of the problem */
218 );
219
220/** saves graph data structure to file */
221SCIP_EXPORT
223 TCLIQUE_GRAPH* tcliquegraph, /**< graph data structure */
224 const char* filename, /**< name of file to create */
225 double scaleval, /**< value to unscale weights with */
226 const char* probname /**< name of the problem */
227 );
228
229/** gets number of edges in the graph */
230SCIP_EXPORT
232 TCLIQUE_GRAPH* tcliquegraph /**< pointer to graph data structure */
233 );
234
235/** gets degree of nodes in graph */
236SCIP_EXPORT
238 TCLIQUE_GRAPH* tcliquegraph /**< pointer to graph data structure */
239 );
240
241/** gets adjacent nodes of edges in graph */
242SCIP_EXPORT
244 TCLIQUE_GRAPH* tcliquegraph /**< pointer to graph data structure */
245 );
246
247/** gets pointer to first adjacent edge of given node in graph */
248SCIP_EXPORT
250 TCLIQUE_GRAPH* tcliquegraph, /**< pointer to graph data structure */
251 int node /**< given node */
252 );
253
254/** gets pointer to last adjacent edge of given node in graph */
255SCIP_EXPORT
257 TCLIQUE_GRAPH* tcliquegraph, /**< pointer to graph data structure */
258 int node /**< given node */
259 );
260
261/** prints graph data structure */
262SCIP_EXPORT
264 TCLIQUE_GRAPH* tcliquegraph /**< pointer to graph data structure */
265 );
266
267
268
269
270/*
271 * Interface Methods
272 */
273
274/** finds maximum weight clique */
275SCIP_EXPORT
277 TCLIQUE_GETNNODES((*getnnodes)), /**< user function to get the number of nodes */
278 TCLIQUE_GETWEIGHTS((*getweights)), /**< user function to get the node weights */
279 TCLIQUE_ISEDGE((*isedge)), /**< user function to check for existence of an edge */
280 TCLIQUE_SELECTADJNODES((*selectadjnodes)), /**< user function to select adjacent edges */
281 TCLIQUE_GRAPH* tcliquegraph, /**< pointer to graph data structure that is passed to graph callbacks */
282 TCLIQUE_NEWSOL((*newsol)), /**< user function to call on every new solution */
283 TCLIQUE_DATA* tcliquedata, /**< user data to pass to new solution callback function */
284 int* maxcliquenodes, /**< pointer to store nodes of the maximum weight clique */
285 int* nmaxcliquenodes, /**< pointer to store number of nodes in the maximum weight clique */
286 TCLIQUE_WEIGHT* maxcliqueweight, /**< pointer to store weight of the maximum weight clique */
287 TCLIQUE_WEIGHT maxfirstnodeweight, /**< maximum weight of branching nodes in level 0; 0 if not used
288 * for cliques with at least one fractional node) */
289 TCLIQUE_WEIGHT minweight, /**< lower bound for weight of generated cliques */
290 int maxntreenodes, /**< maximal number of nodes of b&b tree */
291 int backtrackfreq, /**< frequency to backtrack to first level of tree (0: no premature backtracking) */
292 int maxnzeroextensions, /**< maximal number of zero-valued variables extending the clique */
293 int fixednode, /**< node that is forced to be in the clique, or -1; must have positive weight */
294 int* ntreenodes, /**< pointer to store the number of used tree nodes (or NULL) */
295 TCLIQUE_STATUS* status /**< pointer to store the status of the solving call */
296 );
297
298#ifdef __cplusplus
299}
300#endif
301
302#endif
SCIP_Real scaleval
Definition: cons_sos1.c:241
#define TCLIQUE_GETWEIGHTS(x)
Definition: tclique.h:105
void tcliquePrintGraph(TCLIQUE_GRAPH *tcliquegraph)
#define TCLIQUE_GETNNODES(x)
Definition: tclique.h:97
#define TCLIQUE_ISEDGE(x)
Definition: tclique.h:115
TCLIQUE_Status
Definition: tclique.h:62
@ TCLIQUE_NODELIMIT
Definition: tclique.h:64
@ TCLIQUE_USERABORT
Definition: tclique.h:65
@ TCLIQUE_OPTIMAL
Definition: tclique.h:66
@ TCLIQUE_ERROR
Definition: tclique.h:63
#define TCLIQUE_SELECTADJNODES(x)
Definition: tclique.h:130
int tcliqueGetNEdges(TCLIQUE_GRAPH *tcliquegraph)
int * tcliqueGetLastAdjedge(TCLIQUE_GRAPH *tcliquegraph, int node)
void tcliqueChangeWeight(TCLIQUE_GRAPH *tcliquegraph, int node, TCLIQUE_WEIGHT weight)
TCLIQUE_Bool tcliqueLoadFile(TCLIQUE_GRAPH **tcliquegraph, const char *filename, double scaleval, char *probname, int sizeofprobname)
int * tcliqueGetDegrees(TCLIQUE_GRAPH *tcliquegraph)
void tcliqueFree(TCLIQUE_GRAPH **tcliquegraph)
int * tcliqueGetAdjnodes(TCLIQUE_GRAPH *tcliquegraph)
enum TCLIQUE_Status TCLIQUE_STATUS
Definition: tclique.h:68
int TCLIQUE_WEIGHT
Definition: tclique.h:48
int * tcliqueGetFirstAdjedge(TCLIQUE_GRAPH *tcliquegraph, int node)
void tcliqueMaxClique(TCLIQUE_GETNNODES((*getnnodes)), TCLIQUE_GETWEIGHTS((*getweights)), TCLIQUE_ISEDGE((*isedge)), TCLIQUE_SELECTADJNODES((*selectadjnodes)), TCLIQUE_GRAPH *tcliquegraph, TCLIQUE_NEWSOL((*newsol)), TCLIQUE_DATA *tcliquedata, int *maxcliquenodes, int *nmaxcliquenodes, TCLIQUE_WEIGHT *maxcliqueweight, TCLIQUE_WEIGHT maxfirstnodeweight, TCLIQUE_WEIGHT minweight, int maxntreenodes, int backtrackfreq, int maxnzeroextensions, int fixednode, int *ntreenodes, TCLIQUE_STATUS *status)
TCLIQUE_Bool tcliqueFlush(TCLIQUE_GRAPH *tcliquegraph)
struct TCLIQUE_Graph TCLIQUE_GRAPH
Definition: tclique.h:49
TCLIQUE_Bool tcliqueSaveFile(TCLIQUE_GRAPH *tcliquegraph, const char *filename, double scaleval, const char *probname)
TCLIQUE_Bool tcliqueCreate(TCLIQUE_GRAPH **tcliquegraph)
#define TCLIQUE_Bool
Definition: tclique.h:53
TCLIQUE_Bool tcliqueAddNode(TCLIQUE_GRAPH *tcliquegraph, int node, TCLIQUE_WEIGHT weight)
#define TCLIQUE_NEWSOL(x)
Definition: tclique.h:88
TCLIQUE_Bool tcliqueAddEdge(TCLIQUE_GRAPH *tcliquegraph, int node1, int node2)
tclique defines