Scippy

SCIP

Solving Constraint Integer Programs

expr_varidx.c
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the program and library */
4 /* SCIP --- Solving Constraint Integer Programs */
5 /* */
6 /* Copyright (c) 2002-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 SCIP; see the file LICENSE. If not visit scipopt.org. */
22 /* */
23 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24 
25 /**@file expr_varidx.c
26  * @ingroup DEFPLUGINS_EXPR
27  * @brief handler for variable index expressions
28  * @author Benjamin Mueller
29  */
30 
31 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
32 
33 #include "scip/expr_varidx.h"
34 #include "scip/intervalarith.h"
35 #include "scip/pub_expr.h"
36 #include "scip/scip_expr.h"
37 #include "scip/scip_message.h"
38 #include "scip/pub_message.h"
39 #include "scip/pub_misc.h"
40 
41 /* fundamental expression handler properties */
42 #define EXPRHDLR_NAME "varidx"
43 #define EXPRHDLR_DESC "expression that represents a variable index (typically used for NLPI)"
44 #define EXPRHDLR_PRECEDENCE 0
45 #define EXPRHDLR_HASHKEY 20201210
46 
47 /*
48  * Callback methods of expression handler
49  */
50 
51 /** expression handler copy callback */
52 static
53 SCIP_DECL_EXPRCOPYHDLR(copyhdlrVaridx)
54 { /*lint --e{715}*/
56 
57  return SCIP_OKAY;
58 }
59 
60 /** expression compare callback */
61 static
62 SCIP_DECL_EXPRCOMPARE(compareVaridx)
63 { /*lint --e{715}*/
64  int idx1, idx2;
65 
66  assert(expr1 != NULL);
67  assert(expr2 != NULL);
68 
69  idx1 = SCIPgetIndexExprVaridx(expr1);
70  idx2 = SCIPgetIndexExprVaridx(expr2);
71 
72  if( idx1 < idx2 )
73  return -1;
74  if( idx1 > idx2 )
75  return 1;
76  return 0;
77 }
78 
79 /** expression data copy callback */
80 static
81 SCIP_DECL_EXPRCOPYDATA(copydataVaridx)
82 { /*lint --e{715}*/
83  assert(targetexprdata != NULL);
84 
85  *targetexprdata = SCIPexprGetData(sourceexpr);
86 
87  return SCIP_OKAY;
88 }
89 
90 /** expression data free callback */
91 static
92 SCIP_DECL_EXPRFREEDATA(freedataVaridx)
93 { /*lint --e{715}*/
94  assert(expr != NULL);
95 
96  SCIPexprSetData(expr, NULL);
97 
98  return SCIP_OKAY;
99 }
100 
101 /** expression print callback */
102 static
104 { /*lint --e{715}*/
105  assert(expr != NULL);
106 
107  if( stage == SCIP_EXPRITER_ENTEREXPR )
108  {
109  SCIPinfoMessage(scip, file, "x%d", SCIPgetIndexExprVaridx(expr));
110  }
111 
112  return SCIP_OKAY;
113 }
114 
115 /** expression (point-) evaluation callback */
116 static
118 { /*lint --e{715}*/
119  assert(expr != NULL);
120 
121  SCIPerrorMessage("method of varidx expression handler not implemented yet\n");
122  SCIPABORT(); /*lint --e{527}*/
123 
124  return SCIP_OKAY;
125 }
126 
127 /** expression backward derivative evaluation callback */
128 static
129 SCIP_DECL_EXPRBWDIFF(bwdiffVaridx)
130 { /*lint --e{715}*/
131  /* this should never happen because variable expressions do not have children */
132  return SCIP_INVALIDCALL;
133 }
134 
135 /** expression forward derivative evaluation callback */
136 static
137 SCIP_DECL_EXPRFWDIFF(fwdiffVaridx)
138 { /*lint --e{715}*/
139  assert(expr != NULL);
140 
141  SCIPerrorMessage("method of varidx expression handler not implemented yet\n");
142  SCIPABORT(); /*lint --e{527}*/
143 
144  return SCIP_OKAY;
145 }
146 
147 /** expression backward-forward derivative evaluation callback */
148 static
149 SCIP_DECL_EXPRBWFWDIFF(bwfwdiffVaridx)
150 { /*lint --e{715}*/
151  /* this should never happen because variable expressions do not have children */
152  return SCIP_INVALIDCALL;
153 }
154 
155 /** varidx hash callback */
156 static
158 { /*lint --e{715}*/
159  assert(expr != NULL);
160  assert(hashkey != NULL);
161 
162  *hashkey = EXPRHDLR_HASHKEY;
164 
165  return SCIP_OKAY;
166 }
167 
168 /** expression curvature detection callback */
169 static
170 SCIP_DECL_EXPRCURVATURE(curvatureVaridx)
171 { /*lint --e{715}*/
172  assert(success != NULL);
173 
174  /* x -> x is linear, convex, and concave */
175  *success = TRUE;
176 
177  return SCIP_OKAY;
178 }
179 
180 /** expression monotonicity detection callback */
181 static
182 SCIP_DECL_EXPRMONOTONICITY(monotonicityVaridx)
183 { /*lint --e{715}*/
184  assert(result != NULL);
185 
186  *result = SCIP_MONOTONE_INC;
187 
188  return SCIP_OKAY;
189 }
190 
191 /** creates the handler for variable index expressions and includes it into SCIP */
193  SCIP* scip /**< SCIP data structure */
194  )
195 {
196  SCIP_EXPRHDLRDATA* exprhdlrdata;
197  SCIP_EXPRHDLR* exprhdlr;
198 
199  /* create expression handler data */
200  exprhdlrdata = NULL;
201 
202  /* include expression handler */
204  exprhdlrdata) );
205  assert(exprhdlr != NULL);
206 
207  SCIPexprhdlrSetCopyFreeHdlr(exprhdlr, copyhdlrVaridx, NULL);
208  SCIPexprhdlrSetCopyFreeData(exprhdlr, copydataVaridx, freedataVaridx);
209  SCIPexprhdlrSetCompare(exprhdlr, compareVaridx);
210  SCIPexprhdlrSetPrint(exprhdlr, printVaridx);
211  SCIPexprhdlrSetHash(exprhdlr, hashVaridx);
212  SCIPexprhdlrSetDiff(exprhdlr, bwdiffVaridx, fwdiffVaridx, bwfwdiffVaridx);
213  SCIPexprhdlrSetCurvature(exprhdlr, curvatureVaridx);
214  SCIPexprhdlrSetMonotonicity(exprhdlr, monotonicityVaridx);
215 
216  return SCIP_OKAY;
217 }
218 
219 /** creates a variable index expression */
221  SCIP* scip, /**< SCIP data structure */
222  SCIP_EXPR** expr, /**< pointer where to store expression */
223  int varidx, /**< variable index to represent */
224  SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), /**< function to call to create ownerdata */
225  void* ownercreatedata /**< data to pass to ownercreate */
226  )
227 {
228  SCIP_EXPRHDLR* exprhdlr;
229  SCIP_EXPRDATA* exprdata;
230 
231  assert(expr != NULL);
232 
233  exprhdlr = SCIPfindExprhdlr(scip, EXPRHDLR_NAME);
234 
235  if( exprhdlr == NULL )
236  {
237  SCIPerrorMessage("could not find %s expression handler -> abort\n", EXPRHDLR_NAME);
238  SCIPABORT();
239  return SCIP_ERROR;
240  }
241 
242  /* create expression data */
243  exprdata = (SCIP_EXPRDATA*)(size_t)varidx; /*lint !e571*/
244 
245  /* create expression */
246  SCIP_CALL( SCIPcreateExpr(scip, expr, exprhdlr, exprdata, 0, NULL, ownercreate, ownercreatedata) );
247 
248  return SCIP_OKAY;
249 }
250 
251 /** indicates whether expression is varidx expression */ /*lint -e{715}*/
253  SCIP* scip, /**< SCIP data structure */
254  SCIP_EXPR* expr /**< expression */
255  )
256 { /*lint --e{715}*/
257  assert(expr != NULL);
258 
259  /* quick inconclusive check first */
260  if( SCIPexprGetNChildren(expr) > 0 )
261  return FALSE;
262 
263  return strcmp(SCIPexprhdlrGetName(SCIPexprGetHdlr(expr)), EXPRHDLR_NAME) == 0;
264 }
265 
266 /** gives the index stored in a varidx expression */
268  SCIP_EXPR* expr /**< varindex expression */
269  )
270 {
271  assert(expr != NULL);
272  assert(strcmp(SCIPexprhdlrGetName(SCIPexprGetHdlr(expr)), EXPRHDLR_NAME) == 0);
273 
274  return (int)(size_t)SCIPexprGetData(expr);
275 }
276 
277 /** sets the index stored in a varidx expression */
279  SCIP_EXPR* expr, /**< varindex expression */
280  int newindex /**< new index */
281  )
282 {
283  assert(expr != NULL);
284  assert(strcmp(SCIPexprhdlrGetName(SCIPexprGetHdlr(expr)), EXPRHDLR_NAME) == 0);
285  assert(newindex >= 0);
286 
287  SCIPexprSetData(expr, (SCIP_EXPRDATA*)(size_t)newindex); /*lint !e571*/
288 }
#define NULL
Definition: def.h:267
#define EXPRHDLR_HASHKEY
Definition: expr_varidx.c:45
#define EXPRHDLR_NAME
Definition: expr_varidx.c:42
int SCIPexprGetNChildren(SCIP_EXPR *expr)
Definition: expr.c:3854
void SCIPexprhdlrSetDiff(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRBWDIFF((*bwdiff)), SCIP_DECL_EXPRFWDIFF((*fwdiff)), SCIP_DECL_EXPRBWFWDIFF((*bwfwdiff)))
Definition: expr.c:473
const char * SCIPexprhdlrGetName(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:545
static SCIP_DECL_EXPRCOPYDATA(copydataVaridx)
Definition: expr_varidx.c:81
#define FALSE
Definition: def.h:94
struct SCIP_ExprData SCIP_EXPRDATA
Definition: type_expr.h:54
#define TRUE
Definition: def.h:93
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63
void SCIPexprhdlrSetHash(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRHASH((*hash)))
Definition: expr.c:451
#define EXPRHDLR_DESC
Definition: expr_varidx.c:43
static SCIP_DECL_EXPRCURVATURE(curvatureVaridx)
Definition: expr_varidx.c:170
static SCIP_DECL_EXPRFWDIFF(fwdiffVaridx)
Definition: expr_varidx.c:137
#define SCIP_EXPRITER_ENTEREXPR
Definition: type_expr.h:692
SCIP_EXPRHDLR * SCIPfindExprhdlr(SCIP *scip, const char *name)
Definition: scip_expr.c:868
void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
Definition: scip_message.c:208
public functions to work with algebraic expressions
SCIP_EXPRDATA * SCIPexprGetData(SCIP_EXPR *expr)
Definition: expr.c:3887
static SCIP_DECL_EXPRCOMPARE(compareVaridx)
Definition: expr_varidx.c:62
handler for variable index expressions
SCIP_RETCODE SCIPcreateExpr(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPRHDLR *exprhdlr, SCIP_EXPRDATA *exprdata, int nchildren, SCIP_EXPR **children, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
Definition: scip_expr.c:974
#define SCIPerrorMessage
Definition: pub_message.h:64
interval arithmetics for provable bounds
static SCIP_DECL_EXPRBWDIFF(bwdiffVaridx)
Definition: expr_varidx.c:129
static SCIP_DECL_EXPRHASH(hashVaridx)
Definition: expr_varidx.c:157
public functions to work with algebraic expressions
SCIP_RETCODE SCIPincludeExprhdlrVaridx(SCIP *scip)
Definition: expr_varidx.c:192
static SCIP_DECL_EXPRBWFWDIFF(bwfwdiffVaridx)
Definition: expr_varidx.c:149
#define SCIP_CALL(x)
Definition: def.h:380
void SCIPexprhdlrSetCopyFreeHdlr(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRCOPYHDLR((*copyhdlr)), SCIP_DECL_EXPRFREEHDLR((*freehdlr)))
Definition: expr.c:370
public data structures and miscellaneous methods
#define SCIP_Bool
Definition: def.h:91
static SCIP_DECL_EXPRFREEDATA(freedataVaridx)
Definition: expr_varidx.c:92
#define SCIP_DECL_EXPR_OWNERCREATE(x)
Definition: type_expr.h:143
void SCIPexprhdlrSetMonotonicity(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRMONOTONICITY((*monotonicity)))
Definition: expr.c:429
void SCIPsetIndexExprVaridx(SCIP_EXPR *expr, int newindex)
Definition: expr_varidx.c:278
struct SCIP_ExprhdlrData SCIP_EXPRHDLRDATA
Definition: type_expr.h:195
SCIP_EXPRHDLR * SCIPexprGetHdlr(SCIP_EXPR *expr)
Definition: expr.c:3877
void SCIPexprhdlrSetPrint(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRPRINT((*print)))
Definition: expr.c:396
void SCIPexprhdlrSetCopyFreeData(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRCOPYDATA((*copydata)), SCIP_DECL_EXPRFREEDATA((*freedata)))
Definition: expr.c:383
void SCIPexprhdlrSetCompare(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRCOMPARE((*compare)))
Definition: expr.c:462
void SCIPexprhdlrSetCurvature(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRCURVATURE((*curvature)))
Definition: expr.c:418
void SCIPexprSetData(SCIP_EXPR *expr, SCIP_EXPRDATA *exprdata)
Definition: expr.c:3902
static SCIP_DECL_EXPRMONOTONICITY(monotonicityVaridx)
Definition: expr_varidx.c:182
public methods for message output
SCIP_Bool SCIPisExprVaridx(SCIP *scip, SCIP_EXPR *expr)
Definition: expr_varidx.c:252
#define SCIP_Real
Definition: def.h:173
public methods for message handling
#define EXPRHDLR_PRECEDENCE
Definition: expr_varidx.c:44
unsigned int SCIPcalcFibHash(SCIP_Real v)
Definition: misc.c:10347
static SCIP_DECL_EXPREVAL(evalVaridx)
Definition: expr_varidx.c:117
static SCIP_DECL_EXPRPRINT(printVaridx)
Definition: expr_varidx.c:103
SCIP_RETCODE SCIPincludeExprhdlr(SCIP *scip, SCIP_EXPRHDLR **exprhdlr, const char *name, const char *desc, unsigned int precedence, SCIP_DECL_EXPREVAL((*eval)), SCIP_EXPRHDLRDATA *data)
Definition: scip_expr.c:823
#define SCIPABORT()
Definition: def.h:352
int SCIPgetIndexExprVaridx(SCIP_EXPR *expr)
Definition: expr_varidx.c:267
SCIP_RETCODE SCIPcreateExprVaridx(SCIP *scip, SCIP_EXPR **expr, int varidx, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
Definition: expr_varidx.c:220
static SCIP_DECL_EXPRCOPYHDLR(copyhdlrVaridx)
Definition: expr_varidx.c:53